Skip to content

wfapgm36/Tensorflow-Object-Detection-API-Tutorial-train-optimize

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 

Repository files navigation

Tensorflow-Object-Detection-API-Tutorial-train-optimize

Tensorflow Object Dectection API๋ฅผ ์‚ฌ์šฉํ•ด ํŠน์ • ๊ฐ์ฒด ๊ฒ€์ถœ์— ํŠนํ™”๋œ Detection ๋ชจ๋ธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” Tutorial์ž…๋‹ˆ๋‹ค.

Summary

์šฐ๋ฆฌ๋Š” ์ข…์ข… ๋†’์€ ์ •ํ™•๋„๋ฅผ ์กฐ๊ธˆ ์–‘๋ณดํ•˜๋”๋ผ๋„ ๋น ๋ฅด๊ณ (fast) ๊ฐ€๋ฒผ์šด(light) Detection ๋ชจ๋ธ์„ ์›ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ˆ˜์‹ญ ๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ ๊ฒ€์ถœํ•˜๊ธฐ ๋ณด๋‹จ, ํŠน์ • ๊ฐ์ฒด ๋ช‡ ๊ฐœ๋ฅผ ์ •ํ™•ํ•˜๊ณ  ๋น ๋ฅด๊ฒŒ ๊ฒ€์ถœํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋„๋กœ์œ„์˜ ์ฐจ๋Ÿ‰๊ณผ ์‚ฌ๋žŒ, ์‹ ํ˜ธ๋“ฑ๋งŒ์„ ๊ฒ€์ถœํ•˜๊ธธ ์›ํ•˜๊ฑฐ๋‚˜ ์‹ ์šฉ ์นด๋“œ์˜ ์ˆซ์ž๋ฅผ ๊ฒ€์ถœํ•˜๋Š” ๋ชจ๋ธ์„ ์›ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

์ด ํŠœํ† ๋ฆฌ์–ผ์€ Tensorflow Object Detection API๋ฅผ ์‚ฌ์šฉํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ํŠน์ • ๊ฐ์ฒด๋ฅผ ๊ฒ€์ถœํ•˜๋Š” ๋น ๋ฅด๊ณ  ๊ฐ€๋ฒผ์šด ๋ชจ๋ธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋†’์€ ์ •ํ™•๋„๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•๋„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

๋ณธ ํŠœํ† ๋ฆฌ์–ผ์€ ์‹ ์šฉ ์นด๋“œ ์ˆซ์ž ๊ฒ€์ถœ ๋ชจ๋ธ ์ƒ์„ฑ์„ ์˜ˆ์‹œ๋กœ ์„ค๋ช…์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ ํ™˜๊ฒฝ

  • Ubuntu 16.04
  • Python 3.6.6
  • Tensorflow 1.9.0
  • cuda 9.0

Table of contents

  1. ์„ค์น˜(Install)
  2. ๋ฐ์ดํ„ฐ์…‹(Dataset) ๊ตฌ์„ฑ
  1. ํ•™์Šต(Training)
  2. ๋ชจ๋ธํ…Œ์ŠคํŠธ(Running)
  3. ๊ฒฐ๊ณผ(Result)
  4. Extras

1. ์„ค์น˜

Tensorflow Object Dectection API์„ ์ ๋‹นํ•œ ํด๋”์— git cloneํ•˜๊ณ  ์—ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์„ค์น˜๋ฅผ ์™„๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ( COCO API installation์€ ํ•˜์ง€ ์•Š์•„๋„ ํŠœํ† ๋ฆฌ์–ผ์„ ์ง„ํ–‰ํ•˜๋Š”๋ฐ ๋ฌธ์ œ๋Š” ์—†์Šต๋‹ˆ๋‹ค. )

๋ณธ ํŠœํ† ๋ฆฌ์–ผ์˜ ๋Œ€๋ถ€๋ถ„์˜ ์ž‘์—… ๋ฐ ๋ช…๋ น์–ด๋Š” models/research/object_detection์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์•„๋ž˜์™€ ๊ฐ™์€ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค์–ด ์•„๋ž˜์™€ ๊ฐ™์€ ์ˆœ์„œ๋Œ€๋กœ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฐ์ดํ„ฐ์…‹ ๊ตฌ์„ฑ
  • ๋ชจ๋ธ ํ•™์Šต
  • ๋ชจ๋ธ ํ…Œ์ŠคํŠธ

