JUST WRITE

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

AI

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

천재보단범재 2023. 4. 9. 20:14

엔지니어의 Yolo 도전기

엔지니어의 Yolo 도전기

회사에서 Vision 관련 프로젝트를 진행할 수 있다는 소식이 전해졌습니다.

AI로 강아지와 고양이를 비교하는 예시만 많이 들었지 Vision은 저에게는 미지의 세계였습니다.

Kaggle 강아지,고양이 Dataset 예시

팀장님에게 이번 프로젝트에서 CVAT이 활용될 수 있다는 단서를 들었습니다.

이 단서를 바탕으로 일단 부딪혀 보기로 하였습니다.

CVAT으로 Train 할 Dataset을 만들고 Vision 모델 중 Yolo 모델을 Train 하는 일련을 과정에 도전해 보았습니다.

아래 3가지 Step으로 이번 도전기를 정리해보려 합니다.

  1. CVAT을 통해 Auto Labeling 후 Train Dataset 생성
  2. 해당 Dataset을 Yolo Train을 할 수 있게 변환
  3. Dataset으로 Yolo Model Train

이번 포스팅에서 도전기의 첫 번째 포스팅으로 CVAT을 통해 Auto Labeling 과정을 정리해 보았습니다.

CVAT을 통한 Auto Labeling

CVATAuto Annotation Tool로써 오픈 소스입니다.

Object Detection을 하기 위해서는 해당 이미지가 고양이인지 강아지인지 정보가 있어야 합니다.

그 정보를 통해 학습한 모델이 다른 이미지에서 고양이인지 강아지인지를 예측합니다.

이때 해당 이미지가 고양이인지 강아지인지 정보를 입력하는 게 Labeling입니다.

Labeling 작업은 상당한 비용이 드는 작업입니다.

CVAT은 이러한 Labeling을 도와줘 딥러닝 작업 어려움을 덜어주는 도구입니다.

Obejct Detection이란?
출처 : https://opencv.github.io/cvat/docs/manual/advanced/serverless-tutorial/

CVAT Documentation에 있는 내용을 바탕으로 CVAT을 구성해 보았습니다.

CVAT 설치

Documentation대로 CVAT을 AWS EC2 Instacne에 설치해 보았습니다.

EC2는 Amazone Linux 2023 AMI로 진행하였습니다.

Tutorial에는 Docker Compose를 통해서 설치를 진행합니다.

Docker와 Docker Compose를 EC2 Instance에 설치합니다.

(해당 과정은 이번 포스팅에서 중요하지 않기 때문에 생략!)

그다음에는 CVAT Github Repository를 내려받습니다.

$ cd ~/workspace
$ git clone https://github.com/opencv/cvat.git

내려받으면 Docker Compose Yaml 파일을 확인할 수 있습니다.

Compose로 올리기 전에 환경 변수를 하나 세팅해야 합니다.

CVAT Host명을 localhost로 Default로 세팅되어 있기 때문에 EC2 Public IP로 설정해 줍니다.

$ vi ~/.bash_profile

...
# 추가
CVAT_HOST=${EC2 Public IP}
export CVAT_HOST

그럼 이제 Docker Compose로 CVAT을 구성합니다.

$ docker-compose -f docker-compose.yml -f docker-compose.dev.yml -f components/serverless/docker-compose.serverless.yml up -d

[+] Running 16/16
 ✔ Network cvat_cvat                 Created                                                                             0.1s 
 ✔ Container cvat_redis              Started                                                                             1.4s 
 ✔ Container cvat_grafana            Started                                                                             2.1s 
 ✔ Container cvat_clickhouse         Started                                                                             1.1s 
 ✔ Container nuclio                  Started                                                                             2.1s 
 ✔ Container cvat_opa                Started                                                                             1.4s 
 ✔ Container traefik                 Started                                                                             1.7s 
 ✔ Container cvat_db                 Started                                                                             2.0s 
 ✔ Container cvat_vector             Started                                                                             2.9s 
 ✔ Container cvat_utils              Started                                                                             3.4s 
 ✔ Container cvat_worker_import      Started                                                                             4.0s 
 ✔ Container cvat_worker_webhooks    Started                                                                             3.6s 
 ✔ Container cvat_server             Started                                                                             4.0s 
 ✔ Container cvat_worker_annotation  Started                                                                             3.5s 
 ✔ Container cvat_worker_export      Started                                                                             3.8s 
 ✔ Container cvat_ui                 Started
 
 $ docker ps
