joanne

docs: update 0412.md

......@@ -65,16 +65,104 @@
## R-CNN
![rcnn](./images/rcnn.png)
## Feature Pyramid Network
R-CNN이 Object Detection을 수행하는 알고리즘 순서는 다음과 같다.
1. 입력 이미지에 Selective Search 알고리즘을 적용하여 물체가 있을 법한 박스 2000개를 추출한다.
2. 모든 박스를 227 x 227 크기로 리사이징한다. 이 때 박스의 비율은 고려하지 않는다.
3. 미리 ImageNet 데이터를 통해 학습시켜놓은 CNN을 통과시켜 4096차원의 특징 벡터를 추출한다.
4. 이 추출된 벡터를 가지고 각각의 클래스마다 학습시켜놓은 SVM Classifier를 통과시킨다.
5. Bounding Box Regression을 적용하여 박스의 위치를 튜닝한다.
## Fast R-CNN
> CNN 특징 추출부터 classfication, bounding box regression까지 모두 하나의 모델에서 학습시키자!
![fast r-cnn](./images/fastrcnn.png)
1. 전체 이미지를 미리 학습된 CNN을 통과시켜 피쳐맵을 추출한다.
2. Selective Search를 통해서 찾은 각각의 ROI에 대해 ROI Pooling을 수행한다. 그 결과로 고정된 크기의 feature vector를 얻는다.
3. feature vector는 fc layer들을 통과한 뒤, 두 개의 브랜치로 나뉘게 된다.
4. 하나의 브랜치는 softmax를 통과하여 해당 ROI가 어떤 물체인지 분류한다.
4. 또 하나의 브랜치는 bounding box regression을 통해서 selective search로 찾은 박스의 위치를 조정한다.
* ROI Pooling
Fast R-CNN에서는 먼저 입력 이미지를 CNN에 통과시켜 피쳐맵을 추출한다. 추출된 피쳐맵을 미리 정해놓은 H\*W 크기에 맞게끔 그리드를 설정한다. 그리고 각각의 칸 별로 가장 큰 값을 추출하는 max pooling을 실시하면 결과값은 항상 H\*W 크기의 피쳐맵이 되고, 이를 쭉 펼쳐 feature vector를 추출한다.
## Faster R-CNN
Faster R-CNN의 핵심 아이디어는 Region Proposal Network이다. 해당 네트워크는 다음과 같은 구조를 갖는다.
![faster r-cnn](./images/faster_rcnn.png)
먼저 feature map을 추출한 뒤, 이를 RPN에 전달하여 ROI를 계산한다. 여기서 얻은 ROI로 ROI Pooling을 진행한 다음 분류를 진행하여 Object Detection을 수행한다.
## Region Proposal Network
![rpn](./images/rpn.png)
RPN이 동작하는 알고리즘은 다음과 같다.
1. CNN을 통해 뽑아낸 피쳐맵을 입력으로 받는다. 이 때, 피쳐맵의 크기를 HxWxC로 잡는다. (가로, 세로, 채널 수)
2. 피쳐맵에 3x3 컨볼루션을 256 혹은 512 채널만큼 수행한다. 위 그림에서 intermediate layer에 해당한다. 이 때, padding을 1로 설정해주오 HxW가 보존될 수 있도록 한다. intermediate layer 결과 HxWx256 or HxWx512 크기의 두번째 피쳐맵을 얻는다.
3. 두번째 피쳐맵을 입력받아 classfication과 bounding box regression 예측 값을 계산해주어야한다. 이때 fully convolution network의 특징을 갖는다.
4. 먼저 분류를 수행하기 위해 1x1 컨볼루션을 18(object인지 나타내는 지표 수 2 \* 앵커 개수 9) 채널 수 만큼 수행하며, 그 결과 HxWx18 크기의 피쳐맵을 얻는다. HxW 상의 하나의 인덱스는 피쳐맵 상의 좌표를 의미한다. 그 아래 18개의 채널은 각 해당 좌표를 앵커로 삼아 k개의 앵커 박스들이 개체인지 아닌지에 대한 예측값을 담고 있다. 즉, 한번의 1x1 컨볼루션으로 HxW 개의 앵커 좌표들에 대한 예측을 모두 수행한다. 이제 이 값들을 적절히 reshape 한 뒤, softmax를 이용하여 해당 앵커가 오브젝트일 확률 값을 얻는다.
5. 다음으로 Bounding Box Regression 예측값을 얻기 위한 1x1 컨볼루션을 36채널 수 만큼 수행한다.
6. 1~5를 통해 얻은 값들로 ROI를 계산한다. 먼저 Classification을 통해서 얻은 물체일 확률 값들을 정렬한 다음, 높은 순으로 K개의 앵커만 추려낸다. 그 다음 K개의 앵커들에 각각 Bounding box regression을 적용한다. 그 다음 Non-Maximum-Suppression을 적용하여 RoI을 구한다.
7. 이렇게 찾은 ROI를 다시 첫 번째 피쳐맵에 project한 다음, ROI Pooling을 적용하고 다시 분류에 적용하여 물체의 종류를 알아낸다.
## Feature Pyramid Network
![feature pyramid](./images/feature_pyramid.png)
Object Detection 분야에서 풀리지 않은 문제는 바로 작은 물체를 탐지해내기 어렵다는 것이다. 이를 위해 이미지나 피쳐맵의 크기를 다양한 형태로 rescale하는 접근 방법이 있었다. 위 이미지와 관련된 설명은 다음과 같다.
(a)는 입력 이미지 자체를 여러 크기로 리사이징한 뒤, 각각의 이미지에서 물체를 탐지하는 방법이다.
(b)는 CNN 신경망을 통과하여 얻은 최종 단계의 피처맵으로 object detection을 수행하는 기법이다.
(c)는 CNN 신경망을 통과하는 중간 과정에 생성되는 피쳐맵들 각각에 Object Detection을 수행하는 기법이다.
(d)는 FPN에서 제안하는 방법으로서 먼저 신경망을 통과하며 단계별로 피쳐맵을 생성한다. 그리고 가장 상위 레이어에서부터 거꾸로 내려오면서 피쳐를 합쳐준 뒤, Object Detection을 수행한다. 이러한 방식을 통해 상위 레이어의 추상화된 정보와 하위 레이어의 작은 물체들에 대한 정보를 동시에 살리면서 Object Detection을 수행할 수 있게 된다.
## Feature Fusion
![feature fusion](./images/feature_fusion.png)
FPN이 상위 피쳐맵과 하위 피쳐맵을 어떻게 합쳐주는지 알아보자. 기본적으로 FPN은 피쳐맵이 레이어를 통과하면서 해상도가 2배씩 작아진다고 가정한다. 때문에 상위 피쳐맵과 하위 피쳐맵을 합쳐주기 위해서는 해상도를 맞춰주어야 한다. nearest neighbor upsampling이라는 기법을 사용해 상위 피쳐맵의 해상도를 2배 키워주었다.
![nearest](./images/nearest.png)
위 과정을 거쳐 해상도를 2배 키워준 뒤 하위 피쳐맵에서는 1x1 convolution을 수행하여 상위 피쳐맵과 동일한 채널 수를 갖도록 한다. 그 다음 해상도와 채널 수를 모두 맞춰준 두 피쳐맵을 element-wise 덧셈을 수행하여 합쳐주며 그 결과로 나온 피쳐맵에 object detection을 수행한다.
## Mask R-CNN
> 미팅 당일 교수님 설명 듣고 추가할 예정.
---
# About Detectron2
우선 Detectron2란 FAIR에서 파이토치를 베이스로 개발한 Object Detection & Segmentation Library이다. 고수준의 API가 아주 이용하기 쉽게 작성되어있고, 친절한 document를 제공하기 때문에 누구나 쉽게 이용할 수 있다. 하지만 좋은 API 내부에는 복잡한 구조가 있기 마련, 캡슐화가 잘 되어있기 때문에 내부를 뜯어보려면 매우 어렵다고 한다.
Detectron2는 최신의 Object Detection 알고리즘이 구현을 포함하고 있다. Fast R-CNN, Mask R-CNN을 비롯하여 여러 알고리즘들이 포함되어있다. 더불어 Modular design이기 때문에, Object Detection System의 어디든 내가 커스텀하여 갖다 붙일 수 있다. 그리고 매우 빠른 트레이닝 속도를 자랑한다.
Detectron2는 다음과 같은 모델 구조를 갖는다.
![d2](./images/detectron2.png)
* Backbone Network
Input: Images
Output: Multi-Scaled Feature Maps
Backbone 네트워크에는 이미지들이 인풋으로 들어간다. 그리고 결과물로서는 피라미드 형태의 서로 다른 스케일을 갖는 피쳐맵을 얻을 수 있다. 백본 네트워크의 결과물로 얻어진 피쳐맵은 다음 단계인 Region Proposal Network와, ROI Heads 둘 모두의 Input으로 이용된다.
* Region Proposal Network
Input: Mutli-Scaled Feature Maps
Output: Object Regions(Region Proposals)
Region Proposal Network에서는 Multi-Scaled Feature Maps를 바탕으로 Object Region을 얻는 과정을 거친다. 해당 물체가 위치한 박스를 얻는다고 보면 될 것 같다. 이 단계에서 얻은 결과는 ROI Heads의 Input으로도 이용된다.
* ROI Heads
Input: Multi-Scaled Feature Maps, Region Proposals
Output: Box
RPN과 매우 유사하지만 더 fine-tuned 된 박스를 얻어내는 과정이다.
![d2_detail](./images/d2_detail.png)
https://medium.com/@hirotoschwert/digging-into-detectron-2-47b2e794fabd 여기서부터 내일!
---
# Tutorial of Detectron2
......@@ -85,6 +173,7 @@
* [갈아먹는 Object Detection](https://yeomko.tistory.com/13?category=888201)
* [reference: The Modern History of Object Recognition — Infographic](https://medium.com/@nikasa1889/the-modern-history-of-object-recognition-infographic-aea18517c318)
* [Digging into Detectron2](https://medium.com/@hirotoschwert/digging-into-detectron-2-47b2e794fabd)
* [Understanding feature pyramid networks for object detection](https://jonathan-hui.medium.com/understanding-feature-pyramid-networks-for-object-detection-fpn-45b227b9106c)
* [교수님 강의자료]()
* [detectron2 github](https://github.com/facebookresearch/detectron2)
* [detectron2 documentation](https://detectron2.readthedocs.io/en/latest/tutorials/getting_started.html)
\ No newline at end of file
......