라벨링한 데이터는 'stickynote_image'에 모두 저장한다. (이미지와 xml 모두)
라벨링 인원 각각 branch를 파서 이미지 업로드, PR, 확인 후 main에 merge
라벨링한 데이터는 팀 드라이브 내 알맞은 위치에 이미지 파일과 xml 파일 모두를 업로드.
드라이브 접속 시 학교 계정 로그인 필수.
- Anaconda 22.9.0(Python 3.9.16)
- Tensorflow 2.10
- Protoc 22.0
- Visual Studio 2022
Tensorflow Object Detection API를 git clone해 설치
와우보드 위에 직접 포스트잇을 붙여서 촬영한 이미지와 단순히 포스트잇을 중심으로 한 이미지를 수집
학습에 사용하기 위해 수집한 이미지 데이터를 라벨링하는 작업이 필요하다.
LabelImg라는 오픈소스 툴을 이용해 작업을 진행한다.
데이터 라벨링 문서를 참고해 라벨링하기
PascalVOC dataset으로 설정 후 각 이미지를 라벨링, 라벨링된 이미지는 각각 xml파일이 생성된다
이미지데이터를 불러오고 오브젝트 영역(Bounding Box)을 지정, 학습데이터는 xml파일로 저장됨
라벨링한 데이터셋은 학습(train)에 사용할 것과 평가확인(test)에 사용할 것으로 분리해준다.
권장되는 디렉토리 구조는 다음과 같음
├─images
│ │
│ ├─test
│ │ 20230404_192449.jpg
│ │ ......
│ │
│ └─train
│ 20230404_192356.jpg
│ .......
각 이미지 별로 xml파일이 생성되었는데, 이를 하나의 csv파일로 묶어주어야 한다.
토탈 2개의 csv가 생성, train용으로 분리한 데이터셋 과 test로 분리한 데이터셋
python xml_to_csv.py --image_dir=[images 디렉토리 경로]
인식할 객체의 정보를 담은 파일로 위의 데이터셋에서 라벨링했던 내용을 포함한다.
id값은 1부터 시작하며, 저장할 파일의 확장자는 .pbtxt
item {
id: 1
name: "stickynote"
display_name: "stickynote"
}
앞서 생성한 csv파일을 기반으로 TFRecord 파일을 생성해주어야한다.
TFRecord : 학습에 사용할 데이터셋의 바이너리 포맷
위의 label map과 같이 generate_tfrecord.py에서 class_text_to_int()의 내용을 수정한다.
def class_text_to_int(row_label):
if row_label == 'stickynote':
return 1
else:
None
# test용 데이터셋 TFRecord 생성
python generate_tfrecord.py --csv_input=images\test_labels.csv --image_dir=images\test --output_path=test.record
# train용 데이터셋 TFRecord 생성
python generate_tfrecord.py --csv_input=images\train_labels.csv --image_dir=images\train --output_path=train.record
model zoo에서 평균 탐색시간과 평균 객체 인식률을 비교해 적절한 모델을 다운로드
모델파일의 압축을 풀면 아래와 같은 구조가 있음
├─ssd_mobilenet_v2_fpnlite_640x640_coco17_tpu-8
│ │ pipeline.config
│ │
│ ├─checkpoint
│ │ checkpoint
│ │ ckpt-0.data-00000-of-00001
│ │ ckpt-0.index
│ │
│ └─saved_model
│ │ saved_model.pb
│ │
│ └─variables
│ variables.data-00000-of-00001
│ variables.index
해당 구조를 유지한 채로, pipeline.config의 내용을 수정
# 주요 수정 구간
num_classes: [label map에서 작성한 인식할 객체의 종류 갯수]
...
batch_size: [연산 한 번에 들어가는 데이터의 크기, 적당히 1정도,
메모리 용량이나 GPU 메모리에 여유가 있는 경우 4까지도 괜찮음, 너무 크면 OOM발생]
...
fine_tune_checkpoint: [학습을 시작할 checkpoint의 경로, pre-trained 모델의 checkpoint/ckpt-0]
num_steps: [학습 step수, 보통 20000]
fine_tune_checkpoint_type: "detection" [객체를 detection할 것이므로 이렇게 수정]
...
train_input_reader {
label_map_path: [label map.pbtxt의 경로]
tf_record_input_reader {
input_path: [train용 tfrecord의 경로]
}
}
...
eval_input_reader {
label_map_path: [label map.pbtxt의 경로]
shuffle: false
num_epochs: 1
tf_record_input_reader {
input_path: [test용 tfrecord의 경로]
}
}
위의 세팅이 완료되면 본격적으로 학습을 시작,
python model_main_tf2.py —-pipeline_config_path=[pipeline.config의 경로] -—model_dir=[학습 결과물들이 저장될 경로] —-logtostderr
학습 과정을 모니터링 할 수 있는 툴로 tensorboard가 있다.
API 설치시 같이 딸려오므로 학습 실행시켜두고 모니터링 커맨드 실행
tensorboard --logdir=[학습 결과물들이 저장될 경로]
- 모델 추출 : 학습을 완료하면 checkpoint가 생성되는데, 이를 model로 export 해줘야 한다.
python exporter_main_v2.py --input_type=image_tensor --trained_checkpoint_dir=[학습 결과물들이 저장될 경로] --output_directory=[결과 model이 저장될 경로] --pipeline_config_path=[pipeline.config의 경로]
- 실제 추론(Detecting) : - 이렇게 추출된 model을 바탕으로 실제 추론(detecting)을 한다.
예시 코드는 colab_tutorials의 object_detection_tutorial.ipynb에 있음
Imports 부분 부터 쭉 실행
PATH_TO_LABELS를 라벨맵의 경로로 수정, PATH_TO_TEST_IMAGES_DIR를 실제 detection에 사용할 이미지 경로로 수정
detection_model의 경로를 학습하고 모델로 export한 경로(exported_model) 수정
python detection.py --image_dir=[detection할 이미지폴더 경로] --output_dir=[detection 결과물이 저장될 폴더] --detection_model=[detection에 사용할 모델 경로] --label_map_dir=[라벨맵 파일의 경로]
detection 결과가 output_dir에 저장됨
+) 0403 : cropping_entities()의 추가로 각각의 인식된 객체들의 단일 이미지도 추가로 저장함