[YOLO] 나만의 데이터셋 학습시키기 (Colab 기반)

Jina·2023년 5월 25일
1

Art Hunter 프로젝트

목록 보기
3/5
post-thumbnail

안녕하세요,
저는 2023년도 1학기 졸업프로젝트를 진행하고있는 '에잇'팀의 팀원입니다ヾ(•ω•`)o


저희 팀의 주제는 외국인 관광객을 타겟으로 부분해설을 기반으로 하는 미술관 도슨트 서비스를 제공하는 것입니다.

길고 지루한 해설을 조각조각 나누고 다양한 인터랙션을 제공하여 보다 쉽게 다가가, 한국미술에 대한 흥미를 고취시키고자 합니다. (ง •_•)ง


이번 포스팅에서는 미술작품을 요소별로 detection하기 위한 YOLO v5 학습과, 이를 모바일 앱으로 구현하기 위한 Spring boot 초기 설정을 알아보았습니다.

나만의 데이터셋으로 YOLO 학습

사용자가 미술작품과 인터랙션하는 적극적인 경험을 할 수 있도록, 작품 감상 중 모바일 카메라로 작품의 부분 요소들을 찍을 수 있게 만들고자 합니다!

이를 위해 미술작품 해설의 각 부분에서 언급되는 작품의 요소들을 YOLO를 활용하여 학습시켰습니다. (❁´◡`❁)

사용자 데이터셋 만들기

먼저 해설을 읽거나/들으며 감상해야 할 포인트들이 라벨링된 데이터셋을 만들어야 합니다!


저희는 Roboflow 사이트을 사용했습니다! 이 사이트에서는 사용자 데이터를 업로드하여 bounding box로 라벨링할 수 있습니다. ლ(╹◡╹ლ)

Roboflow 사용 준비


먼저 Roboflow 사이트에 회원가입을 하고
사용목적 및 워크스페이스명을 입력하면 위와 같은 화면이 나옵니다.

가격정책을 선택하라는 것인데요, 무료인 Community 버전을 선택해도 충분합니다.


저는 YOLOv5라는 이름으로 워크스페이스를 생성했습니다. 이제 하단의 + Create New Project를 클릭하여 프로젝트를 생성합니다.

참고로 좌측 하단의 Public Datasets를 클릭하면 무료로 제공되는 데이터를 받을 수 있습니다. 무료 데이터셋으로 yolo 학습한 포스팅도 있으니 다음의 포스팅을 참고해보세요!


팝업에 자신의 프로젝트 정보를 적은 후 Create Public Project를 클릭하면 준비가 끝납니다~

  • Project Type : 객체 탐지를 할 것이므로 Object Detection을 선택했습니다.
  • Detecting : 탐지하고자 하는 것을 적으면 됩니다. 저는 미술작품 내의 다양한 요소들을 탐지할 것이라서 artworks라고만 적었습니다.
  • Project Name : 팀 이름을 적었습니다.

라벨링

생성된 프로젝트의 모습입니다.
이제 Select FilesSelect Folder로 이미지를 선택해서, 라벨링하고자 하는 곳에 bounding box를 만들면 됩니다!


저는 심사정의 <홍련> 작품에서 물총새, 연꽃, 글자를 라벨링했습니다.


여러 사이트에서 화질, 밝기가 조금씩 다른 <홍련> 이미지를 모았고, 해당 이미지들을 띄운 화면을 측면에서 촬영한 사진들을 업로드했습니다.

실제 미술관에서는 반드시 정면에서만 촬영할 수 있는 것은 아니니까요!


업로드한 이미지를 각각 클릭하면, 다음과 같이 bounding box를 만들 수 있습니다!

저는 kingfisher, lotus, text 3가지로 라벨링해보았습니다. (~ ̄▽ ̄)~

위처럼 모든 이미지의 라벨링이 끝났다면, 우측 상단의 Save and Continue 버튼을 클릭합니다.


팝업에서 어떤 Set으로 설정할지 물어보게 되는데, 각 Set의 의미는 다음과 같습니다.

  • Training(학습) Set
    모델 학습에 사용되는 데이터. 이를 이용해 서로 다른 epoch로 학습시킴.
  • Validation(검증) Set
    학습이 이미 완료된 모델을 검증하기 위한 데이터셋
  • Test(평가) Set
    검증이 완료된 모델의 성능을 평가하기 위한 데이터셋

다음의 블로그를 참고하여 저는 6:2:2의 비율을 선택했습니다.

좌측 하단의 Dataset을 클릭하면 업로드한 이미지들이 Trian, Valid, Test로 잘 나뉘어 업로드된 것을 확인할 수도 있습니다. (‾◡◝)

Generate


Roboflow에서는 위와 같은 단계를 거쳐 데이터를 정제할 수 있습니다!

세번째 단계인 Preprocessing에서는 위와 같은 기능을 추가하여 데이터를 조금씩 변화시킬 수 있습니다.

