2020. 12. 23. 13:51ㆍComputer vision ღ'ᴗ'ღ
※ 본 글은 <딥러닝 컴퓨터비전 완벽가이드> 강의 및 여러 자료를 참고하여 쓰여진 글입니다. ※
github: github.com/chaeyeongyoon/ComputerVision_Study
1. Localization
localization과정을 간단히 설명하자면
1. 하나의 object가 포함된 이미지를 VGG/ResNet등을 이용해 feature extraction을 수행하고,
2. 그 결과로 나온 feature map을 FC Layer을 통과시킨 후
3. softmax를 수행하여 classification을 수행합니다.
4. 동시에 bounding box regression도 수행합니다. (weights 찾기)
자세한 딥러닝 과정에 대한 내용은 생략하겠습니다. 딥러닝 관련 카테고리의 글에서 다룬 내용입니다.
2. Detection
detection은 두개 이상의 object를 검출해야 하기 때문에 다른 방식이 필요합니다.
- Sliding Window 방식
window를 왼쪽 상단부터 오른쪽 하단까지 차례로 이동시키면서 object를 detection하는 방식입니다.
다양한 형태의 window를 sliding 하는 방식과 window scale은 고정하고 이미지의 scale을 변경해 수행하는 방식(Image Pyramid, feature pyramid)을 합쳐 사용합니다.
원래는 Image Pyramid를 사용하거나 Multiple-scaled sliding window를 사용했는데, 더 발전하여 anchor box라 불리는 여러 형태의 window를 사용해 이미지의 scale을 변경해 수행할 필요도 없고, filter크기를 변경시킬 필요도 없어졌습니다. 대신 anchor box를 사용하면 anchor box 개수만큼 결과값이 늘어난다는 단점이 있습니다.
이 방식은 Region Proposal기법의 등장으로 활용도가 떨어졌지만 object detection 발전의 기술적 토대를 제공했습니다.
- Region Proposal (영역 추정) 방식
sliding box방식을 개선한 것으로, objecti가 있을만한 후보 영역을 추천받는 형식입니다.
원본이미지는 보통 배경이 대부분이기 때문에, 후보 bounding box들을 선택하고, 최종 후보를 도출하는 형식입니다.
대표적으로 Selective Search 가 있습니다.
Selective search는 빠른 detection과 높은 Recall 예측 성능을 동시에 만족하는 알고리즘으로, 컬러, 무늬, 크기, 형태에 따라 (color, texture, size, shape) 유사한 region을 계층적 그룹핑 방법으로 계산합니다.
초반에는 pixel intensity 기반한 graph-based segment기법에 따라 Over Segmentation을 수행합니다.
1. 이렇게 개별 segment된 모든 부분들을 bounding box로 만들어 region proposal 리스트로 추가한 후
2. 컬러, 무늬, 사이즈, 형태 따라 유사도가 비슷한 segment들을 그룹핑(고유 알고리즘이 있습니다)
3. 다시 1, 2를 반복하며 어느정도 기준에 도달하면 종료합니다.
간단한 코드만 적어보겠습니다. 자세한 코드는 글 상단 github에서 보실 수 있습니다.
Alpaca의 selectivesearch api를 사용합니다.
import selectivesearch
img = cv2.imread('../../data/image/audrey01.jpg')
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # RGB image
_, regions = selectivesearch.selective_search(img_rgb, scale=100, min_size=2000)
'''
{'rect': (0, 0, 107, 167), 'size': 11166, 'labels': [0.0]},
{'rect': (15, 0, 129, 110), 'size': 8771, 'labels': [1.0]},
{'rect': (121, 0, 253, 133), 'size': 17442, 'labels': [2.0]},
{'rect': (134, 17, 73, 62), 'size': 2713, 'labels': [3.0]},
{'rect': (166, 23, 87, 176), 'size': 8639, 'labels': [4.0]},
...
'''
cand_rects = [cand['rect'] for cand in regions] # (x, y, w ,h)
cand_rects = [cand['rect'] for cand in regions if cand['size'] > 10000]
for rect in cand_rects:
left = rect[0]
top = rect[1]
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)
img_rgb_copy = cv2.putText(img_rgb_copy, str(i),(int((right+left)/2), int((bottom+top)/2)), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255,0,0), 2)
plt.figure(figsize=(8, 8))
plt.imshow(img_rgb_copy)
plt.show()
selectivesearch.selective_search(input, scale, min_size, [sigma:가우시안필터]), input은 rgb이미지, scale = runtime parameter k: 임계값 함수
τ(c)=k/|c|계산에 사용.
regions 의 labels를 보면 계속 [1, 0], [2, 0], 이렇게 가다가 어느순간 [7, 11], 이런 형태가 나옵니다. 7번 라벨과 11번라벨이 특성이 비슷해서 합쳐진 것입니다.
'Computer vision ღ'ᴗ'ღ' 카테고리의 다른 글
R-CNN(Regions with CNN) (0) | 2021.01.03 |
---|---|
COCO dataset 다루기 (0) | 2020.12.26 |
주요 dataset 및 파이썬 이미지 라이브러리 (0) | 2020.12.23 |
IOU /NMS/mAP (0) | 2020.12.23 |
Object Detection 개요 (0) | 2020.12.23 |