JUST WRITE

[Vision] Click 한 번에 Segmentation?! - CVAT에 SAM 적용 본문

AI

[Vision] Click 한 번에 Segmentation?! - CVAT에 SAM 적용

천재보단범재 2024. 1. 17. 11:15

CVAT에 SAM 적용

Click 한 번에 Segmentation?!

Vision 프로젝트를 진행하면서 CVAT을 사용하고 있습니다.

CVAT을 통해 이미지를 Labeling 작업을 진행하고 있습니다.

CVAT을 통해 Auto Labeling 작업도 진행할 수 있지만 100% 원하는 대로 Labeling을 하지는 못합니다.

사용자가 수동으로 Labeling을 진행해야 하는 경우도 있습니다.

bounding box가 아닌 segmentation으로 정교한 Labeling을 사용자가 하기 힘듭니다.

Object Detection이 bounding box로 구분

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도 수행하기 때문에 폭넓게 활용할 수 있습니다.

출처 : https://ai.meta.com/blog/segment-anything-foundation-model-image-segmentation/

 

출처 : https://github.com/facebookresearch/segment-anything

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 됩니다.

 

Added Segment Anything interactor for GPU/CPU by bsekachev · Pull Request #6008 · opencv/cvat

Motivation and context Idea of the PR is to finish this one #5990 Deploy for GPU: ./deploy_gpu.sh pytorch/facebookresearch/sam/nuclio/ Deploy for CPU: ./deploy_cpu.sh pytorch/facebookresearch/sam/n...

github.com

SAM은 CVAT interactor로 적용됩니다.

interactor는 사용자 point를 찍어주면 point를 기준으로 Object를 polygon 형태로 mask 씌워줍니다.

Positive point, Negative point 2가지 형태로 찍을 수 있습니다.

Positivie point 기준으로 segmentation 대상을 찾고, Negative point 부분은 대상에서 제외합니다.

출처: https://opencv.github.io/cvat/docs/manual/advanced/ai-tools/#interactors

Nuclio에 SAM 배포

CVAT SAM 적용은 간단합니다.

(참고로 테스트용 CVAT 설치는 아래 링크 참고)

 

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

엔지니어의 Yolo 도전기 회사에서 Vision 관련 프로젝트를 진행할 수 있다는 소식이 전해졌습니다. AI로 강아지와 고양이를 비교하는 예시만 많이 들었지 Vision은 저에게는 미지의 세계였습니다. 팀

developnote-blog.tistory.com

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)입니다.

  1. baseimage 생성
  2. nuclio cvat project 생성
  3. argument로 받은 path에 정의된 nuclio function build 및 deploy
  4. 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에서 배포된 것을 확인할 수 있습니다.

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해주는 포맷이 달라지니 주의해 주시길 바랍니다.

아래 링크에서 변경사항을 확인하실 수 있습니다.

 

Running SAM backbone on frontend by bsekachev · Pull Request #6019 · opencv/cvat

Motivation and context Resolved #5984 Resolved #6049 Resolved #6041 Compatible only with sam_vit_h_4b8939.pth weights. Need to re-export ONNX mask decoder with some custom model changes (see below...

github.com

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 논문을 정리해 보도록 하겠습니다.

[참고사이트]

더보기

 

 

 

728x90
반응형
Comments