일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- MAC address
- PostgreSQL
- kubeadm
- CVAT
- kubectl
- jvm
- Vision
- Kafka
- aws s3
- Operating System
- zookeeper
- CSV
- Spring
- JavaScript
- helm
- Python
- ip
- kubernetes
- airflow
- tcp
- OS
- EC2
- Packet
- Network
- AWS
- docker
- log
- Trino
- java
- grafana
- Today
- Total
JUST WRITE
[Vision] Click 한 번에 Segmentation?! - CVAT에 SAM 적용 본문
Click 한 번에 Segmentation?!
Vision 프로젝트를 진행하면서 CVAT을 사용하고 있습니다.
CVAT을 통해 이미지를 Labeling 작업을 진행하고 있습니다.
CVAT을 통해 Auto Labeling 작업도 진행할 수 있지만 100% 원하는 대로 Labeling을 하지는 못합니다.
사용자가 수동으로 Labeling을 진행해야 하는 경우도 있습니다.
bounding box가 아닌 segmentation으로 정교한 Labeling을 사용자가 하기 힘듭니다.
segmentation도 수월하게 할 수 없을까 고민하다가 찾은 것이 SAM(Segment Anything Model)입니다.
SAM을 활용하면 segmentation을 수월하게 할 수 있습니다.
이번 포스팅에서는 CVAT에 SAM을 적용한 것을 정리해 보도록 하겠습니다.
Segment Anything Model
SAM은 Meta AI에서 개발한 이미지 분할 AI Model입니다.
a new AI model from Meta AI that can "cut out" any object, in any image, with a single click
Meta AI 홈페이지에서 SAM을 소개하는 첫 문구입니다.
문구에서 알 수 있듯이 클릭 한 번으로 segmentation이 가능합니다.
엄청난 Performance로 이미지 내의 Object의 Mask를 생성해 주는 Model입니다.
SAM은 함께 공개된 1100만의 이미지와 11억 Mask 데이터로 이뤄진 SA-1B Dataset으로 Train 되어 있습니다.
그리고 학습하지 않은 작업을 수행하는 zero-shot도 수행하기 때문에 폭넓게 활용할 수 있습니다.
SAM은 아래 3가지 구성 요소로 구성되어 있습니다.
- image encoder -> image embedding 생성
- prompt encoder -> promp embedding 생성
- mask decoder -> embedding을 기반으로 segmentation 예측
이번 포스팅에서는 SAM이 정확히 어떤 것인지 느껴보고 다른 포스팅에서 자세히 정리해 보도록 하겠습니다.
CVAT에 SAM 적용
Meta AI에서 SAM이 발표된 지 얼마 지나지 않아 CVAT에도 적용이 됩니다.
CVAT에 장착되면 잘 활용될 수 있는 것이 SAM이기 때문입니다.
2023년 4월달에 CVAT deploy branch에 merge 됩니다.
SAM은 CVAT interactor로 적용됩니다.
interactor는 사용자 point를 찍어주면 point를 기준으로 Object를 polygon 형태로 mask 씌워줍니다.
Positive point, Negative point 2가지 형태로 찍을 수 있습니다.
Positivie point 기준으로 segmentation 대상을 찾고, Negative point 부분은 대상에서 제외합니다.
Nuclio에 SAM 배포
CVAT SAM 적용은 간단합니다.
(참고로 테스트용 CVAT 설치는 아래 링크 참고)
SAM을 Serverless Platform인 Nuclio function형태로 배포해 주면 됩니다.
다만 해당 Image가 약 11GB 정도되니 repository size 체크를 꼭 해주시길 바랍니다.
CVAT에서 gpu/cpu 버전 script를 제공해 주기 때문에 해당 script를 실행해 주면 됩니다.
$ git clone https://github.com/opencv/cvat.git
# on gpu server
$ cd cvat/serverless && ./deploy_gpu.sh pytorch/facebookresearch/sam/nuclio/
# on cpu server
$ cd cvat/serverless && ./deploy_gpu.sh pytorch/facebookresearch/sam/nuclio/
script를 살펴보면 nuctl 설치가 선행되야 합니다.
nuclio github에서 nuctl를 다운로드할 수 있습니다.
$ wget https://github.com/nuclio/nuclio/releases/download/1.12.11/nuctl-1.12.11-linux-amd64
$ mv nuctl-1.12.11-linux-amd64 ~/.local/bin/nuctl
$ chmod 700 ~/.local/bin/nuctl
$ source ~/.profile
$nuctl
Nuclio command-line interface
Usage:
nuctl [command]
Available Commands:
beta A beta version of nuctl as a Nuclio api cli client
build Build a function
completion Generate the autocompletion script for the specified shell
create Create resources
delete Delete resources
deploy Build and deploy a function, or deploy from an existing image
export Export functions or projects
get Display resource information
help Help about any command
import Import functions or projects
invoke Invoke a function
update Update resources
version Display the version number of the nuctl CLI
Flags:
-h, --help help for nuctl
-k, --kubeconfig string Path to a Kubernetes configuration file (admin.conf)
-n, --namespace string Namespace
--platform string Platform identifier - "kube", "local", or "auto" (default "auto")
-v, --verbose Verbose output
Use "nuctl [command] --help" for more information about a command.
아래는 cpu 버전 script 파일(serverless/deploy_gpu.sh)입니다.
- baseimage 생성
- nuclio cvat project 생성
- argument로 받은 path에 정의된 nuclio function build 및 deploy
- nuclio function list
#!/bin/bash
# Sample commands to deploy nuclio functions on CPU
set -eu
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
FUNCTIONS_DIR=${1:-$SCRIPT_DIR}
export DOCKER_BUILDKIT=1
docker build -t cvat.openvino.base "$SCRIPT_DIR/openvino/base"
nuctl create project cvat --platform local
shopt -s globstar
for func_config in "$FUNCTIONS_DIR"/**/function.yaml
do
func_root="$(dirname "$func_config")"
func_rel_path="$(realpath --relative-to="$SCRIPT_DIR" "$(dirname "$func_root")")"
if [ -f "$func_root/Dockerfile" ]; then
docker build -t "cvat.${func_rel_path//\//.}.base" "$func_root"
fi
echo "Deploying $func_rel_path function..."
nuctl deploy --project-name cvat --path "$func_root" \
--file "$func_config" --platform local
done
nuctl get function --platform local
Kubernetes에 구성된 cvat에 해당 function을 배포하려면 script를 수정해야 합니다.
해당 부분은 따로 정리하도록 하겠습니다.
정상적으로 배포가 되었다면 Nuclio UI와 CVAT에서 배포된 것을 확인할 수 있습니다.
예시로 사과 이미지를 통해서 CVAT에서 SAM을 활용하여 apple를 Labeling 해보겠습니다.
Click 한 번으로 point를 찍어서 쉽게 segmentation이 되는 것을 확인할 수 있습니다.
CPU, GPU 2가지 버전을 다 시도해 보았는데, 확실히 GPU에서 빠르게 동작하는 것을 알 수 있었습니다.
주의할 점
CVAT v2.4.2부터 SAM이 적용되어 있습니다.
그리고 v2.4.4부터 SAM의 동작 방식 일부분이 frontend단에서 진행되도록 로직이 변경되었습니다.
그에 따라 SAM에 reponse해주는 포맷이 달라지니 주의해 주시길 바랍니다.
아래 링크에서 변경사항을 확인하실 수 있습니다.
SAM이 적용되고 초기 v2.4.2에서는 mask될 point들의 list가 reponse 되었다면,
[
[
404,
2
],
[
394,
3
],
[
387,
4
],
...
일부 로직이 frontend 단에서 처리되도록 변경된 이후에는 blob형태로 reponse 되는 것을 확인할 수 있습니다.
blob: "NlwsPtM1Iz6KVrE9BpvIPUWIBD6UevY9WGf3Pex0OD7tOzU+S.......
정리
이번 포스팅에서는 Meta AI에서 개발한 SAM(Segmentation Anything Model)을 CVAT에 적용해 보았습니다.
SAM 덕분에 한 번의 Click으로 쉽게 segmentatio이 가능하였습니다.
SAM을 통해 수동으로 Labeling 작업을 해야 할 때 손쉽게 할 수 있었습니다.
다음 포스팅에서는 SAM 논문을 정리해 보도록 하겠습니다.
[참고사이트]
'AI' 카테고리의 다른 글
[LLM] RAG와 LLM을 활용한 자동 분류(1) - VectorDB 구성하기 (0) | 2024.11.23 |
---|---|
하이퍼 파리미터 튜닝(1) - Tracking System Mlflow 세팅 (0) | 2024.10.12 |
[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 |