CONTAINER ID   IMAGE                                        COMMAND                  CREATED          STATUS                    PORTS                                                                                          NAMES
766fb08aef21   cvat/ui:dev                                  "/docker-entrypoint.…"   32 seconds ago   Up 27 seconds             80/tcp                                                                                         cvat_ui
bdf6cb09e85d   cvat/server:dev                              "/usr/bin/supervisor…"   32 seconds ago   Up 28 seconds             8080/tcp, 0.0.0.0:9090->9090/tcp, :::9090->9090/tcp                                            cvat_server
782d6c8e48e0   cvat/server:dev                              "/usr/bin/supervisor…"   32 seconds ago   Up 28 seconds             8080/tcp                                                                                       cvat_utils
245c522fee82   cvat/server:dev                              "/usr/bin/supervisor…"   32 seconds ago   Up 28 seconds             8080/tcp, 0.0.0.0:9091->9091/tcp, :::9091->9091/tcp                                            cvat_worker_annotation
2a1e0955638a   cvat/server:dev                              "/usr/bin/supervisor…"   32 seconds ago   Up 28 seconds             8080/tcp, 0.0.0.0:9092->9092/tcp, :::9092->9092/tcp                                            cvat_worker_export
ae4008dedd86   cvat/server:dev                              "/usr/bin/supervisor…"   32 seconds ago   Up 28 seconds             8080/tcp, 0.0.0.0:9093->9093/tcp, :::9093->9093/tcp                                            cvat_worker_import
7f9fc65dd2c4   cvat/server:dev                              "/usr/bin/supervisor…"   32 seconds ago   Up 28 seconds             8080/tcp                                                                                       cvat_worker_webhooks
894baa60fb0f   timberio/vector:0.26.0-alpine                "/usr/local/bin/vect…"   32 seconds ago   Up 29 seconds                                                                                                            cvat_vector
b6519ad2aab2   quay.io/nuclio/dashboard:1.8.14-amd64        "/docker-entrypoint.…"   32 seconds ago   Up 30 seconds (healthy)   80/tcp, 0.0.0.0:8070->8070/tcp, :::8070->8070/tcp                                              nuclio
89122e79aefe   openpolicyagent/opa:0.45.0-rootless          "/opa run --server -…"   32 seconds ago   Up 30 seconds             0.0.0.0:8181->8181/tcp, :::8181->8181/tcp                                                      cvat_opa
b44801b166b0   clickhouse/clickhouse-server:22.3-alpine     "/entrypoint.sh"         32 seconds ago   Up 31 seconds             8123/tcp, 9000/tcp, 9009/tcp                                                                   cvat_clickhouse
2e2368860288   grafana/grafana-oss:9.3.6                    "sh -euc 'mkdir -p /…"   32 seconds ago   Up 30 seconds             3000/tcp                                                                                       cvat_grafana
5a9634f239b0   redis:4.0-alpine                             "docker-entrypoint.s…"   32 seconds ago   Up 30 seconds             6379/tcp                                                                                       cvat_redis
270914fa3f81   postgres:15-alpine                           "docker-entrypoint.s…"   32 seconds ago   Up 30 seconds             5432/tcp                                                                                       cvat_db
0ec3890c1651   traefik:v2.9                                 "/entrypoint.sh --pr…"   32 seconds ago   Up 30 seconds             0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 80/tcp, 0.0.0.0:8090->8090/tcp, :::8090->8090/tcp   traefik
1d608342175b   gcr.io/iguazio/alpine:3.15                   "/bin/sh -c '/bin/sl…"   34 minutes ago   Up 34 minutes                                                                                                            nuclio-local-storage-reader
f6c8a758fedc   cvat/openvino.omz.public.yolo-v3-tf:latest   "processor"              11 days ago      Up 34 minutes (healthy)   0.0.0.0:49153->8080/tcp, :::49153->8080/tcp                                                    nuclio-nuclio-openvino-omz-public-yolo-v3-tf

