23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
회사에서 Vision 관련 프로젝트를 진행할 수 있다는 소식이 전해졌습니다.
AI로 강아지와 고양이를 비교하는 예시만 많이 들었지 Vision은 저에게는 미지의 세계였습니다.
팀장님에게 이번 프로젝트에서 CVAT이 활용될 수 있다는 단서를 들었습니다.
이 단서를 바탕으로 일단 부딪혀 보기로 하였습니다.
CVAT으로 Train 할 Dataset을 만들고 Vision 모델 중 Yolo 모델을 Train 하는 일련을 과정에 도전해 보았습니다.
아래 3가지 Step으로 이번 도전기를 정리해보려 합니다.
CVAT을 통해 Auto Labeling 후 Train Dataset 생성
해당 Dataset을 Yolo Train을 할 수 있게 변환
Dataset으로 Yolo Model Train
Kaggle 강아지,고양이 Dataset 예시
이번 포스팅에서 도전기의 첫 번째 포스팅으로 CVAT을 통해 Auto Labeling 과정을 정리해 보았습니다.
CVAT은 Auto Annotation Tool로써 오픈 소스입니다.
Object Detection을 하기 위해서는 해당 이미지가 고양이인지 강아지인지 정보가 있어야 합니다.
그 정보를 통해 학습한 모델이 다른 이미지에서 고양이인지 강아지인지를 예측합니다.
이때 해당 이미지가 고양이인지 강아지인지 정보를 입력하는 게 Labeling입니다.
Labeling 작업은 상당한 비용이 드는 작업입니다.
CVAT은 이러한 Labeling을 도와줘 딥러닝 작업 어려움을 덜어주는 도구입니다.
Obejct Detection이란?
출처 : https://opencv.github.io/cvat/docs/manual/advanced/serverless-tutorial/
CVAT Documentation에 있는 내용을 바탕으로 CVAT을 구성해 보았습니다.
Documentation대로 CVAT을 AWS EC2 Instacne에 설치\해 보았습니다.
EC2는 Amazon 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-tfdocker 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을 통해 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 화면
이제 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 할 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 하는 것은 다음 포스팅에서 정리하도록 하겠습니다.
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.