안녕하세요~ 

 

이번 Chapter에서는 segmentation에 대해서 알아보도록 할거에요. 

 

Segmentation을 하는 방식에는 여러가지가 있지만, 이번 chapter에서는 딥러닝을 기반으로한 segmentation에 대해서 알아보도록 할거에요.

 

 

 

 

 

<1. Semantic segmentation이 뭔가요?>

 

이미지 분야에서 semantic segmentation이란 이미지 내에 있는 객체들을 의미있는 단위로 분할하는 작업을 말해요 (의미있는 단위란 객체들을 의미합니다).

 

<사진1>

 

좀 더 자세히 이야기하자면, semantic segmentation은 모든 픽셀의 레이블을 예측하는 dense prediction이라고도 불립니다.

 

<사진2>

 

 

 

 

 

<2. Instance segmentation이란 뭔가요?>

 

Semantic segmentation과 달리 instance segmentation은 좀 더 엄격한 기준이 추가되는데요.

 

Semantic segmentation은 같은 class의 instance를 구별하지 않는 반면에 instance segmentation은 아래 오른쪽 사진처럼 instance를 구별하게 해줍니다. (종종 논문을 읽으시다가 'semantic segmentation이란 용어와 instance segmentation이란 용어가 혼용되는데 잘 구분하시고 보시면 될 것 같아요!)

 

<사진3>

 

지금까지 배웠던 classification, object detection과의 차이점은 아래 그림을 보시면 명확하게 이해하실 수 있으실 거에요. 

 

<사진4>

 

 

 

 

 

 

 

<3. Segmentation challenge and Performance measure>

 

Classification challenge에서는 top1, top5를 통해 classification model을 평가했고, Object detection challenge에서는 mAP, AR과 같은 performance measure (성능평가지표)를 사용했어요.

 

위와같이 segmentation 영역도 challenge가 있고 해당 challenge에서 사용하는 performance measure가 있는데요. 하나씩 차례대로 알아보도록 해보겠습니다.

 

 

 

1) Pascal VOC

 

Object detection에 이어 Pascal VOC challenge에서는 segmentation 대회도 동시에 진행했어요. Pascal VOC challenge에서는 object detection challenge의 class 개수와 동일하게 21 classes (20 classes + background) 에 대해서 segmentation하도록 되어있어요.

 

 

<사진5>

 

True positive: yellow pixel

False positive: red pixel

False Negative: green pixel

 

Pascal VOC에서 performance measure로 사용하는 공식은 mIoU 입니다.

 

 

판단요소(비교군: Ground truth)

- 예측된 픽셀들이 (어떤 클래스인지 여부와 상관없이) 객체에 속하는가?

- 예측된 픽셀들이 특정 클래스에 올바르게 classification(분류)되었는가?

True positive: 예측된 픽셀들이 (ground truth의) 객체에 속하면서 (해당 객체에 대해) 올바르게 classification한 경우

False positive: 예측된 픽셀들이 (ground truth의) 객체에 속하지만 (해당 객체에 대해) 올바르게 classification하지 못 한 경우 -> 이런 경우는 해당 모델이 객체는 잘 검출하고 있는지에 대해 판단할 요소가 될 서 있음

False negative: (Ground truth의) 실제 객체인 픽셀임에도 불구하고 예측된 픽셀들이 (ground truth의) 객체에 속하지도 않는다고 판단한 경우 -> 객체에 속하지 않았다고 판단 (background라고 판단) 했기 때문에 당연히 classification도 제대로 하지 못함 (종속적인 결과))

 

좀 더 쉽게 말하자면 predicted segmentation과 ground truth segmentation의 IoU를 계산하는라고 생각하시면 될 것 같아요.

 

mIoU: the value across all the classes in the dataset (Pascal VOC = 21 classes)

 

<사진6>

 

 

 

 

2) COCO challenge

 

COCO segmentation challenge에는 두 가지 challenge가 있어요. 첫 번째는 stuff segmentation challenge이고, 두 번째는 panoptic segmentation challenge에요.

 

 

 

2-1) Stuff segmentation challenge

 

COCO에서 정의한 stuff classes는 아래와 같아요.

 

"Stuff classes are background materials that are defined by homogeneous or repetitive patterns of fine-scale properties"

 

<사진7>

 

 

쉽게말해, stuff란 background를 의미하는데요. 즉, 기존에 background에 대해서 세밀하게 신경쓰지 않고 모든 background가 될 수 있는 것들을 통채로 하나의 background라고 분류했었는데요. 여기에서는 background를 stuff (grass, wall, sky, road, etc)로 분류해서 segmentation하는 것이 주된 목적이에요.

 

예를들어, 자율주행차에서 배경에 대한 정보가 세밀해지지 않으면 문제가 많이 생길거에요. 평상시에 background라고 구분했던 '길'도 정확하게 분류해주어야 하고 그외에 주변의 배경들을 좀 더 세밀하게 구분해주어야 더 좋은 성능을 보여줄거에요.

 

 

 

2-2) Panoptic segmentation

 

우리가 흔히 생각하는 일반적인 segmentation은 panoptic segmentation이에요. Panoptic segmentation은 'Stuff segmentation + Things segmentation'이라고 할 수 있겠는데요. Stuff은 배경관련 객체, things는 흔히 우리가 알고 있던 배경을 제외한 객체라고 생각하시면되요.

 

 

<사진8>

 

 

Panoptic segmentation에서는 PQ (Panoptic Quality)라는 성능지표를 통해 segmentation model들을 평가해요. 

 

 

<사진9>

 

 

 

 

3) Cityscapes

 

위에서 언급한 challenge에서 제공하는 dataset 이외에도 cityscapes에서 제공하는 dataset도 있어요. 독일에 있는 도시들을 위주로한 도시 배경에 대한 dataset을 제공해주고, 29개의 classes (within 8 super vategories: flat, human, vehicle, construction, object, nature, sky, void) 들에 대해서 semantic segmentation을 진행하게 됩니다.

 

"It is also well know for its similarity with real urban scenes for autonomous driving applications"

 

 

<사진10>

 

 

 

<사진11>

 

 

 

 

 

<4. Application>

 

Segmentation은 굉장히 다양한 영역에서 사용될 수 있는데요. 그 중에 몇몇 응용사례들을 살펴보도록 할게요.

 

 

 

1) Self driving cars

 

자율주행은 object detection과 같이 rectangular information으로만 갖고는 불가능하기 때문에, non-rectangular information을 얻기 위해 segmentation 기술을 응용해야해요.

 

<사진12. Autopilot segment>

 

 

2018년에는 테슬라가 운행하던 자율주행차량으로 인해 인명피해가 있었다고 하는데요. 이 역시 segmentation 기술에서 문제가 생겨서 그랬다고 하네요. (아직 발전시켜야할 부분이 많이 남은듯 합니다)

 

아래는 해당 기사 링크입니다.

 

https://www.reuters.com/article/us-tesla-crash/tesla-driver-in-fatal-crash-had-reported-problems-before-with-autopilot-feature-idUSKBN20522C

 

 

 

 

2) Medical imaging (의료영상)

 

몇년전부터 의료영상분야에 segmentation 기술이 적용되는 사례를 자주 접할 수 있었습니다. 평소에는 다수의 의사들이 MRI, CT, X-ray 데이터를 보고 질병 여부를 판단하게 되는데요.

 

최근에는 딥러닝 기술을 이용해 실력이 뛰어난 의사가 의료영상데이터를 판독하는 수준까지 도달했다고 합니다.

 

<사진13>

 

<사진14>

 

물론 의료데이터가 다른 이미지 데이터들에 비해 복잡하고 데이터 양 자체도 많은 편도 아니에요. 또한 데이터가 일부 질병에 치중되어 있다보니 모든 질병에 대해 정확하게 판독을 한는건 아직까지는 어렵다고 하네요. 

 

하지만 성공율이 점점 올라갈 수록 의사들의 업무효율성 올려주고, 업무과중을 피할 수 있도록 도와주며, 환자들이 오랜시간동안 CT결과를 기다릴 필요가 없게 만들어줄거에요. 

 

 

 

 

 

 

3) 그외 우리가 흔히 접하는 사례

 

요즘에는 핸드폰에서 사진을 찍을때 mode를 설정해주면 사람에게만 focus를 맞출 수 있도록 해주는데요. 이러한 기술도 사람만 segmentation해주고 그 주위 background를 blur처리해주도록 설정해주기 때문에 segmentation 기술이 핵심이라고 보시면 될 것 같아요.

 

<사진13. Portrait mode>

 

 

 

 

 

 

 

 

<5. Basic Segmentation models based on Deep Learning>

 

물론 굉장히 많은 딥러닝 기반 segmentation models이 나왔지만, 간단하게 어떤 모델이 있는지만 소개해드리고 모델에 대한 자세한 설명은 다음장에서부터 하도록할게요~

 

1) Fully Convolutional Network (FCN) for semantic segmentation.

 

 

 

(↓↓↓FCN 논문정리↓↓↓)

https://89douner.tistory.com/296?category=878997 

 

2. FCN

안녕하세요. 이번 글에서는 처음으로 딥러닝을 적용한 segmentation 모델인 FCN에 대해서 소개해드리려고 합니다. Conference: CVPR 2015 (논문은 2014년에 나옴) Paper title: Fully Convolutional Networks for..

89douner.tistory.com

 

 

 

 

 

2) U-Net

 

 

 

 

(↓↓↓UNet 논문정리↓↓↓)

https://89douner.tistory.com/297?category=878997 

 

3.UNet

안녕하세요. 이번 글에서는 의료분야에서 보편적으로 많이 사용되는 segmentation 모델인 UNet에 대해서 소개해드리려고 합니다. Conference: MICCAI 2015 Paper title: U-Net: Convolutional Networks for Biomed..

89douner.tistory.com

 

 

 

 

 

 

3) DeepLab

 

 

 

4) Mask RCNN

 

 

 

 

 

 

지금까지 Segmentation에 대한 기본적인 개념에 대해서 다루어봤는데요.

 

다음장부터는 딥러닝 기반 segmentation 모델들을 차례대로 살펴보면서 딥러닝이 segmentation 영역에 어떻게 적용되고 있는지 살펴보도록 할거에요.

 

그럼 다음글에서 뵈요~

 

 

 

 

 

 

[글 래퍼런스]

https://bskyvision.com/491

https://medium.com/digitalbridge/how-we-use-image-semantic-segmentation-e85fac734caf

https://medium.com/@arthur_ouaknine/review-of-deep-learning-algorithms-for-image-semantic-segmentation-509a600f7b57

 

[사진 래퍼런스]

사진1,3

https://bskyvision.com/491

사진2,13

https://medium.com/hyunjulie/1%ED%8E%B8-semantic-segmentation-%EC%B2%AB%EA%B1%B8%EC%9D%8C-4180367ec9cb

사진4

https://medium.com/hyunjulie/1%ED%8E%B8-semantic-segmentation-%EC%B2%AB%EA%B1%B8%EC%9D%8C-4180367ec9cb

사진5

 

https://medium.com/digitalbridge/how-we-use-image-semantic-segmentation-e85fac734caf

사진6

 

 

https://heartbeat.fritz.ai/a-2019-guide-to-semantic-segmentation-ca8242f5a7fc

사진7

http://cocodataset.org/#stuff-2019

사진8

http://cocodataset.org/#panoptic-2019

사진9

http://cocodataset.org/#panoptic-eval

사진10

 

사진11

사진12

https://www.businessinsider.com/tesla-cars-have-reached-100-million-autopilot-miles-2016-5

 

 

 

'Deep Learning for Computer Vision > Segmentation' 카테고리의 다른 글

3.UNet  (4) 2021.07.19
2. FCN  (1) 2021.07.08

 안녕하세요~


이번글에서는 SSD (Single Shot MultiBox Detector)라는 object detection 모델에 대해서 설명해보도록 할거에요.





<1. Motivation>


SSD는 사실 YOLO V1과 비슷한시기에 나왔어요. YOLO V1에서 grid cell 방식의 region proposal 방식이 Faster RCNN보다 훨씬 높은 FPS를 기록했다고 언급했었죠? 하지만 그에 비해 mAP는 너무 낮게 나와 고민을 안겨주었어요.




SSD는 기존 YOLO V1의 grid cell 방식의 region proposal 방식을 그대로 적용시키면서 더 좋은 mAP, FPS 성능을 기록할 수 없을까 하다가 만들어진 object detection 모델이에요.








<2. Architecture>


1) Modified VGG Net


먼저 SSD는 VGG Net을 이용해 feature extraction하려고 했어요. 하지만 VGG Net을 그대로 이용하지 않고 SSD 모델에 맞게 수정해주었어요. 아래그림에서 보면 어떻게 수정되었는지 직관적으로 이해하기 쉬우실 거에요.






2)  Remove FC layer


앞서 YOLO V2에서 FC layer를 제거시켜서 얻은 효과가 2가지였죠? 첫 번째는 object detection 모델에서 입력 이미지를 고정시키지 않아도 되는거였어요. 그리고 두 번째는 parameters (가중치) 개수의 급격한 감소로 인해 빨라지는 속도였죠.


본래 YOLO V2는 SSD 다음에 나온 모델이기 때문에 YOLO V2에서 FC layer를 제거시킨 아이디어는 SSD 모델에서 얻었을 가능성이 커요.








3) Multi-map scale feature maps


아래 SSD 모델을 보시면 detection을 하기위해 여러 feature map들이 동원되는걸 보실 수 있을거에요. 




SSD 역시 grid cell 방식으로 운영이 되는데, YOLO V1처럼 하나의 grid cell에서 고정된 개수의 default boxes (or anchor boxes)를 사용하게되요. 그러다 보니 학습을 끝낸 anchor boxes (size, aspect ratio가 정해짐) 가 각기 다른 output feature map에 적용되었을때 검출할 수 있는 객체가 다양해져요. 


예를들어 아래와 같이 하나의 grid cell에서 생성하는 anchor boxes의 크기가 동일하다면, output feature map이 작은 크기에서는 좀 더 큰 객체를 더 잘 탐지할 수 있고, 더 큰 output feature map size에서는 작은 물체를 검출할 수 있을 가능성이 커집니다. 그래서 다양한 크기의 feature map을 detection하기 위해 사용한다면 더 좋은 성능을 기대할 수 있게 되는것이죠.








