[Lec 12] Detection & Segmentation
이글은 앞부분에서 잠깐 semantic segmentation 이야기를 언급한 후,
중후반 부터는 object detection 이야기가 등장하고,
마지막에 instance segmentation을 언급합니다.
여러 종류의 컴퓨터 비전 tasks
Classification | Semantic Segmentation | Object Detection | Instance Segmentation | |
---|---|---|---|---|
특징 | No spatial extent | No objects, just pixels | 여러개의 objects, 특별히 하나의 object를 구별하는 과제는 (classification + Localization)라고 부름 | 여러개의 objects |
단점 | 이미지 전체를 하나의 클래스로 분류한다. | 여러개의 물체를 구분하지 못한다. | 발전중 | 발전중 |
기법 | Sliding Window, Fully Convolutional, upsampling | selective search, region proposal, RoI Pooling, RoI Align, RPN, two-stage / one-stage method | mask prediction |
Semantic Segmentation
Sliding window
입력 이미지를 작은 단위(사각형)로 쪼개고, 이 단위가 어떤 부류에 속하는지 분류(classification)합니다.
공유된 특징을 다시 사용하지 않고, 작게 쪼갠 모든 단위에 대해 forward/backward 과정이 필요하므로 비효율적입니다.
서로 다른 영역이라도 인접해 있다면 주변 특징을 공유할 수 있어서 물체의 구분에 도움을 줄 수도 있지만, 이것이 불가능 합니다.
Semantic segmentation Idea : Fully Convolutional
위 문제점을 개선한 것이 Fully convolutional network 입니다.
3x3 zero padding을 통해 이미지의 공간 정보를 손실시키지 않고, 최종적으로 C x H x W 의 prediction을 얻습니다. C는 카테고리 개수입니다.
C x H x W 로 나온 출력과 C x H x W 크기의 label을 각 픽셀마다 classification loss를 계산하게 됩니다.
따라서 입력 이미지에서 모든 픽셀에 해당하는 클래스 레이블이 있어야 합니다. 이를 다 레이블링하는 것은 굉장한 노동일 것 같습니다.
또 다른 문제는 같은 크기의 convolution 연산을 계속 하다보니 입력 이미지 해상도(resolution)가 커서 이 연산이 고비용라는 문제가 있습니다.
Downsample & Upsample
max pooling 또는 stride convolution으로 downsampling을 합니다.
그 이후에는 unpooling 등을 이용해 upsampling을 하여 공간 해상도(spatial resolution)를 원래 입력 이미지와 같도록 만듭니다.
Upsampling 과정은 어떻게 이루어 질까요?
첫번째 방법으로 unpooling이 있습니다.
Nearest neighbor, Bed of nails, Max unpooling 등이 있습니다.
두번째 방법으로는 transpose convolution 이 있습니다.
convolution 필터 처럼 학습이 가능한 'Learnable upsampling' 방법입니다.
4x4의 인풋에 3x3 convolution filter, stride=2, pad=1 을 적용(내적, dot product)하면 2x2 아웃풋이 출력됩니다.
transposed convolution은 이와 반대 과정으로,
Deconvolution
Upconvolution
Fractionally strided convolution
Backward strided convolution
등 다양한 용어로 불립니다.
2x2의 인풋에 3x3 transposed convolution, stride=2, pad=1을 적용하면, 4x4 아웃풋이 출력됩니다.
계산을 이해하는 데는 1차원으로 생각하면 훨씬 쉬울 것 같습니다.
크기가 4인 인풋에 1D conv(kernel size=3, stride=2, padding=1)을 적용한 결과는 크기 2인 아웃풋입니다.
이와 반대로, 크기가 2인 인풋에 1D conv(kernel size=3, stride=2, padding=1)을 적용한 결과는 크기 5 입니다.
아래 그림을 보면 이해하시겠지만, 사실 아웃풋의 크기는 6입니다. 위 그림은 0이 생략되어있고, 아래 그림은 모든 연산과정을 행렬로 보여줍니다. 아웃풋 크기 6은 (4 + 1 * 2(padding))이라고 생각할 수 있습니다.
conv연산을 위해 인풋은 열벡터( $\vec{a}$ )로 일자로 늘여놓고, 필터는 각 열마다 늘어놓되, stride만큼 건너뛰면서 배치($X$)하여 내적을 계산합니다. 이렇게 실제로 행렬연산을 이용한다는 것을 기억하면 좋을 것 같습니다.
transposed convolution은 $Xa = b $ 에서 마치 양변에 역행렬을 곱하여,
역으로 $ a = X^Tb $, 출력으로 부터 입력을 구한다고 생각하면 좋습니다.
아웃풋으로는 원래 입력에서 패딩의 크기가 추가된 $a$가 나올 것입니다.
또 다른 예제입니다.
입력 6(4 +2(패딩))에 아웃풋 4가 나오는 padding=same 조건(kernel size=3이면, padding=1)의 필터입니다.
이 conv 연산을 반대로 수행해봅시다.
입력 4에서 아웃풋 6가 나오는 것을 확인할 수 있습니다.
Sementic Segmentation의 일반적 구조입니다.
입력 데이터가 downsampling, upsampling을 거치면서 나온 출력의 모든 픽셀에서 실제 레이블과 cross-entropy를 계산하는 방식으로 네트워크 전체를 end-to-end로 학습시킬 수 있습니다.
Object Detection
Classification + Localization
이미지 샘플은 1000개의 class score와 4개의 box 좌표를 추정합니다.
그래서 cls loss와 bbox loss를 더한 multitask loss를 사용합니다.
실제로 각 loss 앞에는 이를 조절하는 하이퍼파라미터가 있지만, 이를 조절하는 것은 매우 까다롭고, loss값으로 성능을 비교하지 않고, 실제 모델 성능 지표를 이용해 성능을 비교한다고 합니다.
pretrained 모델을 사용하여 Trasnfer learning을 주로 합니다.
Human Pose Estimation
이를 적용해볼 수 있는 곳은 대표적으로 human pose estimation이 있습니다.
각각의 이미지에서 사람 포즈 좌표와 레이블 사이의 regression loss를 계산하고,
주어진 테스트 이미지에서 각 포즈를 예측하는 문제입니다.
주로 L2 loss 를 사용하고, L1 smooth, L1 loss 등 다양한 loss를 사용할 수 있습니다.
Object Detection as Classification
Sliding Window
슬라이딩 윈도우 방법은 위에서 말씀드린 것과 같이,
매우 많은 crop된 이미지(또는 location, scale, aspect ratio) 에 대해 각각 CNN을 적용해야 해서 비용이 비싸 비효율적입니다.
Selective Search
모든 crop 영역에 대해 CNN을 적용하는 sliding window대신,
Selective search를 이용해서 2천개 정도의 객체 후보 영역(Region proposal)을 정합니다.
방법은 비슷한 픽셀이 '뭉친' 곳을 찾아내는 것입니다. 따라서 region proposal 안에는 객체가 속할 확률이 높습니다.
Selective search 영역은 학습되는 영역이 아니고, 딥러닝과 별개의 전처리 알고리즘으로 이용됩니다.
이를 적용한 것이 R-CNN입니다. (Ross Girshick et al., 2015)
RCNN
아래에서 과정을 살펴보면,
1) 먼저 입력 이미지에서 Selective search를 통하여 region proposal을 얻습니다. (대략 2000개 후보)
2) 다음은 ConvNet 에 넣기 위해 이미지 크기를 224 x 224 로 resize합니다. (warp)
3) 한 번의 ConvNet 출력에서 class를 분류하기 위한 SVM loss를 합니다.
4) 이와 더 불어 bbox regression를 진행하여 (x, y, w, h) 의 4가지 값을 예측(predict)합니다.
학습과정은 총 3가지 입니다.
1) Softmax classifier 로 CNN을 미세조정(fine-tune)합니다. (log loss)
pretrained된 ConvNet을 wrap된 이미지를 가지고 미세조정(fine-tune) 합니다.
CNN은 RoI(Region of Interest)가 CNN을 통과하여 출력한 K + 1 (K 클래스 + background) 개의 클래스를 bbox ground truth와 비교하여 미세조정합니다. (softmax + log loss 를 사용)
대부분의 RoI가 background이기 때문에, 작은 학습률을 사용하고, positive(객체가 있는) 샘플을 미니배치에 더 많이 수집되도록 설정하여 학습합니다.
2) Linear SVM classifier 학습 (hinge loss)
각 image region마다 각 클래스 별 독립적으로 SVM binary 분류를 합니다.
예를 들면 region안에 car가 있으면 positive라고 하는 것이 명백(clear)하고,
region에 배경만 있으면 negative라고 하는 것이 명백합니다.
하지만, car의 일부만이 region에 있으면 이는 명백하지 않기 때문에 IoU로 판단하였다고 합니다.
즉, grouth truth와의 IoU $\geq$ 0.3 이면 positive, 그렇지 않으면 negative로 판별합니다.
앞서 softmax 분류기에서 클래스를 판별했는데, 이것이 맞는지 한번 더 거치는 작업을 함으로써, 성능을 올릴 수 있었다고 합니다.
3) Bounding-box regression (least squares)
각각의 RoI마다 class-specific detection SVM를 통해 스코어링을 후에
class-specific bbox regressor를 통해 새로운 bbox를 예측하게 됩니다.
즉, ground-truth와 매칭되는 새로운 bbox P로의 변형(transformation) 학습 방법을 찾는 것입니다.
4개의 함수를 통해 변형을 파라미터화 했습니다.
$ P = (P_x, P_y, P_w, P_h) $ 는 각 Predicted bbox의 중심좌표, width, height입니다.
$d_x(P), d_y(P)$ 는 스케일 변형과 관련되어있고,
$ d_w(P), d_h(P) $는 log-space 변형과 관련됩니다.
이를 통해 ground-truth box($\hat{G}$)를 예측합니다.
이렇게 변형 하는 것의 장점은, [$-\infty, +\infty$] 사이의 값을 취할 수 있도록 한다는 것입니다.
$ d_★(P) = w_★^T \phi_5(P)$ 에서 ★는 x, y, h, w를, $\phi_5$는 $pool_5$ 층에서 나온 피쳐를 의미합니다. 여기에 w라는 웨이트를 설정하여, 학습 가능한 파라미터를 만들었습니다.
그리고 target vector $t_★$와 $d_★$의 SSE(sum squared error)에 규제항을 추가하여 이를 최소화하는 최적화 작업을 진행합니다.
target vector는 위와 같이 구합니다.
여기서 중요한 점은 $\lambda$ 항이 학습에 영향을 많이 미쳤다는 것입니다. 여러 경험을 통해 $\lambda = 1000$
을 찾았습니다.
또한 모든 P box가 해당 하는 ground truth가 존재하는 것이 아닐 수 있으므로, 근처에 적어도 하나의 ground-truth box가 있는 proposal P에 대해서만 , IoU overlap $\geq 0.6$ 인 경우 학습을 진행하였다고 합니다.
하지만 RCNN은 단점이 많습니다.
- 학습 과정에서는 ConvNet 파라미터만 학습이 되고, selective search는 고정되어있습니다. end-to-end 학습이 아닌 단점이 있습니다.
- 지도학습이기 때문에 모든 객체에 대한 bbox정보가 필요해 레이블링에 대한 부담이 있습니다.
- 학습이 느립니다. (84시간), 많은 디스크 공간을 차지합니다.
- Inference(테스트 셋 예측) 과정도 느립니다.
Fast R-CNN
Ross Girshick(MS Research), ICCV, 2015
RCNN에서 selective search 후 RoI마다 CNN하는 방식이 매우 느리기 때문에,
Fast R-CNN은 CNN을 먼저하고 나온 feature에서 selective search를 하는 아이디어를 냅니다.
RoI Pooling (Region of Interest Pooling)
region proposal 은 서로 다른 사이즈를 가지고 있습니다,
첫번째 CNN에서 나온 feature에 selective search를 통해 RoI들을 구하면,
RoI pooling을 통해 하나의 고정된 사이즈로 변경할 수 있습니다. (e.g. 512 x 7 x 7)
예를 들어보겠습니다.
image feature가 RoI pooling의 input이 됩니다.
우리는 8x8의 이 인풋에서 발생한 다양한 크기의 RoI들을 고정된 크기 2x2로 바꿀것입니다.
region proposal (왼위, 오른아래) = (0, 3), (7, 8) 하나 있다고 해봅시다.
7x5 영역을 2x2로 만들어야 하기 때문에 완벽하게 가를 순 없습니다.
나누어 떨어지지 않는 것은 버림하여 계산합니다.
width_bin = 7 / 2 = 3
height_bin = 5 / 2 = 2
bin size만큼 영역을 자르면서, 마지막에 남는 영역은 통째로 계산하면 됩니다.
각 영역에서 max pooling한 결과 입니다.
이로써 pooling layer 의 한 종류로 생각할 수 있어 네트워크 안에 자연스럽게 이어지게 붙일 수 있게 되었습니다.
하지만 이는 2번의 quantized 과정이 필요해 정보손실이 있을 수 있고, 실제 bbox와 완벽하게 잘 매칭이 안된다는 문제가 있습니다. 이는 추후 Mask R-CNN 논문에서 RoI Align 으로 극복하는데, 여기서는 RoI Align이 무엇인지 미리보고 가겠습니다.
RoI Align
RoI Align은 Region proposal을 feature map에 적용시킬 때, 픽셀 칸에 맞추는 작업(quantize)을 하지 않습니다. 입력에서 feature로 축소비율만큼 같은 비율로 poposal도 축소가 되며, 길이가 소수여도 그대로 남겨둡니다.
그 후 RoI feature 크기 (7x7)만큼 정확히 등분하게 됩니다.
이 예제를 다시 보면, 640 x 480 이미지가 32배 줄어 feature는 20 x 15 가 되었음을 알 수 있습니다.
여기서 예를들어 320 x 240 proposal을 feature에 투영시키면, 10 x 7.5 가 될것입니다.
여기서 2x2의 RoI feature를 뽑아보도록 하겠습니다. (논문에서는 7x7을 합니다만 여기서는 편의상 2x2로 예를 듭니다.)
10x7.5를 각각 2등분하면 5x5.25가 될것입니다.
그러면, 이를 또 2x2의 subcell로 나눠 중점을 구합니다.
proposal의 (top left), (bottom right) 좌표가 주어지고, 각 width, height를 이용하면 이를 구할 수 있습니다.
image feature는 행렬로 나타낼 수 있고, 행렬의 각 index를 각 x, y의 좌표라고 하면 각각의 중점좌표를 알 수 있습니다. 즉
$$
\begin{pmatrix}(0, 0) & (1, 0) & (2, 0) & \cdots \newline (0, 1) & (1, 1) & (2, 1) & \cdots \newline \vdots & \vdots & \vdots & \ddots\end{pmatrix}
$$
확대된 그림과 수식을 보면, 센터점과 각 픽셀값을 이용해서 $f_{xy}$를 구할 수 있습니다.
식은 bilinear interpolation으로 2차원상에 선형 보간법을 의미합니다.
위 수식은 $(x, y)$와 멀리 떨어진 점은 더 낮은 가중치로, 가까운 점은 더 높은 가중치로 $f_{x_iy_i}$ 와 곱해주고 있습니다.
이제는 2x2 subcell 안에서 구해진 4개의 점을 maxpool하고,
각 subcell마다 결과를 다시 maxpool 하여 2x2 RoI feature를 만들면 됩니다.
이후는 Conv층 후에 FC 층을 거쳐
클래스 분류로 softmax log loss를,
bbox 회귀로 smooth L1 loss를 사용하면서 이 둘을 합쳐
Multi-task loss로 전체의 네트워크를 한번에 학습합니다.
하지만, 2000여개의 Region proposal을 selective search하는 시간이 2초 정도 걸린다고 합니다.
즉 이부분이 병목(bottle-neck)인 것입니다.
Faster R-CNN
Ross Girshick et al., 2015, NIPS
더 빠른 object detection 네트워크가 등장합니다.
selective search를 제거한 대신, RPN(Region proposal network)를 추가합니다.
RPN
각 픽셀마다 정해진 사이즈의 anchor box가 있다고 해봅시다.
먼저, 각 점에서 해당 anchor가 object를 포함하고 있는지 예측합니다. (per-pixel logistic regression) - classification loss
포함하고 있다면(positive), anchor로 부터 groud-truth box로 변형하는 예측을 합니다. (regress 4 number per pixel) - bbox regression loss
한 픽셀마다 다른 사이즈, 모양의 anchor box가 K개 있으므로,
K (1 + 5) x 픽셀 수 만큼의 예측값이 나오게 됩니다.
여기서 K 개의 박스를 object score가 높은 순으로, 300개의 proposal 후보를 출력합니다.
이와 같은 작업으로, selective search 병목을 제거하여 테스트시간 2.3초 → 0.2초의 드라마틱한 시간 단축을 할 수 있었습니다.
Faster R-CNN에는 4가지 loss가 있습니다.
1) RPN에서 object / non-object를 binary classify하는 loss
2) RPN에서 bbox 좌표를 regress하는 loss
3) Final에서 object에 대한 classification score loss
4) Final에서 bbox 좌표 regress 하는 loss
추가로 짚고 넘어가야 할 4가지 개념이 있습니다.
1) NMS (Non-max suppresion)
2) Proposal이 positive인지 negative인지 판단하는 방법
3) 두번째 스테이지에 전달할 positive/negative의 개수
4) Bounding box regression을 파라미터화 하는 방법
R-CNN 계열은 후보 RoI마다 독립적 연산을 수행합니다. 따라서 R-CNN 계열 네트워크를 region-based method라고 합니다.
또한 RCNN 계열은 첫번째 스테이지로 각 이미지에 대해 연산하여 image feature을 뽑고,
두번째 스테이지에서 각 RoI마다 CNN을 통과하여 object class와 bbox를 예측합니다.
이런 의미에서 Two-stage object detector라고 불립니다.
반면에 One stage object detector도 있습니다.
)
YOLO의 경우 정리해 놓은 글이 따로 있습니다.
https://wordbe.tistory.com/entry/Real-time-YOLO-You-Look-Only-Once?category=1072348
SSD, RetinaNet도 유명한 아키텍쳐 입니다.
특히 RetinaNet의 Focal loss는 imbalance 한 데이터 문제를 해소하는데 도움이 됩니다.
Instance Segmentation
마지막으로 Instance Segmentation입니다.
Semantic segmentation + Object detection이라고 할 수 있습니다.
대표적으로 Mask R-CNN(He et al., ICCV 2017)을 예로 들 수 있습니다.
)
각 RoI별 Mask prediction이 진행되는 방식입니다.
Mask R-CNN은 매우 잘 적용이 됩니다.
Mask R-CNN은 이 링크에 정리해 놓았습니다.
https://wordbe.tistory.com/entry/Mask-RCNN?category=1058161 (보강예정)
2019년 기준으로,
2D Object Detection을 넘어, 관련된 다양한 연구가 진행되고 있습니다.
키워드만 정리하려합니다.
- Dense Captioning = Object Detection + Captioning
- Scene Graphs = Objects + Relationships
- 3D Object Detection
- 3D Shape Prediction
reference
Object detection: https://lilianweng.github.io/lil-log/2017/12/31/object-recognition-for-dummies-part-3.html#model-workflow
RoI Pooling: https://deepsense.ai/region-of-interest-pooling-explained/
RoI Pooling, RoI Align: https://www.youtube.com/watch?v=XGi-Mz3do2s
cs231n 2017: http://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture11.pdf
cs231n 2019: http://cs231n.stanford.edu/slides/2019/cs231n_2019_lecture12.pdf
'ML, DL > object detection' 카테고리의 다른 글
Object Detection 예제, 설명, 코드포함 [Pytorch] (282) | 2020.06.14 |
---|---|
[Real-time] YOLO, You Look Only Once (979) | 2019.10.27 |
댓글