directory

2. ๋ฐ์ดํ„ฐ์…‹ ๊ตฌ์„ฑ

Step 1. ํ•™์Šต ๋ฐ์ดํ„ฐ ์ค€๋น„

ํ•™์Šต์— ํ•„์š”ํ•œ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค. object_detection/images ํด๋”๋ฅผ ๋งŒ๋“ค์–ด ํ•™์Šตํ•˜๊ณ ์ž ํ•˜๋Š” ์ด๋ฏธ์ง€๋ฅผ Google ๊ฒ€์ƒ‰์„ ํ†ตํ•ด ๋‹ค์šด๋กœ๋“œํ•˜๊ฑฐ๋‚˜, ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ์œ„ ๊ฒฝ๋กœ๋กœ ์ €์žฅํ•ด ์ค๋‹ˆ๋‹ค. ๋˜ํ•œ ์—ฌ๊ธฐ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ํ•™์Šต ์‹œ ์‚ฌ์šฉํ•  ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๋Š” RGB image๋กœ jpeg๋‚˜ png ํฌ๋งท์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ณธ ํŠœํ† ๋ฆฌ์–ผ์—์„œ ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ์…‹์€ .png ํŒŒ์ผ๊ณผ .csv ํŒŒ์ผ์ด ํ•œ ์Œ ์”ฉ ์ด๋ฃจ๊ณ  ์žˆ๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ .png ํŒŒ์ผ์€ ํ•™์Šตํ•  ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ์ด๋ฉฐ, .csv ํŒŒ์ผ์—๋Š” ์ด๋ฏธ์ง€์— ์กด์žฌํ•˜๋Š” ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ •๋ณด( class, x, y, width, height )๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์ฒด ์ •๋ณด(.csv ํŒŒ์ผ) ์ƒ์„ฑ์— ๋Œ€ํ•œ ์„ค๋ช…์€ Step 2. ๋ฐ์ดํ„ฐ ๋ผ๋ฒจ๋ง ๋ชฉ๋ก์—์„œ ์ด์–ด์„œ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


file_list

  • ํ•™์Šต์— ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ์…‹ ๋ฆฌ์ŠคํŠธ

card_img

  • ํ•™์Šต์— ์‚ฌ์šฉํ•  ์นด๋“œ ์ด๋ฏธ์ง€

csv_format

  • ํ•™์Šต์— ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ์…‹์˜ csv ํฌ๋งท( ์™ผ์ชฝ๋ถ€ํ„ฐ ๊ฐ์ฒด์˜ class(์ˆซ์ž), x, y, width, height )

Step 2. ๋ฐ์ดํ„ฐ ๋ผ๋ฒจ๋ง

ํ•™์Šตํ•  ์ด๋ฏธ์ง€๊ฐ€ ์ค€๋น„๋์œผ๋ฉด Object Detection ๋ชจ๋ธ์„ ํ•™์Šตํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ด๋ฏธ์ง€์— ์กด์žฌํ•˜๋Š” ๊ฐ์ฒด์˜ ์œ„์น˜์™€ ์ •๋ณด๋ฅผ Labelling์„ ํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด์™€ ๊ด€๋ จํ•œ ๋งŽ์€ ํ”„๋กœ๊ทธ๋žจ์ด ์กด์žฌํ•˜์ง€๋งŒ ์ด ํŠœํ† ๋ฆฌ์–ผ์—์„  github์— open source๋กœ ๊ณต๊ฐœ๋˜์–ด ์žˆ๋Š” LabelImg๋ฅผ ์‚ฌ์šฉํ•˜๊ธธ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.

