일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- EC2
- java
- MAC address
- docker
- airflow
- Vision
- CVAT
- log
- Packet
- tcp
- ip
- jvm
- Kafka
- aws s3
- Network
- kubectl
- kubernetes
- grafana
- AWS
- PostgreSQL
- helm
- OS
- Spring
- JavaScript
- Trino
- Operating System
- CSV
- Python
- kubeadm
- zookeeper
- Today
- Total
JUST WRITE
[Vision] 엔지니어의 Yolo 도전기(2) - Train Dataset 준비 본문
Train DataSet 준비
저번 포스팅에서 CVAT을 활용해서 Video를 Auto Labeling을 진행하였습니다.
이제 Yolo 모델을 Train 할 수 있게 DataSet을 준비하도록 하겠습니다.
CVAT Data Export
저번에 CVAT에서 Auto Labeling을 한 Task에서 Data를 Export 합니다.
Data 포맷은 COCO 포맷으로 선택해서 이미지를 포함해서 Export 합니다.
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()
pycocotools에서 제공해 주는 함수로 쉽게 segmentation도 확인할 수 있습니다.
plt.imshow(image); plt.axis('off')
coco.showAnns(anns)
convert2Yolo
내려받은 Dataset을 Yolo 모델이 Train 할 수 있도록 변환 작업을 합니다.
Yolo Darknet 포맷으로 변환하게 해주는 프로젝트가 있습니다.
convert2Yolo라는 프로젝트입니다.
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 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 해보도록 하겠습니다.
[참고사이트]
'AI' 카테고리의 다른 글
[Vision] GraphDB로 얼굴인식을?!?!(3) - GraphDB로 얼굴 인식하기 (0) | 2023.05.11 |
---|---|
[Vision] GraphDB로 얼굴인식을?!?!(2) - deepFace로 얼굴 이미지 Feature 추출 (0) | 2023.05.07 |
[Vision] GraphDB로 얼굴인식을?!?!(1) - neo4j 구축하기 (0) | 2023.04.29 |
[Vision] 엔지니어의 Yolo 도전기(3) - Yolo 모델 Train (0) | 2023.04.27 |
[Vision] 엔지니어의 Yolo 도전기(1) - CVAT을 통한 Auto Labeling (0) | 2023.04.09 |