06 Jan 2019
|
Deep learning
Object detection
[Object detector] R-CNN/Fast R-CNN/Faster R-CNN/SSD 가볍게 알아보기
객체 탐지(Object detection)에 대해 공부하면서 정리해놓았던 내용들을 업로드 해 보았다.
Introduction
Object detection
객체 탐지(Object detection)은 사진처럼 영상 속의 어떤 객체(Label)가 어디에(x, y) 어느 크기로(w, h) 존재하는지를 찾는 Task를 말한다.
수 많은 객체 탐지 딥러닝 논문들이 나왔지만, 그 중 Base가 될 법한 기본적인 모델들인 R-CNN, Fast R-CNN, Faster R-CNN, 그리고 SSD에 대해 알아본다.
R-CNN
R-CNN의 구조
Hypothesize Bounding Boxes (Proposals)
Image로부터 Object가 존재할 적절한 위치에 Bounding Box Proposal (Selective Search)
2000개의 Proposal이 생성됨.
Resampling pixels / features for each boxes
모든 Proposal을 Crop 후 동일한 크기로 만듦 (224224 3)
Classifier / Bounding Box Regressor
위의 영상을 Classifier와 Bounding Box Regressor로 처리
하지만 모든 Proposal에 대해 CNN을 거쳐야 하므로 연산량이 매우 많은 단점이 존재
Fast R-CNN
상: R-CNN의 구조, 하: Fast R-CNN 구조
Fast R-CNN은 모든 Proposal이 네트워크를 거쳐야 하는 R-CNN의 병목(bottleneck)구조의 단점을 개선하고자 제안 된 방식
가장 큰 차이점은, 각 Proposal들이 CNN을 거치는것이 아니라 전체 이미지에 대해 CNN을 한번 거친 후 출력 된 특징 맵(Feature map)단에서 객체 탐지를 수행
Fast R-CNN 구조
R-CNN
Extract image regions
1 CNN per region(2000 CNNs)
Classify region-based features
Complexity: ~224 x 224 x 2000
Fast R-CNN
1 CNN on the entire image
Extract features from feature map regions
Classify region-based features
Complexity: ~600 x 1000 x 1
~160x faster than R-CNN
하지만 Fast R-CNN에서 Region Proposal을 CNN Network가 아닌 Selective search 외부 알고리즘으로 수행하여 병목현상 발생
Faster R-CNN
상: R-CNN 구조, 하: Faster R-CNN 구조
Region Proposal을 RPN이라는 네트워크를 이용하여 수행(병목현상 해소)
Region Proposal 단계에서의 bottleneck 현상 제거
해당 단계를 기존의 Selective search 가 아닌 CNN(RPN)으로 해결
CNN을 통과한 Feature map에서 슬라이딩 윈도우를 이용해 각 지점(anchor)마다 가능한 바운딩 박스의 좌표와 그 점수를 계산
2:1, 1:1, 1:2의 종횡비(Aspect ratio)로 객체를 탐색
R-CNN 계열 구조 비교
R-CNN 계열 성능 비교
Single Shot Multi-box Detector (SSD)
R-CNN과 SSD방식 구조 비교
SSD의 추론 방식
Multi-scale feature maps
크기가 다른 객체 검출을 위한 다양한 크기의 Grid cell을 사용
검출기는 Grid cell과 크기가 비슷한 객체를 찾도록 학습됨
SSD 구조
Base network : VGG-16[5]
Conv 4_3, 7, 6_2, 9_2, 10_2, 11_2을 입력으로 컨벌루션하여 6개의 특징맵 생성
특징맵에는 경계박스(x, y, w, h)와 클래스 정보(Classification)가 저장됨
Conv 4_3 : 3838 (4(Classes+4)) = 5776 (Classes+4)
Conv 7(FC7) : 1919 (6(Classes+4)) = 2166 (Classes+4)
Conv 8_2 : 1010 (6(Classes+4)) = 600 (Classes+4)
Conv 9_2 : 55 (6(Classes+4)) = 150 (Classes+4) = 클래스당 8732개의 경계박스를 예측
Conv 10_2 : 33 (4(Classes+4)) = 36 (Classes+4)
Conv 11_2 : 11 (4(Classes+4)) = 4 (Classes+4)
SSD는 Faster R-CNN에서 사용하는 Anchor box와 비슷한 Default Box 사용
기본적으로 가로/세로 로 계산되는 종횡비를 사용
4* : 1, 2, 1/2, 종횡비가 1인 크기가 작은 박스 사용
6* : 1, 2, 3, 1/2, 1/3, 종횡비가 1인 크기가 작은 박스 사용
IoU(Jaccard overlap)
Positive/Negative 비율
예측 된 경계박스의 Positive : Negative = 1 : 3 비율
객체에 대한 Confidence loss가 큰 것 만을 골라 loss를 줄이는 방향으로 학습
SSD Loss function
$L(x, c, l, g)=\frac{1}{N}(L_{conf}(x, c)+\alpha L_{loc}(x, l, g))$
Loss function은 객체에 대한 confidence와 경계박스에 대한 localization을 더한 형태
$\hat{g}^{cx}_j=(g^{cx}_j-d^{cx}_i)/d^w_i \qquad \hat{g}^{cy}_j=(g^{cy}_j-d^{cy}_i)/d^h_i$
$\hat{g}^w_j=log(\frac{g^w_j}{d^w_i}) \qquad \hat{g}^h_j=log(\frac{g^h_j}{d^h_i})$
$N$: 검출된 박스 개수
$g$ : ground truth box (실제 박스의 변수들)
$d$ : default box
$c$ : category
$l$ : predicted boxes (예상된 박스의 변수들)
$cx$, $cy$ : offset of center
$w, h$ : width and height
$\alpha$ : weight term( $\alpha$ = 1)
The confidence loss is the softmax loss over multiple classes confidences ($c$).
The weight term $\alpha$ is set to 1 by cross validation.
Flowchart
SSD example
21개의 클래스가 있는 경우, 위와 같이 55 3=75의 특징맵에 대해 55 (3(21+4))로 5 5의 그리드 각각 셀에서 경계박스와 클래스 확률 3개씩을 예측함(75=25*3)
출력은 21개의 클래스에 대한 신뢰도
이렇게 생성된 75개의 경계박스 중 신뢰도 점수가 0.01보다 높은 것만 남기면 대부분의 경계박스는 사라짐.
검출된 75개의 경게박스에 대한 confidence에 의한 필터링
Experimental Result of SSD
Base network
VGG16 (with fc6 and fc7 converted to conv layers and pool5 from 2x2 to 3x3 using atrous algorithm, removed fc8 and dropout)
It is fine-tuned using SGD
Training and testing code is built on Caffe toolkit
Database ‘07
Training: VOC2007 trainval and VOC2012 trainval (16551 images)
Testing: VOC2007 test (4952 images)
Database ‘12
Training: VOC2007 trainval, test and VOC2012 trainval(21503 images)
Testing: VOC2012 test(10991 images)
Mean Average Precision of PASCAL VOC 2007
Mean Average Precision of PASCAL VOC 2012
Inference time 비교
Non-maximum suppression 알고리즘에 대한 효율성 개선의 여지가 남아있음
[1] Ross Girshick, “Rich feature hierarchies for accurate object detection and semantic segmentation”, 2013
[2] Ross Girshick, “Fast R-CNN”, 2015
[3] Shaoqing Ren, “Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks”, 2015
[4] Wei Liu, “SSD: Single Shot MultiBox Detector”, 2015
[5] Karen Simonyan, “Very Deep Convolutional Networks for Large-Scale Image Recognition”, 2014
05 Jan 2019
|
Ubuntu
tmux
[Ubuntu] 우분투(Ubuntu)에 tmux 설치/세팅하기
우분투는 주로 Server로 사용하며 작업을 하다보니.. 가끔 연결이 끊기는 경우엔 작업하던 내용이 포함된 터미널 자체가 날라가 복구가 불가능하다.
tmux는 터미널 분할 프로그램으로 기존 작업을 이어오거나 터미널 분할을 가능하게 해준다.
tmux 설치 및 실행
설치: sudo apt-get install tmux
실행: tmux
tmux를 실행할때마다 새로운 tmux 세션이 시작된다.
빠져 나올 땐 Ctrl + D
키를 누른다.
tmux 사용법
Putty, 또는 Server단에서 터미널을 연 후 tmux
를 쳐 터미널 실행
모든 tmux 명령어는 Ctrl + b
를 눌러 명령어 입력 모드에 들어간 후 해당 키를 눌러 실행된다.
필요한/유용한 명령어만 포함했다.
tmux의 터미널은 ‘화면(Pane)’과 ‘창(Window)’의 두 개념으로 나뉜다. 직관적인 설명은 아래의 그림과 같다.
image from https://code.snipcademy.com/tutorials/linux-command-line/tmux/pane-management
화면(Pane) 관련 명령어
화면 가로 분할: %
화면 세로 분할: "
화면 이동: 해당 방향키
화면 위치 바꾸기: {
(이전자리의 위치로), }
(다음 자리의 위치로)
해당 작업중인 화면 닫기: x
화면 스크롤: PgUp/PgDn
(완료 후 q
로 스크롤모드 끝내야 함)
창(Window) 관련 명령어
신규 창 생성: c
창 선택하여 이동: w
이전 창 이동: p
번호별 창 이동: 해당 창 숫자(0~9)
창 종료: &
세션 관련 명령어
[session_name]의 세션으로 tmux 실행: $ tmux new -s [session_name]
tmux 세션을 백그라운드로 돌리기: d
tmux 세션 리스트 보기: $ tmux ls
[session_name]의 세션으로 다시 전환: $ tmux attach -t [session_name]
세션 이름 변경: $
[session_name]의 세션 종료: $ tmux kill-session -t [session_name]
세션 이름을 별도로 설정하지 않아도 d
로 세션을 백그라운드로 돌린 후 $ tmux attach
를 치면 다시 기존의 세션으로 돌아올 수 있다.
우분투 상에서 tmux 내 마우스 사용 가능하게 하기
설치 후 재부팅 후, 홈 디렉터리에 ~/.tmux.conf
파일에 아래의 내용을 추가한다.
```
set-option -g mouse on
set-option -g history-limit 10000
```
첫 번째 줄이 마우스 사용 가능, 두 번째 줄이 최대 10000줄까지 볼 수 있게 해주는 옵션(기본 1480 lines)
tmux 명령어 바꾸기
~/.tmux.conf
파일을 수정하면 된다.
https://gist.github.com/spicycode/1229612 링크에 잘 정리되어 있다.
꿀팁
간혹 코드 중 display 장치가 없어서 에러가 나는 코드들이 존재한다.
코드를 수정해서 해결 가능하지만, 우분투 설치된 pc에서 터미널을 켜고 창 크기를 조절 후 tmux
를 친다.
그 상태로 작업 pc로 가서 putty로 tmux attach
를 치면 우분투 터미널과 direct로 연결된다.
이를 이용해 display 장치가 필요한 코드의 경우 작업 가능하다.
http://blog.naver.com/PostView.nhn?blogId=itperson&logNo=220777286226