훈련전 준비작업:
- 모델훈련 들어가기 전에 우선 tensorflow-object-detection-api 에 대해 실행가능한지 테스트를 진행해 보아야 한다.
https://blog.csdn.net/holidayun/article/details/82378201 참고 - github에서 xml_to_csv.py 와 generate_tfrecord.py 를 다운로드 받은뒤,\tensorflow\models\research\object_detection 목록아래에 저장해 둔다.
다운로드 주소:
https://github.com/holidayun/Tesorflow-Object-Detection-API-Training-Windows-Tutorial - \tensorflow\models\research\object_detectio 목록아래에 images폴더를 생성한다.
- \tensorflow\models\research\object_detectio\imgaes 목록아래에 test폴더와 train폴더를 생성해 둔다.
모델 다운로드.
( 필요에 따라 모델을 다운로드 받으실 수 있습니다.)
https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md( SDD-MobileNet 모델은 학습속도는 빠르지만 정확도가 높은편이 아니라
Faster-RCNN-Inception-V2 모델을 예로 설명해 보도록 하겠습니다. )다운로드 주소 :
http://download.tensorflow.org/models/object_detection/faster_rcnn_inception_v2_coco_2018_01_28.tar.gz
다운로드 완료후 faster_rcnn_inception_v2_coco_2018_01_28 폴더를 압축해제하여 tensorflow \ models \ research \ object_detection 경로로 저장해 둔다.(ps: 모델일자와 버전번호는 향후에 변화될 가능성이 있지만 사용방법은 여전히 본 문장이 참고가 되겠습니다.)
1.이미지 수집하기
- 수집한 이미지에는 인식대상이 포함되어야 한다.
- 이미지 파일크기는 200kb 이하이며 해상도는 720*1280을 초과하지 않는것이 좋다.(파일이 클수록 모델이 학습하는데 걸리는 시간이 길어지기 때문)
- 수집한 이미지파일을 \tensorflow\models\research\object_detectio\imgaes 목록 아래로 넣어둔다.
2.이미지 라벨 만들기
이미지를 수집한 뒤 해당 이미지에 인식대상을 표기할수 있다.( 이미지 표기하는 툴로 LabelImg 사용할것을 권장하며 GitHub화면에 설치방법 및 사용방법에 대해 상세하게 설명되어 있습니다. 아래는 LabelImg툴의 GitHub 주소입니다.)
https://github.com/tzutalin/labelImgLabelImg를 통해 생성된 xml 파일중 80%는
\tensorflow\models\research\object_detectio\imgaes\train 목록으로 저장해서 학습하는데 사용하고 나머지 20% 는 \object_detection\imgaes\test 에 저장하여 테스트하는데 사용한다.
3.훈련데이터 생성하기
- 생성된 xml데이터를 csv양식의 데이터로 전환시킨 후 에디터로 \object_detection 목록아래 xml_to_csv.py 파일을 열어서 해당 경로를 수정한다
def main():
#image_path - 테스트폴더 경로
image_path = r'D:\Image-GPU\tensorflow\models\research\object_detection\images\test'
xml_df = xml_to_csv(image_path)
#'test_labels.csv' - 생성된 csv명
xml_df.to_csv('test_labels.csv', index=None)
print('Successfully converted xml to csv.')
아래와 같이 실행하게 되면
D:\Image-GPU\tensorflow\models\research\object_detection> python xml_to_csv.py
object_detection 목록에 해당 test_labels.csv 파일이 생성 된다.
동일한 방법으로 train_label.csv 파일도 생성할수 있다.
2. csv 파일을 .record 파일로 전환시키기
에디터에서 generate_tfrecord.py 파일을 열은 후, 31번째 행부터 시작되는 이미지라벨명을 실제상황에 맞추어 아래와 같이 재작성하며 매개 대상마다 해당 ID를 배정하고 나면 그 뒤로 labelmap.pbtxt파일 세팅시 동일한 ID번호로 배정하게 된다.
예를 들어,현재 모델로 사과와 바나나, 오렌지에 대한 인식을 훈련시키는 경우 ,generate_tfrecord.py 에서 아래코드를
if row_label == 'collar':
return 1
아래와 같은 식으로 변경시킨다
if row_label == 'apple':
return 1
if row_label == 'banana':
return 2
if row_label == 'orange':
return 3
다음으로 \ object_detection 폴더에서 아래와 같은 명령을 넣어 TFRecord 파일을 생성시킨다.
python generate_tfrecord.py --csv_input=train_labels.csv --image_dir=images\train --output_path=train.record
python generate_tfrecord.py --csv_input=test_labels.csv --image_dir=images\test --output_path=test.record
그러면 \ object_detection 에 train.record와 test.record파일이 생성되며 이들은 파일인식에 사용된다.
5.라벨 매핑 생성하기
tensorflow \ models \ research \ object_detection \ training 목록아래에서 labelmap.pbtxt를 생성한다.예를 들어, 인식 대상이 사과나 바나나, 오렌지일 경우 labelmap.pbtxt 의 내용은 아래와 같다.
주의점: 여기서 ID와 name은 3-2번의 generate_tfrecord.py 에서 기록한것과 일치해야 한다.
item {
id: 1
name: 'apple'
}
item {
id: 2
name: 'banana'
}
item {
id: 3
name: 'orange'
}
6.세팅파일 수정하기
인식훈련 터널에 대한 세팅이며 모델 및 학습에 쓰이는 파라미터에 대해 정의되어 있다.이는 훈련에 들어가기 전의 마지막 절차가 된다.配置对象检测训练管道。它定义了哪个模型以及将用于培训的参数。这是运行训练前的最后一步。
tensorflow1 \ models \ research \ object_detection \ samples \ configs 으로 지향하되 faster_rcnn_inception_v2_pets.config 파일을 \ object_detection \ training 목록아래로 복사한 뒤, 에디터로 파일을 열어본다.여기서 .config 에 대해 수정가능하며 주로 종류나 예제수량을 수정하거나 파일경로를 훈련하는 데이터에 추가하는 등 작업을 할수 있다.
faster_rcnn_inception_v2_pets.config 파일에 대해 아래와 같은 수정 진행.
주의점:경로 입력시 반드시 ()가 아닌 (/)와 큰따옴표(“)를 사용하여야 한다. 。
9번째 줄에서 num_classes는 인식대상종류수로 수정한다.예를들어 상기 예제일 경우 인식대상이 사과,바나나,오렌지이기 때문에 num_classes:3 으로 된다.
106번째 줄에서 fine_tune_checkpoint를 아래와 같이 변경한다.
fine_tune_checkpoint:“D:/Image-GPU/tensorflow/models/research/object_detection/faster_rcnn_inception_v2_coco_2018_01_28/model.ckpt”
123번째,125번째 줄, train_input_reader부분에서 input_path와 label_map_path를 아래와 같이 변경한다.
input_path:“D:/Image-GPU/tensorflow/models/research/object_detection/train.record”
label_map_path:“D:/Image-GPU/tensorflow/models/research/object_detection/training/labelmap.pbtxt”
130번째 줄에서는 num_examples 를 \ images \ test 목록에 이미지개수로 수정한다
135,137줄, eval_input_reader에서 input_path와 label_map_path를 아래와 같이 변경한다.
input_path:“D:/Image-GPU/tensorflow/models/research/object_detection/test.record”
label_map_path:“D:/Image-GPU/tensorflow/models/research/object_detection/training/labelmap.pbtxt”
상기 수정완료된 내용을 저장하고나면 모델의 세팅준비작업이 완료된 상태로 실행이 가능하게 된다.
7.학습기능 실행하기
python train.py --logtostderr --train_dir=training/ --pipeline_config_path=training/faster_rcnn_inception_v2_pets.config
object-detection에 train.py파일이 없을 경우 /research/object_detection/legacy 경로에서 train.py파일을 /research/object_detection 로 카피하여 실행하면 된다.
모든 설정이 문제없이 되어있을 경우 TensorFlow 는 초기화하게 되며 실제로 훈련시작되기 전까지 초기화하는데 약 1분간의 시간이 소요될수 있으며 훈련이 시작될 경우 아래와 같이 보여지게 된다.
8.추리결과 끌어내기
훈련이 완료되었을 경우 마지막으로 .pb파일을 생성하는 작업이 남아있는데 \ object_detection 목록에서 아래와 같은 명령을 넣어 실행한다. 그중 “model.ckpt-XXXX”의 “XXXX”은 training 폴더에서 가장 큰 ID의 .ckpt 파일을 입력해 넣어야 한다
python export_inference_graph.py --input_type image_tensor --pipeline_config_path training/faster_rcnn_inception_v2_pets.config --trained_checkpoint_prefix training/model.ckpt-XXXX --output_directory inference_graph
상기작업 완료되면 \ object_detection \ inference_graph 폴더에
frozen_inference_graph.pb파일이 생성되며 pb파일에는 인식대상검측분류모델이 포함되어 있다.