본문 바로가기

ML & DL

[Label Studio] Labeling progrom for YOLO

YOLOv5를 이용해서 Object detection을 진행해 볼 예정이다. 사용해 보니 사용법이 심플하고, 여러가지 목적(Object detection, segmentation, classification...)에 대한 지원 뿐만 아니라, export 형식도 다양하게 제공되고 있어 쓸만한 프로그램이라는게 내 생각이다. 

 학습을 위한 이미지 데이터가 필요하고, 이미지 데이터에 대한 labeling data가 필요하다. Image classfication의 경우는 단순한 class name label이면 족하겠지만, Object detection은  detection object의 이미지 내 위치에 대한 label이 필요하다. YOLO는 하기의 형식을 따른다. 

 

<object-class> <x> <y> <width> <height>

 

 YOLO 형식의 label format으로 데이터를 뽑아내주지 못한다면 다시 한번 변환해 줘야 하는 불편함이 따른다. 좋은 솔루션은 YOLO형식으로 label을 뽑아줄 수 있는 Tool을 선택하는 것이다. Googling한 결과 Labelimg라는 tool에 대한 가이드가 많아서 이를 사용해 보기로 마음 먹었다. 그런데, update된 내용은 Labelimg가 LabelStudio로 통합되었다는 이야기. 그럼 Label Studio를 사용해 보는 것도 나쁘지 않을 것 같다. 

 

 

https://github.com/heartexlabs/label-studio#install-locally-with-pip

 

GitHub - heartexlabs/label-studio: Label Studio is a multi-type data labeling and annotation tool with standardized output forma

Label Studio is a multi-type data labeling and annotation tool with standardized output format - GitHub - heartexlabs/label-studio: Label Studio is a multi-type data labeling and annotation tool wi...

github.com

 

이제 설치를 진행해 볼까? Label Studio는 설치해 본 적이 없을 뿐더러, library가 꼬이는 것을 염려한다면 conda env(conda를 사용한다면..) 를 새롭게 생성하고 설치하는 것을 추천한다. 

 

# Requires Python >=3.7 <=3.9
pip install label-studio

# Start the server at http://localhost:8080
label-studio

 

 설치를 성공적으로 완료하면 아래와 같은 페이지를 만날 수 있다. 처음 사용하니 Sign UP하고 진행해 보자. 

 

 

 

 

로그인이 성공하면 아래와 같이 Project를 생성할 수 있게 되고, 필요한 project name과 description을 진행해 보자. 

 

 

Project가 생성되면 아래와 같이 empty project가 생성되고, 테스트를 위해 Import를 눌러서 파일을 업로드 해보고 labeling 작업을 진행해 보자. 

 

 

 

Label 1 Task 버튼을 누르면 만나게 되는 메시지, Setup이 뭔지 확인해 볼까?

 

 

 

필요한 부분은 바로 어떤 labeling 이 필요한지 선행적으로 정의해야 한다는 점이다. Instance Segmentation을 진행하는지, Object Detection을 하는지에 따라서, label이 달라지기 때문이다. 놀라운 점은 지원하는 label의 종류가 너무나 다양하다는데 있다. Computer Vision에서부터, Natural Language, Ranking, Scoring, Video까지.. 여러가지 목적에 따른 labeling을 지원한다. 우리는 Object detection을 위한 Bounding Boxes를 선택해야 한다. 

 

 

그리고 나서 Labels를 add해 준다. 미리 정의해둔 class label을 넣어주어야 하지만, 여기서는 실험을 위해 임의로 넣어 보았다. 

 

 

그리고 필요할 것같아 configure settings에서 "Allow image zoom (ctrl + wheel)"을 선택해 두었다. Save 해보면 아래와 같이 사진이 출력된다. 다시 label Task 버튼을 누른다. 

 

 

아래의 클래스 레이블을 누르면 labeling이 활성화 된다. 마우스를 그림에 drag 하면 사각형이 그려지고 이를 class에 맞춰서 레이블링 하면 된다. 이전에 정의된 class가 정의되지 않은 항목은 label이 불가능하다는 점이 여기서 확인되니, 이전 class labeling에 빠진 항목이 있으면 안된다. 

 

 

 Submit을 누르면 모든 Process가 종료되고(Image가 1장이니까), 다시 Project로 돌아오면 label된 이미지가 보이게 된다. 여기서 export 버튼을 누르면, 아래와 같은 다양한 format으로 출력을 할 수 있게 된다. 우리는 여기서 YOLO를 선택하면 된다. 

 

 

 Export를 누르면, 하기와 같이 Zip file format형식으로 자동으로 다운로드되고, 폴더 내부의 labels 폴더에 아래와 같은 YOLO format의 label을 확인할 수 있다. 

 

 

그런데 한가지 문제점이 발생했다. labels 폴더에 label은 제대로 export되었는데, image는 제대로 export되어 나오지 않는다. 구글링한 결과 아래와 같은 명령어로 해결이 가능하다. 

 

pip install -U label-studio-converter

 

 아래와 같이 image와 label의 file명이 동일하게 생성됨을 확인할 수 있다. 이제 1개의 test image로 labeling 가능함을 확인해 보았으니, 필요한 대량의 data를 먼저 확보하고, labeling 작업을 진행하면 되겠다.

 

 

노파심에서 여분으로 하는 이야기 이지만, Web base로 돌아가는 Program들은 프로그램을 구동시킨 console 창을 종료하면 제대로 돌아가지 않으니, Console창은 프로그램 종료 시까지 그대로 두어야 한다.