Classification : 각 이미지가 어떤 이미지인지 예측하는 것
Localization : 이미지 내에 있는 하나의 object의 위치를 bounding box로 지정하여 찾음
Detection : 이미지 내에 있는 하나 이상의 object의 위치를 bounding box로 지정하여 찾음
Segmentation : 이미지 내에 있는 하나 이상의 object들을 pixel level detection으로 찾음
Region Proposal(영역 추정) : object가 있을만한 영역에 대한 힌트를 모델에게 주는 것.
Feature Extraction & FPN & Network Prediction : Detection을 위한 deep learning network. feature extraction의 경우 classification layer이 사용되며, network prediction의 경우, regression layer이 사용된다.
IOU/NMS/mAP/Anchor box : Detection을 구성하는 기타 요소들.
위의 사진에서 ResNet은 Backbone이고, ResNet을 통해 얻은 feature map을 확장하는 feature pyramid network가 있다. Head는 feature pyramid를 통해 얻은 class+box subnet들으로 classification과 regression을 진행한다.
1) Classification + Regression을 동시에
이미지에서 여러 개의 물체를 classification함과 동시에 위치를 찾아야함.
Classification과 regression의 loss 함수들에서 모두 loss가 낮게 나와야하는 것.
2) 다양한 크기와 유형의 object가 섞여 있음
크기가 서로 다르고, 생김새가 다양한 object가 섞여있는 이미지에서 이들을 detect 해야함.
3) detect 속도
detect의 속도가 중요한 실시간 영상 기반에서 detect해야하는 요구사항이 증대함
4) 명확하지 않은 이미지
object 이미지가 명확하지 않은 경우가 많음. 전체 이미지에서 object가 차지하는 비중이 높지 않은 경우도 있음.(배경이 대부분을 차지하는 경우가 많음.)
5) 데이터 세트의 부족
훈련 가능한 데이터 세트가 부족(MS COCO Dataset 80개, Google Open Image 500개)하며, annotation을 만들어야 하기 때문에 훈련 데이터 세트를 생성하기가 상대적으로 어려움.
Bounding Box의 정보로만 학습을 진행하면 object가 어디있는지 추론하는 것이 어렵다. 그래서 이미지 내에서 object가 어디에 있을만한지 먼저 찾은 후에 해당 정보를 가지고 detection을 진행해야한다(Region Proposal).
Sliding Window 방식이란?
원본 이미지에서 후보 bounding box를 선택하여 최종 후보를 도출하고, 이를 바탕으로 object detection 진행. object가 있을만한 후보 영역을 찾는 것.
Selective Search
Selective Search 수행 프로세스
1) 개별 segement된 모든 부분들을 bounding box로 만들어서 region proposal 리스트로 추가
2) 컬러, texture, shape에 따라 유사도가 비슷한 segement들을 그룹핑함.
3) 다시 1)과 같이 region proposal 리스트에 추가하고, 2)와 같이 유사도가 비슷한 segment들을 그룹핑을 하는 것을 반복.
Selective Search Code
import selectivesearch
_, regions = selectivesearch.selective_search(img, scale = 100, min_size = 2000)
selectivesearch의 반환 값이 2개인데, 첫 번째는 중요하지 않은 값이다. 2번째 값(regions)은 object가 있을만한 곳이 담긴 list이다.
scale의 값이 커지면 큰 object들을 찾고, 작아지면 작은 object들을 위주로 찾는다.
min_size로 찾을 object의 최소 사이즈를 정할 수 있다.
반환된 regions
반환된 regions 변수는 리스트 타입으로 세부 원소로 딕셔너리를 가지고 있음.
regions는 아래로 내려갈수록 너비와 높이 값이 큰 bounding box이며, 하나의 bounding box에 여러개의 object가 있을 확률이 커진다.
위와 같이 유사한 object는 뒤로 갈수록 합쳐진다.
bounding box 시각화
#rect 정보만 cand_rects 객체에 저장
cand_rects = [cand['rect'] for cand in regions]
#opencv의 rectangle()을 이용하여 시각화
green_rgb = (125, 255, 51)
for rect in cand_rects:
left = rect[0]
top = rect[1]
#rect[2], rect[3]는 너비와 높이임.
right = left + rect[2]
bottom = top + rect[3]
img = cv2.rectangle(img, (left, top), (right, bottom), color = green_rgb, thickness = 2)
plt.figure(figsize = (8,8))
plt.imshow(img)
plt.show()
IOU : Intersection Over Union, 모델이 예측한 결과와 실측(ground truth) box가 얼마나 정확하게 겹치는가를 나타내는 지표. IOU는 개별 box가 서로 겹치는 영역 / 전체 box의 합집합 영역으로 계산.
IOU Code
import numpy as np
def compute_iou(cand_box, gt_box):
#intersection area 계산
x1 = np.maximum(cand_box[0], gt_box[0])
y1 = np.maximum(cand_box[1], gt_box[1])
x2 = np.maximum(cand_box[2], gt_box[2])
y2 = np.maximum(cand_box[3], gt_box[3])
intersection = np.maximum(x2 - x1, 0) * np.maximum(y2 - y1, 0)
cand_box_area = (cand_box[2] - cand_box[0]) * (cand_box[3] - cand_box[1])
gt_box_area = (gt_box[2] - gt_box[0]) * (gt_box[3] - gt_box[1])
union = cand_box_area + gt_box_area - intersection
iou = intersection / union
return iou
NMS : Non Max Suppresion.
1) Detected된 bounding box별로 특정 confidence threshold 이하 bounding box는 먼저 제거한다.
2) 가장 높은 confidence score을 가진 box 순으로 내림차순 정렬하고, 아래 로직을 모든 box에 순차적으로 적용.
3) 남아있는 box만 선택
Confidence Score이 높을수록, IOU Threshold가 낮을수록 더 많은 box가 제거된다.
mAP : mean Average Precision.
실제 object가 detected된 재현율(recall)의 변화에 따른 정밀고(precision)의 값을 평균한 성능의 수치이다.
정밀도와 재현율
정밀도(precision)은 예측을 positive로 한 대상 중에 예측과 실제 값이 positive로 일치한 데이터의 비율을 의미. 검출 알고리즘이 검출 예측한 결과가 실제 object들과 얼마나 일치하는지를 나타내는 지표임.
재현율(recall)은 실제 값이 positive인 대상 중에 예측과 실제 값이 positive로 일치한 데이터의 비율을 뜻함. 검출 알고리즘이 실제 object들을 빠뜨리지 않고 얼마나 정확히 검출 예측하는지를 나타내는 지표임.
좋은 알고리즘이라면 정밀도와 재현을 모두 결과가 좋아야함.
오차 행렬(confusion matrix)
오차 행렬 : 이진 분류의 예측 오류가 얼마인지, 그리고 어떠한 유형의 예측 오류가 발생하고 있는지 함께 나타내는 지표.
여기서 False Positive는 잘못 예측한 것이고, False Negative는 아예 예측을 하지 않은 것이다.
Object Detection에서 정밀도와 재현율
confidence score에 따른 정밀도-재현율 변화
정밀도와 재현율의 trade-off
confidence threshold를 조정하면 정밀도 또는 재현율의 수치를 높을 수 있다. 그러나 정밀도와 재현율은 상호 보완적인 평가 지표이기 때문에 어느 한쪽을 강제로 높이면 다른 하나의 수치는 떨어지기 쉽다.
정밀도 재현율 곡선
recall값의 변화(confidence 값의 조정)에 따른 precision 값을 나타낸 곡선. 이렇게 얻어진 precision 값의 평균을 AP라고 하며, 일반적으로 정밀도 재현율 곡선의 면적 값으로 계산됨.