๋ณธ ํŠœํ† ๋ฆฌ์–ผ์—์„œ ์ œ๊ณต๋ฐ›์•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•œ ๊ฐ์ฒด ์ •๋ณด๋Š” .csv ํŒŒ์ผ๋กœ ์กด์žฌํ•˜์ง€๋งŒ, ์œ„ ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ผ๋ฒจ๋ง์„ ์ง„ํ–‰ํ–ˆ์„ ๊ฒฝ์šฐ ๊ฒฐ๊ณผ๋Š” .xml ํ˜•์‹์œผ๋กœ ์–ป๊ฒŒ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” datitran์˜ github์— ์žˆ๋Š” xml_to_csv.py ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•˜๋‚˜์˜ .csv ํŒŒ์ผ๋กœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ ๋ณธ ํŠœํ† ๋ฆฌ์–ผ์ฒ˜๋Ÿผ ๋ผ๋ฒจ๋ง ๊ฒฐ๊ณผ๊ฐ€ class, x, y, width, height์˜ ์ˆœ์„œ๋Œ€๋กœ ์ •์˜๋œ .csv ํŒŒ์ผ๋กœ ์–ป๊ฒŒ๋œ๋‹ค๋ฉด ์•„๋ž˜ Step 3. csv ํŒŒ์ผ ํ†ตํ•ฉ ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ์ˆ˜ ๋งŽ์€ .csv ํŒŒ์ผ์„ ํ•˜๋‚˜๋กœ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ผ๋ฒจ๋งํ•œ ํ›„ ์–ป๊ฒŒ๋˜๋Š” ์˜ค๋ธŒ์ ํŠธ์˜ ์ •๋ณด๋ฅผ ๊ฐ–๊ณ ์žˆ๋Š” output์ด .csv ๋˜๋Š” .xml์ธ ๊ฒƒ์€ ์ค‘์š”ํ•˜์ง€ ์•Š๊ณ  ์ด๋ฏธ์ง€์™€ ๊ฐ์ฒด ์ •๋ณด๋“ค์„ ํ•˜๋‚˜์˜ TFRecord ํŒŒ์ผ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด ์ •ํ•ด์ง„ ํฌ๋งท์— ๋งž์ถฐ ํ•˜๋‚˜์˜ .csv ํŒŒ์ผ๋กœ ํ†ตํ•ฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค

Step 3. csv ํŒŒ์ผ ํ†ตํ•ฉ

xml_to_csv.py ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ .xml ํŒŒ์ผ์„ .csvํŒŒ์ผ๋กœ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด ์•ฝ๊ฐ„์˜ ์†Œ์Šค ์ฝ”๋“œ ์ˆ˜์ •์„ ํ†ตํ•ด TFRecord ํฌ๋งท์— ๋งž๋Š” ํ•˜๋‚˜์˜ ํ†ตํ•ฉ๋œ .csv์„ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ณธ ํŠœํ† ๋ฆฌ์–ผ ๋ฐ์ดํ„ฐ์…‹์ฒ˜๋Ÿผ ๊ฐ ์ด๋ฏธ์ง€ ํŒŒ์ผ๋งˆ๋‹ค .csv ํŒŒ์ผ์„ ์–ป๊ฒŒ ๋  ๊ฒฝ์šฐ, TFRecord ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ด๋ฅผ ํ•˜๋‚˜์˜ ํ†ตํ•ฉ๋œ .csv ํŒŒ์ผ๋กœ ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ†ตํ•ฉ๋œ .csv ํŒŒ์ผ์€ TFRecord ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ๋•Œ ์ด์šฉ๋˜๋Š”๋ฐ, TFRecord ํŒŒ์ผ์€ Detection ๋ชจ๋ธ ํ•™์Šต์„ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•™์Šต์— ์š”๊ตฌ๋˜๋Š” ํฌ๋งท์— ๋งž์ถฐ์„œ .csv ํŒŒ์ผ์„ ํ†ตํ•ฉํ•ด์ค˜์•ผ ํ•˜๋Š”๋ฐ ํฌ๋งท์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

( filename, width, height, class, xmin, ymin, xmax, ymax )

์—ฌ๊ธฐ์„œ width์™€ height๋Š” image์˜ ์‚ฌ์ด์ฆˆ์ด๊ณ , Labelling์„ ํ†ตํ•ด ์–ป์€ width์™€ height๋Š” bounding box์˜ ์‚ฌ์ด์ฆˆ์ด๋ฏ€๋กœ ํ˜ผ๋™ํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณธ ํŠœํ† ๋ฆฌ์–ผ์—์„œ ์ œ๊ณตํ•˜๋Š” ์†Œ์Šค์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๊ฐ„๋‹จํžˆ .csv ํŒŒ์ผ๋“ค์„ ํฌ๋งท์— ๋งž๊ฒŒ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ†ตํ•ฉ๋œ ๋ชจ์Šต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

