Semantic Segmentation
Semantic Segmentation
![](https://velog.velcdn.com/images%2Fpseeej%2Fpost%2F294c131d-f96d-45b4-b29d-754f04d7cee3%2Fimage.png)
- same as Dense Classification, per pixel Classification
- 어떤 label에 속하는지 확인 위해 img의 pixel마다 분류 실행
- 자율주행에서 사용
Fully Convolutional Network
-
일반적인 CNN의 형태.
![](https://velog.velcdn.com/images%2Fpseeej%2Fpost%2Fd91d4fdf-aab6-44f7-813e-768168a02fec%2Fimage.png)
-
flat 과정을 통해 1차원인 vector로 만듦
-
Fully Convolutional Network
![](https://velog.velcdn.com/images%2Fpseeej%2Fpost%2Fdb4a941a-7202-43d0-88a8-47346ae6ad1c%2Fimage.png)
-
일반적인 CNN에서의 Dense Layer를 없애는 과정을 Convolutionalization
-
일반적인 CNN과 parameter가 정확하게 일치
-Fully Flatten을 통해 reshape하고 fully convolution으로 넘어가는 것은 convolution을 바꿨기 때문
![](https://velog.velcdn.com/images%2Fpseeej%2Fpost%2Fe3a26e8f-874b-439e-8074-c10875ccf7b8%2Fimage.png)
-
중간에 있던 게 20x20x1000이었던 것을 400,000짜리 vector로 바꾸는 것이 아니라 20x20x1000 feature filter로 만듦
-
그 kernel의 1x1x1000짜리 convolutional feature map 만듦
![](https://velog.velcdn.com/images%2Fpseeej%2Fpost%2F6b2131a7-e4c5-468d-8b94-97167ec89fba%2Fimage.png)
-
Fully Convolutional Network는 input의 spatial dimension에 independent
-
convolution이 가지는 shared parameter 성질 때문에 output이 커지면 그것에 비례하여 뒷단의 network와 spatial dimension이 커짐
-
어떠한 input size에서도 돌 수 있는 FCN에서, output dimension들은 subsampling을 통해 줄어들 수 있음
-
따라서, coarse한(space resolution이 낮은) output을 dense pixel로 바꿔줘야 함
Deconvolution (Convolution Transpose)
![](https://velog.velcdn.com/images%2Fpseeej%2Fpost%2F836e9b3d-96e0-4b92-ba32-0ceaf286d1a4%2Fimage.png)
- convolution의 역연산
- parameter 숫자와 network architecture의 크기 계산할 때 편리
- convolution은 30x30 → 15x15, deconvolution은 15x15 → 30x30
- deconvolution을 통해 spatial dimension을 키워줌
![](https://velog.velcdn.com/images%2Fpseeej%2Fpost%2F32a7dc77-7b91-456e-b315-8811fcc8e8a0%2Fimage.png)
- convolution을 통해 5x5 → 2x2
- deconvolution을 통해 padding을 많이 줌으로써 2x2 → 5x5
- 이에 따른 결과
![](https://velog.velcdn.com/images%2Fpseeej%2Fpost%2F6aef5733-24e2-47cb-b23b-a51a3f66dc12%2Fimage.png)
Detection
R-CNN
![](https://velog.velcdn.com/images%2Fpseeej%2Fpost%2F7bb8ee1a-23e6-4e99-b7a8-f48dad4bd90f%2Fimage.png)
1. img 안에서 patch(부분)을 뽑아냄
2. CNN 돌기 위해 size를 똑같이 맞춰줌
3. support vector machine(SVM)으로 분류 수행
- softmax를 사용해도 되나, SVM을 썼을 때 실험결과가 더 높음
![](https://velog.velcdn.com/images%2Fpseeej%2Fpost%2F2f45f798-daa9-496e-9c40-ac42945cd389%2Fimage.png)
SPPNet
![](https://velog.velcdn.com/images%2Fpseeej%2Fpost%2F66695dd7-1f73-4833-832b-28f709a0efb1%2Fimage.png)
- R-CNN에서는 crop/warp의 수가 보통 2000 정도기 때문에 CNN이 2000번보다 더 많이 돌아야 함
- 반면에, SPPNet은 CNN이 한 번만 돌게됨
- image 안에서 bounding box 뽑고
- image 전체에 대해 convolution feature map 뽑고
- 뽑힌 그 bounding box 위치에 해당하는 convolution feature map의 tensor만 긁어옴
- tensor 한 번만 돌리지만, bounding box를 만들고 필요한 size만큼의 pooling으로 하나의 vector를 만들고 분류해줘야 하므로
사실 느림
Fast R-CNN
![](https://velog.velcdn.com/images%2Fpseeej%2Fpost%2F332c919c-2415-422c-9677-9bcaf44f33a3%2Fimage.png)
1. image 기반으로 input과 bounding box들을 가져온다
2. convolutional feature map을 한 번 뽑아낸다
3. 각 지역에 대해 ROI(Region of Internet)을 통해 고정된 길이의 feature를 가져온다
4. 최종적으로 Neural network를 통해 class와 bounding-box regressor 두 개의 결과를 얻어낸다
Faster R-CNN
![](https://velog.velcdn.com/images%2Fpseeej%2Fpost%2Fa04c479f-d412-454e-9617-f3c5d86f7c6d%2Fimage.png)
- Fast R-CNN에서 Region Proposal Network를 추가함
Region Proposal Network
![](https://velog.velcdn.com/images%2Fpseeej%2Fpost%2F5ff2f385-4c23-4e5c-b08f-2f5406103be4%2Fimage.png)
- img에서 특정 영역의 patch가 bounding box로써의 의미가 있을지/없을지 판단
- Anchor Box : 미리 정해놓은 bounding box의 크기
- 이 template들이 어떻게 바뀔지에 대한 offset 찾고 template 고정
![](https://velog.velcdn.com/images%2Fpseeej%2Fpost%2Ff425f1e6-a488-4867-a287-5109875fd1de%2Fimage.png)
- fully convolution 통해 해당하는 영역에 물체가 존재 여부 확인
- 9(3x3) : 세 개의 다른 region size(128, 256, 512)와 세 개의 다른 비율(1:1, 1:2, 2:1)
- 4 : 네 개의 bounding box regression parameter (bounding box를 위아래&양옆 기준으로 얼마나 키우고 줄일지)
- 2 : box classification (해당 bounding box가 쓸모있을지 없을지) - 최대한 적은 bounding box 사용 위해
- Faster-CNN의 결과
![](https://velog.velcdn.com/images%2Fpseeej%2Fpost%2F8c7a9d27-2181-4ed5-a6e9-58046ba1bfb7%2Fimage.png)
YOLO
![](https://velog.velcdn.com/images%2Fpseeej%2Fpost%2F99581c57-00dc-467f-8ca9-291ffe8d1b24%2Fimage.png)
- 굉장히 빠른 object detection algorithm
- tensor에서 분류하고 하는 것이 아니라 그냥 한 img에서 바로 output 나올 수 있기 때문에 Faster R-CNN보다도 더 빠름
- bounding box와 class probability를 동시에 예측
- bounding box를 따로 뽑는 과정이 없으므로 더 빠름
![](https://velog.velcdn.com/images%2Fpseeej%2Fpost%2Fd57338ea-4b0d-4f9a-8271-89e69aa5070d%2Fimage.png)
- img를 SxS grid로 나눔
- 찾고 싶은 물체의 중앙이 grid 안에 들어가게 될 경우, 해당 grid cell이 해당 물체에 대한 bounding box와 그 해당 물체가 무엇인지를 같이 예측
- 각 cell이 B bounding box들을 예측 (B=5)
- box 재정의 과정 (x, y, 높이, 너비 기준)
- 해당 object를 쓸지 말지 결정
- C class probability 예측 과정 거침
- 최종적으로 SxSx(Bx5+C) 크기의 tensor가 됨
- SxS : grid의 cell 개수
- Bx5 : offset(x, y, w, h)와 사용 여부를 포함하는 B bounding boxes
- C : class의 개수
![](https://velog.velcdn.com/images%2Fpseeej%2Fpost%2F6c2b5272-f18a-42a0-b152-36f31150b3ae%2Fimage.png)