728x90
Semantic Segmentation
[개요]
- image를 입력해서 pixel별로 카테고리를 얻는 것
- 이미지 안에 있는 instance를 구분하지 않는다 (cow1,cow2가 있을 경우 그냥 묶어서 cow로 도출)
[구현방법]
1. Sliding Window
- Full image에서 작은 이미지들을 추출한다
- 해당 작은 이미지를 CNN 네트워크에 입력시킨 후 픽셀의 카테고리를 산출한다
- 문제점 : 모든 이미지에 대한 작은 이미지를 추출하고 돌려야하기 때문에 비효율적
2. Fully Convolutional
- 모든 픽셀에 대한 분류를 진행하기 위해 왕큰 CNN을 만드는 것
- 방법
- 초반에는 activation map의 크기를 줄이는 형태로 downsampling을 진행한다. 이로 인해 연산이 효율적으로 되고 네트워크를 깊게 만드는 것도 가능해진다.
- 이후 upsampling을 통해 원본 이미지 수준으로 다시 복귀시킨다
- 모든 픽셀에 대해 cross entropy loss를 계산하고 평균 loss를 구한다
- Upsampling
- Unpooling
- NN : 작은 레이어의 값들을 큰 레이어로 확장시킬때 주변에 있는 픽셀 값으로 채워주는 것
- Bed of Nails : 작은 레이어의 값들은 각 구역 별 좌상단 값으로 배치, 나머지는 0으로 채우는 것
- Max Unpooling
- Max Pooling 시, 구역마다 Max 값이었던 요소들의 위치를 기억하고 Unpooling 시 그 위치에 해당 요소를 넣고 나머지는 0으로 채우는 것
- Transpose Convolution
- 학습 가능한 Upsampling 방법
- 입력 레이어의 요소(값 하나! 스칼라!)를 필터와 곱하고, 해당 값을 위치에 맞추어 출력 레이어에 배정하는 것
- 이 경우 stride에 따라 겹칠 수 있는데 겹칠 경우 두 값을 합친다
- Unpooling
- 이 과정을 포함한 Convolution은 결국 행렬곱으로 나타낼 수 있음!
- Convolution의 경우 input layer에 filter를 행렬곱하는 것
- Unpooling의 예시는 input layer를 전치시킨 후 필터를 행렬곱 하는 것
- 이 때 stride가 2 이상일 경우 transpose 일 땐 normal convolution이 아니다
Classification + Localization
[방법]
- 이미지를 입력 시킨다
- CNN을 통과시킨다 (pre trained 네트워크를 써서 전이 학습을 시키는 경우도 있음)
- 결과 값으로 벡터를 산출한다
- 해당 벡터를 2 방향으로 FC를 연결한다
- Classification을 위한 FC
- 카테고리를 분류해서 class score를 구한 다음 softmax로 Class Loss를 구한다
- Localization을 위한 FC (Regression 문제처럼 구하기)
- 클래스 별로 박스 위치(x,y,z,h)를 구한 다음 정답 박스와의 차이 통해 L2 Loss를 구한다
- 완전완전 Fully Supervised learning이다
- Multitask Loss를 구한다
- 두 Loss를 합칠 때 가중합을 사용하기 때문에 가중치를 조정하는 파라미터가 있다
- 두 Loss의 가중합에 대한 gradient를 구할때 이 가중치가 사용되는데, 문제는 이 가중치를 결정하기가 어렵다. 원래대로라면 Loss의 변화양상을 보면서 하이퍼파라미터를 구할텐데, 가중합이기 때문에 가중치가 Loss function 그 자체에 관여해서 값 간 비교하는 것이 ..안된다!
- 그래서 이 가중치 파라미터를 구할 땐 Loss변화로 관찰하기보다 다른 성능 지표를 사용해서 파라미터를 결정한다( 무슨 지표인진 안알려줌)
- 만약 Pose estimation도 곁들이고 싶다면 14개의 관절 위치를 output으로 예측하도록 설계할 수 있다. 각 관절 마다의 좌표값을 구하고 이 좌표값의 오차를 모두 구한 후 합해서 전체 오차를 구할 수 있다
Object Detection
[Sliding Window]
- 이미지의 일부를 crop한 이미지를 여러개 만들고 이 이미지마다 CNN을 적용해서 이미지를 해당 클래스인지(cat, dog, background..)분류하는 방법
- 너무 계산 효율이 떨어진다
[Region Proposal을 이용한 방법들]
기본 개념 : Region Proposal
- Object가 있을만한 뭉텅이 이미지 영역을 BoundingBox로 여러개 찾는다. 이 때는 머신러닝이 아닌 고전신호처리 방법인 Selective Search를 사용한다
- 찾은 Region을 CNN에 넣어서 해당 Region의 클래스를 예측한다
방법1. R-CNN
- 앞서 사용되었던 Region Proposal을 얻기 위해 Selective Search를 사용해 Region들(앞으로는 RoI)을 여러개 얻어낸다
- CNN 사용을 위해 모든 RoI의 사이즈를 통일시킨다
- CNN을 통과시킨다
- RoI의 클래스를 분류한다 (SVM사용)
- 또한 BBox 위치를 보정하기 위해 Linear Regression을 사용한다
- 두 작업으로 부터 나온 Loss를 합쳐 Multitask Loss를 구한다
- 문제점 : 너무 느리다...
방법1. Fast R-CNN
- 먼저 이미지를 바로 CNN에 넣어 Feature map을 얻는다
- Selective Search를 사용하여 Feature map에 Roi를 투영시킨다
- Feature map에서 가져온 RoI를 FC에 넣어주기 위해 RoI 풀링을 통해 사이즈를 맞춰준다
- FC에 연결해서 분류를 위해 Softmax Classifier와 연결하고 (softmax loss와 Linear Loss를 같이 사용), BBox 위치를 위해 Linear 함수를 사용한다
- Multi task Loss를 위해 두 Loss를 합치는데 이 때 Log Loss + Smooth L1 Loss이다
방법1. Faster R-CNN
- 이미지를 CNN에 넣어준다. (3x640x480이라 하자!)
- RoI 생성을 위해 Region Proposal Network를 중간에 삽입한다
- RPN 에서는 ground truth가 없음메.. 일정 threshold이상 겹치는 것을 true, 이하인 것을 false로 할 것
- RPN에서도 오차가 생성되며 classification loss(object 존재 여부), BBox regression loss로 구성된다
- Feature map을 만든다 (512x20x15)
- Feature map에 RoI를 투영시킨다 (하나의 프로포절마다 !)(512x18x8, 프로포절마다 다를수있음)
- 투영시킨 Feature map을 7x7 매트릭스 크기로 나눠주고, 한 셀 마다 Max Pool 한다 (512x7x7 per region)
- FC에 이를 연결한다
- Final classification loss와 Final Box loss 를 구한다
- RPN과 Final의 오차 모두 Jointly train시킨다
[Single Shoot Detection : without Proposal]
각 task를 따로 계산하지 말고 한번에! 하면 안되나?
- input image를 7x7 그리드로 나눈다
- 각 그리드 마다 base box 를 여러개 만든다 (길쭉한넘 ..뚱뚱한넘..등등)
- Regrssion을 이용해서 만든 Base box가 진짜 위치가 되려면 얼마나 움직여야 하는지 위치에 대해 회귀분석한다
- Class score도 함께 계산한다
Instance Segmentation
최종보스임. object 위치도 알아야하고 segmentaiton mask도 알아야함;
[Mask R-CNN]
- 먼저 CNN, RPN을 함께 돌려서 Feature map에 RoI를 투영한다
- 해당 부분에 대해 먼저 카테고리와 BBox를 예측한다 (as Faster RCNN)
- 해당 부분이 object인지 아닌지 알기 위해 Selective Search미니 네트워크를 사용한다! 이 결과가 mask로 산출된다
'👩💻LEARN : ML&Data > Lecture' 카테고리의 다른 글
[CS231n] Lecture10. Recurrent Neural Networks (0) | 2023.05.16 |
---|---|
[CS231n] Lecture9. CNN Architecture (0) | 2023.05.16 |
[CS231n] Lecture8. Deep Learning SW - Pytorch (1) | 2023.05.16 |
[CS231n] Lecture6. Training Neural Networks 2 (0) | 2023.05.15 |
[CS231n] Lecture6. Training Neural Networks 1 (0) | 2023.05.14 |