데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

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

      천재보단범재 24.01.18
      2,784 9 0
      DEVOTEE 요약
      이전 포스트에서 사용한 CVAT을 이용해 비디오에 자동 레이블링을 진행하고, 이를 Yolo 모델 학습을 위한 데이터셋으로 준비했습니다. COCO 데이터 포맷을 사용해 데이터를 추출하며, 해당 포맷은 큰 스케일의 객체 탐지, segmentation, caption에 사용되는 데이터셋입니다. 또한, convert2Yolo 프로젝트를 통해 주어진 데이터셋을 Yolo 모델이 학습할 수 있는 포맷으로 변환했습니다.
      DEVOTEE 추천 블로그

      Train Dataset 준비


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

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


      CVAT Data Export


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

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

      image.png

      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
      - 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()

      image.png

      COCO Annotation으로 bbox 처리

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

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

      image.png

      COCO Annotation segmentation 확인


      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 해보도록 하겠습니다.

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      천재보단범재 님의 최신 블로그

      더보기

      DEVOTEE 추천 블로그

      동영상 기고하기