초기 Detection 알고리즘 계열에는 R-CNN계열과 YoLo 계열로 나뉩니다. 오늘은 그 중에서 R-CNN계열의 첫번째 모델인 R-CNN에 대해서 소개해보고자 합니다.
먼저 Detection 알고리즘의 계보 같은거를 보시면 좋을거 같습니다.
아마 이번 글 다음에는 Fast R-CNN과 Faster R-CNN을 리뷰하고 추후에는 요즘 핫한 DETR에 대해서 리뷰하려는 계획을 가지고 있지만 할 수 있을련지... 일단 시작해 보겠습니다.
R-CNN(Regions with CNN features)
R-CNN은 아래 논문에서 소개된 모델입니다.
https://arxiv.org/pdf/1311.2524.pdf
현재 저 논문의 피인용수는 1만6천번을 넘긴 엄청난 논문입니다. 그만큼 비전을 한다면 한번쯤 다뤄볼 만한 모델이라는 생각에 이번 주 발표 주제를 잡았습니다.
모델 전체 모습
위의 R-CNN은 총 3가지의 과정을 거치게 됩니다.
1. 물체의 위치를 파악하는 Extract Region Proposal 부분
2. Region proposal된 각 영역들을 통해 피쳐맵을 추출하는 CNN
3. 추출된 피쳐를 통해 classification하는 linear SVM
1. Extract Region Proposal
물체가 존재할 확률이 있는 영역을 모두 추출하는 부분입니다.
- Select Search라는 방식을 사용하여 약 2000개 정도의 Region Proposal을 뽑아내게 됩니다.
Select Search
Definition
R : 선택된 region 후보들
S : region들의 유사도 집합
- R들을 초기화
- 가장 유사성이 높은 s를 선택
- 유사성 평가$$S(r_i,r_j) = a_1s_{color}(r_i, r_j) + a_2s_{texture}(r_i, r_j) + a_3s_{size}(r_i, r_j)+a_4s_{fill}(r_i, r_j)$$
- 유사성은 [0,1]사이로 정규화된 4가지 요소(Color, Texture, Size, Fill)들의 가중합으로 계산된다.
- $$s = s(r_i, r_j)$$
$$ 0 \leq a_i \leq 1$$
- Color: 이미지의 색깔
- 각 컬러 채널을 25개 bin으로 설정
- 각 region 마다 컬러 히스토그램 생성
- $$ C_i=c_i^1,…,c_i^n$$
- 차원 수 n = 75 (RGB 3채널 × 25개의 Bin)
- L1 norm 정규화 [0,1]
- 인접한 regions의 교집합을 유사도로 측정
$$s\_{colour}(r\_i, r\_j) = \\sum\_{k=1}^nmin(c\_i^k, c\_j^k)$$
- 유사성 척도의 min function은 두 히스토그램의 교집합을 나타냄
- Texture: 주변 Pixel값 들의 변화량 [참고자료: HoG]
- σ=1인 8방향의 가우시안 미분을 적용
- 10개의 Bin으로 히스토그램 도출 Ti=t1i,…,tni
- L1 norm 정규화 [0,1]
- 80차원(8방향 × 10차원의 Bin)의 벡터로 인접한 region들의 유사성을 평가
- RGB(3차원)의 경우: 8방향 × Bin의 수(10차원) × RGB(3차원) = 240차원
- Size: Region들의 사이즈
- 사이즈가 작을 수록 유사도가 높음
- im은 원 이미지를 나타냄
- Fill: candidate Bounding Box 크기와의 차이
- candidate Bounding Box와 Region들의 사이즈의 차이가 적을수록 유사도가 높음
- im은 원 이미지를 나타냄
2. Feature extraction
이제 추출된 Region proposals 영역을 통해 피쳐를 추출하는것.
- 네트워크 특성상 고정된 사이즈의 입력만 받을 수 있기 때문에 각각 나눠진(croping) Region proposals 영역을 변형(wrapping)하여 227x227 pixels를 만든다. 이때 해당 영역의 비율 등은 무시되고 그냥 CNN에 넣기위해 우겨 넣는 느낌이다.
- 이를 CNN Model에 넣어서 길이가 4096인 특징벡터를 추출해 낸다.이때 사용하는 CNN Model은 ImageNet Data에서 미리 학습된 CNN모델을 가져와서 Fine tuning하는 방식을 취했습니다.
3. Classification
이제 추출된 벡터를 클래스 별 Linear SVM에 넣어서 최종 클래스별 확률을 추출하게 됩니다. 이렇게 되면 2000개의 바운딩 박스가 각 클래스 별 확률을 가지게 됩니다.
4. Non-Maximum Suppression
이제 해당 Bounding Box들을 압축할 차례입니다. 이때 사용하는 개념이 IoU입니다. 짧게 말해서 겹치는 부분이 전체 두 이미지를 합한 영역내에서 어느정도를 차지하는지 측정하는 지표입니다.
먼저 RoI(Region of Interest)가 큰 순서대로 정렬을 하고 해당 RoI를 기준으로 IoU가 0.5이상인 RP(Region Proposal)을 합치면서 RP를 줄이게 됩니다.
def non_max_suppresssion_fast(boxes, probs, overlap_thresh):
if not boxes.size:
return np.empty((0,), dtype=int)
if boxes.dtype.kind == 'i':
boxes = boxes.astype('float')
pick = []
x1 = boxes[:, 0]
y1 = boxes[:, 1]
x2 = boxes[:, 2]
y2 = boxes[:, 3]
area = (x2 - x1) * (y2 - y1)
idxs = np.argsort(probs)
while idxs.size:
last = len(idxs) - 1
i = idxs[last]
pick.append(i)
xx1 = np.maximum(x1[i], x1[idxs[:last]])
yy1 = np.maximum(y1[i], y1[idxs[:last]])
xx2 = np.minimum(x2[i], x2[idxs[:last]])
yy2 = np.minimum(y2[i], y2[idxs[:last]])
w = np.maximum(0, xx2 - xx1)
h = np.maximum(0, yy2 - yy1)
overlap = (w * h) / area[idxs[:last]]
idxs = np.delete(idxs, np.concatenate(([last], np.where(overlap > overlap_thresh)[0])))
return boxes[pick].astype('int'), probs[pick
## https://inspace4u.github.io/dllab/lecture/2017/09/27/NMS_Algorithm.html
5. 학습
SVM의 경우 Ground Truth 부분과 해당 클래스 예측한 이미지의 IoU가 0.3이상이면 라벨을 1로 두고 해당 클래스별 SVM을 학습 하게 됩니다.
CNN의 경우 아마 추측하기로는 4096이후로 몇개의 레이어를 더 추가하여 해당 값을 클래스별 1 또는 0으로 추측해 놓고 해당 추측된 클래스의 실제 이미지와 RP가 0.5이상이면 1로 두고 학습을 진행하고 추후에 끝에 레이어를 떼고 아웃풋이 4096이 되게 만든거 같습니다.
그럼 여기서 당연히 의심이 가셔야하는 부분이 있습니다. 이미 학습된 모델이 있는데 왜 굳이 SVM을 들고와서 붙이느냐?
논문에서 해당 부분에 대해서 논의한 부분인데 mAP가 되게 줄었다고 합니다. 사실 이 부분을 추후에는 CNN으로 대체하긴 합니다.
결론
일단 읽으시면서 느끼겠지만 Object Detection을 위해서 정말 많은 것을 붙인것을 볼 수 있습니다. 일단 AI하시는 분들이면 Input이 들어가면 Output까지 End to End 학습을 선호하실 겁니다. 그렇게 해야 GPU를 좀 더 잘 활용할 수 있기 때문이죠. 근데 여기서 Select Search부터 해당 RP들을 합치는 것, 그리고 SVM을 사용한 것까지 이런 부분에서 병목이 걸리게 됩니다. CNN은 GPU를 사용하여 빠르게 연산을 하지만 위에서 언급한 부분들이 연산의 속도를 느리게 한다는 것이죠. 그렇기 때문에 R-CNN은 Detection분야에서 상당히 느린 속도를 띄는 것으로 유명합니다. 그래도 Detection의 근본이니 다뤄보는것에 있어서 좋은 시간이었던거 같습니다.
'인공지능 > Computer Vision' 카테고리의 다른 글
Image Detection 기초 (0) | 2021.02.05 |
---|