YOLOv5를 이용한 전동 킥보드 인식

매생이·2021년 9월 20일
3

일지

목록 보기
5/16
post-thumbnail


위 사진은 실제 코드를 사용하여 전동 킥보드와 점자블록을 인식한 사진입니다.
개발 환경 : Google Colaboratory Pro

사용 모델


Object detection에는 여러가지 모델이 사용되는데, 그 중에서 FPS(Frame Per Seconds)와 mAP(Mean Average Precision)가 높은 YOLOv5를 사용했습니다.
쉽게 말해서 빠르고 정확하다는 소리인데 실제 서비스에서 쓰려면 빠른게 사용하는 입장에서 당연히 좋을 것이고 그 중에서 비교적

YOLOv5 모델은 YOLO(You Look Only Once)라는 Object Detection모델의 5번째 버전으로,
제작자의 깃헙에서 패키지를 다운받아 바로 모델을 학습하고 사용할 수 있습니다!
(https://www.github.com/ultralytics/yolov5)

모델의 자세한 이해와 설명은 아래 글을 참조하면 좋습니다.
(https://ropiens.tistory.com/44)

모델을 사용하기 위한 준비

먼저 YOLOv5 모델을 사용하기 위해서는 데이터 셋을 준비해야합니다.
모든 머신러닝 모델은 데이터 셋이 필요한데, YOLOv5은 이미지 파일과, 이미지에서 object의 위치를 박스로 표시한 좌표의 정보를 담은 라벨 파일, 데이터셋의 클래스명과 갯수, 경로에 대한 정보를 담고있는 data_config.yaml파일이 있어야 합니다.

먼저 데이터셋 준비를 알아보겠습니다. YOLOv5뿐만 아니라 다른 이미지를 활용한 object detection, segmentation detection등의 모델을 사용하려고 할 때에는 이미지 라벨링이 필수입니다.

YOLOv5 사용시에는 많은 분들이 darknet이라는 라벨링 툴을 이용하시는데, 저는 supervisely라는 웹사이트를 이용했습니다!

이런 화면구성으로 라벨링 작업을 할 수 있으며, 프로젝트 생성 후 팀원을 초대해서 진행상황 공유와 분업을 할 수 있다는게 큰 장점인 것 같습니다. 그리고 또한 큰 장점으로 train set과 val set을 원하는 비율(ex. 8:2, 7:3 등등)로 폴더로 나누어서 저장이 가능합니다!


프로젝트의 옵션(점 세개 버튼)을 눌러서 Run App -> Training data -> Assign train/val tags to images 를 누르면 전체 메뉴에서 task탭에 작업이 올려진다.

작업 목록을 보면 해당 작업에 open이라는 버튼이 있는데 open을 누르면 아래 사진과 같은 화면이 나옵니다.

원하는 비율로 train/val을 나누어주고 작업이 완료되면,
.tar 형식의 압축파일을 저장할 수 있습니다.

linux환경에서 압축해제가 가능하고 linux환경이 아니라 곤란하다면,
WSL이나 Git bash를 사용해 로컬 환경에서 linux명령어를 사용할 수 있습니다.

supervisely에서 데이터 라벨링을 해서 다운로드해줬다면,

# train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]
train: ../coco128/images/train2017/
val: ../coco128/images/val2017/

# number of classes
nc: 80

# class names
names: ['person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat', 'traffic light',
        'fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow',
        'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee',
        'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard',
        'tennis racket', 'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple',
        'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch',
        'potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 
        'cell phone', 'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors', 
        'teddy bear', 'hair drier', 'toothbrush']

data_config.yaml을 만들어주실 차례. 위 예시는 제작자의 github에서 다운 가능한 coco128dataset의 data_config입니다~
간단하게 수정할 수 있는데.
저대로 data config를 다운로드해와서 python 코드를 사용해 수정해줄 수 있습니다.


import yaml
with open("/content/electricscooter/es_project/data_config.yaml","r") as f:
  data = yaml.load(f)
  
data["train"] = "/content/electricscooter/es_project/train.txt"
data["val"] = "/content/electricscooter/es_project/val.txt"
with open("/content/electricscooter/es_project/data_config.yaml","w") as f:
  yaml.dump(data,f)
#data_config.yaml파일의 내용을 수정
%cat /content/electricscooter/es_project/data_config.yaml 
#수정된 data_config.yaml확인

import yaml 패키지를 사용해 python에서 yaml파일을 다룰 수 있습니다.
여기서 잠시 혼란이 올 수 있는데, 해당 코드내의 주소는 제가 사용한 주소이기 때문에 주소는 사용자가 dataset을 저장한 폴더로 수정해주셔야합니다~

그리고 갑자기 튀어나온 train.txt와 test.txt는 바로 이렇게

from glob import glob
train_img_list = glob("/content/electricscooter/es_project/images/train/*.jpg")
val_img_list = glob("/content/electricscooter/es_project/images/val/*.jpg")

glob함수를 사용하여 먼저 각 train, val set의 파일명 리스트를 만들어줍니다.

with open("/content/electricscooter/es_project/train.txt","w") as f:
  f.write("\n".join(train_img_list)+"\n")
#train.txt파일의 내용을 다운로드한 train img list로 작성
with open("/content/electricscooter/es_project/val.txt","w") as f:
  f.write("\n".join(val_img_list)+"\n")
#val.txt의 내용을 다운로드한 val img list로 작성

그 후 파일명 리스트를 train.txt, val.txt로 각각 저장해줍니다. 이 txt파일들이 모델이 학습할 이미지 파일들을 가르쳐줍니다!

제가 이 프로젝트에서 인식했던 오브젝트는 4가지로, electric scooter, fire flug, cross walk, braille block입니다

nc : 4, class names도 변경됩니다!

수정된 data_config.yaml을 출력한 결과입니다.
colors는 아마.....supervisely에서 라벨링에 사용한 색깔인듯 합니다~
여기까지 하시면 모델을 사용하기 위한 준비는 끝입니다!
모델 사용방법과 코드, 설명, 결과물은 다음 게시글에서 작성하겠습니다.
안녕~

0개의 댓글