Semantic Segmentation
- Dense classification, per pixel classification과 같이도 불림
- 이미지의 모든 픽셀이 어떤 label에 속하는지 분류하는 문제
- 사용 예시) 자율 주행, 운전보조장치, 라이다와 같은 센서를 활용하지 않고 이미지만 가지고 하는 여러 문제에 대해서 semantic segmantation이 매우 중요
![](https://velog.velcdn.com/images%2Fchangyong93%2Fpost%2F0bdbc388-40e0-4bbb-b80d-a39c524a4399%2Fimage.png)
Semantic Sementation의 가장 기본적인 technic : Fully Convolutional Network
- CNN vs FCN
- CNN에서 Dense Layer를 없앤 network로, 이 없애는 과정을 Convolutionalization
- FCN의 이점은 Dense Layer가 없다는 것인데, 결과적으로 봤을 땐 동일
이 network의 장점은 Dense Layer가 없다는 것인데, 결과적으로 봤을 땐 input과 output의 출력은 동일하다.
![](https://velog.velcdn.com/images%2Fchangyong93%2Fpost%2Ff94564c0-c09c-424d-846e-492d48f62fda%2Fimage.png)
아래와 같이 결과적으로는 같은 parameter를 가지고, output vector 형태만 다른데 왜 Convolutionalization을 할까?
![](https://velog.velcdn.com/images%2Fchangyong93%2Fpost%2F966164ee-b245-4a13-b0d9-85e6f1ca61ae%2Fimage.png)
Benefit of FCN
- Transforming fully connected layers into colvolution layers enables a classification net to output a heat map
- intput의 speicial dimension에 independent
기존 network의 경우 reshape으로 인해 input이 다르면 동작을 안하지만, FCN은 input image의 special dimension에 상관없이 kernel이 동작하기에, input size가 커지면 output feature map은 heatmap 과 같이 출력될 수 있다.
결과적으로 FCN를 통해 classification만 할 수 있던 network가 semantic segmentation과 같은 작업도 수행할 수 있다.
![](https://velog.velcdn.com/images%2Fchangyong93%2Fpost%2F1981b807-4283-457d-a3b5-6a3518bec527%2Fimage.png)
딘. FCN는 input size와 무관하게 동작하지만 network를 지나며 feature map의 special dimension이 줄어드는데(coarse output), 더 복잡한 작업(classification, segmantic segmantation 등등)을 위해 늘리는 작업이 필요하다.
Deconvolution(Upsampling)
시간되면 내가 읽어보려고 남겨놓은 링크, Deconvolution and Checkerboard Artifacts
- Deconvolution은 두 가지 방법이 존재
- 1) pooling layer를 복원
- 2) Cov layer의 stride에 의한 축소를 복원
Pooling layer 복원
1) Nearest Neighbor Unpooling : 같은 값으로 복원
2) Bed of Nails Unpooling : 특정 위치만 값을 저장하고, 나머지는 0으로 만드는 방법 baddddddd
3) Max Unpooling : max pooling 된 위치를 기억하고, 그 위치에 값을 복원하는 방법
![](https://velog.velcdn.com/images%2Fchangyong93%2Fpost%2F26335a95-4323-495a-b655-6542e4f1f676%2Fimage.png)
![](https://velog.velcdn.com/images%2Fchangyong93%2Fpost%2F32012c6e-280c-4391-8032-b7ea986be44d%2Fimage.png)
![](https://velog.velcdn.com/images%2Fchangyong93%2Fpost%2Fe9fd2c8a-deab-464f-a7c9-3eaefa8b81c9%2Fimage.png)
convolution transpose(강의에서 소개해준 방법)
![](https://velog.velcdn.com/images%2Fchangyong93%2Fpost%2F038453f8-8d29-4c27-a1ef-349367cdde63%2Fimage.png)
- Cov trans : 반대로 동일한 조건에서, 3x3 kernel로 만든 matrix shape을 Transpose 해주고, intput feature map을 flatten 해준 뒤 행렬곱을 하면 원하는 형태의 output feature map을 얻을 수 있음
![](https://velog.velcdn.com/images%2Fchangyong93%2Fpost%2Fa0949dba-3ada-4efb-b7fb-7c5cd97a3dcb%2Fimage.png)
![](https://velog.velcdn.com/images%2Fchangyong93%2Fpost%2Ff65cbcb6-b4af-4f46-a8ce-b63891a3d2d3%2Fimage.png)
result
F
![](https://velog.velcdn.com/images%2Fchangyong93%2Fpost%2Ff7dccbcf-55f3-4a41-8d08-45cf5a5f4ef8%2Fimage.png)
Detection
- Detection 역시 이미지 내에서 어떤 물체가 어딨는지를 찾고자 하는 것으로 segmenttation과 비슷하지만 per pixel이 아닌 bounding box를 찾는 것으로 접근
R-CNN
1) 이미지를 넣으면
2) 거의 2000개의 영역(patch, region, bounding box(bounding box regression))을 추출하고
3) 다양한 bounding box로 인해 다른 크기로 출력된 region들의 크기를 통일시키고, feature를 뽑고
4) SVC으로 분류
- brute force 느낌이며, 추출한 region들을 모두 alexnet으로 학습하여 2천개의 convolution feature map를 추출한 다음 각각을 classification하므로 오랜 시간이 걸림
![](https://velog.velcdn.com/images%2Fchangyong93%2Fpost%2Fce04a171-9d4f-4131-81eb-60176377acbc%2Fimage.png)
결과적으로 cat을 dog과 같이 detect하는 것을 보면 완벽하진 않지만 detection 문제를 풀고자 했던 시도가 있었다.
![](https://velog.velcdn.com/images%2Fchangyong93%2Fpost%2Fcec2dd6b-8938-4852-88b8-4d08d9197366%2Fimage.png)
SPPNet
- In R-CNN, the number of crop/warp is usually over 2,000 meaning that CNN must run more than 2,000 times(59s / image on CPU)
- However, in SPPNet, CNN runs once.
- image 안에서 2K 개의 bounding box를 뽑고, image 전체에 대해 conv feature map을 만들어서 bounding box에 포함된 feature map의 tensor만 추출하자는 idea 적용
- 결과적으로 R-CNN과 비슷하지만 방법이지만 SPPNet 상대적으로 매우 빠름
![](https://velog.velcdn.com/images%2Fchangyong93%2Fpost%2F61b6b102-c18d-4c16-8784-22ceebbe19f2%2Fimage.png)
Fast R-CNN
- 하지만 SPPNet 마저도 느릴 수 밖에 없음
- convolution을 한 번만 수행하지만, 2K 개의 bounding box 내의 tensor 추출하여 SPP를 통해 하나의 vector를 만들다음 분류를 해야하기 때문
- Fast R-CNN도 SPPNet에서 가진 것과 동일한 컨셉이지만, 마지막에 Nueral Net을 통해 classification과 bbox(bounding box) regression을 수행한 특징이 있음
![](https://velog.velcdn.com/images%2Fchangyong93%2Fpost%2F493c9d9d-252a-467e-af5e-4ad06e67140e%2Fimage.png)
Faster R-CNN
- Fast R-CNN에 image를 통해 bounding box도 뽑아내는 Region Proposal Network도 학습하는 것이 더해짐
![](https://velog.velcdn.com/images%2Fchangyong93%2Fpost%2Fbabae892-5888-4718-a60a-183e02bac439%2Fimage.png)
RPN(Region Proposal Network)
- 이미지가 있으면 이 이미지에서 특정 patch가 bounding box로써 의미가 있는지, 이 내부에 어떠한 물체라도 있는지를 찾아줌
- RPN을 해주기 위해 필요한 것이anchor box(미리 정해놓은 bounding box의 크기)
- 이미지 내 특정 크기의 물체가 있을 것이란 것을 알고 있는 상태에서 K개의 고정된 templete의 anchor boxes를 갖는게 RPN의 특징
![](https://velog.velcdn.com/images%2Fchangyong93%2Fpost%2F82479dce-1e03-4244-a4ec-f68f3e2099a6%2Fimage.png)
- RPN 역시 FCN을 활용
- conv filter가 모든 영역에 대해 찍어보기에 이미지 내의 모든 정보를 갖고 있으며, feature map은 9*(4+2)의 depth를 가지게 됌, 이걸 통해 해당 영역에서 어떤 bounding box를 사용할지, 말지 등을 결정
- 9 : 3개의 region size * 3개의 ratio
- 4 : width, height, x-offset, y-offset 조절로 4가지 형태
- 2 : 해당 bounding box가 쓸모 있을지
![](https://velog.velcdn.com/images%2Fchangyong93%2Fpost%2Fc13d4b49-a6f8-4bd5-b7a6-fa0dc8db9f35%2Fimage.png)
그 결과 기존 Fast R-CNN보다 조금 더 성능이 개선됨
![](https://velog.velcdn.com/images%2Fchangyong93%2Fpost%2F4ebeb58b-ffec-47b9-8ab9-6401ad3bfb5b%2Fimage.png)
YOLO(최근 YOLOv5까지 나옴)
- faster R-CNN보다 매우 빠름
- 이미지 한 장을 찍으면 바로 output이 나오는 네트워크 구조
![](https://velog.velcdn.com/images%2Fchangyong93%2Fpost%2F2e8faeb2-1f56-4789-8ddb-d5aecd9e8e40%2Fimage.png)
- S x S grid 내에서, 물체의 중심이 grid cell 내에 있을 경우, bounding box와 어떤 class인지 같이 예측
![](https://velog.velcdn.com/images%2Fchangyong93%2Fpost%2F0ec0e274-e407-4a44-b03b-be3eb3c8ad1d%2Fimage.png)
2-1. anchor box처럼 predefined box가 있는게 아니라, 각 cell은 B개의 bounding box의 x,y, w(width), h(height)를 찾아주고, 그 bounding box가 쓸모있는지를 예측
![](https://velog.velcdn.com/images%2Fchangyong93%2Fpost%2F36b2f289-4cc1-41cc-8d76-08c934b4c7a4%2Fimage.png)
2-2. 동시에 grid cell에 속하는, 중간에 있는 object가 어떤 class에 속하는지 예측
![](https://velog.velcdn.com/images%2Fchangyong93%2Fpost%2Fe90cef9c-7108-4a6d-9961-8233a2950aef%2Fimage.png)
- 마지막에, 두 정보를 취합하면 bounding box와 그 box가 어떤 class인지 출력
- 이 때 tensor의 크기는 (SxS, grid cell 개수) X (Bx5(x,y,w,h,yes/no) X C(class 개수)
![](https://velog.velcdn.com/images%2Fchangyong93%2Fpost%2F9aab3661-469a-4046-92f4-c32176b29a83%2Fimage.png)
그 결과 아래와 같이 detection을 한다!!
![](https://velog.velcdn.com/images%2Fchangyong93%2Fpost%2F9bda5b14-6921-4b20-a613-75ce2026a442%2Fimage.png)
이후 YOLO는 거의 real time을 유지한 채 성능이 개선되고 있다!!
참고