본문 바로가기

프로그래밍/종합설계 딥러닝 프로젝트

같은 물체에 여러개의 바운딩 박스가 생기는 문제

현재 문제점

 

많은 사과를 디텍션 하기위해 score_threshold(점수가 높을수록 사과일 확률이 높음)를 낮추었을때 같은 물체에 대해 많은 bounding box가 생기는 문제점이 발생 하였습니다.
그렇다고 score_threshold를 높이면 전체 사과 AP가 급감하고 
또 대부분의 물체는 바운딩 박스가 한 개만 남지만 어떤 물체는 여전히 한개이상 박스들이 생겼습니다.

 

여러개의 바운딩 박스가 생기는 모습

 

해결방안

 

score_threshold만으로는 해결이 안되기 때문에 새로운 알고리즘을 구상하였습니다.

사진과 같이 설명하면 아래와 같습니다.

 

 

거리에 기반해서 그룹핑 알고리즘을 디자인하고 적용하였습니다.

코드는 아래와 같습니다.

 

import warnings
import numpy as np
from math import *

sphere_thr = 0.1
id_thr = 0.01

def dist(p,q):
    return sqrt(sum((px - qx) ** 2.0 for px, qx in zip(p, q)))

def identity(l1):
    real = []
    warnings.filterwarnings(action='ignore')
    
    while len(l1) > 0: # l1 is not empty
        l2 = []
        a = l1[0]
        try:
            l2 = np.vstack( i for i in l1 if dist(a[1:],i[1:]) < id_thr ) # distance from one another
            temp = np.vstack( x for x in l1  if x not in l2 ) # exclude l2 in l1
            l1 = temp # renew l1 without l2
        except:
            l1 =[]
                
        if len(l2) != 1: # l2 is more than one so find the max
            max = l2[0][0]
            count = 0
            for i in range(len(l2)):
                if max < l2[i][0]: # compare to prior score
                    max = l2[i][0]
                    count = i
            l2 = l2[count]
                
        real.append(l2) # real is the filterd bboxes
    return real

 

크게 한상자에 대해 모든상자와 거리를 구해서 기준보다 작을경우 그룹핑하는 부분과 같은 그룹에서 가장 score가 높은 한상자만 남기는 부분으로 코드를 작성했습니다. 자세한 사항은 주석을 확인해 주시면 됩니다.

그럼 이 코드를 적용한 후 어떻게 처리됐는지 확인해 보시겠습니다.

 

결과 사진

 

적용 전 적용 후

 

의도 했던대로 사과마다 각각 가장 점수가 높은 박스 한개만을 남기고 나머지는 필터링되었네요.

영상처리와 알고리즘을 배우면 코드를 직접 시각화해서 확인할수있는 경우가 많아서 성취감도 좋고 동기부여도 확실히 되는것 같습니다. 다음 포스팅에선 이렇게 검출된 사과를 로봇을 이용해서 수확하는 과정을 리뷰하겠습니다.

감사합니다.