분류와 분할 논문은 꽤 읽었었던 걸로 아는 데, 탐지는 또 처음이다. 탐지 관련 논문은 한번도 안읽어서 나중에 나오는 FPN과 RetinaNet은 솔직히 잘은 모른다. 대충 블로그를 통해 공부를 하긴 했지만 사실 내가 정확히 이해한다고는 못하겠다. 그래서 나중에 나오는 내용에서는 조금 이해가 안가는 것도 있지만 중요한 것은 방법론이고, 그 방법론은 잘 이해를 했다.
** 읽고 여러가지를 검색해 보다가, 이게 옛날 버전? 이라는 것을 알게 되었다. 실제로 나는 3월에 나온 논문을 읽은 건데 6월에 나온 DetNAS : Backbone Search for Object Detection 이라고 나왔으니 읽을 사람들은 그것을 읽는 것이 더 나을 듯 하다. 아무래도 좀 더 가공했을 것 같다.
그림이 없는 것은 지금 내가 출력한 논문을 pdf로 받지를 못해서 ㅠㅠㅠ.
자 그럼 시작
[ 요약 ]
탐지는 보통 backbone으로 분류에서 쓰이는 네트워크를 많이 쓴다. 하지만 분류와 탐지는 분명히 차이가 존재한다. 하지만 분류가 아닌 탐지를 위한 Backbone 네트워크를 설계하는 것은 매우 어려운 일이다.
우리는 DetNAS를 통해 자동적으로 객체 탐지의 Backbone 네트워크를 찾는 방법을 제안한다.
DetNAS에서 탐색 공간은 supernet으로 되어있고, 탐색 전략은 유전알고리즘(EA)로 되어있다.
실험결과에서 우리는 다양한 탐지기에서의 효율성을 보여준다.
(one stage detector인 RetinaNet과 two stage detector인 FPN)
[1. 소개 ]
객체 탐지는 실용적이고 중요한 문제이다.
특징을 추출하는 것은 Backbone 네트워크에 많이 의존한다.
근데 그것들이 대부분 다 분류 쪽 네트워크이다.
탐지와 분류는 분명히 차이가 존재한다.
분류는 무엇인가를 따진다면, 탐지는 무엇과 어디를 따진다.
기존에 이러한 객체 탐지를 위한 Backbone 네트워크를 설계하려는 시도는 있었다.( Detnet )
최근 NAS는 분류와 분할쪽으로 성공적인 결과를 냈었다.
근데 탐지쪽은 없었다.
물론, CIFAR-10 데이터셋으로 찾은 분류 네트워크를 바로 탐지에 쓰인 적은 있었지만, 차선책일 뿐이다.
우리의 논문은 객체 탐지 분야에서 Backbone을 자동적으로 찾는 첫 논문이다.
기존과 NAS에서 쓰였던 방법과 같이 Proxy task나 이식을 하지 않고 바로 찾는다
==> 예전 NAS-Net에서는 CIFAR에서 찾은 걸로 Imagenet에 이식을 하였고, 그 외 어떤 작업들에서는 너무 큰 데이터셋을 바로 접근하지 않고, 그보다 조금 더 하위호환되는 데이터셋에서 찾았었음.
탐지는 학습 자체가 오래걸린다. 몇일 걸리는 것은 기본적임.
근데, 바로 RL이나 EA를 사용해서 구조를 찾는 다는 것은 정말 어려움. ( 너무 오래걸리고, 찾는 것 자체가 힘드니까 )
(RL = Reinforcement Learning ( 강화학습 ) , EA - Evolutional Algorithm ( 유전 알고리즘 ) )
시공간적인 이 문제를 해결하기 위해, 우리는 이 문제를 큰 그래프나 Supernet에서 최적의 path를 찾는 문제로 정의하였다.
(=> 이게 중요한 포인트, 방법이 나온 이유. ENAS와 비슷한 것 같아도 조금 다름 나중에 다룰 예정 )
DetNAS는 크게 3단계로 이루어지는 데,
1. 모든 Sub Network가 있는 SuperNet을 학습시킨다.
2. 유전 알고리즘으로 Sub Network 중에서 가장 Validation 결과가 좋은 것을 선택한다.
3. 가장 결과가 좋은 Sub Nettwork를 다시 학습시키고, 테스트 한다.
우리의 기여는 이렇게 있다.
1. Backbone을 찾는 첫 시도이다.
2. DetNAS의 효율을 증명하였다.
3. 더 좋은 네트워크를 발견하였다.
[2. 관련연구]
2.1 객체 탐지
객체 탐지는 객체를 탐지한 후에 분류한다.
딥러닝의 발전으로 FPN, RetinaNet등이 나왔고 좋은 성능을 낸다.
객체 탐지는 2개로 나뉘는 데, Backbone과 head로 나뉜다.
여지까지 Head에서 많은 발전이 이루어졌다. ( 구조, loss, anchor 등등 )
FPN은 top-down 구조를 제안하였고, RetinaNet에서 제안한 focal loss는 클래스 불균형 문제를 해결하는 등의 발전이 있었다.
하지만 Backbone network는 분류쪽에서 나온 네트워크를 많이 썼었다.
하지만 탐지는 분류와 다르게 어디와 무엇을 신경써야하는 데, 분류는 무엇만 신경쓴다.
우리가 하려는 것과 비슷하게 Detnet이라고 hand-craft적인 방법으로 객체탐지의 backbone network를 찾으려는 시도가 있었다.
이에 영감을 받아 우리는 backbone 네트워크를 자동적으로 찾으려고 한다.
2.2 NAS
강화학습을 쓰는 NAS의 등장후에, Cell 단위로 찾는 NASNet이 등장하였고, 유전 알고리즘도 빛을 발했다.
AmoebaNet은 유전 알고리즘이 강화학습과 비교해도 경쟁력있다는 것을 손보였다.
ENAS는 가중치를 공유하며,
DART는 이산적인 구조를 연속적인 구조로 바꾸었다.
근데 이것들 대부분 분류쪽이다. 요즘에는 분할쪽으로도 좀 있다.
하지만 탐지에만 성공적인 결과가 없다.
안된 이유는 우리가 생각하기에는 Object Detector에 ImageNet pre-training을 했기 때문이라고 생각한다.
우리는 이 문제를 해결하기 위해서, one-shot supernet과 유전알고리즘을 사용했다.
[3. 방법]
Object Detector들은 객체 분류와 위치의 특징을 학습하는 데에 있어서 backbone network에 많이 의존하는 데, 직접 찾을 것이다. 원래는 ResNet을 많이 썼었다.
3.1. 전체 파이프라인
Detnas 3단계
1. supernet 학습
2. supernet 탐색
3. 결과 학습
대충 일주일 걸리고, 70개의 GPU가 필요하다고 한다.
1단계 ( supernet 학습 )
supernet은 ImageNet으로 pretrain된다.
fine-tune은 COCO 데이터셋으로 하는 데,
여기서 From-Scratch로 할 때는 pretrain 없이 바로 COCO 데이터셋으로 fine-tune한다. 대신 pre-train에서 할 iter만큼 iteration을 2배가 더 많다.
두 가지 알아야 할 것이,
(1) 학습은 path 단위
- 각 iteration마다 path를 생성하고, forward후 propagation을 한다.
(2) Batch normalization은 Sync Batch normalization을 사용한다.
2단계 ( 학습된 supernet에서 EA로 구조를 탐색하는 단계)
여기서는 두가지 알아야 될 것이
(1) 탐색은 path-wise
validation은 선택된 path로만 진행한다.
(2) validation하기 전에 몇 iteration을 forward만 한다.
back propagation은 안한다.
batch statistic를 계산하기 위함이기 때문이다.
3단계 ( 찾은 결과를 재학습 )
3.2 Supernet 탐색 공간 ( 1단계 )
8GPU로 몇 일 걸린다.
가중치는 공유ㅎ나다.
효율성 입증을 위해 탐색공간은 2개가 있다.
(1) Search space 1
총 5단계로 이루어지며,
0 - Conv3 , BN , ReLU ( channel - 16 / block - 1 )
1 - Shuffle block ( channel - 64 / block - 4 )
2 - Shuffle block ( channel - 160 / block - 4 )
3 - Shuffle block ( channel - 320 / block - 8 )
4 - Shuffle block ( channel - 640 / block - 4 )
으로 이루어진다. 1,2,3,4를 찾는 것이 목적이고, 총 20개의 block을 찾으면 된다.
Block은 ShuffleNetv2 block으로, 한개의 block당 연산 집합은 4개의 선택지를 가진다.
ShuffleNet 논문에 나온 연산인 ShuffleNetv2 3x3, 5x5, 7x7과 xception이다.
그래서 4^20의 공간을 가진다.
각 단계의 첫 Block은 stride가 있는 데, 모두 1이다.
이때, 대부분 300M FLOPS 을 가지는 네트워크가 나오는 데, 이건 300M 이상은 버리기 때문.
(2) Search space 2
(1) 공간보다 더 큰 차이밖에 없다.
0 - Conv3 , BN , ReLU ( channel - 48 / block - 1 )
1 - Shuffle block ( channel - 96 / block - 8 )
2 - Shuffle block ( channel - 240 / block - 8 )
3 - Shuffle block ( channel - 480 / block - 16 )
4 - Shuffle block ( channel - 960 / block - 8 )
여기서 찾은 네트워크는 대부분 1G Flops를 가지는 데,
이렇게 하는 이유는 더 큰 모델을 만들기 위함이며, 다른 복잡한 네트워크와 비교할 때에도 비슷한 복잡성을 가진 네트워크로 비교를 해야 형평성에 맞기 때문이다.
3.3 탐색 전략 (2단계)
1단계 후에 EA를 적용해서 찾는다.
이 부분은 수식과 알고리즘을 보면 별로 어려울 것이 없는 데, 현재 논문이 갱신되서 사진을 못넣었다.
DetNAS : Backbone Search for Object Detection
을 찾아서 보기를 바란다.
일반적인 유전 알고리즘이다. 우선 아까 말한 대로, BN을 계산하고, 한 Path를 고른 후, validation으로 평가를 한다. 더 좋으면 그것의 분포를 선택하고 mutate와 cross over를 거쳐서 정해진 만큼 반복한다.
3.4 중요한 팁
3.4.1 Single Path Sampling
Supernet 기술은 DARTS에서도 사용되었다.
기존 DARTS에서는 supernet에서 한개를 훈련시키고 평가를 하는 데, 이것은 성능을 낮출 수도 있다. 우리는 supernet을 모두 훈련을 시킨 후에 평가를 한다. 즉 주변부를 다 평가를 할 수 있는 장점이 있다.
3.4.2 Batch Normalization
BN은 최적화에 도움을 준다.
하지만 객체 탐지에서는 이미지가 커서 Batch가 작다. 이것은 BN의 성능 저하를 불러 일으킬수 잇음.
보통 Fine tune 할때 Batch 파라미터는 고정시킨다.
하지만 DetNAS에선 supernet에서 path-wise로 하는 데, path마다 batch statistics가 다 다르다.
그래서 우리는 Sync Batch Normalization을 써서 우리에 맞췄다.
4. 실험 결과 ( 3단계 )
데이터 셋
자세한 것은 논문을 보고,
VOC, COCO를 사용하였다.
하이퍼 파라미터
batch size = 1024
GPU = 8
iteration = 30k
lr = 0.5 -> 0으로 선형적으로 감소시킴
momentum = 0.9
weight decay = 4 x 10^-5
이것 이외의 각 FPN과 RetinaNet에서의 학습 방법은 논문 참조를 바란다.
4.2 최종 결과
FPN은 2 stage detector 핵심, RetinaNet은 1 stage detector의 핵심이라서 두개를 사용하였다.
이 이상 모든 실험결과를 하나하나 다 말해줄 순 없기에 논문을 참조하길 바란다.
중요한 것은 방법론이기 때문이다.
실험결과에서는 기존에 많이 쓰던 ResNet 101보다 더 좋은 mAP를 달성하며, Object Detection에 따로 찾은 Backbone이 의미가 있다는 것을 말해준다.
그리고 분류쪽으로도 찾은 네트워크로 객체탐지를 해보고, 객체탐지쪽으로도 찾은 네트워크로 객체탐지를 해보았는 데, 객체 탐지쪽으로 찾은 네트워크가 분류를 위해 찾은 네트워크보다 성능이 더 좋은 것을 보여주며, 분류와 탐지간의 차이가 확실히 존재한다는 것을 알려준다.
[ 느낀 점 ]
읽기가 상당히 어려웠다.
FPN과 RetinaNet을 몰라서, 객체 탐지의 전반적인 것을 공부하고 들어갔다.
여기서 흥미로운 점은 객체 탐지에 NAS를 적용했다는 점이고, 일반적인 강화학습이 아닌 유전 알고리즘을 썼다는 점이다.
예전에 읽은 기존 NAS쪽 논문들에서는 유전 알고리즘은 시간도 많이 걸려서 보통 작은 문제에서만 했었다고 하는 데, 이제는 NAS에서도 많이 활용되는 것을 볼 수 있었다.
그리고 또, 요즘 논문들을 보면 Batch Normalization을 그냥 사용하는 법이 없다. (NAS분야에선 )
다 본인들 것에 많이 맞춰서 다른 것을 사용하던 가 난생 처음 보는 종류를 많이 사용하는 것을 봐서 나도 Batch Normalization을 꼭 고려해야겠다는 생각이 든다....여기서는 Sync Batch Normalization을 썼다.
또한, 나는 보통 ENAS 처럼 DAG가 전부인 줄 알았는 데, Supernet이라는 방법도 알아간다.
하지만 전통적인 NAS처럼 RL을 쓰고 싶다.
나는 사실 탐색 전략을 높게 평가하는 데, 뭐 별 다른 것은 없었던 것 같다. 그냥 4개중에 하나 선택하는 것 ( 전통적이다.)
무튼.... 이제 잘 보면, 요즘 AutoML분야에서 내가 좀 아이디어를 떠올릴랑 말랑 하는 것은 다 그래프라는 것이다. 뭔가 네트워크가 다 그래프로 표현이 되고, DAG에서도 그렇고 supernet도 그렇고, 다 그래프라는 점이 인상적이다. SMASH에서는 그래프를 하나씩 절단하기도 하고... 뭔가 그래프와 많이 연결되어 있는 양상을 띄는 게 심상치 않다.
DAG말고도 더 좋은 그래프 방법들이 많을 텐데 이쪽으로 공부해보면 뭔가 나올 수 있지 않을 까?
무튼 객체탐지에서의 Backbone을 찾는 NAS는 잘 보았다.
또 하나..... 앞으로는 좀 더 잘 정리를 해봐야겠다. 물론 나를 위해서 나중에 볼 때 내용을 굳이 논문 안읽어도 파악할 수 있을 만큼 한다고는 하지만.... 뭔가 그래도 정리를 좀 더 해야겠다는 생각이 든다. 원래 내 의도는 모든 중요한 내용을 블로그에 남기려고 했었는 데, 가독성 있게 만들고 나중에 추가적으로 논문을 보는 게 더 낫겠다는 생각도 드네...