1. 라이브러리 Import
- tensorflow 버전은 2.8.2에서 정상 작동 되는 것 확인 함
import os
import glob
import xml.etree.ElementTree as ET
import pandas as pd
import tensorflow as tf
print(tf.__version__)
2. 구글 드라이브에서 작업폴더 생성 및 이미지/라벨링 파일 업로드
- 작업폴더명: customTF2
- 작업폴더 하위에 data, training 폴더 생성
- 이미지 파일(jpg): images.zip
- 라벨링 파일(xml): annotation.zip
※ 라벨링 파일은 labelimg 라이브러리를 이용하여 이미지파일을 불러와 한땀한땀 수작업으로 진행!\
3. 구글 드라이브 Mount 및 Alias 설정
from google.colab import drive
drive.mount('/content/gdrive')
!ln -s /content/gdrive/MyDrive/ /mydrive
4. Tensorflow Model 복사 및 Object Detection API 설치
4-1. Tensorflow Github에서 models 폴더를 통채로 불러옴
!git clone --q https://github.com/tensorflow/models.git
# model/research 폴더 이동해서 작업수행. 이동안하면 xxx.py module import에 문제 생김
%cd models/research
4-2. Protocol Buffer파일(*.proto)을 파이썬 모듈(.py)로 변환
- 뒤에 붙은 dot(.)은 동일 폴더(object_detection/protos/) 를 지칭
!protoc object_detection/protos/*.proto --python_out=.
4-3. setup.py 준비
- tf2용 setup.py 모듈을 research폴더로 이동(root폴더인 research에서 다른 모듈import를 위해서 수행)
- tf1용도 있기때문에 각각 따로 두었다가 꺼내서 쓰는것이라고 이해하면 됨
- 뒤에 붙은 dot(.)은 현재 폴더(/content/models/research/) 를 지칭
!cp object_detection/packages/tf2/setup.py .
4-4. ★ models/research/setup.py 에서 아래 수정. 버전 호환 위해서 반드시 필요!
REQUIRED_PACKAGES = [
'avro-python3',
'apache-beam',
'pillow',
'lxml',
'matplotlib',
'Cython',
'contextlib2',
'tf-slim==1.1.0',
'six',
'pycocotools',
'lvis',
'scipy',
'pandas',
'tf-models-official==2.7.0',
'tensorflow_io==0.23.1',
'keras==2.7.0'
]
4-5. 위에서 지정한 Package(Dependency) 설치
- 뒤에 붙은 dot(.)은 현재 폴더에 있는 모든 파일을 지칭 (setup.py밖에 없으니 이 파일만 수행하게 됨)
!python -m pip install .
5. Model Builder 테스트
- Model Build하는데 문제 없는지 사전 확인 하는 단계. 마지막 출력문에 OK 확인 되면 이상없는 것.
!python object_detection/builders/model_builder_tf2_test.py
6. Custom 폴더로 이동해서 기반 작업수행
- 구글드라이브의 customTF2에서 작업을 진행할 것이므로 해당폴더의 data폴더로 이동 시켜놓음
- images, annotattions 폴더를 만든뒤 사전 준비해놓은 압출파일들을 각각폴더에 풀어줌
%cd /mydrive/customTF2/data/
!mkdir images annotations
!unzip /mydrive/customTF2/images.zip -d /mydrive/customTF2/data/images
!unzip /mydrive/customTF2/annotations.zip -d /mydrive/customTF2/data/annotations
7. Test & Train Set 준비
- test_labes 와 train_labels 폴더를 먼저 만들어줌
- annotations에 있는 파일중 60개를 random으로 sorting해서 test_label 폴더로 이동시킴
- annotations에 있는 폴더에 남아있는 파일을 모두 train_label 폴더로 이동시킴
!mkdir test_labels train_labels
!ls annotations/* | sort -R | head -60 | xargs -I{} mv {} test_labels/
!ls annotations/* | xargs -I{} mv {} train_labels/
8. label_map.pbtxt 파일 만들기
- 앞에서 준비한 annotation폴더의 label파일(.xml)을 csv로 변환시켜줌
- label 파일에서 지정된 class들을 검출해서 label_map.pbtxt 파일로 정리해 줌
def xml_to_csv(path):
classes_names = []
xml_list = []
for xml_file in glob.glob(path + '/*.xml'):
tree = ET.parse(xml_file)
root = tree.getroot()
for member in root.findall('object'):
classes_names.append(member[0].text)
value = (root.find('filename').text ,
int(root.find('size')[0].text),
int(root.find('size')[1].text),
member[0].text,
int(member[4][0].text),
int(member[4][1].text),
int(member[4][2].text),
int(member[4][3].text))
xml_list.append(value)
column_name = ['filename', 'width', 'height', 'class', 'xmin', 'ymin', 'xmax', 'ymax']
xml_df = pd.DataFrame(xml_list, columns=column_name)
classes_names = list(set(classes_names))
classes_names.sort()
return xml_df, classes_names
for label_path in ['train_labels', 'test_labels']:
image_path = os.path.join(os.getcwd(), label_path)
xml_df, classes = xml_to_csv(label_path)
xml_df.to_csv(f'{label_path}.csv', index=None)
print(f'Successfully converted {label_path} xml to csv.')
label_map_path = os.path.join("label_map.pbtxt")
pbtxt_content = ""
for i, class_name in enumerate(classes):
pbtxt_content = (
pbtxt_content
+ "item {{\n id: {0}\n name: '{1}'\n}}\n\n".format(i + 1, class_name)
)
pbtxt_content = pbtxt_content.strip()
with open(label_map_path, "w") as f:
f.write(pbtxt_content)
print('Successfully created label_map.pbtxt ')
- 각각 만들어진 파일은 아래와 같은 형태로 되어 있음.
9. train.record / test.record 파일 생성
- getnerate_tfrecord.py 모듈을 깃허브에서 불러들여 사용 (record 파일 생성기라고 보면됨)
- 앞에서 만들어진 label_map과 image들을 매칭하여 모델학습에 사용될 record파일을 생성해 줌
!wget https://raw.githubusercontent.com/techzizou/Train-Object-Detection-Model-TF-2.x/main/generate_tfrecord.py
!python generate_tfrecord.py train_labels.csv label_map.pbtxt images/ train.record
!python generate_tfrecord.py test_labels.csv label_map.pbtxt images/ test.record
- 위 작업까지 완료되면 아래와 같은 Folder Tree가 만들어 진 것을 확인 할 수 있음.
'데이터사이언스 > 딥러닝' 카테고리의 다른 글
Classification Project (Colab) (0) | 2022.07.25 |
---|---|
Object Detection Tensorflow API (Colab) #2_모델학습 (0) | 2022.07.18 |
Image Labeling (0) | 2022.07.18 |
PreActResNet, 2016 (0) | 2022.06.24 |
LeNet, AlexNet, ZFNet, VGG, GoogLeNet, ResNet (0) | 2022.06.23 |