Semantic Segmentation
- Dense classification, Per pixel classification와 같은 의미로 사용됨
- 픽셀마다 이미지를 특정 라벨로 분류하는 작업
- 자율주행(특히, 라이더 센서를 사용하지 않는 자율주행)에 많이 활용되고 있음
[사전지식 #1] Fully Convolutional Network
- 위치 정보를 보존하고자 생성하는 네트워크
- Segmentation의 목적은 이미지의 각 픽셀에 대해 클래스로 구분하고, 오브젝트 및 배경을 분할하는 것
- 기존의 Fully Connected Layer에선?
- 이미지가 컨볼루션과 풀링을 통과하여 Fully Connected Layer를 생성하여 분류 작업을 진행
- 이럴 경우, 기존의 이미지에 대한 위치 정보가 사라짐, 하지만 Segmentation에선 위치 정보가 중요
- 이를 방지하고자, Dense Layer을 없애, 인푹과 아웃풋 사이즈가 동일하게 만들고자 함
- 이렇게 진행할 경우 파라미터 수는 동일하게 유지됨
[사전지식 #2] Deconvolution
- upsampling을 진행하는 과정
- 기본적으로, FCN은 어느 사이즈나 진행할 수 있지만, 일반적으로 서브샘플링 과정을 거쳐 아웃풋 사이즈(차원)이 감소됨
- 따라서, 이를 다시 늘려주고자하는 과정
- 패딩을 많이 줘서, 아웃풋을 확대하는 방법이기 때문에 근본적으로 역연산은 아님
FCN 논문 리뷰 - Fully Convolutional Networks for Semantic Segmentation
Object Detection
[Method #1] R-CNN
1) Selective Search를 활용하여 이미지 안에 약 2000개의 ROI를 뽑아내어 모든 같은 크기로 변경
2) 각 ROI별로 CNN을 통과하여 피처를 계산 후, 선형 SVM을 활용하여 분류를 진행
- 하지만, 이렇게 진행할 경우 ROI(region of interest)마다 CNN을 진행해야 하기 때문에, 약 2000번을 진행해야하기 때문에 비효율적
- 또한, 이와 같은 방법의 경우 multi stage 파이프라인으로, 모델을 한번에 학습이 불가
[Method #2] SPPNet
1) 이미지를 ROI를 기준으로 crop이나 warp하기전에, CNN을 통과시켜 피처맵 먼저 얻음
2) 이를 바탕으로, ROI 부분에 해당하는 텐서만 가져와서 분류를 진행
- 이로써, CNN을 여러번 돌리는 수고를 하지 않아 작동시간 감소
[Method #3] Fast R-CNN
1) Selective Search를 활용하여 ROI(Region of Interest) 영역을 지정
2) 전체 이미지에 대한 CNN를 통과하여 피처맵을 추출
3) 각 ROI부분을 가져와 ROI 풀링을 진행하여 고정된 크기의 피처벡터를 생성
4) FC 레이어를 통과한뒤, 브랜치로 나눔
4-1) 하나는 softmax를 통과하여 Object 분류를 진행
4-2) 다른 하나는 bounding box regression을 통해 selective search로 찾은 박스를 조정
- 이로써, 단일 파이프라인을 구축하고, 모델을 한번에 학습시킬 수 있게됨
- 하지만, 여전히 Selective Search를 통한 ROI 영역 지정은 시간이 많이 걸림
(논문리뷰) Fast R-CNN 설명 및 정리
[Method #4] Faster R-CNN
- RPN + Fast R-CNN 구조를 취하고 있음
- RPN(Region Proposal Network)이란?
- Selective Search 부분에서 걸리는 시간을 단축하고자, ROI 생성하는 네트워크도 GPU에 넣어 컨볼루션 레이어에서 생성하도록 하자는 취지
- 아래 그림과 같이, CNN을 통과한 피처맵에서 RPN에 의해 ROI를 생성
- 하지만, 이역시 상대적으로만 빠를 뿐, 실제 서비스에 활용하기에는 매우 느림
(논문리뷰&재구현) Faster R-CNN 설명 및 정리
[Method #5] YOLO(You Only Look Once)
- 기존의 모델들은 복잡한 처리과정으로 Human Visual System을 모방하기엔 부족
- 기존의 ROI를 지정한 이후, 분류를 진행하는 모델들과는 달리, 네트워크의 최종 출력단에서 ROI (여기선 Bounding Box)찾기 및 분류를 동시에 이뤄지는 방식 => 하나의 회귀문제로 바뀐 격
- 이미지가 주어지면 S*S 그리드로 나눔
- 각각의 셀(그리드)은 다음과 같은 2가지 역할을 진행
-
각 셀안에서 B개의 바운딩 박스를 예측하고, 각각의 Bounding Box에 대한 존재여부에 대한 확률을 계산
=> 셀당 B개의 Confidence Score
ConfidenceScore=Pr(Object)∗IOUpredtruth
(만약 Grid에 Object가 존재하지 않을 경우 0)
-
각 셀이 C개의 Object중 하나일 조건부 확률을 계산
=> 셀당 C개의 Conditional Class Probability
ConditionalClassProbability=Pr(Classi∣Object)
-
각각의 Bounding Box는 x, y, w, h, confidence로 구성
- x : grid cell 내의 bouding box의 중심 x좌표가 차지하는 비율(0~1, 중간일 경우 0.5)
- y : grid cell 내의 bouding box의 중심 y좌표가 차지하는 비율(0~1, 중간일 경우 0.5)
- w : 전체 이미지(각 셀 아님) 대비 bouding box가 차지하는 비율(0~1, 전체 width의 절반일 경우 0.5)
- h : 전체 이미지(각 셀 아님) 대비의 bounding box가 차지하는 비율(0~1, 전체 height의 절반일 경우 0.5)
-
물체 존재여부를 확인
-
동시에, 각각의 셀은 C개의 클래스(라벨)에 대한 확률을 예측
- SS( B*5 + C)