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

+ Recent posts