4) Detection


앞서 SSD의 detection 방식은 다양한 output feature map size를 이용하는것이었어요. 이렇게 다양한 output feature map이 최종단계에서 어떻게 결합되는건지 아래 그림을 보시면 이해하기 수월하실 거에요.



각 feature map에서 anchor boxes 개수를 다르게 설정하는 이유에 대한 명확한 실명이 있다기 보다 논문에서 아래와 같이 표현한 부분에서 추정을 했는데요.


"Allowing different default box shapes in several feature maps let us efficiently discretize the space of possible output box shapes"


아마 몇몇 feature map에서 empirical 하게 box 개수들에 대해서 실험을 해봤던거 같아요. 그래서 몇몇 feature map에서는 다른 different default box shapes를 사용했다고 하는데, anchor boxes 개수가 6개인 곳은 기존 anchor boxes 4개와 2개의 다른 anchor boxes 모양이 추가됩니다.







5) NMS


위와 같이 8732x(Classes+4) features를 뽑게되면 아래와 같은 그림으로 요약할 수 있는데요. 이렇게 되면 각각의 output feature map에서 뽑은 anchor boxes 때문에 최종 단계에서 한 객체에 대해 많은 bounding boxes가 생성되게 되요. 


<사진1>


이렇게 많은 anchor boxes 중에서 NMS를 적용하여 가장 높은 class confidence score를 갖는 anchor box를 선택하게 됩니다 (NMS에 대한 설명은 YOLO V1에서 자세히 설명드린바 있으니 여기서는 넘어가도록 하겠습니다).


<사진2>


지금까지의 과정을 진행하다보면 아래와 같은 최종 SSD 모델을 보실 수 있으실거에요.









<3. Training>


전반적인 학습에 대해서는 모든 object detection이 동일하기 때문에 여기에서는 localization 학습이 어떻게 되는지 위주로 살펴보도록 하겠습니다.


1) Shape of anchor boxes


1-1) scale factor


Anchor boxes를 생성시킬 때, grid cell과 크기를 같게 하는 것이 간단하지만 대부분의 물체는 아래와 같이 aspect ratio가 다릅니다. 그렇기 때문에 aspect ratio를 다르게 하는 anchor boxes들을 생성해주어야 하는데 이때 aspect ratio의 기준이 되는 크기 먼저 선정을 해주어야 해요. 예를들어, aspect ratio=2 라고 했을 때, 그기가 4:2를 말하는건지, 3:1.5를 말하는건지 모르기 때문이에요. 그래서 scale을 2라고 설정한 aspect ratio=2라고 한다면 "4:2"의 크기의 anchor boxes를 생각해 볼 수 있겠죠.


<사진3>


SSD는 detection을 위해 6개의 feature map을 사용하는데요. 이때 각 feature map 마다 grid cell 크기가 다릅니다. 그래서 6개의 output feature map에 따라서 scale factor를 다르게 주어야 하는데요.



아래와 같은 수식을 이용하면 output feature map에 따라서 적절한 scale factor값이 도출됩니다. k=1일때 Smin 값이 나오고, k=6일때 Smax 값이 나오기 때문에 위의 그림과 연결시켜 이해하실 수 있을것 같습니다. (highest layer=⑥/ lowest layer=①)




1-2) width and height


Aspect ratio의 기준이되는 scale factor를 결정했으면, aspect ratio에 따라 anchor boxes의 width height을 결정해주어야 해요. SSD에서는 아래와같은 aspect ration(=a)를 설정하고 scale factor에 따라 아래와 같은 식을 통해 width, height을 결정해 줍니다.




지금까지 배운 식들을 이용해서 anchor(default) boxes들의 모양을 결정합니다. 그렇다면 이렇게 결정되는 anchor boxes들은 어떻게 학습하게 될까요?






2) Bounding Box regression


2-1) Select candidate anchor boxes by using Jaccard overlap


SSD는 각각의 다른 output feature map마다 anchor boxes를 생성하게되요. 예를들어, train 단계에서는 38x38x4 개의 anchor boxes가 생성되는데요. 이렇게 무수히 생성되는 anchor boxes 중에서 우리가 학습에 이용하고 싶은 anchor boxes는 ground truth와 유사한 anchor boxes에요. 



그렇기 때문에 여러 anchor boxes 중 ground truth와 유사한 IoU를 갖는 anchor boxes들에 대해서만 학습을 진행하게 되는데요. 이러한 방식을 위해서 jaccard overlap 방식을 사용해요. (SSD 논문에서는 threshold=0.5로 설정했습니다)


만약 이러한 조건이 없다면 무수한 anchor boxes에 대해서 학습할 것이고 negative examples, positive examples 비율도 맞지않고, 학습시간도 굉장히 오래걸리기 때문에 학습자체가 매끄럽게 되지 않을거에요.


<사진4. jaccard overlap>


추가적으로 jaccard overlap이 0.5 이상이라고 하더라도 분명 negative example이 존재할 수 있을거에요. 아래그림을 예를 들면 하나의 cell에 생성된 IoU가 0.5 이상인 anchor boxes가 2개 인데요. 2개를 비교했을 때 상대적으로 한 anchor box의 이미지는 negative example이라 할 수 있고, 다른 한 이미지는 positive example이라 할 수 있을거에요.

<사진5>


SSD에서는 jaccard overlap을 통해 선별된 anchor boxes들 중에서 가장 높은 confidence loss를 기준으로 positive example과 negative example의 비율을 3:1로 나누게 됩니다. (Confidence loss는 아래에서 설명할거에요~)





2-2) bounding box regression


먼저 bounding box 좌표에 대해서 학습하는 방식에 대해서 설명드릴게요.



아래식은 위의 notation만 이해하고 있으면 어렵지않아요. 아래 식들은 Faster RCNN에서의 bounding box regression 식과 대조해보면 급방 이해하실 수 있으실거에요.



또한 선별된 default(anchor) box와 class의 관계를 기반으로 아래와 같은 confidence loss를 도출하게 됩니다. (Pos: positive examples, Neg: Negative examples)



이렇게 confidence score와 bounding box 좌표식을 이용해 bounding box regression 식을 만들게 됩니다.






<4. Result>









[논문 래퍼런스]

SSD: Single Shot MultiBox Detector/ wei. L. et al/ 2016/ https://arxiv.org/pdf/1512.02325.pdf


[글 래퍼런스]

https://m.blog.naver.com/sogangori/221007697796


[사진 래퍼런스]

사진1

https://m.blog.naver.com/sogangori/221007697796

사진2

https://twitter.com/KirellBenzi/status/1039521626025541632

사진3

https://www.shutterstock.com/fr/video/clip-1013815781-people-animation-walk-video-transparent-background

https://geekgirljoy.wordpress.com/2017/10/02/ancestor-simulations-elementary-cellular-automata/

https://www.dreamstime.com/stock-photography-crocodile-cartoon-illustration-image34607912

사진4

https://medium.com/@smallfishbigsea/understand-ssd-and-implement-your-own-caa3232cd6ad

사진5

https://mypetlife.co.kr/wiki/%EA%B3%A0%EC%96%91%EC%9D%B4-%EB%94%B8%EA%B8%B0-%EB%A8%B9%EC%96%B4%EB%8F%84-%EB%90%98%EB%82%98%EC%9A%94/

'Deep Learning for Computer Vision > Object Detection (OD)' 카테고리의 다른 글

14. Object Detection Trend (2019~2021.08)  (7) 2021.09.12
13. YOLO V3  (0) 2021.08.26
10. YOLO V2  (4) 2020.02.06
9. YOLO V1  (4) 2020.02.06
8. Faster RCNN  (1) 2020.02.06

안녕하세요~


이번글에서는 YOLO V1을 업그레이드한 버전인 YOLO V2에 대해서 알아보도록 할거에요.


YOLO V2 논문에서는 YOLO V1을 3가지 측면에서 업그레이드 시켜서 논문 제목을 Better, Faster, Stronger이라고 지었는데요. 이번에는 Motivation을 따로 나누지 않고 3가지 측면을 통해 어떤 motivation이 있었고 어떠한 방법으로 해결했는지 알아보도록할거에요!





<1. Better>


YOLO V1이 이전 object detection 모델보다 속도는 굉장히 빨라졌음에도 불구하고 정확성(mAP)측면에서는 다소 아쉬움을 나타내고 있었어요. 특히 recall과 localization 성능이 낮았다라고 언급하고 있는데요. Recall이 낮았다는 말은 7x7x2 개의 bounding box에서 객체를 찾는것이 어려웠다는 뜻이고 (recall에 대한 설명은 여기 링크를 참고해주세요), Faster RCNN에서 생성하는 bounding box개수가 현저히 적기때문에 recall 성능도 낮을 수 밖에 없었어요.



논문에 언급한 "Better"의 의미는 YOLO V1보다 정확성(mAP)가 더 좋아졌다는 뜻으로 쓰였는데, 어떤 방법들을 이용해 recall과 localization 성능을 높였는지 알아보도록 할게요.




1) Batch Normaliation


YOLO V1에서 사용되고 있는 convolution layer에 모두 batch normalization을 적용시켜 mAP 2% 성능향상을 기록했어요.


Batch normalization에 대한 설명은 여기 링크를 참고해주세요.






2) High resolution classifier


YOLO V1에서 feature extraction 목적으로 사용된 CNN모델은 VGG 16 기반이에요 (YOLO V1은 중간중간 1x1 conv도 적용시켰기 때문에 온전한 VGG 16을 사용했다고 보긴 어려워요). VGG 16은 보시다시피 224 image로 resizing되어 학습을 하기 때문에 224x224 image에 대한 객체를 classification하는데 최적화되어 있어요.



<사진1. VGG 16 구조>


그런데 아래 YOLO V1을 보면 detection을 위해 input image size가 두 배더 커진것을 볼 수 있죠? 이렇다보니 448x448 image에 익숙하지 않았던 (YOLO V1에 사용된) VGG 16 기반의 CNN 모델이 detection에서는 성능저하를 일으키게되요. 



그래서 YOLO V2에서는 imageNet의 dataset에서 448x448 이미지들을 다시 학습시켜 fine-tuning 해주었는데요. 기존 224x224 보다 high resolution인 448x448 image에 대한 CNN (classification network; classifier) 모델을 재학습시켜주려고 했어요. 


YOLO V2에서는 YOLO V1과는 달리 VGG Net 기반의 모델을 사용하지 않고 자체적으로 만든 CNN 모델을 사용했는데요. 그 모델 이름이 "darknet 19"에요. (사실 darknet 19는 'Faster'라는 섹션에 있는데 여기서 설명을 해도 될 듯 싶어요)


Darknet은 19개의 layer로 구성되어 있기 때문에 논문에서는 darknet 19라고 통칭하고 있어요. Darknet 19는 처음에 224x224에 대한 imageNet dataset을 학습시키고난 후, 448x448 이미지에 대해서 재학습 시켜주어 fine tuning해주어요. 이때 learning rate를 더 적게 설정해 주는데 그 이유에 대해서는 명확한 언급이 없었어요. (그냥 empirical한 결과라고 이해하고 있어요)



Darknet 19를 이용한 결과  4% mAP 성능 향상을 볼 수 있었습니다.




3) Anchor Boxes


YOLO V2에서는 기존에 사용했던 FC layer 방식을 쓰지 않고 Faster RCNN에서 사용한 RPN방식을 사용하는 실험이 있어요. 그런데, 나중에 결과를 보면 Anchor Boxes를 사용하지 않은 경우에 mAP 성능이 더 좋았고 achor boxes를 사용하지 않은 기존 모델을 결과표에서 최종 모델로 보여주고 있어요.





논문을 읽다보면 anchor boxes를 사용하게되면 recall이 굉장히 향상되기 때문에 미래에 더 발전될 여지가 있다고 언급하는 부분이 있어요 (왜냐하면 recall이 높다는건 객체가 검출될 확률이 높으니까 mAP도 더 높게 나올 가능성이 있는거니까요).


그런데 문제는 결과표는 anchor boxes를 사용하지 않은걸 기준으로 올려 놓았기 때문에 논문에서 'yolo v2''라고 언급된 부분들을 anchor boxes가 포함된 모델로 봐야하는건지, 포함되지 않은 모델로 봐야하는건지 잘 모르겠어요. 그리고, anchor boxes를 사용하면 당연히 yolo v1보다 fps가 더 증가할거라고 생각하는데 그 부분에 대한 언급도 없는것 같았어요 (abstract에서 fps 성능을 보여주는 yolo v2는 anchor boxes를 적용시키지 않았을때의 모델 갔았어요).


정확한 판단을 위해서는 코드를 직접 들어가서 봐야겠지만, 논문만 보면 기냥 기존 yolo v1 구조에서 FC layer만 제거하고 conv layer를 추가해 13x13x30 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!작성중!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!



3-1) Convolutional with Anchor Boxes


Faster RCNN의 RPN 구조를 보면 convolution 연산을 통해 RoI를 추출하는 작업을해요.  



YOLO V1은 x,y,w,h 값을 랜덤하게 설정해주고 직접 최적화된 값을 찾아가도록 학습하지만, Faster RCNN은 사전에 anchor box 9개를 설정해주고 그에 따른 x,y, aspect ratio (offset)값과 object confidence score를 계산하면 되는 구조이기 때문에 훨씬 간단하게 학습할 수 있죠 (예를들어, 아무것도 모르는 상태에서 정답을 찾아가는것 보다 어느정도 틀이 갖추어진 상태에서 정답을 찾아가는것이 더 쉽겠죠?). 


<사진2>


YOLO V2에서는 Faster RCNN과 비슷한 region proposal 방식을 사용합니다. Anchor box를 미리선정하고 사용하기 때문에 MLP 방식으로 bounding box coordinate를 추론할 필요가 없어 FC layer를 사용하지 않고 RPN과 비슷하게 convolution layer를 사용하게 됩니다. 논문에서는 5, 9개의 anchor box를 설정하고 실험을 진행했어요 (자세한 부분은 뒤에서 설명드릴게요). 


