JUST WRITE

[Vision] 엔지니어의 Yolo 도전기(2) - Train Dataset 준비 본문

AI

[Vision] 엔지니어의 Yolo 도전기(2) - Train Dataset 준비

천재보단범재 2023. 4. 16. 22:22

Train DataSet 준비

Train DataSet 준비

저번 포스팅에서 CVAT을 활용해서 Video를 Auto Labeling을 진행하였습니다.

 

[Vision] 엔지니어의 Yolo 도전기(1) - CVAT을 통한 Auto Labeling

엔지니어의 Yolo 도전기 회사에서 Vision 관련 프로젝트를 진행할 수 있다는 소식이 전해졌습니다. AI로 강아지와 고양이를 비교하는 예시만 많이 들었지 Vision은 저에게는 미지의 세계였습니다. 팀

developnote-blog.tistory.com

이제 Yolo 모델을 Train 할 수 있게 DataSet을 준비하도록 하겠습니다.

CVAT Data Export

저번에 CVAT에서 Auto Labeling을 한 Task에서 Data를 Export 합니다.

Data 포맷은 COCO 포맷으로 선택해서 이미지를 포함해서 Export 합니다.

Data Export
CoCo 포맷 선택

COCO는 큰 스케일의 Object Detection, Segmetation, Caption에 쓰이는 DataSet입니다.

매년 다른 Dataset으로 주요 세계 대회에 자주 사용되고 있습니다.

COCO는 아래와 같은 구조를 가지고 있습니다.

{
    "info" : info, 
    "images" : [image], 
    "annotations" : [annotation], 
    "licenses" : [license],
}

info{
    "year" : int, 
    "version" : str, 
    "description" : str, 
    "contributor" : str, 
    "url" : str, 
    "date_created" : datetime,
}

image{
    "id" : int, 
    "width" : int, 
    "height" : int, 
    "file_name" : str, 
    "license" : int, 
    "flickr_url" : str, 
    "coco_url" : str, 
    "date_captured" : datetime,
}

license{
    "id" : int, 
    "name" : str, 
    "url" : str,
}

Video 파일을 Labeling 하였지만 Dataset은 캡처된 수백 장의 image파일로 export 됩니다.

총 795개의 PNG와 annotation 정보가 있는 JSON이 export 되었습니다.

# coco dataset 구조
- annotations/nstances_default.json
- images

COCO Dataset 확인

python을 통해서 COCO Dataset이 어떻게 구성되어 있는지 확인할 수 있습니다.

예시로 사과 이미지를 Labeling해서 COCO Dataset으로 구성해 보았습니다.

해당 이미지는 SAM(Segment Anything Model)로 Segmentation 후 Labeling을 하였습니다.

export한 COCO Dataset annotation 정보의 JSON에는 bbox와 segmentation 정보가 있었습니다.