merged_csv

Step 4. TFRecord ํŒŒ์ผ ์ƒ์„ฑ

Object Detection ๋ชจ๋ธ์„ ํ•™์Šต์‹œํ‚ฌ ๋•Œ๋งˆ๋‹ค ์ด๋ฏธ์ง€์™€ .csv ํŒŒ์ผ์„ ํ•œ ์Œ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ด€ํ•˜๊ณ  ์ด์šฉํ•˜๋Š” ๊ฒƒ์€ ๋น„ํšจ์œจ์ ์ด๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ์—๋„ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Tensorflow Object Detection API๋Š” ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฏธ์ง€์™€ .csv ํŒŒ์ผ์€ TFRecord๋ผ๋Š” ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

object_detection/data ํด๋”์— ํ†ตํ•ฉ๋œ train_labels.csv ์„ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค. ๊ทธ ํ›„ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด์„œ TFRecord ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

python3 generate_tfrecord.py --csv_input=data/train_labels.csv --output_path=data/train.record

์ด ๊ณผ์ •์€ ์ œ๊ณต๋˜๋Š” ์†Œ์Šค์ฝ”๋“œ๋ฅผ object_detection ํด๋”์— ๋„ฃ์€ ํ›„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋‹จ, ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ์— ์ ์ ˆํ•˜๊ฒŒ class์™€ path๋ฅผ ์ˆ˜์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.


TFRecord_class

TFRecord_path

data ํด๋”์— ์ƒ์„ฑ๋œ tfrecord ํŒŒ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

tfrecord

TFRecord์— ๋Œ€ํ•œ ๋” ์ž์„ธํ•œ ์„ค๋ช…์€ ์—ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํ•˜๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

Step 5. object-detection.pbtxt ํŒŒ์ผ ์ƒ์„ฑ

๋ณธ ํŠœํ† ๋ฆฌ์–ผ์—์„œ๋Š” ์นด๋“œ ์ˆซ์ž ๊ฒ€์ถœ์„ ์œ„ํ•ด 0 ~ 9์˜ 10๊ฐ€์ง€ ์ˆซ์ž๋ฅผ ๊ฒ€์ถœํ•ด์•ผํ•  class๋กœ ์ง€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. TFRecord ํŒŒ์ผ์€ .pb ํฌ๋งท์œผ๋กœ ํ•™์Šต ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด ์˜ค๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ ๊ฐ์ฒด ์ •๋ณด์— ๋Œ€ํ•œ label๋„ .pbtxtํ˜•์‹์œผ๋กœ ์ฝ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. object_detection/training ํด๋”๋ฅผ ์ƒ์„ฑํ•ด ์ด๊ฒƒ๊ณผ ๊ฐ™์€ object-detection.pbtxt ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋ธ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•˜์—ฌ ๊ฐ™์€ ํŒŒ์ผ์„ object_detection/data ํด๋”์—๋„ ๋ณต์‚ฌํ•˜์—ฌ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค. ์ด 2๊ฐœ์˜ ๋˜‘๊ฐ™์€ .pbtxt ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

3. ํ•™์Šต

์•ž์˜ ๊ณผ์ •์„ ํ†ตํ•ด์„œ ํ•™์Šต์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ , ๋ผ๋ฒจ๋งํ•˜๊ณ , TFRecord๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์„ ํ†ตํ•ด ๋ชจ๋ธ์„ ํ•™์Šตํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•™์Šต์— ์•ž์„œ Tensorflow Object Detection API๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ„๋‹จํžˆ ํ•™์Šต ํ™˜๊ฒฝ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋„๋ก object_detection/samples/configs์— .config ํŒŒ์ผ์„ ์—ฌ๋Ÿฌ ๊ฐœ ์ค€๋น„ํ•ด๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ข€ ๋” ๋น ๋ฅด๊ณ  ์ •ํ™•ํ•œ ๋ชจ๋ธ์„ ํ•™์Šต์‹œํ‚ค๊ธฐ ์œ„ํ•˜์—ฌ SSD(Single Shot Detector)์™€ MobileNet_V2๋ฅผ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ ssd_mobilenet_v2_coco.config ํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜์—ฌ training ํด๋”์— ๋„ฃ์–ด์ฃผ๋„๋ก ํ•ฉ์‹œ๋‹ค.