위에서 darknet 19 (=for classification)를 학습시킬 때는 448x448 이미지를 학습시킨다고 했죠? 하지만 detection을 진행할때는 입력이미지가 416x416으로 바뀌어요. 그 이유를 설명하면 아래와 같아요.


먼저 제일 마지막 pooling layer 이후를 모두 지워줍니다. 그 이유는 7x7 grid cell은 너무 크기가 작기 때문에 사실상 low resolution 상태에서 detection하는것과 같아요. 또한 YOLO V1 에서 적용한 bounding box 개수를 보면 7x7x2 = 98 개인데, 이 개수가 recall 관점에서는 터무니 없이 적은 bounding box 개수라는걸 확인할 수 있어요. 그래서 anchor box 개수를 5개로 설정하여 기존보다 3개 더 많은 bounding box를 설정해주고, 7x7 보다 더 큰 feature map size (higher resolution) 인 13x13 (어떻게 13x13이 되는지 뒤에서 설명) 로 설정하게 되면 13x13x5 = 845 개의 bounding box를 사용할 수 있기 때문에 더 많은 recall을 얻을 수 있었어요. 하지만 mAP 성능에서는 오히려 더 낮은 mAP를 기록했다고 합니다.



YOLO V2에서는 output feature map이 짝수x짝수가 되는게 좋지 않다고 생각했는데요. 그 이유는 보통 물체가 이미지의 중앙에 있는 경우가 많다보니 홀수x홀수 로 최종 output feature map을 설정해주는게 더 좋다고 합니다. 그래서 14x14가 아닌 13x13으로 맞춰주기 위해서 448x448을 416x416으로 변경해주었다고 하네요.


        



아래그림이 detection시 사용되는 YOLO V2구조의 앞부분이라고 보시면 됩니다.


<사진3. YOLO V2 구조 for detection>



3-2) Dimension Clusters


Faster RCNN에서 사용한 anchor box는 사전에 aspect ratio와 size를 달리하여 9개의 숫자로 미리 정해주었어요 (hand pick). YOLO V2에서는 anchor box를 적용시킬때 단순히 aspect ratio, size를 통해 미리 정해준 anchor box를 사용하는것이 문제가 있다고 판단했어요.


그래서 "we run k-means clustering on the training set bounding boxes to automatically find good priors"라고 언급했는데요. 이 이야기는 training dataset에 있는 ground truth bounding boxes에 k-means clustering 방법을 사용하여 최적의 anchor boxes를 찾겠다는 뜻이에요.


K-means clustering은 본래 euclidean distance를 사용하여 구하는데요. 아래 예시를 한 번 살펴볼게요. 

먼저,

step1. k=3이라고 설정을 하면 임의의 data 3개를 지정합니다. 그리고 각 3개의 데이터를 기준으로 3개의 다른 영역들을 구성하게되죠. 

step2. 3개의 다른 영역을 나눌때, 지정된 3개의 data에서 가장 가까운 (euclidean distance 이용) data들을 계산해 각각의 그룹을 형성합니다.

step3. 해당 그룹내에서 데이터들간의 위치를 계산하여 그룹내에서 평균을 냅니다. 그리고, 그 평균을 기준으로 step2의 방식을 적용하여 다시 3개의 그룹을 형성하게되죠.

step4. step2~3을 반복하다보면 최적화된 clustering을 만들게 됩니다.


<사진4>


그런데 최적의 anchor box를 찾을때 euclidean clustering 기준으로 k-means clustering 방식을 적용하면 문제가 생깁니다.


아래 그림에서 파란색 부분은 ground truth bounding box라고 하고, 빨간색 부분은 예측된 anchor box라고 할게요. 아래 왼쪽 그림을 봤을 때, bounding boxes가 비슷함에도 불구하고 중심점끼리의 차이가 많이 나기 때문에 예측된 anchor box는 실제 ground truth와 유사함에도 불구하고, 무시되거나 같은 group이라고 보지 않을 가능성이 많아요. 반면에 euclidean distance를 기준으로 grouping을 하면 아래그림의 중간, 오른쪽과 같이 ground truth와 전혀 엉뚱한 anchor boxes이 grouping될 확률이 높아집니다.



그래서 논문에서는 IoU개념을 이용해서 distance metric라는 방식을 제안했는데요. 다시말해, K-means clustering 방식을 적용하여 최적의 anchor boxes를 추출할때, euclidean distance가 아닌 IoU를 적용한다는 뜻이에요. 



IoU를 기준으로 하여 clustering을 적용하면 training dataset에 있는 ground truth bounding boxes들의 평균을 잘 계산해주어 더 좋은 anchor boxes를 추출할 수 있게 됩니다.









3-3) Direct location prediction


RCNN에서  bounding box regression에 대해서 설명드린바있죠? (링크)


Fast RCNN, Faster RCNN 모두 같은 bounding box regression 식을 이용하는데요. 짧게 설명드리면 d함수를 학습시켜 P (predicted bounding box)의 (x,y,w,h)를 조정해주는거에요.



그런데 문제는 d라는 함수에 제한이 없기 때문에 predicted bounding box가 아래와 같이 하나의 cell을 벗어나 형성될 수 있게되는데요. 특히 초기에는 d함수가 학습도 제대로 되어 있지 않기 때문에 문제가 더 심각할거에요.



그래서 아래와 같은 방식으로 bounding box regression 식을 변경시켜주었는데요. 아래의 notation을 먼저 설명해드리면 아래와 같아요. 




위의 수식에서 중요한건 시그모이드 함수와 tx, ty tw, th에요.


YOLO V2는 5개의 anchor boxes를 적용시킨다고 말씀드렸죠? 5개의 anchor boxes 각각의 좌표를 tx, ty, tw, th라고해요. 그래서 Faster RCNN에서는 d함수를 학습시켰다면, YOLO V2에서는 t에 대해 학습을 시켜주게 됩니다. 


Ground truth 좌표값과 predicted anchor box에 속하는 t가 서로 regression하면서 b와 ground truth의 차이가 0이 되게 수렴하는 predicted anchor box 't'가 학습이 될거에요. 그런데 시그모이드 함수를 적용하지 않으면 predicted anchor box는 Faster RCNN에서 제기된 문제처럼 cell의 아무곳에서나 생성될거에요.


그런데 sigmoid function을 적용해주면 tx, ty의 범위가 0~1로 바뀌기 때문에 predicted bounding box가 초기에 그려지는 범위가 해당 cell 영역에 제한될거에요. 이렇게 된다면 초기 학습에 시간을 낭비할 필요도 없고, 더 좋은 anchor box를 그려주도록 할거에요.





YOLO V2는 이러한 anchor boxes 방식 (위에서 언급한 3가지 기술)을 적용시켰을 때 5%의 성능향상이 되었다고 기술했어요 (그런데 이 성능이라는 것이 mAP를 말하는건지, 단순히 recall을 말하는건지 잘 모르겠네요;;;;)





4) Fine-Grained Features


상대적으로 작은 feature map에서는 작은 크기의 객체에 대한 localization 작업이 힘들수 있어요. 그래서 조금 해상도를 높여 (feature map size를 증가시켜) 작은 객체또한 잘 detection할 수 있도록 하기위해 고안된 방법이 fine-grained features에요 (사실 이 기술은 SSD object detection에서 주로 사용된건데 다음글에서 SSD에 대해 설명하도록 할게요!)




YOLO V1과 달리 YOLO V2의 최종 output feature map은 13x13의 크기를 갖고 있는데요. 이러한 13x13 output feature map보다 조금 더 큰 26x26 output feature map 위에서 bounding box 작업을 진행하게 됩니다.





아래와 같이 최종 feature map에서 적용한 13x13x512의 channel수를 기준으로 26x26에서도 같은 channel수를 유지하여 13x13 output feature map에서 다루어지는 정보들 (512)와 동일하게 설정해주되, 26x26에서는 4등분을하여 적용시켜주게 됩니다.


<사진5>


<사진6>


그렇다면 최종적으로 아래와 같은 YOLO V2 구조를 생각해 볼 수 있겠네요.



마지막 13x13x125에서 125의 의미는 YOLO V1과 동일하게 생각하면 되실것 같아요. YOLO V1은 classification과 localization이 동시에 적용되기 때문에 2개의 bounding box가 각각의 cell에 대해 classification 결과를 공유했는데요. YOLO V2에서 anchor box를 적용시켰을때에는 각각의 anchor box에 대해서 classification 정보를 갖고있다보니 아래와 같이 하나의 anchor box에 대해 25가지 정보를 구성하게 되었어요. 그래서 총 5개의 anchor boxes를 적용했다고 가정했을 때 하나의 cell에서 총 5x25 =125개의 정보를 갖고 있게 되기 때문에 125개의 channel을 사용하게되요.



아래그림을 보면 125 channel에 대해 gray scale로 visualization한 것을 볼 수 있는데요. 하나의 anchor box에 25개의 정보가 담겨져있고, 앞부분 5개는 anchor box정보(x,y,w,h and object confidence score)이고, 뒷 부분은 20개의 classes에 대한 activation map을 보여주고 있어요.


<사진7>




<사진8>


지금까지 방식을 적용시켰을때 기존의 YOLO V1보다 더 좋은 성능을 기록하게 되었어요.





5) Multi-Scale Training


추가적으로 YOLO V2는 하나의 image scale에 대해서만 학습시키는 것이 아니고 다양한 image scale에 대해서 학습을 시켜요. 


논문에서 제시한 방식은 320, 320+32=352, 320+32*2=384, ..., 320+32*9=608 의 이미지로 training 시키려고 했는데요. 32씩 증가시킨 이유는 YOLO가 본래 이미지 사이즈에서 1/32 만큼 줄인 output feature map을 추출하기 때문이에요. YOLO V2는 10 batches 마다 input size를 변경시켜 학습을 시키게 됩니다.




이렇게 multi-scale로 학습시켰을때 아래와 같은 결과를 얻을 수 있었어요. Test 단계에서 input size를 다르게 설정할 수록 mAP와 FPS의 성능이 변하는걸 알 수 있어요. 당연히 output feature map의 size가 달라지기 때문에 anchor boxes 수도 달라질 거고, 그에 따라서 mAP, FPS 성능도 달라질거에요.







<2. Faster>


지금까지 YOLO V2가 변한 과정을보면 여러 기법들이 사용되었고 동시에 anchor boxes가 사용되었다는 점이에요. 그런데 생각해보면 faster RCNN과 유사한 anchor boxes 개념을 사용하게되면 FPS 성능이 YOLO V1보다 더 나빠져야 하는데, 더 좋아진 이유는 무엇일까요?



1) Darknet 19


YOLO V2가 더 빨라진 이유는 CNN 모델로 쓰인 darknet 19에 있어요. 기존 YOLO V1과 다른점은 FC layer를 제거했다는 점이에요. YOLO V1에서 쓰인 구조를 잠시보면 FC layer에서 7x7x1024x4096+4096x7x7x30이라는 weight가 사용이되요. 거의 YOLO V1에서 쓰이는 대부분의 가중치가 FC layer에 국한되어 있다고 보시면되요.



하지만 YOLO V2에서는 FC layer를 제거함으로써 가중치 파라미터수를 급격하게 낮췄기 때문에 더 빠른 속도로 detection이 가능하게 되었어요. 이것을 가능하게 했던 또 하나의 이유는 global average pooling이라는 기술인데요. Darkenet 19에서는 7x7x1024 feature map에 1x1x1024 conv filter를 1000개 적용시켜, 7x7x1000개를 만들어줘요 (1000개가 뜻하는바는 imageNet dataset의 class가 1000개 이기 때문이에요. 즉, 1000개의 classes에 대해서 classification 하겠다는것이죠. 그리고 나서 7x7x1000 feature map에 대해서 global average pooling을 하게되면 YOLO V1에서 언급했던 7x7x1024 feature map 이후에 사용된 가중치는 1x1x1000 이 됩니다 (YOLO V1:  7x7x1024x4096+4096x7x7x30  VS  YOLO V2: 1000). 실제 detecetion에서는 크기도 13x13 feature map으로 바뀌고 26x26 feature map과 concatenation하는 부분이 있어 가중치가 개수가 조금 달라지지만 여전히 FC layer와는 비교도 안되는 수의 가중치 개수를 갖게됩니다.



<사진9>






<3. Stronger>


논문 제목을 보면 YOLO9000이라고 되어있죠? 왜 9000이라는 숫자를 제목에 붙였을까요? YOLO V1은 pascal VOC dataset에서 제공되는 20개의 classes를 기준으로 학습하기 때문에 20개의 classses에 대해서밖에 detection을 하지 못했어요. 하지만 YOLO V2에서는 9000개의 classes에서 detection을 할 수 있도록 해주었는데요. 이러한 놀라운 성과를 갖었기 때문에 논문제목을 YOLO9000이라고 붙였어요.



이 부분에 대해서는 자세하게 언급을 하진 않으려고 합니다. 이유는 Object detection 모델 아키텍처를 구성하는데 필요한 지식이 아니고 단지 detection하는 label을 어떻게 늘릴 수 있는지에 대해서 설명한 것이기 때문이에요 (아 물론 output feature map의 size가 달라질수는 있겠네요). 간단하게 이야기하면 ImageNet dataset에는 2만개 넘는 라벨링이 있는데요. 그 중에서 9000개를 가져오고 COCO dataset에서 대략 300개 정도되는 라벨을 갖고와서, 약 9300개의 classes에 대해서 detection할 수 있도록 구성하게 됩니다.



지금까지 YOLO V2에 대해서 알아보았어요. YOLO V3를 설명하기 전에 SSD라는 object detection 모델을 설명하려고 하는데요. 그 이유는 YOLO V3에서 사용된 중요한 개념중에서 SSD에서 쓰인 방식이 적용된 부분이 있기 때문이에요 (paper 순서는 YOLO V1 -> SSD -> YOLO V2 입니다) ~


그럼 SSD 모델에서 뵐께요~



[논문 래퍼런스]

YOLO9000: Better, Faster, Stronger/ Joseph. R/ 2017/ https://arxiv.org/abs/1612.08242


[사진 래퍼런스]

사진1

https://bskyvision.com/504

사진2

https://towardsdatascience.com/yolov1-you-only-look-once-object-detection-e1f3ffec8a89

사진3

https://www.researchgate.net/figure/The-architecture-of-YOLOv2_fig4_336177198

사진4

https://en.wikipedia.org/wiki/K-means_clustering

사진5

https://www.slideshare.net/JinwonLee9/pr12-yolo9000

사진6

https://www.etsy.com/il-en/listing/692367997/dog-brick-puzzle-boxset-size-26x26-cm

사진7

https://www.youtube.com/watch?v=vw1R5JXvXi0&feature=youtu.be

사진8

https://www.researchgate.net/figure/4-Number-of-images-for-each-class-in-PASCAL-VOC-2007-dataset_tbl3_257998995

사진9

https://towardsdatascience.com/review-nin-network-in-network-image-classification-69e271e499ee

'Deep Learning for Computer Vision > Object Detection (OD)' 카테고리의 다른 글

13. YOLO V3  (0) 2021.08.26
11. SSD  (3) 2020.02.06
9. YOLO V1  (4) 2020.02.06
8. Faster RCNN  (1) 2020.02.06
7. Fast RCNN  (2) 2020.02.06

안녕하세요~ 


지난번 글까지는 RCNN 계열 (RCNN - Fast RCNN - Faster RCNN)에 대해서 알아보았어요. 


이번글부터는 새로운 object detection 방식인 YOLO에 대해서 알아보도록할게요. 자세히 보시고 Faster RCNN과 어떤차이가 있는지 살펴보시면 좋을거 같아요!





<1. Motivation>


1) Low FPS