{
    "annotations": [
        {
            "area": 97414.0,
            "attributes": {
                "occluded": false
            },
            "bbox": [
                262.0,
                2.0,
                346.0,
                357.0
            ],
            "category_id": 1,
            "id": 1,
            "image_id": 1,
            "iscrowd": 0,
            "segmentation": [
                [
                    377.0,
                    7.0,
                    372.0,
                    9.0,
                    369.0,
                    10.0,
                    365.0,
                    14.0,
                    362.0,
...

SAM에 대한 자세한 사항은 다른 포스팅에서 정리해 보도록 하겠습니다.

그럼 이제 pycocotools을 통해서 확인이 가능합니다.

필요한 python package를 설치합니다.

$ pip install pillow matplotlib pycocotools

먼저 bbox를 정보를 확인해 보겠습니다.

pycocotools package를 통해서 annotation 파일을 읽어서 annotation 정보를 load합니다.

load 한 annotation 정보 중 bbox 정보를 표시합니다.

from PIL import Image
import matplotlib.pyplot as plt
import matplotlib.patches as patches
from pycocotools.coco import COCO

# annotation read
ann_file = './coco_sam/instances_default.json'
coco = COCO(annotation_file=ann_file)
anns = coco.loadAnns(coco.getAnnIds())

image_path = './coco_sam/apple.png'
image = Image.open(image_path)

fig, ax = plt.subplots()
 
# Draw boxes and add label to each box
for ann in anns:
    box = ann['bbox']
    bb = patches.Rectangle((box[0],box[1]), box[2],box[3], linewidth=2, edgecolor="blue", facecolor="none")
    ax.add_patch(bb)
 
ax.imshow(image)
plt.show()

COCO Annotation으로 bbox 처리

pycocotools에서 제공해 주는 함수로 쉽게 segmentation도 확인할 수 있습니다.

plt.imshow(image); plt.axis('off')
coco.showAnns(anns)

COCO Annotation segmentation 확인

convert2Yolo

내려받은 Dataset을 Yolo 모델이 Train 할 수 있도록 변환 작업을 합니다.

Yolo Darknet 포맷으로 변환하게 해주는 프로젝트가 있습니다.

convert2Yolo라는 프로젝트입니다.

 

GitHub - ssaru/convert2Yolo: This project purpose is convert voc annotation xml file to yolo-darknet training file format

This project purpose is convert voc annotation xml file to yolo-darknet training file format - GitHub - ssaru/convert2Yolo: This project purpose is convert voc annotation xml file to yolo-darknet t...

github.com

convert2Yolo 프로젝트는 아래와 같은 Dataset을 Yolo Darknet 포맷 변환을 지원해 줍니다.

  • COCO
  • VOC
  • UDACITY Object Detection
  • KITTI 2D Object Detection

먼저 해당 프로젝트 내려받습니다.

python 기반이기 때문에 필요한 package를 설치합니다.

$ git clone https://github.com/ssaru/convert2Yolo
$ cd convert2Yolo
$ pip install -r requirements.txt

Amazon Linux 2023에서의 세팅

다만 Amazon Linux 2023 AMI에서 package를 설치하려면 추가과정이 필요합니다.

Amazon Linux 2023에서 python은 3.9.16 버전이 설치되어 있습니다.(23/11/27 기준)

$ python3 --version
Python 3.9.16

convert2Yolo에서 Pillow package 버전을 7.2.0을 사용하고 있습니다.

해당 버전은 Python 3.9 버전을 지원하지 않습니다.

# requirements.txt
Pillow==7.2.0
cycler==0.10.0
kiwisolver==1.0.1
matplotlib==2.2.2
numpy==1.14.3
pyparsing==2.2.0
python-dateutil==2.7.2
pytz==2018.4
six==1.11.0

그렇기 때문에 다른 Python 버전이 필요합니다.

pyenv를 통해 Python 3.7.13 버전을 설치합니다.

pyenv 설치는 아래 포스팅을 참고해 주시길 바랍니다.

 

버전관리가 가능한 python 환경 세팅 - pyenv 설치

pyenv python으로 개발을 진행하다 보면 항상 버전 문제로 골머리를 앓게 됩니다. python이 제공하는 library가 정말 다양해서 편하기도 하지만 단점도 존재합니다. 필요한 python library가 특정 python 버전

developnote-blog.tistory.com

# python 3.7.13 설치
$ pyenv install 3.7.13
Downloading Python-3.7.13.tar.xz...
-> https://www.python.org/ftp/python/3.7.13/Python-3.7.13.tar.xz
Installing Python-3.7.13...
patching file Doc/library/ctypes.rst
patching file Lib/test/test_unicode.py
patching file Modules/_ctypes/_ctypes.c
patching file Modules/_ctypes/callproc.c
patching file Modules/_ctypes/ctypes.h
patching file setup.py
patching file 'Misc/NEWS.d/next/Core and Builtins/2020-06-30-04-44-29.bpo-41100.PJwA6F.rst'
patching file Modules/_decimal/libmpdec/mpdecimal.h
patching file setup.py
Installed Python-3.7.13 to /home/ec2-user/.pyenv/versions/3.7.13

# 3.7.14 python 가상환경 생성
$ pyenv virtualenv 3.7.13 convert2yolo
Looking in links: /tmp/tmp27krvuji
Requirement already satisfied: setuptools in /home/ec2-user/.pyenv/versions/3.7.13/envs/convert2yolo/lib/python3.7/site-packages (47.1.0)
Requirement already satisfied: pip in /home/ec2-user/.pyenv/versions/3.7.13/envs/convert2yolo/lib/python3.7/site-packages (22.0.4)
$ pyenv versions
* system (set by /home/ec2-user/.pyenv/version)
  3.7.13
  3.7.13/envs/convert2yolo
  convert2yolo --> /home/ec2-user/.pyenv/versions/3.7.13/envs/convert2yolo
  
# 가상환경 세팅  
$ cd convert2Yolo/
[ec2-user@ip-172-31-0-42 convert2Yolo]$ ll
total 60
-rw-r--r--. 1 ec2-user ec2-user 27253 Nov 27 14:12 Format.py
-rw-r--r--. 1 ec2-user ec2-user  9480 Nov 27 14:12 README.md
drwxr-xr-x. 4 ec2-user ec2-user    30 Nov 27 14:12 example
-rw-r--r--. 1 ec2-user ec2-user  4488 Nov 27 14:12 example.py
drwxr-xr-x. 2 ec2-user ec2-user    46 Nov 27 14:12 images
-rw-r--r--. 1 ec2-user ec2-user  2990 Nov 27 14:12 label_visualization.py
-rw-r--r--. 1 ec2-user ec2-user   105 Nov 27 14:12 msgLogInfo.py
-rw-r--r--. 1 ec2-user ec2-user   144 Nov 27 14:12 requirements.txt
$ pyenv local convert2yolo
(convert2yolo) [ec2-user@ip-172-31-0-42 convert2Yolo]$ python --version
Python 3.7.13

그리고 필요한 package 설치를 진행합니다.

$ pip install -r requirements.txt 
Collecting Pillow==7.2.0
  Downloading Pillow-7.2.0-cp37-cp37m-manylinux1_x86_64.whl (2.2 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.2/2.2 MB 23.7 MB/s eta 0:00:00
Collecting cycler==0.10.0
  Downloading cycler-0.10.0-py2.py3-none-any.whl (6.5 kB)
Collecting kiwisolver==1.0.1
  Downloading kiwisolver-1.0.1-cp37-cp37m-manylinux1_x86_64.whl (89 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 89.5/89.5 KB 19.1 MB/s eta 0:00:00
Collecting matplotlib==2.2.2
  Downloading matplotlib-2.2.2-cp37-cp37m-manylinux1_x86_64.whl (12.6 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 12.6/12.6 MB 49.6 MB/s eta 0:00:00
Collecting numpy==1.14.3
  Downloading numpy-1.14.3.zip (4.9 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4.9/4.9 MB 63.9 MB/s eta 0:00:00
  Preparing metadata (setup.py) ... done
Collecting pyparsing==2.2.0
  Downloading pyparsing-2.2.0-py2.py3-none-any.whl (56 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 56.4/56.4 KB 12.0 MB/s eta 0:00:00
Collecting python-dateutil==2.7.2
  Downloading python_dateutil-2.7.2-py2.py3-none-any.whl (212 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 212.3/212.3 KB 32.6 MB/s eta 0:00:00
Collecting pytz==2018.4
  Downloading pytz-2018.4-py2.py3-none-any.whl (510 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 510.9/510.9 KB 49.4 MB/s eta 0:00:00
Collecting six==1.11.0
  Downloading six-1.11.0-py2.py3-none-any.whl (10 kB)
Requirement already satisfied: setuptools in /home/ec2-user/.pyenv/versions/3.7.13/envs/convert2yolo/lib/python3.7/site-packages (from kiwisolver==1.0.1->-r requirements.txt (line 3)) (47.1.0)
Using legacy 'setup.py install' for numpy, since package 'wheel' is not installed.
Installing collected packages: six, pytz, pyparsing, python-dateutil, Pillow, numpy, kiwisolver, cycler, matplotlib
  Running setup.py install for numpy ... /

done
Successfully installed Pillow-7.2.0 cycler-0.10.0 kiwisolver-1.0.1 matplotlib-2.2.2 numpy-1.14.3 pyparsing-2.2.0 python-dateutil-2.7.2 pytz-2018.4 six-1.11.0
WARNING: You are using pip version 22.0.4; however, version 23.3.1 is available.
You should consider upgrading via the '/home/ec2-user/.pyenv/versions/3.7.13/envs/convert2yolo/bin/python3.7 -m pip install --upgrade pip' command.

Dataset 변환

Dataset에 사용한 클래스들을 정리한 파일을 만들어 줍니다.

이번에 person만 labeling을 하였기 때문에 person만 넣어주었습니다.

그리고 Yolo Darknet 포맷으로 변환한 label 파일을 export 할 폴더를 미리 생성해 줍니다.

$ vi class.names
person

# yolo label 파일 폴더 생성
$ mkdir lables

이제 아래 명령어로 변환해 줍니다.

python example.py \
--datasets COCO \
--img_path ./cvat/images/ \
--label ./cvat/annotations/instances_default.json \
--convert_output_path ./cvat/labels \
--img_type ".PNG" \
--manifest_path ./ \
--cls_list_file ./cvat/class.names


COCO Parsing:  |████████████████████████████████████████| 100.0% (5901/5901)  Complete

YOLO Generating:|████████████████████████████████████████| 100.0% (795/795)  Complete

YOLO Saving:   |████████████████████████████████████████| 100.0% (795/795)  Complete
  • --datasets : 변환 전 Data format(COCO, VOC, UDACITY, KITTI)
  • --img_path : labeling 한 image 경로
  • --label : 변환 전 label 정의된 파일 경로
  • --convert_ouput_path : 변환 후 label 정의된 파일 경로
  • --img_type : image 타입(ex. jpg, png...)
  • --cls_list_file : 클래스 정의 파일 경로

그러면 아래와 같이 label 파일이 생성됩니다.

$ cat ./labels/frame_000794.txt
0 0.597 0.57 0.056 0.172
0 0.296 0.329 0.034 0.168
0 0.826 0.556 0.048 0.177
0 0.861 0.489 0.036 0.161
0 0.863 0.309 0.031 0.163
0 0.324 0.389 0.038 0.177
0 0.523 0.349 0.04 0.142
0 0.388 0.339 0.018 0.047
0 0.546 0.312 0.034 0.073

이제 Yolo 모델을 Train 할 Dataset 준비가 완료되었습니다.

다음 포스팅에서는 해당 Dataset으로 Yolo 모델을 Train 해보도록 하겠습니다.

[참고사이트]

728x90
반응형
Comments