์ด ๋•Œ, ๋ชจ๋ธ์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ํ•™์Šต์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋งค์šฐ ๋งŽ์€ ์‹œ๊ฐ„์ด ํ•„์š”ํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ COCO dataset์œผ๋กœ ๋ฏธ๋ฆฌ ํ•™์Šต๋œ ๋ชจ๋ธ(Pretrained Model)์„ ์‚ฌ์šฉํ•ด ์šฐ๋ฆฌ ๋ชจ๋ธ์„ Transfer learning์„ ์‹œํ‚ค๋„๋ก ํ•ฉ์‹œ๋‹ค. ๋˜ํ•œ ์šฐ๋ฆฌ๊ฐ€ data ํด๋”์— ์ƒ์„ฑํ•œ train.record์™€ object-detection.pbtxt์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋ธ์„ ํ•™์Šต์‹œํ‚ค๊ธฐ ์œ„ํ•ด .config ํŒŒ์ผ์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. .config ํŒŒ์ผ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์€ Extras๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.


9 num_classes: 90

9 num_classes: 10

156 fine_tune_checkpoint: "PATH_TO_BE_CONFIGURED/model.ckpt"

156 fine_tune_checkpoint: "ssd_mobilenet_v2_coco_2018_03_29/model.ckpt"

175 input_path: "PATH_TO_BE_CONFIGURED/mscoco_train.record-?????-of-00100"

175 input_path: "data/train.record"

177 label_map_path: "PATH_TO_BE_CONFIGURED/mscoco_label_map.pbtxt"

177 label_map_path: "data/object-detection.pbtxt"


Pretrained ๋ชจ๋ธ ๋‹ค์šด๋กœ๋“œ์™€ ๊ฐ ๋ชจ๋ธ๊ฐ„์˜ ์†๋„ ๋น„๊ต๋Š” ์—ฌ๊ธฐ์—์„œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ssd_mobilenet_v2_coco ๋ชจ๋ธ์„ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•„ object_detection ํด๋”์— ๋„ฃ๋„๋ก ํ•ฉ์‹œ๋‹ค. ๊ทธ ํ›„ object_detection ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ํ•™์Šต์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

python3 train.py --logtostderr --train_dir=training/ --pipeline_config_path=training/ssd_mobilenet_v2_coco.config

ํ•™์Šต์ด ์ •์ƒ์ ์œผ๋กœ ์‹œ์ž‘๋˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

train

๊ฐ step๋งˆ๋‹ค loss ๊ฐ’์ด ์ถœ๋ ฅ๋˜๊ณ  ์ž˜ ํ•™์Šต๋˜๋Š” ๊ฒฝ์šฐ loss๋Š” 0์— ์ˆ˜๋ ดํ•ฉ๋‹ˆ๋‹ค. ์ ๋‹นํžˆ loss๊ฐ€ 0 ~ 2 ์ •๋„๋กœ ์ˆ˜๋ ดํ•œ๋‹ค ์‹ถ์œผ๋ฉด ํ•™์Šต์„ ์ข…๋ฃŒํ•˜๊ณ  ๋ชจ๋ธ์„ ํ…Œ์ŠคํŠธํ•ด๋ด…๋‹ˆ๋‹ค.

Tensorflow Object Detection API์—์„œ ์ œ๊ณตํ•˜๋Š” .config ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ด ๋ณธ ํ›„ ์นด๋“œ ๋ฒˆํ˜ธ ๊ฒ€์ถœ์— ์ตœ์ ํ™”ํ•œ .config ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ด ๋ชจ๋ธ์„ ํ•™์Šต์‹œ์ผœ๋ณด๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋น„๊ตํ•ด๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•ด ๋ณด์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

4. ๋ชจ๋ธ ํ…Œ์ŠคํŠธ

๋ชจ๋ธ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  1. ์ถ”๋ก  ๊ทธ๋ž˜ํ”„ ์ถ”์ถœ
  2. ์ถ”๋ก  ๊ทธ๋ž˜ํ”„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด ๊ฒ€์ถœ