Faster RCNN 논문에서 언급된 fps 성능은 5fps에요. Detection 성능인 mAP는 높은 수준을 유지하고 있지만 낮은 fps 성능 때문에 real-time (30fps) 수준에 한참 미치지 못하는 결과를 볼 수 있었어요.



Faster RCNN의 순서도를 보면 아래와 같다고 할 수 있는데요. classification을 하려면 RoI를 먼저 선행되어야 한다는 단점이 있어요. 그러다보니 'detection 성능은 조금 떨어뜨리더라도 높은 fps 성능을 갖는 object detection 모델을 구현해볼 수 없을까?'라는 질문을 하게 됩니다.



그래서 만든 object detection 모델이 YOLO에요. YOLO의 architecture를 먼저 간단하게 보시면 아래와 같은데요. Faster RCNN과 달리 Bounding box를 선별하는 localization 작업과, classification 작업이 동시에 수행되어 최종 detection 결과를 보여주는걸 보실 수 있어요. 



결과적으로 아래와 같은 구조차이로 인해 YOLO의 fps가 더 높게 나올 수 있게 됩니다.



그럼 지금부터 YOLO가 어떻게 동작하는지 디테일하게 알아보겠습니다.








<2. Architecture>


Step1 - Feature map(Grid Cell) extraction


다른 Object detection 모델처럼 CNN을 통해 feature map (=SxS)을 추출합니다. 논문에서는 7x7의 feature map을 추출했고, feature map을 grid cell이라는 용어를 사용하여 표현합니다. 왜 7x7이냐라는 질문에는 명확한 답을 내놓을것 같지는 않고 단지 empirical result일거라는 생각이 드는데요. 



Grid cell의 기준을 홀 수 (=7) size로 선정한 이유는 대부분 이미지에서 물체들이 중앙에 위치할 확률이 높기 때문인거 같고, 7x7 보다 크거나 작은 홀 수 size로 설정한 수 있지만 7x7보다 크면 더 많은 bounding box가 생성되기 때문에 fps성능이 떨어질것이고, 7x7보다 작으면 더 적은 bounding box가 생성되기 때문에 mAP 성능이 낮아질것이라고 추측되기 때문에 실험적으로 제일 적당한 사이즈를 찾은게 아닌가 싶어요.


<사진1>

 

또한 YOLO는 Conv layer를 적용시킬 때, 1x1 conv filter를 이용하여 channel reduction을 수행하였고, 이를 통해 연산의 효율성도 증가시키게됩니다. GoogLeNet의 아이디어에서 영감을 받았다고 하네요. (아래 filter notation이 혼동이 될 수 있는데, 첫 번째 layer를 보면 실제로 7x7x3 filter를 64개 적용한 모습이라고 한다면 그 다음 layer의 filter notation을 이해하실 수 있으실거에요)


한 가지 의아한점은 x4, x2로 반복되는 구조가 있는데 이 부분을 쓴이유는 대게 non-linearity를 증가시키기 위해서일텐데, 이게 과연 얼만큼의 효과를 내고 있는건지는 모르겠네요. 오히려 불필요한 반복으로 parameter가 많아진거면 overfitting의 역효과를 불러 일으킬 수 있을거 같기도 하거든요 (뭐 제가 제기하고 있는 질문들도 충분히 고려해서 여러 실험을 진행한거라고 믿고 있습니다만.) 그리고, FC layer도 굳이 두어야 했나라는 의문도 들게 되는데요. SSD라는 모델은 나중에 FC layer제거한 object detection 모델을 만들게 됩니다 (이 부분은 SSD모델을 다룰때 더 자세히 설명드릴게요!) 









Step2 - Bounding box & Classification information 구축 (7x7x30 Grid cell)






YOLO V1에서는 각각의 Grid cell에서 2개씩 bounding box를 생성 (= predicted bounding box = RoI)시켜요. 이과정에서 bounding box 정보(x,y,w,h)와  confidence score정보를 생성하게되는데요. 


x,y: 각각의 cell 안에서의 위치 

(cell 위치내에서 가운데에 있을수도 있고, 약간 오른쪽으로 이동할 수 있음, 아래그림에서 초록색 점이 cell위치 x,y를 의미)

w,h: bounding box의 높이와 넓이

confidence score: bounding box에서 object가 포함되어 있을 확률 (어떤 class에 속하는지를 말해주는것이 아닌 단지 bounding box내에 객체가 포함되어 있는지 아닌지 추론)


(Training시에 predicted bounding box와 입력데이터에 포함되어 있는 ground truth들의 IoU에 따라 학습이 진행되는데요. 이렇게 학습하다보면 neural network가 object라고 하는 녀석들의 특성을 파악하게 될거에요. 그렇게 학습된 neural network가 test시에 적용되어 bounding box내에서 object가 있는지 없는지에 대한 확률값을 생성하게 됩니다 -> 학습 과정은 뒤에서 자세히 설명할게요~) 




동시에 각 cell이 어느 classes(categories)에 속해있는지 classification 작업을 해줍니다. 이때 각 cell의 확률값은 조건부 확률로 주어지는데 즉, 객체가 있을 확률에 대해 어떤 클래스일지 판단하는 확률값입니다 (극단적으로 이야기하자면 객체가 있을때 그 객체가 어떤 클래스인지 판단하는 조건부 확률이라고 보시면 되겠네요)


 

이러한 과정을 하나의 그림으로 설명할 수 있는데요. 아래와 같이 각각의 cell에는 총 30개의 정보가 담겨져 있어요. 앞에서 말했듯이 하나의 bounding box에 대한 좌표정보(=x,y,w,h)와 confidence(=P(object))정보가 총 2개 (=2x5) 들어있고 (bounding box는 각 cell마다 2개씩 생성되기 때문에), 나머지 20개의 정보는 Pascal VOC challenge가 20개 class에 대해서 detection작업을 하는것이기 때문에, 20개의 class에 대한 classification 확률값을 담게 됩니다.


<사진2>


<사진3>





Step3 - NMS (Non Maximum Suppression)


Bounding box정보((x,y,w,h), P(object))와 classification 정보(P(class|object))를 담고있는 grid cell을 구축했으니 grid cell을 이용한 최종 detection 작업순서를 설명드릴게요.





7x7 grid cell 각각에 대해서 2개의 bounding box 정보와 20개의 classification 정보가 담겨있어요. 그리고 두 개의 정보가 어떻게 이용되는건지 아래와 같이 나와있어요. 


먼저, 첫 번째 cell에서 얻고자하는 결과는 20x1 tensor에요. 20x1 tensor에는 해당 cell에서 20개의 class에 대한 score(확률값)을 알려줍니다. Class에 대한 score(확률값)은 아래와 같은 과정을 통해 얻을 수 있어요.




<사진4>


각 cell에 대해서 위와같은 작업을 모두 진행하면 아래와 같은 결과를 얻을 수 있게 됩니다.


<사진5>


위에서 얻은 정보를 통해 detection하는 과정에 대한 설명을 아래의 그림으로 대체하겠습니다.


<사진6>


위와 같은 작업이 끝났다면 최종 마무리 작업을 하게 됩니다. 


- 특정 cell 위치에 해당하는 하나의 bounding box에서 가장 높은 score(확률값)을 갖는 class를 골라줍니다. 

- 특정 cell 위치에 해당하는 하나의 bounding box에서 가장 높은 score(확률값)이 0이 넘는다면 선택된 class와 매칭되는 color와 score를 그려줍니다.


<사진7>


아래 그림은 최종 detection 결과입니다.


<사진8>





<3. Training>


YOLO의 cost(loss) function은 아래와 같이 여러 요소들에 대한 regression 문제들을 전부 더하기 연산으로 통합시킨것을 볼 수 있을거에요. 즉, localization문제(=localization regression)와 classification문제(=classification regression)를 하나로 통합한 하나의 regression 모델을 만들었다고 볼 수 있는데, 이때문에 'You Only Look Once (for detection)'이라는 명칭이 붙여졌습니다.



위의 여러 regression에 대해서 알아보기 전에 기본적인 hyperparameter에 대해서 알아보도록 할게요. 

1이라고 표기된 부분은 ground truth와 predicted bounding box (RoI)의 IoU를 기점으로 객체가 포함되어 있는지 여부를 알려주는 함수라고 생각하시면되고, 람다라고 표기된 부분은 객체가 포함되어 있다면 5라는 learning rate을 주는 개념으로 알고있으면 될 것 같습니다. 이렇게 5, 0.5로 구성한 이유는 대게 7x7 cell 중에 객체가 아니라고 하는 cell이 더 많을 텐데 이러한 cell들에 대해 학습을 진행하다보면 negative example에 대해서만 neural network가 학습할 가능성이 큽니다. 즉, 우리가 원하는건 해당 객체 (positive example)에 대한 detection이지 negative example에 대한 detection이 아니기 때문에 아래와 같이 learning rate 값을 다르게 주게 됩니다.




1) Regression of bounding box


1-1) Regression of bounding box coordinate in a cell 


먼저 bounding box의 중점이 되는 좌표값에 대한 regression 식이에요. 결과부터 말씀드리자면 학습을 통해 아래 그림처럼 빨간색 좌표에서 초록색 좌표로 이동하는 것을 볼 수 있어요.


아래식을 해석하자면 i번째 cell에 속하는 j번째 bounding box에서 ground truth가 존재한다고 했을때 (존재 여부는 predicted bounding box와 ground truth의 IoU가 기준이 됩니다), ground truth의 x,y좌표와 predicted bounding box의 x,y좌표에 대해 regression을 진행합니다.





1-2) Regression of bounding box width and height in a cell


위와 동일한 개념이지만 루트를 씌워준 이유는 아래와 같습니다.

하나의 cell 안에서 ground truth와 predicted bounding box의 차이가 많이 나봤자 하나 cell 영역범위에 제한적이다보니 차이값이 크게 나지 않습니다.


논문에서는 small deviation in large boxes 라고 표현했는데요. 명확하게 이해되지 않는 부분이 있어서 아래와 같이 제 생각을 정리해봤어요. (설명이 틀릴수 있으니 주의해주세요!)


하지만 bounding box의 width, height의 넓이는 cell의 범위와 다르게 다양하게 형성될 수 있어요. 즉, 생성된 predicted bounding box가 큰 객체의 ground truth와 비교했을때는 굉장히 큰 error값이나오고, 작은 객체의 ground truth와 비교했을때는 상대적으로 작은 error 값이 나올 수 있어요. 그러다보면 큰 object 위주로 학습을 할 가능성이 있기 때문에, 루트를 씌워죠 이러한 문제를 피하고자 한거같아요.






2) Regression of bounding box score prediction


2-1) Regression of bounding box score prediction when there is object in a cell


Predicted bounding box가 학습에 따라 변하면 ground truth와 비교해가면서 특정 cell에 bounding box가 존재하는지 (confidence score)를 학습하게 될거에요.



아래와같은 cost function으로 인해 점점 bounding box는 ground truth에 근접하게 이동하도록 유도 될거에요.


2-2) Regression of bounding box score prediction when there isn't object in a cell


각각의 cell에 대해서 predicted bounding box와 ground truth를 비교하다보면 IoU가 현저하게 낮게 나오는 경우가 있어요. 이럴때는 보통 해당 cell에 객체가 없다고 판단하는데요. 이러한 negative example에 대해서는 learning rate를 굉장히 낮게주어 positive example 위주로 학습이 되도록 방햐을 설정해줘요.




3) Class score prediction


마지막으로는 classification 작업에 대한 regression이에요. Training 이미지 데이터에는 특정 cell에 어떤 class가 있는지 알 수 있어요. 만약 학습 이미지를 입력받았을때, i번째 cell에서 20개의 클래스 중 j번째 클래스에 속해 있다고 하면 아래와 같이 표현할 수 있을거에요.



CNN이 학습이 잘되었다면 해당 cell에서 ground truth가 아닌 class에 대해서는 0과 가까운 값을 도출할거에요. 그래서 해당 cell에서 ground truth인 class에 대해서는 p^값을 점점 높여주는 방향으로 학습할거고, ground truth가 아닌 class에 대해서는 점점 낮은 방향으로 p^값을 업데이트 해줄거에요.



지금까지 설명드린 내용을 요약하면 아래의 그림으로 보여드릴 수 있을 것 같아요.








<4. Result>








YOLO V1은 Real-time을 실현시켰다는 획기적인 성과가 있었지만, 정확도 (mAP) 측면에서는 기존 object detection model (Faster RCNN) 보다는 낮게 나오기 때문에 문제가 되었습니다.


