Faster RCNN 추리 처음부터 자바(6)NMS(비 최대 치 억제)

  • 1.이미지 전처리
  • 2.RPN 네트워크 예측
  • 3. RPN to ROIs
  • 4.분류 기 네트워크 예측
  • 5.Classifier 네트워크 출력 이 ROIs 에 대한 여과 및 수정
  • 6. NMS ( )
  • 7.좌 표를 원시 이미지 차원 으로 전환
  • 입 출력
    입력:
  • candidate_bboxes:shape 는[M,4]
  • candidate_probs:shape 는[M,]
  • 출력:
  • bboxes_on_resize:VGG 16 그림 입력 차원 의 bbox,shape 는[M,4]N 으로 알 수 없 음
  • result_probs:최종 boxes 확률,shape[M,]M 은 알 수 없 음
  • 흐름
  • 각 box 의 면적 을 계산한다
  • 확률 치 정렬
  • 최대 확률 로 box 추출
  • 최대 확률 을 계산 하 는 box 와 나머지 모든 box 의 면적 교 집합
  • 계산 overlap
  • 모든 확률 과 최대 확률 의 box 를 걸 러 내 는 IOU>0.7
  • 여과 후 남 은 box 가 있 으 면 3 단계
  • 로 이동 합 니 다.
    3:code by code
    추출[x1,y1,x2,y2]
    INDArray x1 = boxes.get(NDArrayIndex.all(), NDArrayIndex.point(0));
    INDArray y1 = boxes.get(NDArrayIndex.all(), NDArrayIndex.point(1));
    INDArray x2 = boxes.get(NDArrayIndex.all(), NDArrayIndex.point(2));
    INDArray y2 = boxes.get(NDArrayIndex.all(), NDArrayIndex.point(3));
    

    각 box 의 면적 을 계산 하 다
    INDArray area = x2.sub(x1).mul(y2.sub(y1));
    

    bbox 의 확률 을 작은 것 에서 큰 것 으로 정렬 하여 다음 색인 으로 되 돌려 줍 니 다.
    List idxs = new ArrayList<>(argsort_v1(probs.toFloatVector()));
    

    마지막 으로 남 긴 box 아래 색인 을 표시 합 니 다.
    List pick = new ArrayList<>();
    

    옮 겨 다 니 며 마지막 bbox,즉 확률 이 가장 높 은 box 를 가 져 옵 니 다.
    while (idxs.size() > 0)
    {
        int last = idxs.size() - 1;
        //          .
        int i = idxs.get(last);
        pick.add(i);
    

    최대 확률 box 를 제외 한 모든 box 의 색인 가 져 오기
    SpecifiedIndex exceptLastIndex = new SpecifiedIndex(Ints.toArray(idxs.subList(0, last)));
    

    최대 확률 bbox 이외 의 모든 bbox 의 사각형 상자 데 이 터 를 추출 하고 면적 교 집합 상 자 를 계산 합 니 다.
    INDArray xx1 = Transforms.max(x1.get(exceptLastIndex), x1.getDouble(i));
    INDArray yy1 = Transforms.max(y1.get(exceptLastIndex), y1.getDouble(i));
    INDArray xx2 = Transforms.min(x2.get(exceptLastIndex), x2.getDouble(i));
    INDArray yy2 = Transforms.min(y2.get(exceptLastIndex), y2.getDouble(i));
    

    구속 너비 최소 0
    INDArray ww = Transforms.max(xx2.sub(xx1), 0);
    INDArray hh = Transforms.max(yy2.sub(yy1), 0);
    

    계산 면적 교차
    INDArray area_intersection = ww.mul(hh);
    

    계산 면적 병집
    INDArray area_union = area.get(exceptLastIndex).add(area.getFloat(i)).sub(area_intersection);
    

    최대 확률 을 계산 하 는 bbox 와 다른 모든 box 의 overlap 는 IOU 라 고도 부 르 며,교 집합 면적/집적 면적
    INDArray overlap = area_intersection.div(area_union.add(1e-6));
    

    최대 bbox 의 IOU 가 밸브 값 보다 큰 bbox 를 삭제 합 니 다.
    for (int k = idxs.size() - 1; k >= 0 ; k--)
    {
        if (overlap.getFloat(k) > overlap_thresh)
        {
            idxs.remove(k);
        }
    }
    

    마지막 으로 남 긴 bbox 를 추출 하고 함 수 를 되 돌려 줍 니 다.
    INDArray valid_boxes = boxes.get(valid_index, NDArrayIndex.all()).castTo(DataType.INT);
    INDArray valid_probs = probs.get(valid_index);
    
    return Arrays.asList(valid_boxes, valid_probs);
    

    좋은 웹페이지 즐겨찾기