docker ps 명령어로 많은 container들이 실행된 것을 확인할 수 있습니다.

CVAT의 자세한 Architecture은 따로 포스팅으로 정리하고 주요 container만 짚고 넘어가겠습니다.

  • PostreSQL -> CVAT Database
  • Traefik -> Proxy 역할로 Backend, FrontEnd Serivce를 연결
  • Nuclio -> Serverless Function으로 Auto Labeling을 도와줄 딥러닝 모델 Deploy

정상적으로 실행이 되었다면 2가지 WEB UI를 확인할 수 있습니다.

  • CVAT UI -> 8080
  • Nuclio UI -> 8070

CVAT UI
Nuclio UI

CVAT Task 생성

설치한 CVAT을 통해 Yolo 모델을 Train 할 DataSet을 만들어보았습니다.

샘플 비디오를 Auto Labeling을 하여 DataSet을 만듭니다.

OpenCV에서 제공하는 샘플비디오(vtest.avi)를 다운로드합니다(해당링크)

샘플비디오를 준비한 다음 CVAT UI에서 Auto Labeling Task를 생성합니다.

Label은 person(사람)을 넣어줍니다.

CVAT Task 생성(1)
CVAT Task 생성(2)

아래와 같이 Task가 생성된 것을 확인할 수 있습니다.

CVAT Task 화면

Model Deply & 연결

이제 Auto Labeling을 도와줄 딥러닝 Model을 Deploy를 합니다.

Model Deploy는 Nuclio를 통해 합니다.

CVAT에서 scirpt를 만들어 놓아서 해당 script를 실행시켜 줍니다.

yolov3 Model로 Deploy 됩니다.

Nuclio로 Model를 Deploy 하면 docker container가 생성된 것을 확인할 수 있습니다.

$ serverless/deploy_cpu.sh serverless/openvino/omz/public/yolo-v3-tf/
$ docker ps | grep yolo
f6c8a758fedc   cvat/openvino.omz.public.yolo-v3-tf:latest   "processor"              11 days ago         Up 2 hours (healthy)         0.0.0.0:49153->8080/tcp, :::49153->8080/tcp                                                    nuclio-nuclio-openvino-omz-public-yolo-v3-tf

배포하면 CVAT Models Tab에 Yolo v3 Model이 배포된 것을 확인할 수 있습니다.

CVAT Model Tab

Auto Labeling

Auto Labeling 할 Model까지 준비가 되었습니다.

이제 CVAT Auto Labeling 기능을 통해 샘플비디오를 Labeling 작업을 합니다.

해당 Task에서 Automatic annotation을 실행합니다

Task Automatic annotation
Model 선택

하나의 이미지가 아닌 1분 20초가량의 비디오를 Labeling 하기 때문에 시간이 좀 걸립니다.

저는 EC2에서 t3.xlarge(CPU, RAM 16GB) 사양에서 진행하니 10분가량 소요되었습니다.

Labeling이 끝나면 아래와 같이 rectangle로 labeling 된 것을 확인할 수 있습니다.

보시면 중간에 사람 말고 트래픽콘이 사람으로 인식된 것을 확인할 수 있습니다.

이렇게 잘못 Labeling 된 것은 수동으로 제거해 줍니다.

Labeling이 완료되었으면 이제 준비된 Dataset으로 Yolo 모델을 Train 합니다.

Dataset Export

이후 Dataset으로 Yolo 모델을 Train 하는 것은 다음 포스팅에서 정리하도록 하겠습니다.

[참고사이트]

 

728x90
반응형
Comments