다음장에서는 이러한 문제점을 개선한 YOLO V2에 대해서 알아보도록 하겠습니다.




[논문 래퍼런스]

You Only Look Once: Unified, Real-Time Object Detection/ Joseph. R/ 2016/ https://arxiv.org/abs/1506.02640


[글 래퍼런스]

https://curt-park.github.io/2017-03-26/yolo/


[사진 래퍼런스]

사진1

http://codexbaram.com/%EB%A9%94%ED%83%80-%EC%A7%80%EC%8B%9D-%EB%82%AF%EC%84%A0-%EC%9D%B4%EB%AF%B8%EC%A7%80/

사진2,4

https://www.slideshare.net/xavigiro/object-detection-d2l4-2017-upc-deep-learning-for-computer-vision

사진3

http://openresearch.ai/t/yolo-you-only-look-once-unifed-real-time-object-detection/67

사진4

https://pylessons.com/YOLOv3-introduction/

사진5,6,7

http://blog.naver.com/PostView.nhn?blogId=sogangori&logNo=220993971883

사진8

https://sandipanweb.wordpress.com/2018/03/11/autonomous-driving-car-detection-with-yolo-in-python/

'Deep Learning for Computer Vision > Object Detection (OD)' 카테고리의 다른 글

11. SSD  (3) 2020.02.06
10. YOLO V2  (4) 2020.02.06
8. Faster RCNN  (1) 2020.02.06
7. Fast RCNN  (2) 2020.02.06
6. SPP Net  (2) 2020.02.05


안녕하세요~


이번글에서는 Fast RCNN의 업그레이드 버전인 Faster RCNN에 대해서 알아보도록 할거에요~



<1. Motivation>


Fast RCNN은 SPP-Net과 RCNN의 시간을 굉장히 감소시켰을에도 불구하고 아직도 realtime을 수행하는데 어려움이 있었습니다. Real-time을 수행하려면 "1/30초 = 30 fps"가 소요되어야 하는데 2.3초는 realtime을 수행하는데 큰 무리가 있어요. 그런데 자세히보면 region proposal을 수행하는시간이 전체 Fast RCNN을 수행하는데 대략 87(=(2.3-0.32)/2.3)%나 차지하고 있어요. 


<사진1>


Fast RCNN의 region proposal 방식인 selective search는 Fast RCNN 네트워크 내부에 있는게 아니에요. 예를들면, CNN을 통해 feature map을 추출하면 region proposal을 적용해 RoI를 추출해야 하는데 이때 selective search는 외부에서 계산된 관련정보를 Fast RCNN 네트워크에 있는 feature map에 전달해주어 RoI pooling을 적용하게 되는거에요. 


외부에서 들어오는것이기 때문에 문제가 되는것도 있지만, selective search 자체는 cpu에서 계산되기 때문에 시간소요가 굉장히 많아요. 그렇기 때문에 selective search와 같은 region proposal 방식을 바꿔주어야 할 필요성이 제기되었어요.

<사진2>





<2. Architecture>


Faster RCNN의 구조는 Fast RCNN과 유사해요. 단지 region proposal 방식이 selective search 방식에서 region proposal network (RPN) 방식으로 바뀐것 뿐이에요. 그래서 Faster RCNN 구조에서는 다른 부분은 크게 언급하지 않고 RPN이 어떻게 동작하는지를 살펴보도록 할거에요.




1) Region Proposal Network (RPN)


Faster RCNN에 CNN을 이용할때 VGGNet과 ZFNet을 이용하는데요. 여기에서는 ZFNet을 기준으로 RPN이 동작하는 방식을 설명드릴게요.



① CNN을 통해 추출한 feature map 13x13x256에 3x3x256 conv filter를 적용한다. 

② 3x3영역을 기준으로 center 지점에서 9개의 anchor box를 생성한다 (13x13 feature map을 기준으로하면 13x13x9 개의 anchor가 생성됨). 하나의 3x3 conv filter 영역에서 output으로 나오는 연산량은 256x9 이다.

③ 9개의 anchor 각각에 대해서 object가 포함되어 있는지 아닌지에 대한 classification 작업이 진행된다. 주의할점은 anchor내의 class가 무엇인지 classification하는게 아니라 객체인지 아닌지 classification을 하는작업이다. 이 작업을 마치면 output으로 나오는 연산량은 256x9x2 이다 (2= object or non object)

④ 9개의 anchor 각각에 대해서 bounding box regression을 한다. 이때 좌표정보로 4개의 요소 (x,y,높이,넓이)가 사용되기 때문에, 이 작업을 마치면 output으로 나오는 연산량은 256x9x4 가 된다.

⑤ Classificaton(object인지 아닌지)과 bounding box regression은 동시에 수행되므로 RPN의 loss function은 아래와 같이 더하기 연산으로 진행된다. 그렇기 때문에 하나의 3x3 conv filter 영역으로부터 생성되는 최종 output 파라미터수(연산량)는 256x9x2+256x9x4 가 된다. 

 

(loss function에 대한 자세한 설명은 뒤에서 할게요~)


대략적으로 아래와 같은 매커니즘을 갖고 연산이 진행되는거 아닌가라는 생각이 들어요. (더 자세한건 코드를 봐야겠지만요)









2) Translation Invariant Anchor and Multi-scale anchors


이부분은 MultiBox라는 모델에 대한 이해가 있어야 해요. 하지만 간단히 설명하면 '객체의 translation 이동이 anchor box가 이동한 객체를 찾는데 영향을 미치진 않는다' 정도로 이해하고 있으면 될 것 같네요.


<사진3>



또한 RPN의 anchor box의 특징으로는 3 different size, 3 different aspect ratio 를 적용하여 다양한 9개의 anchor box를 제공하고 있어요. 그래서 좀 더 정확한 localization 성능을 얻을 수 있게 된답니다.


<사진4>



이러한 RPN 방식을 통해서 selective search (ss) 방식보다 더 적은 RoI를 추출할 수 있게되어 시간도 굉장히 절약했고, mAP 조차도 더 높게 나왔다는 것을 볼 수 있습니다.






<사진5>








<3. Training>


먼저 RPN에서도 학습을 시키기전에 positive example과 negative example을 나누게 되는데요. Feature map 위에는 객체정보가 담긴 여러 ground truth가 있을거에요. 위의 RPN 동작 방식에서 설명드릴것 처럼 feature map위에서 3x3 conv가 이동하면서 여러 anchor들을 생성하게 되는데, 보통 하나의 ground truth 위에 여러 anchor들이 생겨날거에요. 이 중에서 IoU가 높은 순서대로 positive example에 넣고, 0.3 이하는 negative example이라고 설정합니다. (0.7 이상으로 positive example을 삼을 수 있긴한데, 만약 어떤 ground truth위에 생성된 anchor들이 대부분 0.7 미만이면 positive example이 없을 수 도 있기때문에 이런 방식은 쓰지 않았다고 해요)


아래 방식은 미니 배치 방식으로 학습시키는 RPN loss funciton을 나타내고 있어요.


의미는 RCNN, Fast RCNN의 bounding box regression가 같다고 볼 수 있고 단지 배치단위로 normalization한것만 추가 되었다고 보시면되요 (논문에서는 이런 normalization 효과가 크지 않은거 같다고 이야기 하기 때문에 그냥 RCNN, Fast RCNN에서 쓰이는 bounding box regression을 그대로 가져 왔구나 생각하시면 될거 같아요).


i: index of an anchor in a mini-batch

pi: the predicted probability of anchor i being an object

p*i: Ground truth label is 1 if the anchor is positive, 0 negative

ti: vector representing the 4 parameterized coordinates of the predicted bounding box

t*i: ector representing the 4 parameterized coordinates of the ground truth box (associated with positive anchor)

Lcls: log loss over two classes (object vs not object)

Lreg: smooth function (same with Fast RCNN Lreg) <- if p*i=0, disabled

Ncls: Mini-batch size = 256

Nreg: Nreg~2400 = the number of anchor locations





1) Sharing Features for RPN and Fast RCNN


Faster RCNN은 RPN+Fast RCNN 의 조합이라고 할 수 있어요. 

하지만, 처음부터 RPN을 처음부터 Fast RCNN 네트워크에 내장시켜 학습을 시키는건 아니에요.


처음에는 RPN과 Fast RCNN을 분리해서 학습을 시켜요.


① Pre-trained CNN model (M0)을 가져와서 RPN을 ImageNet 데이터로 학습을 시킨다. (학습된 RPN=M1)

② 학습된 RPN (M1)에서 RoI(P1)을 추출한다. 

③ Pre-trained CNN model (M0)와 RPN에서 학습된 RoI(P1)을 적용시켜 Fast RCNN를 학습시킨다. (M2=학습된 Fast RCNN)

(1~3번 과정 모두 CNN이 학습이 됨)


<사진6>


④ 학습된 Fast RCNN(M2)를 이용해 RPN을 다시 학습시킨다. (재학습된 RPN=M3)

(실제로는 Fast RCNN과 RPN은 독립적으로 학습이 됨, 하지만 이때부터 CNN은 따로 학습시키지 않음. 즉, Fast RCNN에서 사용되는 CNN을 그대로 가져와서 RPN에 적용시키는 꼴 -> feature map에서 region proposal network로 가는 filter들만 학습 -> CNN을 share하게 됨)




⑤ 재학습된 RPN에서 RoI(P2)를 추출한다.

⑥ 추출된 RoI(P2)와 재학습된 RPN(M3)을 다시 Fast RCNN에 학습을 시킨다.


CNN을 share하고 있는지 없는지에 대한 차이만 존재할 뿐 1~3번과 4~6번의 작업은 동일하다고 보시면 되요.





<사진7>







<4. Result>







지금까지 Faster RCNN을 알아보았어요. Faster RCNN 역시 RCNN 계열 (RCNN-Fast RCNN-Faster RCNN)로써 좋은 성능을 보여줬는데요. Test time을 0.2초로 줄였음에도 불구하고 아직도 real-time을 가능하게 했다고 말할 수준은 아닌거 같아요 Real-time: 1/30초 = 0.03초).


그래서 다음글에서는 real-time performance를 가능하게 한 RCNN 계열이 아닌 YOLO라는 object detection 모델에 대해서 소개할게요!






[논문 레퍼런스]

Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks/ Ross. G. et al/ 2016/ https://arxiv.org/pdf/1506.01497.pdf 


[사진 래퍼런스]

사진1,6,7

https://www.youtube.com/watch?v=kcPAGIgBGRs

사진2

https://m.blog.naver.com/PostView.nhn?blogId=laonple&logNo=220776743537&proxyReferer=https%3A%2F%2Fwww.google.com%2F

사진3

https://www.onlinemathlearning.com/reflection-rotation.html

사진4

http://incredible.ai/deep-learning/2018/03/17/Faster-R-CNN/

사진5

https://towardsdatascience.com/r-cnn-fast-r-cnn-faster-r-cnn-yolo-object-detection-algorithms-36d53571365e


'Deep Learning for Computer Vision > Object Detection (OD)' 카테고리의 다른 글

10. YOLO V2  (4) 2020.02.06
9. YOLO V1  (4) 2020.02.06
7. Fast RCNN  (2) 2020.02.06
6. SPP Net  (2) 2020.02.05
5. RCNN  (0) 2020.02.05

안녕하세요~


이번글에서는 RCNN의 단점과 SPP-Net의 단점을 극복한 Fast RCNN이라는 모델에 대해서 설명할게요~




<1. Motivation>



1) Three stage pipeline (RCNN, SPP-Net)


RCNN과 SPP-Net의 공통적인 학습방식은 아래와 같아요.


①CNN 모델을 사용할 때 ImageNet에 학습된 pre-trained 모델을 쓴다. 이때 pre-trained 모델을 Pascal VOC 이미지 데이터셋에 finetuning 시킨다.

②Fine tuning을 마친 후, CNN의 softmax layer를 제거해주고 SVM을 설치한다. Pascal VOC 데이터셋을 CNN의 뒷 부분에 해당하는 SVM을 학습시켜준다.

③classification 학습이 마무리되었으면 bounding box regression을 학습시켜준다.  


결국 학습을 세 번을 나눠서 하는꼴이 되는건데, 이런 과정들이 굉장한 시간을 소요하게 만들어요.




2) Feature vectors stored in hard disk


RCNN은 Conv layer를 통해 얻은 feature map을 hard disk에 저장시켜요. 그리고 hard disk에 저장된 feature map정보를 bounding box regression or SVM 학습을 할때 갖다 쓰는방식이에요.


그런데 메모리가 아닌 하드디스크에 접근하려면 CPU와 hard disk간의 물리적거리로 인해 많은 시간이 소요되요. 또한 데이터가 하드 디스크에 기록되는 시간도 추가가 되겠죠? 그런데 이것이 굉장히 많은 RoI (Selective search에서는 보통 2000개의 RoI를 제시)에 진행된다고 하면 정말 많은 시간들이 걸릴거에요.

 




3) Slow test time


RCNN과 SPP-Net의 test time은 아직도 real-time을 실행하는데 있어서 많이 부족해요. 


<사진1>








<2. Architecture>


Fast RCNN이 어떻게 구성되었는지 알아보도록 할게요.



1) RoI pooling layer


Fast RCNN의 가장 큰 특징은 RoI pooling layer라고 할 수 있겠어요. Conv layer를 통해 뽑아낸 feature map에서 RoI pooling을 적용하게 되는데 순서는 아래와 같아요.


①Conv layer를 통해 추출된 feature map에 selective search를 적용하여 RoI들을 선별한다

②선별된 RoI를 모두 HxW(=7x7) size로 만들어주기 위한 작업을 시작한다.

③먼저 RoI가 h x w 크기를 갖고 있을때,  "window size=(h/H x w/W)", "적절한 stride 값", "max pooling"을 적용해주면  H x W (=7x7) feature map이 만들어 진다. (이러한 방식은 SPP-Net에서 설명한 "special case of spatial bin : 7x7 spatial bin"이라 할 수 있다)

