├── README.md
├── doc
└── img
│ ├── 1.google_image_download.jpg
│ ├── 2.google_image_download.jpg
│ ├── 3.labelimg.jpg
│ ├── 4.tfrecord.jpg
│ ├── 5.tfrecord2.jpg
│ ├── 6.learning.jpg
│ ├── 6.learning2.jpg
│ ├── 7.result1.jpg
│ ├── 7.result2.jpg
│ ├── 7.result3.jpg
│ ├── 7.result4.jpg
│ ├── 7.result5.jpg
│ ├── 8.evaluate.gif
│ ├── 8.evaluate2.gif
│ ├── 9.loss.jpg
│ ├── ex3_log.jpg
│ └── ex3_log1.jpg
└── label_map.pbtxt
/README.md:
--------------------------------------------------------------------------------
1 | # **Custom object detection tutorial**
2 |
3 | 해당 튜토리얼은 [tensorflow_object_detection_helper_tool](https://github.com/5taku/tensorflow_object_detection_helper_tool)을 활용해서 진행됩니다.
4 | 미리 만들어진 dataset을 활용하는 Simpson Charactors Object Detection Tutorial은 [여기](https://github.com/5taku/simpson_charactors_object_detection)를 참고하시길 바라겠습니다.
5 |
6 | # Table of contents
7 | 1. [Summary](#summary)
8 | 2. [Tutorial](#tutorial)
9 | 1) [STEP 1. 데이터 수집](#datacollecting)
10 | 2) [STEP 2. 데이터 라벨링](#labeling)
11 | 3) [STEP 3. TF RECORD 파일 생성](#maketfrecord)
12 | 4) [STEP 4. label_map.pbtxt 파일 수정](#labelmapupdate)
13 | 5) [STEP 5. Transfer Learning & exporting](#trainig)
14 | 6) [STEP 6. Export model 확인](#exporting)
15 | 3. [Extra](#extra)
16 | 1) [Evaluate 값 확인](#evaluating)
17 | 2) [Loss 값 확인](#loss)
18 | 3) [Log 값 확인](#log)
19 | 4) [Model별 Training Time 확인](#time)
20 |
21 |
22 | ## Summary
23 |
24 | Pretrain 되어서 제공되는 Model들은 대부분 [coco dataset](http://cocodataset.org/) 을 기본 dataset으로 training 되었습니다.
25 | 따라서 coco dataset instance 에 없는 데이터는 custom된 dataset 을 준비하여 transfer learning을 시켜야 합니다.
26 |
27 | 해당 튜토리얼은 Custom Object Detection 을 위한 data의 수집, labeling, training등을
28 | [tensorflow_object_detection_helper_tool](https://github.com/5taku/tensorflow_object_detection_helper_tool)을 활용하여 진행하는 방법에 대한 튜토리얼 입니다.
29 |
30 |
31 |
32 | ## Tutorial
33 |
34 | 해당 튜토리얼은 google cloud comute engine 에서 테스트 되었으며 vm의 사양은 다음과 같습니다.
35 |
36 | 16 vCPU
37 | 60gb Ram
38 | 1 x NVIDIA Tesla P100
39 | ubuntu 16.0.4
40 | python 2.7.12
41 | tensorflow 1.8.0
42 | cuda 9.0
43 | cudnn 7.1
44 |
45 | ### STEP 1. 데이터 수집
46 |
47 | 귀여운 판다, 라쿤, 수달, 포메라니안, 미어캣을 디텍팅해보겠습니다.
48 | 각각의 이미지를 100장씩 준비합니다.
49 |
50 | [Google image download](https://github.com/hardikvasa/google-images-download) 를 사용하여 이미지를 다운로드 합니다. ( 저작권을 조심하시길 바라겠습니다. )
51 |
52 | googleimagesdownload --keywords "panda" --size medium --output_directory ./panda
53 |
54 | 위의 명령어대로 실행하면, 이미지를 폴더에 다운로드 하게 됩니다.
55 | 적당하게 잘못된 이미지를 지우고 다른 이미지로 채워 넣습니다.
56 |
57 | raccoon , otter , pomeranian , meerkat 역시 동일하게 이미지를 준비합니다.
58 |
59 | 오직 jpg 파일포맷의 이미지만 가능합니다.
60 |
61 | 
62 | 
63 |
64 | ### STEP 2. 데이터 라벨링
65 |
66 | [labelimg](https://github.com/tzutalin/labelImg) 를 사용하여 원본 이미지와 오브젝트 영역을 저장한 xml 을 하나의 폴더에 위치 시킵니다.
67 | ( 기본 폴더는 images 폴더입니다.)
68 |
69 | 하나의 이미지에 여러개의 라벨이 존재할 수 있습니다.
70 | Tip. 각각의 Object 에서 default label을 설정하면 라벨을 하나하나 입력할 필요가 없습니다.
71 | Tip. 단축키 W 는 영역지정 A 는 이전 이미지 D 는 다음 이미지 Ctrl + S 는 저장입니다.
72 |
73 | 500장의 이미지를 라벨링하는데 50분 정도의 시간이 소요되었습니다.
74 |
75 | 
76 |
77 | ### STEP 3. TF RECORD 파일 생성
78 |
79 | tfgenerator.py 명령어를 수행하여, TF RECORD 파일을 생성합니다.
80 |
81 | python tfgenerator.py
82 |
83 | process.log 파일을 통하여 요약정보를 확인할 수 있습니다.
84 |
85 | 
86 |
87 | train , validate 비율을 변경하려면, -sr 옵션을 사용하면 됩니다.
88 |
89 | python tfgenerator.py -sr 5
90 |
91 | 
92 |
93 | 위의 원본 이미지, xml, csv, record 파일은 [여기](https://drive.google.com/drive/folders/1WwqFT6sbgoL6n7Bq-qbcvwkVHNSztKVS?usp=sharing)에서 다운받으실 수 있습니다.
94 |
95 | ### STEP 4. label_map.pbtxt 파일 수정
96 |
97 | 레이블과 번호를 입력하여 줍니다.
98 |
99 | item {
100 | id: 1
101 | name: 'meerkat'
102 | }
103 | item {
104 | id: 2
105 | name: 'otter'
106 | }
107 | item {
108 | id: 3
109 | name: 'panda'
110 | }
111 | item {
112 | id: 4
113 | name: 'raccoon'
114 | }
115 | item {
116 | id: 5
117 | name: 'pomeranian'
118 | }
119 |
120 | ### STEP 5. Transfer Learning & exporting
121 |
122 | Faster_Rcnn_Inception_v2_coco 모델을 가지고 50,000번 training 시켜보겠습니다.
123 | 3,000번마다 evaluate 값을 확인하겠습니다.
124 |
125 | python main.py -n 3000
126 |
127 | 
128 | 
129 |
130 | ### STEP 6. Export model 확인
131 |
132 | export_dir 폴더로 이동합니다.
133 |
134 | ./export_dir/faster_rcnn_inception_v2_coco_2018_01_28
135 |
136 | frozen_inference_graph.pb 파일이 존재하는지 확인합니다.
137 |
138 | ### 번외0. 테스트 이미지 확인
139 |
140 | 테스트 이미지 폴더에 적절한 이미지들을 넣습니다.
141 | 기본 테스트 이미지 폴더는 아래와 같습니다.
142 | (image0.jpg 부터 시작하여 번호를 증가시킵니다.)
143 |
144 | ./object_detection/test_images
145 |
146 | jupyter notebook을 실행합니다.
147 |
148 | object detection 튜토리얼 파일을 수행합니다.
149 |
150 | ./object_detection/object_detection_tutorial.ipynb
151 |
152 | 결과값을 확인합니다.
153 |
154 | 
155 | 
156 | 
157 | 
158 | 
159 |
160 | 위의 결과를 보면, 정확한 결과값을 내지 못하는 경우도 있습니다.
161 | 이 경우, 모델의 변경, dataset 의 추가, training_step의 증가, hyperparameter 변경등을 통하여 정확도를 향상시킬 수 있습니다.
162 |
163 | ## Extra
164 |
165 | ### Evaluate 값 확인
166 |
167 | eval_dir 폴더로 이동합니다.
168 |
169 | ./eval_dir/faster_rcnn_inception_v2_coco_2018_01_28
170 |
171 | tensorboard를 실행합니다.
172 |
173 | $tensorboard --logdir=./
174 |
175 | 각 이미지들을 확인합니다.
176 |
177 |  
178 |
179 | ### Loss 값 확인
180 |
181 | train_dir 폴더로 이동합니다.
182 |
183 | ./train_dir/faster_rcnn_inception_v2_coco_2018_01_28
184 |
185 | tensorboard를 실행합니다.
186 |
187 | $tensorboard --logdir=./
188 |
189 | 
190 |
191 | ### Log 값 확인
192 |
193 | 최상단의 process.log 파일을 확인하여 record 파일 생성 summary , training time , total process time 등을 확인할 수 있습니다.
194 |
195 | ./cat process.log
196 |
197 | 
198 | 
199 |
200 | ### Model별 training time 확인
201 |
202 | 모델별, 1000 step, training -> evaluating -> exporting time 체크
203 |
204 | 테스팅 환경
205 |
206 | 16 vCPU
207 | 60gb Ram
208 | 1 x NVIDIA Tesla P100
209 | ubuntu 16.0.4
210 | python 2.7.12
211 | tensorflow 1.8.0
212 | cuda 9.0
213 | cudnn 7.1
214 |
215 | | Model | Size | Training time |
216 | |:--------------------------------------------------------:|:----:|:-------------:|
217 | | ssd_mobilenet_v1_coco | 86M | 9m 44s |
218 | | ssd_mobilenet_v2_coco | 201M | 11m 12s |
219 | | ssd_inception_v2_coco | 295M | 8m 43s |
220 | | faster_rcnn_inception_v2_coco | 167M | 4m 43s |
221 | | faster_rcnn_resnet50_coco | 405M | 4m 28s |
222 | | faster_rcnn_resnet50_lowproposals_coco | 405M | 4m 30s |
223 | | rfcn_resnet101_coco | 685M | 6m 19s |
224 | | faster_rcnn_resnet101_coco | 624M | 6m 13s |
225 | | faster_rcnn_resnet101_lowproposals_coco | 624M | 6m 13s |
226 | | faster_rcnn_inception_resnet_v2_atrous_coco | 712M | 18m 6s |
227 | | faster_rcnn_inception_resnet_v2_atrous_lowproposals_coco | 712M | |
228 | | faster_rcnn_nas | 1.2G | 47m 49s |
229 | | faster_rcnn_nas_lowproposals_coco | 1.2G | |
230 |
231 |
232 |
--------------------------------------------------------------------------------
/doc/img/1.google_image_download.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/5taku/custom_object_detection/a5921b3c020dddb542412e8c0f38a42e594b34ba/doc/img/1.google_image_download.jpg
--------------------------------------------------------------------------------
/doc/img/2.google_image_download.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/5taku/custom_object_detection/a5921b3c020dddb542412e8c0f38a42e594b34ba/doc/img/2.google_image_download.jpg
--------------------------------------------------------------------------------
/doc/img/3.labelimg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/5taku/custom_object_detection/a5921b3c020dddb542412e8c0f38a42e594b34ba/doc/img/3.labelimg.jpg
--------------------------------------------------------------------------------
/doc/img/4.tfrecord.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/5taku/custom_object_detection/a5921b3c020dddb542412e8c0f38a42e594b34ba/doc/img/4.tfrecord.jpg
--------------------------------------------------------------------------------
/doc/img/5.tfrecord2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/5taku/custom_object_detection/a5921b3c020dddb542412e8c0f38a42e594b34ba/doc/img/5.tfrecord2.jpg
--------------------------------------------------------------------------------
/doc/img/6.learning.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/5taku/custom_object_detection/a5921b3c020dddb542412e8c0f38a42e594b34ba/doc/img/6.learning.jpg
--------------------------------------------------------------------------------
/doc/img/6.learning2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/5taku/custom_object_detection/a5921b3c020dddb542412e8c0f38a42e594b34ba/doc/img/6.learning2.jpg
--------------------------------------------------------------------------------
/doc/img/7.result1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/5taku/custom_object_detection/a5921b3c020dddb542412e8c0f38a42e594b34ba/doc/img/7.result1.jpg
--------------------------------------------------------------------------------
/doc/img/7.result2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/5taku/custom_object_detection/a5921b3c020dddb542412e8c0f38a42e594b34ba/doc/img/7.result2.jpg
--------------------------------------------------------------------------------
/doc/img/7.result3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/5taku/custom_object_detection/a5921b3c020dddb542412e8c0f38a42e594b34ba/doc/img/7.result3.jpg
--------------------------------------------------------------------------------
/doc/img/7.result4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/5taku/custom_object_detection/a5921b3c020dddb542412e8c0f38a42e594b34ba/doc/img/7.result4.jpg
--------------------------------------------------------------------------------
/doc/img/7.result5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/5taku/custom_object_detection/a5921b3c020dddb542412e8c0f38a42e594b34ba/doc/img/7.result5.jpg
--------------------------------------------------------------------------------
/doc/img/8.evaluate.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/5taku/custom_object_detection/a5921b3c020dddb542412e8c0f38a42e594b34ba/doc/img/8.evaluate.gif
--------------------------------------------------------------------------------
/doc/img/8.evaluate2.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/5taku/custom_object_detection/a5921b3c020dddb542412e8c0f38a42e594b34ba/doc/img/8.evaluate2.gif
--------------------------------------------------------------------------------
/doc/img/9.loss.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/5taku/custom_object_detection/a5921b3c020dddb542412e8c0f38a42e594b34ba/doc/img/9.loss.jpg
--------------------------------------------------------------------------------
/doc/img/ex3_log.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/5taku/custom_object_detection/a5921b3c020dddb542412e8c0f38a42e594b34ba/doc/img/ex3_log.jpg
--------------------------------------------------------------------------------
/doc/img/ex3_log1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/5taku/custom_object_detection/a5921b3c020dddb542412e8c0f38a42e594b34ba/doc/img/ex3_log1.jpg
--------------------------------------------------------------------------------
/label_map.pbtxt:
--------------------------------------------------------------------------------
1 | item {
2 | id: 1
3 | name: 'meerkat'
4 | }
5 | item {
6 | id: 2
7 | name: 'otter'
8 | }
9 | item {
10 | id: 3
11 | name: 'panda'
12 | }
13 | item {
14 | id: 4
15 | name: 'raccoon'
16 | }
17 | item {
18 | id: 5
19 | name: 'pomeranian'
20 | }
21 |
--------------------------------------------------------------------------------