yolo
는 detection task
에 자주 쓰이는 라이브러리임에도 불구하고 라이브러리에 대한 상세한 기능 설명이 공식 docs (https://docs.ultralytics.com)에도 자세히 기술되어 있지 않고, 일일히 구글링으로 yolov5의 이슈에서 사용자들끼리 토론한 글을 찾아봐야 한다는 것이 불편하게 느껴져 yolo를 사용한 2주동안 얻게 된 라이브러리 사용 노하우를 정리해야겠다는 생각이 들었다.
https://arxiv.org/abs/2207.02696
톺아보기에서는 논문을 다루지는 않는다.
https://github.com/WongKinYiu/yolov7
pretrained 된 weight도 위 깃헙 readme의 Testing 아래 6개의 파란글씨.pt 중 원하는 모델을 클릭하면 다운가능하다.
우선 욜로를 쓰기 위해 다소 귀찮은.. 과정이 존재하는데 갖고 있는 데이터셋의 format을 무조건 yolo format으로 바꾸어 주어야 한다.
COCO format은 이미지가 담겨져 있는 폴더가 존재하고, 그 이미지들에 대한 정보와 annotation을 하나에 담은 json파일이 따로 존재한다. annotations안의 image_id는 대응되는 이미지 파일의 id, category_id는 bbox의 라벨, bbox는 (min_x, min_y , width, height) 픽셀단위이다.
반면 Yolo format은
한 폴더 아래에 이름이 같은 이미지 파일과 txt 파일이 대응되는 방식이며 annotation의 양식도
bbox마다 (라벨, center x, center y, width, height)이 좌측 상단 좌표를 (0,0) 우측 하단 좌표를 (1,1)로 하여 정규화된 상태로 0과 1 사이의 실수로 표현되어 있다는 점이 다르다.
당연히 둘 사이의 변환이 가능하다. convert2Yolo라는 라이브러리가 존재한다.
github link : https://github.com/ssaru/convert2Yolo
readme를 잘 읽어보면 자유자재로 활용가능하고, 아래에서 간단한 예시를 들어보겠다.
git clone https://github.com/ssaru/convert2Yolo.git
cd convert2Yolo
필요하다면 pip3 install -r requirements.txt로 convert2Yolo의 의존성 패키지를 설치해준다.
그리고 yolo label들을 담을 폴더를 만들어준다.
mkdir ../dataset/yolo_data
yolo레이블 convert할 때 어떤 class가 있는지 넘겨주기 위해서 names.txt라는 txt파일을 만들어서, 그 속에 레이블 이름을 넣어준다.
vi names.txt
나는 레이블의 이름이 위와 같은 데이터셋을 변환하고자 했기 때문에 위와 같이 저장하였다.
그 후 이제 가장 중요한 변환 과정이다.
python example.py --datasets COCO --img_path ../dataset --label ../dataset/train.json --convert_output_path ../dataset/yolo_train --img_type ".jpg" --manifest_path ./ --cls_list_fie names.txt
인자로 줘야할 것이 많은데 하나하나 뜯어보면 다음과 같다.
--datasets : 원본 데이터가 어떤 포맷으로 되어 있는지 입력해준다. VOC라면 VOC를 입력해주면 된다.
--img_path : 원본 데이터의 이미지 파일들이 담겨 있는 path를 입력한다.
--label : 원본 데이터의 annotation(label)이 담겨있는 파일을 입력한다. COCO의 경우 annotation이 한 json파일 안에 담겨 있으므로 그 json파일의 경로를 넣어준다.
--convert_output_path : 변환된 레이블 파일이 저장될 폴더 경로를 넣어준다.
--img_type : 폴더 안의 이미지가 ".jpg"인지 ".png"인지 입력한다.
--manifest_path : 이미지의 절대경로를 죄다 기록한 txt파일인 manifest.txt를 어디에 저장할 것인지 입력한다. 필요한 경우만 이 txt파일을 관리해주면 된다.
--cls_list_file : 라벨의 이름을 저장해놨던 txt파일을 입력한다.
이후 convert_output_path로 이동해보면 txt파일이 쫙 저장되어 있는 것을 확인할 수 있다. 하지만, Yolo를 학습시키기 위해서는 같은 파일 안에 txt파일과 이미지를 대응시켜야 하기 때문에 python의 shutil 라이브러리나bash cp커맨드로 사진 파일을 txt가 담겨 있는 폴더에 이동시켜야 한다.
이상으로 yolo를 돌리기 위한 모든 준비가 완료 되었다. 다음 포스팅에서는 yolo의 기본 hyper parameter의 의미에 대해 알아보자.