④ 이렇게 생성된 H x W (=7x7) feature map이 flatten되어 2개의 FC layer를 거친다. 

⑤ 2개를 거쳐 생성된 feature들은 softmax, bbox regressor에 각각 사용된다.







2) Single bin


SPP-Net에서 사용했던 1x1, 2x2, 4x4 3가지 spatial bin을 이용하는 것보다, 위에서 언급한 7x7 spatial bin 을 쓰면 아래와 같은 장점이 있어요.


먼저 SPP-Net과 같은 방식으로 학습을 시킨다고 하면 아래와 같이 하나의 객체를 3개의 resolution으로 학습하는것과 같아요. 이렇게 되면 하나의 객체(아래 '사진2')를 지나치게 학습하는 꼴이될 수 있기 때문에 overfitting 문제가 발생할 수 있어요. 


         


만약에 아래그림에서 다른 이미지에서 다른 모양의 눈('사진3')이 입력된다면 자신들이 학습했던 것과 다르다고 판단해 '사진3'이 눈이 아니라고 말할 가능성이 높게 됩니다.


<사진2>


<사진3>






Fast RCNN처럼 단 하나의 7x7 spatial bin을 쓰게 되면 SPP layer에서 발생시키는 overfitting 문제를 피할 수 있게 되요.






3) Truncated SVD (SVM이 아니에요!!!!)


Fast RCNN에는 마지막 FC layer에 Truncated SVD 기법이 적용되어 있어요.


Classification을 위해 사용되는 CNN 구조를 보면 FC layer에서 소요되는 시간보다 Con layer에서 걸리는 시간이 상대적으로 더 많다고 할 수 있어요 (가중치 개수는 FC layer가 더 많지만 연산에 소요되는 시간은 Conv layer가 당연히 더 오래 걸려요!). 



하지만 Fast RCNN 같은 경우에는 단 한 번의 CNN 과정만 거치고 그 위에서 대략 2000개의 RoI가 선별됩니다. 이 후, 2000개의 RoI에 대해서 FC layer를 진행하기 때문에 FC layer에서 소요되는 시간이 더 많아 지게 됩니다. 



그래서 무수히 많은 FC layer 의 연산들이 truncated SVD 기법으로 인해 compression 되어 parameter 수를 줄이게 되고, test 시간도 굉장히 줄여줄 수 있게되요. 이 부분은 논문에서 너무 명확하게 잘 설명해주고 있어서 논문표현을 그대로 빌리도록 하겠습니다.


  













<3. Training>


1) A single training stage (streamline)


1-1) One loss function with two multi-task


먼저 RCNN, SPP-Net에서는 bounding box와 classification이 따로 학습이 되었어요. 하지만 Fast RCNN은 bounding box와 classification을 동시에 학습시키도록 만들었어요. 즉 하나의 loss function을 통해서 multi-task (classification and localization)을 수행하도록 만들었어요. 


<사진4>


Multi-task loss function는 아래와 같이 계산이되요.





1-1) Classification loss function


Classification 문제이다 보니 cost function 자체는 log loss function을 취하고있어요 (자세한 설명은 여기 링크를 참고하세요).


(log loss for true clss u)



1-2) Localization loss function


우선 localization loss function에 필요한 인자는 t, v에요. v는 특정클래스(u)에 대한 ground truth를 의미하고, t는 특정 클래스(u)에 대한 RoI (candidate bounding box)에요.  



Localization loss function은 smooth L1을 사용했어요. 


Bounding box regression은 t-v 값의 차이가 대부분 크게 나올거에요 (왜냐하면 t,v 에는 4가지 요소가 들어가 있기 때문이에요). 그래서 t-v가 많이 차이나는 outlier 경우에 L2 loss를 적용하게되면 더욱 차이가 커질거에요. 이렇게되면 exploding gradient 현상이 일어날 수 있기 때문에, 이를 방지하고자 L1형태의 smooth 함수를써요 (L1을 쓰지 않는 이유는 미분이 되지 않는 지점이 있어 backpropagation을 적용 할 때 문제가 일어날 수 있기 때문인거 같아요).



<사진5>



1-2) Fine tuning


RCNN같은 경우는 사실상 CNN, SVM, Bounding box regression에 대해 각각 Pascal VOC로 fine tuning하는 꼴이되요. 하지만 Fast RCNN에서는 SVM을 따로 classifier로 붙여서 쓰지 않고 기존의 CNN의 classifier (softmax)를 그대로 이용하여 동시에 CNN, softmax classifier, bounding box를 학습하기 때문에 Pascal VOC 데이터를 한 번만 쓰게 됩니다. 그래서 학습시 one single stage로 학습을 하게 되는거에요. 


<사진6>


아래 결과를 보면 Fast RCNN (FRCN)에서 softmax를 쓴 mAP가 조금씩 더 높게 나온 것을 알 수 있기 때문에 굳이 SVM을 붙여서 three stage로 학습시킬 이유가 없다는 것을 증명했어요.



여기서 주의해야 할 부분은 fine-tuning을 적용할 시 첫 번째 Conv layer부터 FC layer까지 전부 학습시키는것이 아니에요. VGGNet을 기준으로 했을 때 3번째 (conv3_1)에서 부터 fine-tuning을 하는것이 효율적이라고 언급했어요.


<사진7>

 

논문에서는 fc6에서 부터 fine tuning한것과 conv3_1에서부터 fine tuning을 적용한 것을 실험했는데, conv3_1에서부터 fine-tuning을 적용한 결과가 훨씬 좋게 나타났어요. 또한 conv3_1과 conv2_1에 대해서 실험을 진행했는데 conv2_1의 성능이 약간 좋았지만 training time이 1.3배 (12.5h > 9.5h) 더 소요되었기 때문에 '시간 및 정확도' 측면을 고루봤을 때 conv3_1에서부터 fine-tuning을 적용하는것이 효율적이라고 언급했어요.







2) Eliminate disk storage


RCNN에서는 SVM, bounding box에 feature를 넘기기전에 disk에 저장한다고 했죠?

하지만 Fast RCNN은 disk에 넘겨주지 않고 메모리단에서 학습을 시켜주기 때문에 시강늘 더 단축할 수 있었다고해요. 논문에서는 구체적인 방법에 대해서 서술하진 않고, 단지 아래 문장으로 disk storage 방식을 사용하지 않았다고 명시하고 있어요.


"Fast R-CNN also eliminates hundreds of gigabytes of disk storage, because it does not cache feature."







3) Hierarchical sampling (image centric sampling)


RCNN, SSP-Net은 mini-batch=128로 설정하여 한 번 학습할 때마다 128개의 서로 다른 이미지들 중에서 128개의RoI를 추출합니다. 이렇게 되면 128번의 CNN(conv layer, conv operation) 작업이 수행되어야 하기 때문에 많은 시간이 소요되요.


<사진8>


Fast RCNN은 RCNN, SPP-Net과는 다른 hierarchical sampling(image centric sampling)이라는 방식을 취했어요. 위에서와 같이 128개의 이미지에 대해서 128개의 RoI를 추출하는것이 아니라 128개 보다적은 개수의 이미지에서 (논문에서는 2개의 이미지로 설정) 128개의 RoI에 대해서 연산을 진행하게 해줍니다. 2개의 이미지 각각에 대해서 64개의 RoI를 추출하게 되는데요. 사실 더 많은 RoI들이 선별되지만 그중에서 IoU가 50% 이상인 것을 기준으로 positive example로 삼는다고해요. 이렇게 되면 2번의 CNN 작업(conv layer; conv operation)만 진행해주면 되기 때문에 시간이 절약될거에요.


<사진9>





4) Inefficient of SPP-Net backpropagation


Fast RCNN 논문에서는 SPP-Net backpropagation 때문에 weight update가 비효율(inefficient)적으로 일어난다고 설명하고 있어요. 좀 더 정확히 말하면 spatial pyramid pooling layer 때문에 이러한 비효율적인 문제가 발생한다고 하면서 자신들의 RoI pooling backpropagation을 소개하고 있어요. (RoI pooling backpropagation이 더 효율적이다라고 설명하려고 하는거 같은데, 왜 더 효율적인지 설명한 부분을 찾지는 못했어요. 제가 실력이 부족해서 이해를 못했을 가능성이 더 크지만요 ㅎㅎ;;;;)








<4. Result>











이번 시간에는 Fast RCNN에 대해서 알아보았어요. 다음 글에서는 Fast RCNN 버전을 업그레이드한 Faster RCNN에 대해서 알아보도록 할게요!





[글 래퍼런스]

https://m.blog.naver.com/PostView.nhn?blogId=laonple&logNo=220776743537&proxyReferer=https%3A%2F%2Fwww.google.com%2F


[논문 래퍼런스]

Fast RCNN/ Ross. G/ 2015/ https://arxiv.org/pdf/1504.08083.pdf


[사진 래퍼런스]

사진1

https://towardsdatascience.com/r-cnn-fast-r-cnn-faster-r-cnn-yolo-object-detection-algorithms-36d53571365e

사진2

http://www.open-eyes-photography.de/oep/articles/Resolution_comparison.htm

사진3

http://kormedi.com/1225116/%EB%88%88-%EA%B1%B4%EA%B0%95-%EC%A7%80%ED%82%A4%EB%8A%94-%EC%A2%8B%EC%9D%80-%EC%8A%B5%EA%B4%80-4/

사진4

https://man-about-town.tistory.com/52

https://m.blog.naver.com/PostView.nhn?blogId=laonple&logNo=220776743537&proxyReferer=https%3A%2F%2Fwww.google.com%2F

사진5

https://www.researchgate.net/figure/Plots-of-the-L1-L2-and-smooth-L1-loss-functions_fig4_321180616

사진6

https://www.mathworks.com/help/vision/ug/getting-started-with-r-cnn-fast-r-cnn-and-faster-r-cnn.html

사진7

https://excelsior-cjh.tistory.com/160

사진8

https://m.blog.naver.com/PostView.nhn?blogId=laonple&logNo=220776743537&proxyReferer=https%3A%2F%2Fwww.google.com%2F

사진9

https://blog.airlab.re.kr/2019/10/Fast-R-CNN

'Deep Learning for Computer Vision > Object Detection (OD)' 카테고리의 다른 글

9. YOLO V1  (4) 2020.02.06
8. Faster RCNN  (1) 2020.02.06
6. SPP Net  (2) 2020.02.05
5. RCNN  (0) 2020.02.05
4. DPM (Deformable Part Model)  (0) 2020.02.04

안녕하세요~

 

이번글에서는 RCNN의 단점을 극복하고자 나온 SPP-Net object detection 모델에 대해서 알아보도록 할게요~

 

 

 

<1. Motivation>

 

 

1) Too CNN operation

 

RCNN은 selective search를 통해 대략 2000개의 candidate bounding box를 만들어내요. 

 

 

 

2000개의 candidate bounding box를 CNN에 입력하게되면 하나의 이미지에 대해서 학습하거나 detection(test) 하는데 굉장한 시간이 소요된답니다. 실시간 성능은 꿈에도 못 꾸겠죠..

 

<사진1>

 

 

 

2) Distortion by warping

 

RCNN은 candidate bounding box 내의 feature를 뽑아내기 위해 AlexNet을 이용한다고 했어요. 그래서 candidate bounding box가 227x227 size로 warping 된다고 설명드린바 있습니다.

 

그런데 이 warping 과정에서 이미지 왜곡현상이 일어날수가 있어요 . 만약 실제 객체의 aspect ratio 비율과 warping된 객체의 aspect ratio가 warping 때문에 굉장히 차이가 나게되면 두 이미지는 아예 다른 이미지가 될 확률이 높아요.

 

 

 

 

<사진2. Distortion되는 경우>

 

 

 

 

 

 

 

 

<2. Architecture>

 

 

1) Reduce CNN operation

 

RCNN에서는 입력 이미지에서부터 region proposal 방식을 이용해 candidate bounding box를 선별하고 모든 candidate bounding box에 대해서 CNN 작업을해요. 만약 2000개의 candidate bounding box가 나오게 되면 2000번의 CNN과정을 수행하게 되는거죠.

 

하지만 SPP-Net은 입력이미지를 먼저 CNN 작업을 진행하고 다섯 번째 conv layer에 도달한 feature map을 기반으로 region proposal 방식을 적용해 candidate bounding box를 선별하게되요. 이렇게되면 CNN 연산은 1번이 되는데요. 즉 RCNN 2000번 -> SPP-Net 1번 의 CNN operation 절감효과가 나타나기 때문에 굉장히 시간을 빠르게 단축할 수 있게되요. 

 

<사진3>

 

<사진4>

 

 

 

 

2) Remove warping process and avoid distortion

 

먼저, SPP-Net은 warping으로 인한 distortion을 없애주고자 'spatial pyramid pooling'이라는 개념을 이용합니다. RCNN과의 차이를 보면 warping하는 부분이 없어지고 spatial pyramid pooling이 추가된것을 볼 수 있을거에요. Spatial pyramid pooling 과정이 어떻게 warping 과정을 없앨 수 있었는지 살펴보도록 하겠습니다.

 

 

[Spatial Pyramid Pooling process]

 

First step

: Conv layer 5까지 거친 feature map에 대해서 region proposal 방식(ex: selective search)을 적용하여 candidate bounding box를 선별해 줍니다. 보통 candidate bounding box를 RoI (region of interests)라고 표현하기 때문에 앞으로 candidate bounding box는 RoI라고 칭하겠습니다. 

 

 

 

Second step

: RoI영역에서 Spatial Pyramid Pooling 알고리즘을 적용합니다. 알고리즘 순서는 아래와 같습니다.

 

 

 

 

[RoI feature is pooled by Spatial bin]

- RoI feature가 13x13인 경우

- 3x3 spaital bin을 사용한다는건 pool 연산을 통해 3x3 feature map을 얻겠단 소리

- 아래의 RoI feature에서 3x3 feature map을 얻기 위해서는 window size=5, stride=4 로 설정

- 위와 같이 설정된 window (아래 작은 네모박스)는 이동하면서 max pooling 연산을 적용

 

 

 

