Inflearn의 딥러닝 컴퓨터 비전 완벽 가이드를 수강하며 공부 목적으로 정리한 글입니다.
주요 구성요소
- Region Proposal
- Detection을 위한 Network 구성(feature extraction, network prediction)
- detection을 위한 요소들(IoU, NMS, mAP, Anchor Box 등)
주요 문제
- 물체 판별(Classification) + 물체 위치 찾기(Regression)을 동시에 수행해야 함
- 한 이미지 내에 크기, 색, 생김새가 다양한 object가 섞여 있음
- 실시간 detection을 위해 시간 성능이 중요
- 명확하지 않은 이미지가 많음(노이즈 혹은 배경이 전부인 사진 등)
- 이미지 데이터 셋의 부족
Selective Search 수행 프로세스
- 초기 수 천개의 개별 Over segmentation된 모든 부분들을 bounding box로 만들어 region proposal 리스트에 추가
- 컬러(color), 무늬(texture), 크기(size), 형태(shape) 등에 따라 유사한 segment들을 그룹핑
- 위 과정을 반복하며 최종 그룹핑 된 segment들을 제안
pip install selectivesearch
를 통해 라이브러리 설치 import selectivesearch
import cv2
img = cv2.imread('./image/test.jpg') # 이미지 로드
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.figure(figsize=(8, 8))
plt.imshow(img_rgb)
plt.show()
#selectivesearch.selective_search()는 이미지의 Region Proposal정보를 반환
_, regions = selectivesearch.selective_search(img_rgb,
scale=100, # bounding box scale
min_size=2000) # rect의 최소 사이즈
regions[:5]
[{'rect': (0, 0, 58, 257), 'size': 7918, 'labels': [0.0]},
{'rect': (16, 0, 270, 50), 'size': 5110, 'labels': [1.0]},
{'rect': (284, 0, 90, 420), 'size': 6986, 'labels': [2.0]},
{'rect': (59, 14, 262, 407), 'size': 3986, 'labels': [3.0]},
{'rect': (62, 17, 256, 401), 'size': 5282, 'labels': [4.0]}]
반환된 regions 변수는 리스트 타입으로 세부 원소로 딕셔너리를 가지고 있음.
# Bounding Box 시각화
green_rgb = (125, 255, 51)
img_rgb_copy = img_rgb.copy()
for rect in cand_rects:
left = rect[0]
top = rect[1]
# rect[2], rect[3]은 너비와 높이이므로 우하단 좌표를 구하기 위해 좌상단 좌표에 각각을 더함.
right = left + rect[2]
bottom = top + rect[3]
img_rgb_copy = cv2.rectangle(img_rgb_copy, (left, top), (right, bottom), color=green_rgb, thickness=2)
plt.figure(figsize=(8, 8))
plt.imshow(img_rgb_copy)
plt.show()
모델이 예측한 bounding box와 실제 ground truth box가 얼마나 정확하게 겹치는지를 측정하는 지표
IoU 값에 따라 detection 예측 성공 결정
- object detection에서 개별 object에 대한 검출 예측이 성공하였는지에 대한 여부를 IoU를 통해 결정
- 일반적으로 PASCAL VOC Challenge에서 는 IoU가 0.5이상이면 예측 성공했다고 판단
def compute_iou(cand_box, gt_box):
# Calculate intersection areas
x1 = np.maximum(cand_box[0], gt_box[0])
y1 = np.maximum(cand_box[1], gt_box[1])
x2 = np.minimum(cand_box[2], gt_box[2])
y2 = np.minimum(cand_box[3], gt_box[3])
intersection = np.maximum(x2 - x1, 0) * np.maximum(y2 - y1, 0) # width * height (x2에서 x1을 뺀 값이 width, y2에서 y1을 뺀 값이 height 이므로)
cand_box_area = (cand_box[2] - cand_box[0]) * (cand_box[3] - cand_box[1]) # width * height
gt_box_area = (gt_box[2] - gt_box[0]) * (gt_box[3] - gt_box[1]) # width * height
union = cand_box_area + gt_box_area - intersection # 실제box와 예측box의 합에서 intersection을 뺌
iou = intersection / union
return iou
object detection 시 최대한 object를 놓치지 않기 위해 많은 bounding box를 찾게 되는데, 이렇게 detected 된 수많은 bounding box 중 비슷한 위치에 있는 box를 제거하고 가장 적합한 box를 선택하는 기법
NMS 수행 프로세스
- Detected 된 Bounding box별로 특정 Confidence score threshold 이하 bounding box는 먼저 제거 (ex. confidence score threshold < 0.5)
- 가장 높은 confidence score를 가진 box 순으로 내림차순 정렬하고 아래 로직을 모든 box에 순차적으로 적용
- 높은 confidence score를 가진 box와 겹치는 다른 box를 모두 조사하여 IoU가 특정 threshold 이상인 box를 모두 제거 (ex. IoU Threshold > 0.4)
- 남아있는 box만 선택
Confidence score threshold가 높을 수록, IoU Threshold가 낮을 수록 많은 box가 제거 됨
실제 Object가 detected된 재현율(recall)의 변화에 따른 정밀도(precision)의 값을 평균한 성능 수치
정밀도와 재현율
정밀도는 모델이 positive라고 예측한 대상 중 예측 값이 실제 positive 값과 얼마나 일치하는지에 대한 비율(즉, 예측한 object가 실제 object들과 얼마나 일치하는지)
재현율은 실제 positive 값 중 모델이 얼마나 실제 값을 positive라고 예측했는지에 대한 비율(즉, 실제 object를 얼마나 빠드리지 않고 잘 예측했는지)
Precision Recall Trade-off : 정밀도와 재현율은 상호 보완적인 관계이므로 어느 한쪽이 높아지면 다른 쪽이 낮아지게 됨
Precision-Recall Curve : confidence threshold의 변화에 따른 정밀도와 재현율의 변화 곡선, 이 곡선의 아랫부분 면적을 AP(Averge Precision, 평균 정밀도)라고 함
AP는 하나의 object에 대한 성능 수치이며, mAP는 여러 object들의 AP를 평균한 값을 의미
일반적으로 이미지 해상도(Image Resolution)가 높을 수록 Detection성능이 좋아지지만 이미지를 처리하는 시간(FPS)이 오래걸림