[Paper] CornerNet
CornerNet: Detecting Objects as Paired Keypoints ECCV 2018 Hei Law, Jia Deng
Abstract
CornerNet -> object bbox를 keypoint(top-left,right-bottom)의 쌍으로single convolution neural network로 예측
이 방법을 통해 원래 single-stage에서 사용하던 anchor box를 design할 필요 사라짐
corner pooling -> corner localize를 도와주는 새로운 pooling layer
Introduction
이전의 object detection 은 CNN을 활용한 모델들이 좋은 성능 이중에서 SOTA 모델이 주로 사용한게 Anchor box Anchor box : boxes of various sizes and aspect ratios that serve as detection candidates
- one-stage detector 에서 two-stage detector 못지 않게 성능을 낼 수 있고 효율적이라 자주 사용
- 매우 많은 set의 anchor box가 필요 (DSSD 에서는 40k, RetinaNet에서는 100k) -> detector가 각 anchor box가 충분히 gt와 겹치는지를 classify 하기 때문. 정답을 확정짓기 위해서는 많은 anchor box 필요
- 많은 hyperparameter와 design choice들이 존재 -> 이 두개를 결정함에 있어 매우 복잡한 문제
CornerNet : new one-stage approach t object detection that does away with anchor boxes object의 bbox를 top-left corner 와 bottom-right corner의 keypoint의 쌍으로 표현
같은 object category의 top-left corner, bottom-right corner의 heatmap을 예측하기 위해 single convolutional layer 사용 + 각 코너의 embedding vector
embedding은 한 쌍의 corner들을 그룹화 하기 위해 사용 -> 네트워크는 비슷한 embedding을 예측하도록 훈련
이러한 방법을 통해 기존의 anchor box를 대체/출력을 간소화
corner pooling
convolutional network가 bbox corner를 더 잘 찾아내도록 도와주는 새로 제안한 pooling layer
그림에서 보면 종종 corner keypoint가 있는 부분이 location을 특정하기 위한 evidence가 없을 때가 있다.
이를 위해 top-left corner를 특정하기 위해서는 객체의 맨 위 경계에서 오른쪽으로 끝까지, 아래쪽으로 끝까지 이동
이 개념으로 motivate
두개의 feature map 사용 첫번째 feature map에서는 각 채널마다 오른쪽으로 feature vector를 maxpool 두번째 feature map에서는 각 채널마다 아래쪽으로 있는 모든 feature vector에 대해 maxpool
2개의 pooling된 결과를 함께 추가
Anchor box보다 corner detecting이 좋은 2가지 이유
- anchor의 중심이 객체의 4개의 방면과 연관되어 있기 때문에 corner는 2개 측면에서 보기 때문에 더 쉬움 + corner pooling을 통해 모서리에 대한 지식 encoding
- box의 space를 빼곡히 이산화 하는데 효율적 just need $O(wh)$ corners to represent $O(w^2h^2)$ possible anchor boxes.
Ablation study를 통해 corner pooling이 매우 중요하다는 것을 보여줌
Related works
Two-stage object detectors
R-CNN에 의해 처음 나온 개념 RoI 를 생성하고 각각을 network에서 classification 이를 low-level vision algorithm을 통해 RoI 생성(selective search, Locating object proposals from edges) 이후 각자가 ConvNet에서 processed -> 많은 computation
SPPnet, Faster R-CNN 이 R-CNN 기반으로 feature map에서 region을 뽑는 새로운 pooling layer를 사용하여 성능 향상 그러나 두 방법 다 분리된 proposal algorithm에 의존 -> end-to-end로 학습할 수 없음
Faster R-CNN -> RPN 사용하여 low-level proposal algorithm 사용 이를 통해 detector가 더 효율적이게 되고 end-to-end로 train 가능
R-FCN 은 Faster R-CNN에서 fully-connected sub-detection network를 fully-convolutional sub-detection network로 교체하여 성능 향상
other works
- [[Subcategory-aware convolutional neural networks for object proposals and detection]] : 하위 category 정보 통합
- multi scale proposal
- [[Feature selective networks for object detection]] : select better feature
- [[Light-head R-CNN]] : 속도 향상
- [[Cascade R-CNN]] : cascade procedure
- [[An analysis of scale invariance in object detection-snip.]] : better training procedure
One-stage object detectors
RoI pooling step을 줄인 one-stage 방식의 YOLO, SSD 방식이 주로 사용되었다 two-stage 방식에 비해 computationally efficient, 어려운 dataset에서 유사한 성능을 보여주었다
- SSD: multiple scale에서 anchor box들을 빼곡히 배치 -> 이를 통해 각 anchor box를 refine, classify
- YOLO: bbox를 image에서 뽑지만 이후 YOLO 9000에서 anchor box 사용
- DSSD,RON: hourglass network와 유사한 network 채택 -> low-level과 high-level feature를 skip connection을 통해 combine, 더 정확한 bbox 예측
이러한 one-stage 방법들은 RetinaNet 덕분에 two-stage를 이김 RetinaNet에서는 빼곡한 anchor box가 positive와 negative 사이에 큰 imbalance를 가져온다고 주장 -> training 비효율적 +anchor box의 weight를 dynamic하게 조정하는 Focal loss 사용
RefineDet: filtering을 통해 negative anchor box의 수를 줄이고 coarse하게 조정
DeNet: anchor box 없이 RoI 생성하는 two-stage detector top-left,top-right,bottom-left,bottom-right 에 대해 4개의 location이 여기에 속할 확률을 결정 이후 모든 가능한 corner 조합을 생성하여 이후 two-stage 방식을 따른다
본 논문의 방식은 이와 매우 다른 방법
-
- DeNet: 두 corner가 동일한 객체인지 식별하지 못하고 subnetwork에 의존하여 좋지 않은 RoI 거부
- CornerNet: 단일 Convnet을 사용하여 corner 탐지, 그룹화하는 one-stage detector
-
- DeNet: region과 비교하여 수동으로 결정된 위치에서 feature 선택
- CornerNet: feature selection step 없음
- corner pooling
corner를 embedding vector를 통해 그룹화 3가지 특징
- corner pooling layer
- hourglass architecture
- focal loss
CornerNet
Overview
- 객체를 top-left, right-bottom 두개의 keypoint 쌍으로 detect
- conv layer는 다른 object category의 corner 위치를 나타내는 두 세트의 히트맵 예측(left-top, right-bottom)
- 감지된 corner에 대해 임베딩 벡터 예측하여 같은 객체의 두 모서리 사이의 임베딩 거리가 작도록 만든다
- bbox를 맞추기 위해 corner 위치를 조정해주는 offset도 예측
- 예측한 값들을 사용해 post processing 알고리즘을 적용하여 최종 bbox 생성
- hourglass network를 backbone으로 사용
- 이후 두개의 예측 모듈(top-left, right-bottom)
- 각 모듈은 히트맵, 임베딩, offset을 예측하는데 이 전 단계에서 corner pooling 사용
- multi-scale feature 사용하지 않는다
Detecting corners
C x H x W
- C: 각각의 히트맵의 채널(카테고리 수), 백그라운드 채널 없음
- 각각의 채널은 class의 corner의 위치를 나타내는 binary mask
positive location을 통한 bbox도 gt annotation과 많이 겹침
- 각각의 corner에 대해 하나의 gt positive location이 존재(이외의 장소는 negative)
- training 시에 negative에 penalty를 동일하게 부과하지 않고 positive 위치의 반경 내에 있는 negative에 주어진 penalty를 줄인다
- false corner detect pair도 만약 positive location과 가깝다면 충분히 gt annotation과 많이 겹치는 bbox 생성
- 생성한 bbox가 gt와 t(threshold,0.7)의 IoU 이상인 것을 가지고 radius를 pair of point 결정
- radius가 주어지면 $e^{-\frac{x^2 + y^2}{2\sigma^2}}$ (unnormalized 2D gaussian)을 사용하여 penalty 부여
- center가 positive에 있고 σ가 반경의 1/3에 있는 negative에 대해
Focal loss
$
L_{\text{det}} = -\frac{1}{N} \sum_{c=1}^{C} \sum_{i=1}^{H} \sum_{j=1}^{W} \left{
\begin{array}{ll}
(1 - p_{cij})^\alpha \log(p_{cij}) & \text{if } y_{cij} = 1
(1 - y_{cij})^\beta (p_{cij})^\alpha \log(1 - p_{cij}) & \text{otherwise}
\end{array}
\right.
$
- $p_{cij}$: 예측한 heatmap의 클래스 c의 (i,j) 위치의 score
- $y_{cij}$: unnormalized gaussian에 의해 augment 된 ground truth
- N: image 내의 object 갯수
- α,β: 각 point의 기여도를 조정하는 hyperparameter(α = 2,β = 4)
Unnormalized 2D Gaussian
- 객체의 위치에 대한 gt 주변에서 penalty를 줄이는데 사용
- 예측 위치 주변에 가우시안 분포를 적용하여 실제 모서리 위치 근처의 예측이 정확이 일치하지 않더라도 페널티가 감소하도록
- gt 위치를 중심으로 하여 가우시안 덩어리(bump)를 feature map에 인코딩
Fully convolutional layer
- output이 image보다 작게 나오는 경우가 많다 $(x,y)$ -> $\left\lfloor \frac{x}{n} \right\rfloor, \left\lfloor \frac{y}{n} \right\rfloor$(heatmap location)
- n: downsampling factor
- 이때 원래의 image 위치로 mapping 시 부정확하게 위치 mapping -> IoU에 큰 영향
- 이를 해결하기 위해 location offset 예측
location offset
- corner location을 input resolution으로 mapping 하기 전에 미세 조정
$ o_k = \left( \left( \frac{x_k}{n} \right) - \left\lfloor \frac{x_k}{n} \right\rfloor, \left( \frac{y_k}{n} \right) - \left\lfloor \frac{y_k}{n} \right\rfloor \right) $
- $O_k$: offset
- $x_k,y_k$: corner k의 x,y 좌표
- top-left, right-bottom 각각에 의해 공유되는 offset 집합 2개 예측
- gt corner location에 smooth L1 loss를 적용
$ L_{\text{off}} = \frac{1}{N} \sum_{k=1}^{N} \text{SmoothL1Loss} (o_k, \hat{o}_k) $
Grouping Corners
하나의 image 내의 여러개의 객체가 있을 수 있고, 이때는 여러개의 top-left, right-bottom corner 쌍이 detect된다 이를 위해 top-left, right-bottom corner가 같은 bbox의 쌍인지 결정해야한다
- 네트워크가 detected corner에 대해 embedding vector 예측(같은 bbox에 속하는지)
- 두 embedding 사이의 거리는 작아야 한다
- 거리를 통해 corner를 그룹화
- embedding의 실제 값들은 중요하지 않음
$ L_{\text{pull}} = \frac{1}{N} \sum_{k=1}^{N} \left[ (e_{t_k} - \bar{e}k)^2 + (e{b_k} - \bar{e}_k)^2 \right], $
$ L_{\text{push}} = \frac{1}{N(N - 1)} \sum_{k=1}^{N} \sum_{\substack{j=1 \ j \neq k}}^{N} \max (0, \Delta - |e_k - e_j|), $
- 1차원 임베딩 사용
- $e_{t_k}$: top-left corner의 embedding
- $e_{b_k}$: bottom-right corner의 embedding
- pull loss: network가 corner를 그룹짓도록 사용
- push loss: corner를 분리하도록 사용
- $e_k$: $e_{t_k}$의 평균
- ∆: 1
- offset loss와 비슷하게 gt corner location에만 loss 적용
Corner Pooling
그림에서는 corner를 특정할 수 있는 지역적인 증거가 없음 pixel이 top-left corner인지 결정하기 위해서는 오른쪽으로, 아래로 pixel을 살펴볼 필요가 있음 corner를 잘 localize하기 위해 명시적인 사전 지식을 encoding하는 corner pooling 제안
- $f_t$,$f_l$: top-left pooling layer의 input feature maps
- $f_{t_{ij}},f_{l_{ij}}$: vectors at location (i,j) in $f_t,f_l$
- top-left 는 오른쪽과 아래쪽 pixel을 보며 pixel 마다 max pool 진행
- left-corner의 방향은 아래 -> 위, 오른쪽 -> 왼쪽 순서 (fig는 잘못나온거같음)
- 모듈의 첫 부분은 residual block의 변형된 버전
- 3x3 conv module을 corner pooling module 로 대체
- 첫 3x3 conv 의 channel은 128
- 3x3 Conv-ReLU- 1x1 Conv 통해 heatmap, embedding, offset 생성
Hourglass Network
CornerNet은 hourglass network를 Backbone으로 사용
- 처음 human pose estimation task를 소개한 논문
-
fully convolutional neural network (+여러개의 hourglass module 포함)
- hourglass network
- 먼저 conv layer와 pooling layer 사용하여 input feature를 downsample
- 이후 upsampling과 conv layer 사용하여 원래의 resolutionㅇ로 upsample
- 이때 detail은 maxpooling layer에서 조금 손실되지만, skip connection을 통해upsampling 시 더해준다
- 이를 통해 하나의 통합된 구조에서 local과 global feature를 잡아준다 이러한 hourglass module이 여러개 쌓이면 higher-level의 정보를 찾는데 도움이 된다
논문의 hourglass network -> 2개의 modified hourglass 사용
- max pooling 대신 stride 2 사용하여 downsample
- resolution은 5번 줄이고 채널은 (256,384,384,384,512)의 순서로 증가
- upsample 시 2개의 residual module 사용(nn upsample)
- 모든 skip connection -> 2개의 residual module 사용
- 중간의 512 channel에는 4개의 residual module 존재
-
hourglass module 전에 7x7conv, stride 2 모듈을 사용하여 resolution 4번 줄임 -> 128 channel
- 첫번째 hourglass module의 입력과 출력에 3x3 conv-BN 모듈 적용
- 이를 element-wise 덧셈을 수행한 후 ReLU와 256의 residual block을 거쳐 두번째 hourglass module의 입력으로 사용
-
마지막 layer의 feature만을 사용
- 중간 감독일 추가했지만, 예측 결과는 네트워크에 다시 추가하지 않음
Total loss
$ L = L_{\text{det}} + \alpha L_{\text{pull}} + \beta L_{\text{push}} + \gamma L_{\text{off}} $
- α,β,γ: 각각의 weight
Experiments
Training details
- Pytorch의 기본 initialize, pre-train, external dataset 사용하지 않음
- focal loss 사용 conv layer의 bias는 [[RetinaNet]] 을 참고
- Input resolution: 511 x 511
- Output resolution: 128 x 128
- random horizontal flipping, random scaling, random cropping and random color jittering adjusting the brightness, saturation and contrast of an image의 data augmentation 사용
- input image에 [[PCA]] 적용
- Adam optimizer
- α,β: 0.1 ,γ: 1
- Batch size: 49
- Iteration: 250k
- Learning rate: $2.5 * 10^-4$
- Compare
- 500k iteration
- $2.5 * 10^-5$ for last 50k
Testing details
- simple-post processing to generate heatmap, embedding, offset
- NMS with 3x3 max pooling layer on corner heatmap
- 100개의 top-left, 100개의 bottom-right
- offset에 의해 corner location 조정
- embedding사이의 거리를 L1 distance로 계산
- 거리 0.5 이상 혹은 달느 카테고리의 corner를 포함하는 pair 제거
- top-left, bottom-right의 average score가 detection score로 사용
- Image를 resize 하지 않고 0으로 padding
- original, flipped image 를 test에 사용
- original과 flipped image의 detection을 합친 뒤 soft-nms 적용 -> 100개의 detectoin
MS COCO
- 80k images for training
- 40k images for validation
- 20k images for testing
training 시에는 training set 전체, 35k validation set 사용 나머지 5k validation set은 hyper parameter tuning과 ablation study에 사용
AP 사용
Ablation study
- Corner pooling
- CornerNet의 주요 구성요소
1
2
- 중간, 큰 크기의 object에 대해 성능 향상
- 이전까지의 경계들이 모서리 위치에서 멀리 떨어져 있었을 가능성 높음
- Reducing penalty to negative locations
- positive location 주변의 penalty를 gaussian 을 사용하여 줄였음
- 이를 penalty 적용 없이, 고정된 radius에 대해, 객체마다의 반경에 따른 penalty(CornerNet)으로 실험
- 이 또한 중간 크기와 큰 크기의 성능 향상
- Error Analysis
- heatmap, offset, embedding을 동시에 출력
- 맨 위가 예측한 heatmap, offset 사용
- 아래는 gt heatmap + 예측한 offset
- 아래는 gt heatmap + gt offset
- heatmap이 더 많이 증가 -> corner를 감지하고 그룹화하는데 있어 개선의 여지가 충분히 있음.
- 왼쪽이 top-left
-
오른쪽이 bottom-right
- comparisons with SOTA
- one-stage 이기고 two-stage와 경쟁력 있는 성능