: 그런데 보통 3x3 spatial bin을 사용하지 않고, SPP-Net은 1x1, 2x2, 4x4 spatial bin을 사용 (각각의 spatial bin을 얻기 위해서 pooling하는 window size와 stride가 다름) -> 이 과정에서 warping 작업이 필요 없게 됨 -> 왜냐하면 feature map size (RoI size)에 따라서 window size, stride만 설정할 수 있도록 계산해주면 1x1, 2x2, 4x4 spatial bin을 구할 수 있음

 

: 또한, Pooling이 resolution을 감소시킨다는 개념을 알고 있으면 위와 같은 1x1, 2x2, 4x4 spaital bin은 다양한 resolution을 갖고 있다는 뜻 -> 그래서 spatial pyramid(다양한 resolution; 다양한 spatial bin) pooling 이라고 함

 

 

Third step

: 위의 spatial pyramid pooling 알고리즘을 통해 1x1, 2x2, 4x4 spatial bin을 얻었으면 spatial bin들을 모두 flatten하게 됩니다. 그럼 총 16+4+1 = 21개의 feature가 만들어 지겠네요. 21개의 고정적인 feature들은 fc layer로 넘어가게 됩니다.

 

<사진5>

 

 

 

 

 

<3. 결과>

 

SPP-Net역시 RCNN에서 사용된 bounding box regression (BB)을 적용했어요. 그 결과 SPP-Net BB 모델이 가장 성능이 좋게 나왔어요.

 

 

 

 

 

이번글에서는 SPP Net에 대해서 알아보았어요. SPP-Net의 장점을 이야기하면 아래와 같이 요약할 수 있겠어요.

①Spatial Pyramid Pooling을 통해 RCNN에서 사용된 warping 작업을 없애 distortion을 피할 수 있었다.

②RCNN에서는 CNN연산을 2000번 한 것에 비해, SPP Net은 CNN 연산을 한 번만 하면되서 training, test 시간의 굉장히 단축시켰다.

 

 

 

 

하지만 여전히 SPP-Net을 통해서도 극복하지못한 RCNN의 단점들이 존재하고 있고, SPP-Net에서도 단점이 있었어요. 그래서 다음글 Fast RCNN을 소개하면서 여전한 RCNN의 단점과 SPP-Net의 단점을 어떻게 극복했는지 설명해드릴게요~  

 

 

 

[사진 래퍼런스]

사진1

https://woosikyang.github.io/fast-rcnn.html

사진2

http://biz.heraldcorp.com/view.php?ud=20131219000553

사진3

https://towardsdatascience.com/r-cnn-fast-r-cnn-faster-r-cnn-yolo-object-detection-algorithms-36d53571365e

사진4

https://blog.lunit.io/2017/06/01/r-cnns-tutorial/

사진5

https://m.blog.naver.com/PostView.nhn?blogId=laonple&logNo=220731472214&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F

 

'Deep Learning for Computer Vision > Object Detection (OD)' 카테고리의 다른 글

8. Faster RCNN  (1) 2020.02.06
7. Fast RCNN  (2) 2020.02.06
5. RCNN  (0) 2020.02.05
4. DPM (Deformable Part Model)  (0) 2020.02.04
3. Object Detection과 CNN의 관계  (2) 2020.02.04

안녕하세요~


이번글에서는 최초의 딥러닝 기술이 적용된 object detection 모델인 RCNN에 대해서 알아보도록 할거에요. 


CNN 챕터처럼 논문을 세세하게 분석하지 않고 보기 편하게 "1. Motivation ->2.Architecture -> 3. Training -> 4. Result" 순서로 간단하게 설명해드리도록 할게요!





<1. Motivation>


앞선글에서 다루었던 DPM 같은 구조의 문제점은 다음과 같이 요약할 수 있어요.


1) 굉장히 복잡한 구조


DPM에서 classification 과정은 매우 복잡해요. 다양한 filter들(low level, high context )의 hog feature 와 각각의 filter들을 적용한 후 SVM을 이용하여 classification을 하게 됩니다. 그리고 모든 filter들의 결과를 합산하는 ensemble 기법을 거쳐 최종 classification을 하게되요. 상당히 복잡한 구조이죠;; 또한 hog feature 기반의 SVM classification 결과도 뛰어나지 않아요;;; 






2)  Bounding box


다양한 크기의 resolution에서 sliding window 방식으로 진행하게되면 굉장히 많은 bounding box가 생성될거에요. 이렇게 많은 bounding box 각각에 대해서 복잡한 dpm classification 알고리즘을 적용한다면 시간도 굉장히 오래걸릴거에요.

     



이렇게 시간도 오래걸리고 classification 결과도 좋지 않은 모델이 2012년까지는 최고의 성능을 보이는 object detection 모델이라고 하면 믿어지시겠어요? 하지만 2012년 혜성같이 등장한 AlexNet으로 인해 Object detection 영역은 큰 변혁을 맞이하게 됩니다.










<2. Architecture>


논문에서는 RCNN 구조를 세 가지의 module (Extract region proposals, Compute CNN features, Classfiy regions)로 구성하고 있어요.




<사진1>



1) Region proposals (Extract region proposals)

: 먼저 입력 이미지가 들어오게되면 이미지 내에서 bounding box가 될 만한 후보(candidate bounding box)들을 선별해주게되요. 객체가 무엇인지에 따라 bounding box가 선별되어 그려지는 것이 아니고 (category-independent region proposal), 그냥 객체가 될만한 영역들에 대해서 candidate bounding box를 선별해 줍니다. 예를들어, 객체가 될만한 것들은 보통 인접한 pixel과 굉장한 차이가 날거에요. 그럼 이러한 정보들을 기반으로해서 객체라고 생각되는 영역에 대한 candidate bounding box를 생성해 줍니다.




이렇게 candidate bounding box (region)를 선별(proposal)해주는 것을 region proposal 방식이라고 해요. 일반적으로 object detection=classification+localization 이라고 할 수 있는데, region proposal 같은 경우는 localization을 위한 기법이라고 생각하시면되요.


Region proposal 방식은 굉장히 다양하게 존재 했어요. RCNN은 selective search라는 알고리즘을 통해 candidate bounding box를 선별해 주었어요 (selective search에 대한 개념은 기회가되면 segmentation 파트에서 더 자세히 다루려고해요. 그러니 이곳에서는 "RCNN의 region proposal 방식이 selective search 구나!" 정도로만 이해하시면 좋을 것 같아요)





2)  Feature Extraction


두 번째 모듈은 feature extraction이에요. 선별된 candidate bounding box들은 개별적으로 CNN이 수행이되요. CNN 작업이 수행되는 이유는 각각의 candidate bounding box에 있는 물체들의 특징(feature)을 추출하기 위해서에요.


(보통 CNN은 이렇게 뽑은 특징들을 softmax로 통해 분류하는데 여기에서는 CNN으로 feature만 뽑아주고, classification은 기존 DPM에서 사용하던 방식인 SVM 방식을 택했어요. 아마 CNN을 그대로 적용시키는 것 보다 object detection 영역에서 기존에 사용했던 classification 방식을 택하는것이 더 좋을거라 판단했었나봐요.)


RCNN은 feature extraction 용도로써 AlexNet을 적용했어요. Softmax를 제외하고 5 conv layer, 2 fc layer를 통해 feature extraction을 진행했습니다.


<사진2>

(그림에서는 input이 224x224라고 나오는데 실제로는 input이 227x227이어야 해요. 논문에 설정된 stride와 padding을 고려했을때, 여러 레이어를 거쳐 13x13으로 도달하려면 227x227이 맞다고해요.AlexNet 논문의 그림이 잘 못된거라고 합니다)


RCNN은 AlexNet을 적용하기 때문에 candidate bounding box들을 227x227 이미지로 만들때 여러 실험(B,C,D)을 했어요.


A: Region proposal 방식을 통해 선별된 candidate bounding box in original input image


B: A 이미지 -> 배경을 포함하는 tightest squre: A이미지에서 배경을 조금 더 포함해서 isotropically 방식으로 227x227 size로 조정 (비어있는 부분 zero 패딩으로 맞추는듯; 확실한 건 아님)

C: A 이미지 -> 배경을 포함하지 않는 tightest squre: A이미지에서 배경 포함하지 않고 isotropically 방식으로 227x227 size로 조정 (비어있는 부분 zero 패딩으로 맞추는듯; 확실한 건 아님)

D: A 이미지 -> A 이미지를 단순히 warping


Top-row: p=0 -> 배경을 아예 무시

Bottom-row: p=16 -> 배경을 padding=16 만큼 포함.

(예를들어, C 방식에서 p=16을 적용한다면, C방식 (A이미지에서 배경이 포함되지 않는 객체)을 기준으로 배경을 p=16 만큼 포함시킨다는 뜻) 


논문에서는 D 방식을 선택했을때 p=16을 적용하면 classification 결과가 좀 더 좋게 나왔다고 하네요.




결국 위와 같이 region proposal 방식으로 선별된 candidate bounding box 를 AlexNet에 입력해주기 위해 warping 작업을 하게 됩니다. 그리고 resizing(warping)된 227x227 이미지에 대해서 AlexNet을 적용해 feature extraction을 수행하게 되는거에요.





3) Classification


AlexNet으로 feature extration을 한 후에는 SVM을 통해 classification을 하게됩니다.





지금까지 RCNN이 어떻게 구성되어 있고 어떤 순서(알고리즘)로 detection 하는지 알아보았어요. 그렇다면 이제 부터는 좀 더 디테일하게 RCNN이 tranining하는 방식에 대해서 알아보도록 할게요.



[Detection 요약]

1. Input image -> RCNN 모델에 입력

2. Selective Search (region proposal)방식으로 candidate bounding box 선별

3. 선별된 candidate bounding box를 warping 해줌 (227x227; for AlexNet input size/ p=16)

4. warping된 227x227 이미지를 입력하여 AlexNet으로 부터 feature extraction

5. AlexNet으로 부터 추출된 feature들을 이용해서 SVM을 적용









 

<3. Training>


Training은 classification(SVM)과 localization(bounding box) 두 task로 나뉘어요. 그렇기 때문에 classification 및 localization은 따로따로 학습이 된다고 보시면되요.






1) Classifciation


기본적으로 classification을 위해 AlexNet이 쓰이는데요. RCNN에서는 처음부터 AlexNet을 만들어 Pascal VOC 데이터로 학습시키지 않고, 기존에 ILSVRC 2012에서 학습된 AlexNet을 사용해요. 보통 이를 pre-trained model을 사용했다고 하는데요. 어차피 Object detection에서 쓰이는 AlexNet도 객체를 classification하는 목적을 갖고 있어요. 그렇다면 ImageNet dataset이나 Pascal VOC dataset에 있는 객체들의 형태가 크게 다르진 않을거에요. 그렇기 때문에 ImageNet dataset으로 training된 AlexNet을 갖고 Pascal VOC dataset을 조금만 학습시켜도 될거에요. 이러한 작업을 fine-tuning 했다고 해요. 


만약 AlexNet 모델을 처음부터 구현하고 Pascal VOC dataset으로 학습시키면 dataset 양도 적을 거고 (Pascal VOC < Pre-trained model: Pascal VOC+ImageNet), 학습시키는데 시간이 굉장히 오래걸릴거에요 (Object detection은 classification말고도 localization에 대해서도 학습이 되어야 하니까 training 시간은 배로 더 걸리겠네요.)


RCNN은 Pascal VOC dataset으로 추가적인 training을 시켜주기 때문에 fine-tuning이라고 했죠?

좀 더 엄격히 말하자면 RCNN은 AlexNet모델에 transfer learning을 적용했다고 이야기 할 수 있는데요.


기존의 AlexNet은 Softmax를 통해 classification을 진행했지만, RCNN에서 사용되는 AlexNet은 Softmax가 아닌 SVM을 통해서 classification을 하게되요. 이렇게되면 기존의 AlexNet의 softmax를 제거 하고 SVM을 연결시켜주어야 하는데, 이때 classifier 부분만 따로 학습을 해주어야해요. 이런 경우 우리가 transfer learning을 했다고 이야기하는데요.


Transfer learning을 적용하는 이유는 우리가 분류하려는 class의 종류가 달라질때에요. AlexNet은 1000개의 class에 대해 학습이 되었지만, 우리가 이를 적용할때는 다른 종류의 class 4개를 분류하고 싶을 때가 있어요. 이럴때에는 제일 뒷단에 위치한 classifier만 따로 다시 학습시키면 되는데요 이때 새로운 classifier를 이식(transfer)해서 학습시킨다고하여 transfer learning이라고 부르게 되었답니다.



Pascal VOC 대회에서는 20개의 클래스들에 대해서만 detection 성능을 평가하기 때문에, 기존의1000개의 클래스를 분류하는 목적을 갖는 AlexNet을 20개의 Pascal VOC 클래스에 대해서 분류하는 목적을 갖도록 transfer learning하게 됩니다. (좀 더 엄밀하게 이야기하면 21개의 클래스에 대해서 분류하게 됩니다 (20:classes; positive example + 1:background; negative example))


<사진3. Pascal VOC>



<사진4>


SVM을 학습시키기 위한 전제 조건은 positive example이어야만 한다는거에요. RCNN을 classification하는건 기본적으로 selective search를 통해 선별된 candidate bounding box에 대해서 학습이 진행되는데요. 아래 그림을 통해 candidate bounding box와 positive example이 어떤관계를 갖고 있는지 살펴볼게요.


RCNN을 통해 2개의 candidate bounding box가 선별되었어요. 하지만 이 두 개의 bounding box에 해당하는 class가 뭔지 아직 모르는 상태에요. 이때 학습 데이터로 사용되는 이미지 (ground truth (class, bounding box coordinate)를 포함)가 입력이되면 이 학습 데이터의 ground truth 정보와 2개의 candidate bounding box 정보를 비교대조하게되요. 만약 ground truth와 candidate bounding box의 IoU가 50% 이상이면 해당 candidate bounding box는 객체를 포함하고 있을 가능성이 높다고 판단하고, 해당 객체를 ground truth의 클래스라고 인식(=positive example)하고 학습을 진행해요. 반대로 IoU가 50% 이하이면 객체가 포함되어있을 확률이 낮다고 판단하여 객체가 아닌 background(=negative example)라고 인식하게 됩니다. 