저는 사이즈 조정만 선택했습니다. 미술관에서 흑백이나 색 대비는 이루어지지 않을 것 같아서...


4번째 Augumentation(증강) 단계에서도 이미지를 다양한 방식으로 변형할 수 있습니다. image 전체 단위로도 가능하고, bounding box 단위로도 변형이 가능합니다!


저는 위와 같이 선택했습니다.

마지막 5번째 단계에서 Generate를 클릭하면 됩니다!
무료 버전에서는 3배까지 데이터를 증강시킬 수 있습니다. o( ̄▽ ̄)ブ

Custom Train

이제 YOLO v5를 선택하고,
Get Snippet을 클릭하여 custom train을 진행하면 됩니다 ( •̀ ω •́ )✧


그럼 위와 같은 팝업이 나오게 됩니다!
저는 Jupyter가 아니라 Terminal탭을 선택하여 위의 코드를 복사했습니다.

curl -L "https://app.roboflow.com/ds/45bgYMtkwa?key=Kdwbvi8otU" > roboflow.zip; unzip roboflow.zip; rm roboflow.zip

YOLO v5 학습 (Colab 기반)

이제 앞서 만든 데이터셋을 colab에서 학습시켜보겠습니다!

colab 개념과 초기 설정은 다음의 포스팅을 참고해주세요(╯▽╰ )

데이터셋 불러오기


현재 directory가 /content인지 항상 확인하고 진행해야 합니다!!
'!pwd'를 입력하고 실행버튼 Ctrl+Enter 을 누르면 현재 위치가 나옵니다.

!curl -L "https://app.roboflow.com/ds/45bgYMtkwa?key=Kdwbvi8otU" > roboflow.zip; unzip roboflow.zip; rm roboflow.zip

이제 앞서 만들었던 데이터셋에서 복사한 코드를 붙여넣으면 됩니다. 이때 !(느낌표) 작성 후 붙여넣는 것을 유의하기!


실행시 다음과 같이 content 파일 하위로 trian, valid, README, data.yaml 파일이 생성됩니다!

YOLO v5 설치

마찬가지로 현재 directory가 /content인지 확인한 후, 다음과 같이 git clone을 하면 yolov5 디렉토리가 생성됩니다.

!git clone https://github.com/ultralytics/yolov5.git

이제 디렉토리를 yolov5 파일로 변경하고, 관련 라이브러리를 설치하면 끝!

%cd yolov5
! pip install -r requirements.txt

학습 시작

다음의 코드를 실행하면 학습이 시작됩니다 ψ(`∇´)ψ

!python train.py --img 415 --batch 16 --epochs 50 --data /content/data.yaml --cfg ./models/yolov5s.yaml --weights yolov5s.pt --name HongRyeon_yolov5s_results
  • img: 학습할 사진의 크기
  • batch: 전체 data를 얼만큼 쪼개어 학습할 것인지
  • epochs: 전체 data 반복학습 횟수
  • data: data set의 경로 정보를 갖고있는 yaml 파일
    ( => 생성한 데이터셋인 /content/data.yaml으로 지정)
  • cfg: 학습에 사용할 모델의 yaml 파일
    ( => yolov5s.yaml으로 지정)
  • weights: 학습에 사용할 모델의 파일
    ( => yolov5에서 제공하는 pre-trained 된 모델인, yolov5s.pt)
  • name: 결과 저장할 폴더명

결과 화면은 다음과 같습니다!

best.pt 파일이 content/runs/train/HongRyeon_yolov5s_results/weights/best.pt에 잘 저장되어 있음을 알 수 있습니다~

학습 결과 테스트


테스트를 위해 작품을 모니터에 띄워 사선에서 찍고, 해당 이미지를 루트 디렉토리에 업로드 했습니다.

!python detect.py --weights ./runs/train/HongRyeon_yolov5s_results/weights/best.pt --conf 0.5 --source /HongRyeon_test01.jpg

이제 위 코드를 실행시키면 됩니다!


다행히 오류없이 잘 실행되었습니다!

result가 저장된 경로에서 결과물을 볼 수 있습니다.(⊙o⊙)
현재 디렉토리가 yolov5이므로 yolov5/runs/detect의 exp3파일을 클릭합니다.


위처럼 앞서 라벨링한 것들이 잘 인식된 것을 볼 수 있습니다 ヾ(⌐■_■)ノ♪


참고자료

3개의 댓글

comment-user-thumbnail
2023년 6월 6일

잘 읽었어요~

답글 달기
comment-user-thumbnail
2024년 3월 16일

글 잘 읽었습니다! 인식이 굉장히 잘 되네요. 혹시 사진을 몇 장 정도나 학습 시키신건가요?

답글 달기
comment-user-thumbnail
2024년 5월 12일

글 잘 읽었습니다! 저는 왜 인식이 안되는건지 잘 모르겠네요ㅠㅠ 이미지를 몇 장 학습 시키신 건가요??

답글 달기