├── 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 | ![Google image Download](./doc/img/1.google_image_download.jpg) 62 | ![Google image Download](./doc/img/2.google_image_download.jpg) 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 | ![labelimg](./doc/img/3.labelimg.jpg) 76 | 77 | ### STEP 3. TF RECORD 파일 생성 78 | 79 | tfgenerator.py 명령어를 수행하여, TF RECORD 파일을 생성합니다. 80 | 81 | python tfgenerator.py 82 | 83 | process.log 파일을 통하여 요약정보를 확인할 수 있습니다. 84 | 85 | ![tfrecord](./doc/img/4.tfrecord.jpg) 86 | 87 | train , validate 비율을 변경하려면, -sr 옵션을 사용하면 됩니다. 88 | 89 | python tfgenerator.py -sr 5 90 | 91 | ![tfrecord](./doc/img/5.tfrecord2.jpg) 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 | ![learning](./doc/img/6.learning.jpg) 128 | ![learning](./doc/img/6.learning2.jpg) 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 | ![result](./doc/img/7.result1.jpg) 155 | ![result](./doc/img/7.result2.jpg) 156 | ![result](./doc/img/7.result3.jpg) 157 | ![result](./doc/img/7.result4.jpg) 158 | ![result](./doc/img/7.result5.jpg) 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 | ![evaluate](./doc/img/8.evaluate.gif) ![evaluate](./doc/img/8.evaluate2.gif) 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 | ![loss](./doc/img/9.loss.jpg) 190 | 191 | ### Log 값 확인 192 | 193 | 최상단의 process.log 파일을 확인하여 record 파일 생성 summary , training time , total process time 등을 확인할 수 있습니다. 194 | 195 | ./cat process.log 196 | 197 | ![log](./doc/img/ex3_log.jpg) 198 | ![log](./doc/img/ex3_log1.jpg) 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 | --------------------------------------------------------------------------------