이렇게 선정된 positive example에 대해서 학습이 classification 작업이 진행되요.






2) Localization (Bounding box)


Selective search를 통해 나온 candidate bounding box (아래그림 파란색)이 ground truth(아래그림 노란색)과 일치하지 않을 수 도 있어요. 이런 경우에는 candidate bounding box와 ground truth의 좌표정보들을 비교하여 regression 문제로 전환해주면 되요. 이렇게 되면 파란색 위치의 candidate bounding box가 ground truth를 보고 bounding box 위치를 학습하게 될거에요. 쉽게 말하면 아래와 같이 요약할 수 있겠네요.


"Selective search 만으로 stopsign의 위치를 찾아내는 능력이 조금 부정확해, 그러니까 너는(RCNN 모델) 정답지 (Ground truth의 올바른 위치) 를 보고 교정(training) 좀 하면 좋아질거야!  이렇게 학습(Training)을 마치게되면, 나중에 너(RCNN 모델)가 selective search를 이용하여 stopsign의 위치를 찾아낼 때, selective search 방식으로 candidate bounding box 를 뽑으면 위치가 조금 부정확했으니 배운대로 위치를 조금씩 조정해주면 더 좋은 localization이 될거야~"





이렇게 selective search를 통해서 나온 좌표값을 ground truth와 비교하여 '조금씩 조정'하게 되면 좋은 localization 성능을 얻게 되는데요. 이때 '조금씩 조정'하는 정도의 최적값을 찾기 위해서 bounding box를 찾는 문제를 아래와 같은 regression 문제로 정의하게되요.




Bounding box regressor의 학습 목표는 P를 G로 mapping할 수 있도록 최적의 변환(transformation)방식을 찾는거에요. 


"After learning these functions, we can transform an input proposal P into a predicted ground-truth box ˆG by applying the transformation"


아래와 같은 식을 기준으로 최적의 transformation 방식을 찾게 되는데, 이해가 잘 안되시죠?


 


아래의 그림에 적힌 설명대로 잘 따라가시면 위에서 언급한 수식들이 bounding box regression에 어떻게 적용되는지 알 수 있으실거에요.


(target-prediction에서 hypothesis function 개념은 아래 사이트를 여기 링크를 참조)



이렇게 최적의 d함수 값을 찾게되면 우리는 보편적으로 selective search를 통해 얻은 candidate bounding box를 학습된 transformation 방식으로 위치조정해주어 향상된 localization 성능을 얻을 수 있게 될거에요. 



<사진5>


<사진6>








3) Pool 5 feature를 Bounding box regression에 사용하는 이유


Pool 5 feature를 Bounding box regression을 위해 사용한 이유를 결론적으로 말씀드리면 'empirical study(경험적 연구)'이기 때문이에요. 즉, 여러 실험을 진행했는데 Pool 5 feature로 d함수를 구성하면 localization 성능 (mAP)이 좋게 나왔다는거에요.




아래결과를 보면  pool 5 feature (=6x6x256)를 이용하는것이 5 or 6 번째 Fully Connected layer feature (4096)를 이용하는것보다 mAP가 더 높게 나왔다는걸 아래 표로 보여주고 있어요.




그 외, CNN 모델을 AlexNet (아래 그림의 T-Net)을 사용한 경우와, VGGNet (아래 그림의 O-Net)을 사용한 경우에 대한 mAP도 보여주고 있네요. 그리고 BB라는건 위에서 언급한 bounding box regression 방식이 적용된 경우라고해요. (아마 BB라고 되어있지 않은 경우는 Selective Search 방식으로만 region proposal한 결과에 대해서 mAP를 계산한게 아닌가 싶어요)


이 결과를 보면 CNN의 성능이 d함수에서 사용되는 feature에 영향을 끼치고 이것이 곧 localization에 영향을 주게 되는걸 알 수 있어요. 그래서 CNN의 성능이 Object detection 모델의 mAP의 성능에도 영향을 끼치고 있다는걸 알 수 있을 겁니다.










<3. Result>


R-CNN 모델의 mAP가 딥러닝 기반 CNN 모델을 적용하지 않은 이전 세대의 object detection 모델 보다 월등히 성능이 뛰어난걸 보실 수 있으실거에요. 그 중에서도 bounding box regression 기법을 추가하게 되면 더욱 성능이 좋아진다는 것을 볼 수 있어요.

 



여기까지 RCNN에 대해서 알아보았어요. 다음글에서는 RCNN의 단점을 극복한 SPP-Net에 대해서 알아보도록 할게요!





[논문 레퍼런스]

Rich feature hierarchies for accurate object detection and semantic segmentation Tech report/ Ross. G. et al/ 2014/ https://arxiv.org/abs/1311.2524



[사진 래퍼런스]

사진1

https://woosikyang.github.io/fast-rcnn.html

사진2

https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf

사진3

https://www.researchgate.net/figure/Illustration-on-our-annotations-of-semantic-object-parts-for-the-PASCAL-VOC-2010-dataset_fig3_284579150

사진4

https://www.researchgate.net/figure/R-CNN-Training-Workflow_fig3_329586511

사진5

https://lilianweng.github.io/lil-log/2017/12/31/object-recognition-for-dummies-part-3.html#bounding-box-regression

사진6

https://blog.lunit.io/2017/06/01/r-cnns-tutorial/


'Deep Learning for Computer Vision > Object Detection (OD)' 카테고리의 다른 글

7. Fast RCNN  (2) 2020.02.06
6. SPP Net  (2) 2020.02.05
4. DPM (Deformable Part Model)  (0) 2020.02.04
3. Object Detection과 CNN의 관계  (2) 2020.02.04
2-3. Object Detection 모델 평가지표 (FPS)  (6) 2020.02.04

안녕하세요~


이번글에서는 RCNN을 배우기전에 존재한 object detection 모델에 대해서 알아보도록 할게요~

이러한 개념들을 이해하고 있어야 RCNN이 등장한 Motivation에 대해서 이해하실 수 있어요. 그래서 이번글에서는 DPM이 동작하는 순서(architecture)에 대한 글을 다루려고 해요.






<1. DPM 동작순서>



1. Sliding window 


먼저 이미지 픽셀마다 (일정간격의 픽셀을 건너띄고) bounding box(window)를 그려줍니다.




2. block wise operation


하나의 이미지를 block단위로 나눕니다. 예를들어 아래와 같은 경우에는 8x8 pixel을 하나의 block 단위로 하여 여러 block들이 이미지를 구성하게 합니다.





3) SIFT or HOG block wise orientation histogram


Bounding box가 픽셀을 옮겨다니면서 하는 일에 대해서 말씀드릴게요.



Bounding box가 아래와 같은 위치에 있다고 가정해볼겠습니다. 그럼 해당 bounding box는 4x8 block ((4x8)x(8x8) pixles)을 포함하고 있어요.




그리고 해당 bounding box영역의 block 마다 Hog feature에 대해 histogram을 분석하여 해당 block의 특징들을 선별하게 됩니다. (Hog, SIFT와 같은 개념을 정확하게 모르셔도 되요. 그냥 이러한 특징들이 뽑힌다는 정도만 이해하시면 될 것 같습니다)






4) Classification


하나의 bounding box에 대한 feature들을 아래와 같이 수집했다면, 이를 토대로 classification 작업을 수행합니다.

    



Classification할 때에는 미리 template filter를 이용해요. 예를들어 얼굴에 대한 template filter가 bounding box영역의 block마다 얼굴 filter(=template filter)를 matching할거에요. 이렇게하면 template filter의 hog feature와 block의 hog feature들이 매칭될거에요 (이러한 방식을 template matching이라고 해요). Template matching결과 얼굴에 해당하는 block은 높은 값이 산출될 거에요.


 

얼굴 template filter가 bounding box내의 block을 돌아다니면서 어떤 block이 얼굴인지 SVM을 통해 classification하게 되요.



5) 요약


결국 아래와 같이 특정 bounding box에 해당하는 block들에 대해서 다양한 template filter들을 template matching 시키고 그 결과를 볼거에요. 예를들면,  이전에 사람객체에 bounding box가 되어 있으면 사람 전체에 대한 template filter(root filter=high context feature)를 bounding box에 적용시켜보고, 얼굴에 해당하는 template filter(low level image feature)를 적용해보고, 여러 template filter에 대해서 계산을 해보고 모두 합산한 결과 bounding box에 있는 feature가 사람이 갖고있는 특징 (여러 template filter) 을 포함하고 있다고 판단하면 해당 bounding box를 사람이라고 detection하게 될거에요. 


결국 다양한 template filter를 통해 SVM으로 classification 한 결과를 이용하여 최종적인 classification을 한 것이니까 ensemble 기법이 적용되었다고 할 수 있겠네요.


최종적으로 아래와 같은 구조로 DPM을 요약할 수 있겠네요. 







<2. 문제점>


뭔가 과정자체가 굉장히 복잡해요. low-level image들과 high-context 결과를 합산여 ensemble 기법을 적용하는 등... 



그리고, 일일이 sliding window를 통해 계산하면 굉장히 많은 bounding box가 형성될거고, 각각의 bounding box마다 복잡한 classification 과정을 거치게 될거에요.



기존에 갖고 있던 이러한 복잡한 object detection 방법들 때문에 한동안 object detection 영역에서 힘을 못쓰다가 CNN 분야인 AlexNet의 등장으로 획기적인 발전을 하게 되는데 그 모델이 R-CNN이에요.






[글 래퍼런스]

https://www.learnopencv.com/histogram-of-oriented-gradients/

(Oriented Gradient histogram에 대해서 설명)

http://darkpgmr.tistory.com/116

(HOG feature에 대해서 설명)

https://pdfs.semanticscholar.org/ca8b/11536d31cfc3dea486833296bcb67e1be780.pdf

(DPM 설명)

http://slideplayer.com/slide/8240331/

(DPM 수식 자세히 설명)


'Deep Learning for Computer Vision > Object Detection (OD)' 카테고리의 다른 글

6. SPP Net  (2) 2020.02.05
5. RCNN  (0) 2020.02.05
3. Object Detection과 CNN의 관계  (2) 2020.02.04
2-3. Object Detection 모델 평가지표 (FPS)  (6) 2020.02.04
1. Object detection이 뭔가요?  (0) 2020.02.03

안녕하세요~


이번글에서는 Object Detection과 CNN의 관계에 대해서 알아보도록 할거에요. CNN분야가 발전하면서 classification 영역에 엄청난 영향을 미친것처럼 동시에 Object detection 영역에도 굉장한 영향을 미치게 되었어요. 그래서 딥러닝 영역에서는 보통 CNN이 발전하는것에 맞춰 더 좋은 Object detection 모델이 제시되는 방향으로 전개되고 있답니다.



<사진1>


먼저 딥러닝 분야에서 사용되는 Object detection 분야에 두 개의 main stream에 대해서 설명드리면 자연스럽게 CNN과 Object detection 모델간의 관계를 파악하실 수 있으실거에요.




<1. Region Proposal -> CNN>


첫 번째 main stream은 Region Proposal로 candidate bounding box를 검출한 후에 해당 candidate bounding box에 대해서 CNN을 적용시키는 방법이에요.


Region Proposal이라는 것은 말 그대로 영역을 제안하는 기술인데, 이때 영역이라고 함은 bounding box를 의미해요. 그래서 일단 이미지가 들어오면 객체가 될 것 같은 후보 영역들 (candidate bounding box)를 선별하게되고, 해당 candidate bounding box에 대해서 classification 작업을 수행하게되요.


<사진2>



<2. Region Proposal + CNN>


Object detection 모델의 또 다른 main stream은 region proposal과 classification(by using CNN) 작업을 동시에 수행하는거에요. 


앞선 방식(Region Proposal -> CNN)에서는 Region Proposal 이 먼저 진행되야지만 classification 작업이 진행됐어요.


하지만 여기에서는 하나의 이미지가 들어오면 병렬적으로 두 작업(A작업, B작업)이 수행되는데요. A작업은 Region Proposal 방식을 통해 candidate bounding box를 선별해주는 것이고, B작업은 CNN을 거쳐 나온 feature map에 대해 classification을 진행하는거에요. 그런다음 마지막 단계에서 A작업의 결과와 B작업 의 결과를 동시에 반영하여 detection을 하게되는거랍니다. 




앞서 언급한 두 개의 main stream의 자세한 알고리즘은 object detection 모델을 소개하면서 차근차근 설명해드릴거에요.


아래 그림은 Object Detection 모델이 변천한 과정들이에요. 보통 Object detection 모델에 대해서 공부할 때는 빨간색으로 표시된 부분의 모델들에 대해서 공부하게 되요 (아직까지는 이 모델들이 좋은 성능을 보이고 있어서 다른 모델들보다 중요다고 판단을 하기때문인거같아요). 


<사진n>


앞으로 소개해드릴 Object detection 모델 순서는 아래와 같이 구성해봤어요.


RCNN -> SPP-Net -> Fast RCNN -> Faster RCNN -> YOLO V1 -> SSD -> YOLO V2 -> YOLO V3



R-FCN, Mask R-CNN을 다루지 않는 이유는 나중에 Segmentation 파트에서 좀 더 자세하게 다룰 예정이기 때문이에요.


그럼 다음 글에서 뵙도록 할게요~



[사진 래퍼런스]

사진1

https://medium.com/@nikasa1889/the-modern-history-of-object-recognition-infographic-aea18517c318

사진2

https://woosikyang.github.io/fast-rcnn.html

사진n

https://hoya012.github.io/blog/Tutorials-of-Object-Detection-Using-Deep-Learning-what-is-object-detection/

'Deep Learning for Computer Vision > Object Detection (OD)' 카테고리의 다른 글

6. SPP Net  (2) 2020.02.05
5. RCNN  (0) 2020.02.05
4. DPM (Deformable Part Model)  (0) 2020.02.04
2-3. Object Detection 모델 평가지표 (FPS)  (6) 2020.02.04
1. Object detection이 뭔가요?  (0) 2020.02.03

+ Recent posts