์šฐ์„  ์ถ”๋ก  ๊ทธ๋ž˜ํ”„ ์ถ”์ถœ์„ ์œ„ํ•ด ํ•™์Šต์„ ์ข…๋ฃŒํ•˜๋ฉด training ํด๋”์— ๋งŽ์€ ํŒŒ์ผ๋“ค์ด ์ƒ๊ธด ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๊ฐ์ฒด ๊ฒ€์ถœ์— ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๋ก  ๊ทธ๋ž˜ํ”„๋ฅผ ์ถ”์ถœํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ object_detection ํด๋”์—์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

python3 export_inference_graph.py
--input_type image_tensor
--pipeline_config_path training/ssd_mobilenet_v2_coco.config
--trained_checkpoint_prefix training/model.ckpt-xxxxx
--output_directory num_recognition

model.ckpt-xxxxx์˜ xxxxx๋ถ€๋ถ„์— ์ €์žฅ๋œ ๋ชจ๋ธ ๋ฒˆํ˜ธ๋ฅผ ์“ฐ๊ณ  ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด num_recognition ํด๋”๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ํด๋”์•ˆ์— frozen_inference_graph.pb(์ถ”๋ก  ๊ทธ๋ž˜ํ”„)๊ฐ€ ์ƒ์„ฑ๋œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถ”๋ก  ๊ทธ๋ž˜ํ”„ ์ถ”์ถœ์ด ์™„๋ฃŒ๋˜์—ˆ์œผ๋ฉด ํ•™์Šต๋œ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ detectionํ•˜๊ธฐ ์œ„ํ•ด object_detection/object_detection_tutorial.ipynb์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.


model_name


์ถ”๋ก  ๋ชจ๋ธ ์ถ”์ถœ ๊ฒฐ๊ณผ num_recognition ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— model_name์„ num_recognition์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  PAATH_TO_CKPT๋„ ๋ฐ”๋€ ๋ชจ๋ธ ๊ฒฝ๋กœ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. PATH_TO_LABELS๋Š” ๋ ˆ์ด๋ธ”์— ์‚ฌ์šฉ๋˜๋Š” ๋ฌธ์ž์šฉ ๋ชฉ๋ก์œผ๋กœ, ์•ž์„œ ์ •์˜ํ•œ object_detection.pbtxt๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ์—ฌ๊ธฐ์„œ ์ •์˜ํ•œ ํด๋ž˜์Šค๋Š” 10๊ฐœ(0 ~ 9)์ด๋ฏ€๋กœ NUM_CLASSES์˜ ๊ฐ’์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.


test_images

ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธํ•  ์ด๋ฏธ์ง€๋ฅผ object_detection/test_images ํด๋”์— ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€๋“ค์„ test_{} ํ˜•์‹์— ๋งž์ถฐ ์—…๋กœ๋“œํ•˜๋ฉด range์˜ ๋ฒ”์œ„์— ๋”ฐ๋ผ ์ˆœ์„œ๋Œ€๋กœ ์ด๋ฏธ์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค.

์—…๋กœ๋“œ ํ›„ object_detection_tutorial.ipynb๋ฅผ ์‹คํ–‰ํ•˜๋ฉด test_images ๋””๋ ‰ํ† ๋ฆฌ์˜ ์ด๋ฏธ์ง€์— ๋Œ€ํ•ด num_recognition/frozen_inference_graph.pb์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ๊ฒ€์ถœ(์ถ”๋ก )ํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.


convert_rgb

๋ณธ ํŠœํ† ๋ฆฌ์–ผ์—์„œ ์‚ฌ์šฉํ•œ ์นด๋“œ๊ฐ€ ์žˆ๋Š” test_images์˜ ์ด๋ฏธ์ง€๋“ค์€ gray-scale๋กœ 1channel์ธ ๋ฐ˜๋ฉด์— ๋ชจ๋ธ์„ ํ•™์Šต์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ๋Š” 3์ฑ„๋„๋กœ ๋„ฃ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ•์ œ๋กœ 3์ฑ„๋„์˜ RGB ์ด๋ฏธ์ง€ ํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ•ด ์ค๋‹ˆ๋‹ค.

5. ๊ฒฐ๊ณผ

result result

๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ํ•™์Šต์ด ์ž˜ ๋˜์–ด ์นด๋“œ ๋ฒˆํ˜ธ ๊ฒ€์ถœ์ด ์ž˜ ์ด๋ฃจ์–ด์ง€๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6. Extras

About

train and optimize your object detection with tensorflow object detection api for number

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •