최신 물체 검출 방법 Mask R-CNN의 RoI Align과 Fast(er) R-CNN의 RoI Pooling의 차이를 정확히 이해하다

입문


CNN의 빠른 물체 검측을 바탕으로 하는 선구자 Fast R-CNN, Faster R-CNN, 최신 Mask R-CNN에서 먼저 물체의 후보 구역을 Region proposal로 검측하여 이 Region proposal이 실제로 식별 대상의 물체일 것으로 추정한다. 만약 식별 대상이라면 어떤 종류일지.
Fast R-CNN계 방법의 기초가 되는 R-CNN에서region proposal의 구역을 입력 이미지에서 잘라내어 고정된 사이즈의 이미지로 조정한 다음에 분류용 CNN으로 조정하는 처리가 진행되기 때문에 대량의 region proposal을 0에서 CNN으로 추가해야 하는데 매우 저속적이다.

참조.
이에 비해 Fast(er) R-CNN에서 어느 정도 볼륨 처리를 한 피처맵에서region proposal에 해당하는 일부 구역을'고정 사이즈의 피처맵'으로 추출한 RoI Pooling으로 하여 앞부분의 볼륨 처리를 공통화시키고 고속화를 실현했다.
그러나 RoI Pooling 대상인feature map은 입력 이미지에 비해 해상도가 낮기 때문에 RoI Pooling의 구역에 실제 대응하는 이미지 구역이 원래의region proposal의 이미지 구역과 분리되는 문제가 존재한다.
최신 Mask R-CNN에서 이 문제를 해결한 RoI Align을 소개합니다.
RoI Align과 RoI Pooling에 관해서는 상세한 설명을 잘 보지 못했기 때문에 본고에서 이러한 처리에 대해 상세한 설명을 하고자 합니다.

RoI Pooling


RoI Pooling에서 어느 정도 볼륨 처리를 한 피처맵에서 지역proposal에 해당하는 일부 구역을'고정 사이즈의 피처맵'으로 추출한다.
여기서 설명하기 위해 입력한 이미지 크기가 320x480이라고 가정하고 해상도 1/32의 CNN을 곱하여 10x15의 피처맵을 얻어 RoI Pool의 결과로 3x3의 피처맵을 추출하고자 합니다(보통 RoI Pooling의 출력은 7x7의 피처맵을 사용하지만 설명을 위해 3x3).

위의 그림에서 보듯이featuremap에 원시 이미지의regionproposal 구역을 투영할 때featuremap와 하위 픽셀 단계의 편차가 발생합니다.
회전 위치에서 오프셋을 반올림하고 위치를 지정합니다.

구체적으로 말하자면 우선regionproposal의 좌표를 정수치에 넣고 상기 빨간색 외접 직사각형을 얻는다.이때 최대 편차는 0.5픽셀입니다.이것은 원시 이미지에서 CNN의stride의 절반에 해당하고 이번 예에서 32/2=16 픽셀의 편차에 해당한다.
그리고 그 외접 직사각형 등을feature 맵의 사이즈와 같은 종이 상자 수로 나눈다.그리고 피처맵의 RoI 내 픽셀을 각각 3x3개의 종이 상자 중 임의로 분배하고, 분배된 종이 상자에서 max나 average를 추출하여 RoI Pooling의 출력을 얻는다.
위 그림에서 시송화 도안으로feature 맵의 각 픽셀의 분배를 나타낸다.반올림 방법과 픽셀 분배 방법은 여러 가지 방법(사거 등)을 고려할 수 있지만, 상술한 그림과 같은 형상이 오차를 줄일 수 있습니까?
(여기관련 비디오에서 RoI를 취득하거나 3x3을 분할할 때 포기하는 설명이기 때문에 상당한 오차가 있는 것처럼 보이지만 원시 논문에서도'round'라고 표시된다)
어쨌든 RoI를 가져오거나 픽셀을 할당할 때 반올림 오차가 발생하기 때문에 분할 등 위치 편차가 허용되지 않는 응용 프로그램에 문제가 된다.

RoI Align


위의 RoI Pooling 문제를 해결한 것은 RoI Align입니다.이것은straight forward로 알고리즘으로 이해하기 쉽다.
RoI Align에서 먼저 Region proposal의 영역 등을 3x3으로 분할합니다.

그리고 피처맵 부근의 4개의 픽셀bilinear interpolation을 사용하여 하위 픽셀 좌표를 가진 상기 격자점의 값을 계산합니다.마지막으로 max나 average에서 pooling과 각 격자에 대응하는 4개의 격자점의 값을 통해 RoI Align의 출력을 얻을 수 있습니다.
또한 상술한 격자점의 상황은 논문에 명확하게 기재되지 않아 다음과 같은 기술에서 추측한 것이다.구현을 확인하고 정보를 업데이트하려고 합니다.
왜냐하면 작가들의 자료가 격자 추출법이 수정되었기 때문이다!
compute the exact values of the input features at four regularly sampled locations in each RoI bin
Ross Girshick 씨의 자료만 보면 Mask R-CNN의 Roialign은 14x14의 bin의 중앙에서 값을 추출하여 mask branch에 대해 그렇게 검측용 pooling으로 물어먹으면 된다. 고양이 귀여움https://t.co/FWFhpuxqZv-Yosuke Shinya(@shinya7y)pic.twitter.com/4hiyJQEgCi
참고로 본문에 기재된 바에 의하면 더욱 간단하게 말하면 각 칸의 중심 좌표의 값을bilinearinterpolation하고 이 값을 직접 이용하는 것도 마찬가지로 효과적이다.만약 RoI가 피처맵보다 작다면, 나는 심지어 이것이 비교적 좋다고 생각한다.
그러나 이 부근의 처리는 피처맵을 이미지에 비유하면 픽셀급 이미지의 크기 조정 문제로 이미지 처리 업체의 측면에서 볼 때 더 좋은 해결 방안이 있을 수 있다.
참고로 TensorFlow 구현에서 RoI Pooling 대신 Resize를 사용한 것 같지만 크기를 조정하는 알고리즘에 따라 RoI Pooling보다 RoI Align의 결과를 얻을 수 있고 정밀도에서도 더 좋을 수 있습니다.
tensorflow 설치는roipooling이 아니라resize가 대변을 사용합니다~,This is much more efficient andhas little impact on results ngo.정말요? - k3nt0(@K3nt0W)2017년 10월 3일

구현 예


PyTorch 설치


2017년 8월 26일.
https://github.com/felixgwu/mask_rcnn_pytorch의 실현만 보면'각 칸의 중심 좌표의 값을 bilinear interpolation으로 하고 이 값을 직접 이용한다'는 것을 이용했다.

TensorFlow 구현


roi_align_kernel.cu
https://github.com/CharlesShang/FastMaskRCNN과 같이 tf.image.crop_and_resize를 이용하여 사이즈를 조정한다.tf.image.crop_and_resizebilinearinterpolation을 삽입 방법으로 사용하기 때문에 결과는 상기 방법과 같다.

Caffe 구현


여기 Issue.
https://github.com/jasjeetIM/Mask-RCNN만 보면 각 칸의 중심 좌표를 중심으로 한 1픽셀 사방의 격자 위의 4점을 샘플링합니다.본고의 예보다 우리의 설치가 더 적합할 수 있다.
R. Girshick, "Fast R-CNN,"in Proc. of ICCV, 2015.  roi_align_layer.cpp
S. Ren, K. He, R. Girshick, J. Sun, "Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks,"in Proc. of NIPS, 2015. 
Mask R-CNN, "K. He, G. Gkioxari, P. Dollar, and R. Girshick, in Proc. of ICCV, 2017. 
R. Girshick, J. Donahue, T. Darrell, and J. Malik, "Rich Feature Hierarchies for Accurate Object Detection and Semantic Segmentation,"in Proc. of CVPR, 2014. 

좋은 웹페이지 즐겨찾기