23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
저번 포스팅에서 CVAT을 활용해서 Video를 Auto Labeling을 진행하였습니다.
이제 Yolo 모델을 Train 할 수 있게 DataSet을 준비하도록 하겠습니다.
저번에 CVAT에서 Auto Labeling을 한 Task에서 Data를 Export 합니다.
Data 포맷은 COCO 포맷으로 선택해서 이미지를 포함해서 Export 합니다.
Data 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
- imagespython을 통해서 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 확인
내려받은 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 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에 사용한 클래스들을 정리한 파일을 만들어 줍니다.
이번에 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 해보도록 하겠습니다.
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.