안녕하세요,
저는 2023년도 1학기 졸업프로젝트를 진행하고있는 '에잇'팀의 팀원입니다ヾ(•ω•`)o
저희 팀의 주제는 외국인 관광객을 타겟으로 부분해설을 기반으로 하는 미술관 도슨트 서비스를 제공하는 것입니다.
길고 지루한 해설을 조각조각 나누고 다양한 인터랙션을 제공하여 보다 쉽게 다가가, 한국미술에 대한 흥미를 고취시키고자 합니다. (ง •_•)ง
이번 포스팅에서는 미술작품을 요소별로 detection하기 위한 YOLO v5 학습과, 이를 모바일 앱으로 구현하기 위한 Spring boot 초기 설정을 알아보았습니다.
사용자가 미술작품과 인터랙션하는 적극적인 경험을 할 수 있도록, 작품 감상 중 모바일 카메라로 작품의 부분 요소들을 찍을 수 있게 만들고자 합니다!
이를 위해 미술작품 해설의 각 부분에서 언급되는 작품의 요소들을 YOLO를 활용하여 학습시켰습니다. (❁´◡`❁)
먼저 해설을 읽거나/들으며 감상해야 할 포인트들이 라벨링된 데이터셋을 만들어야 합니다!
저희는 Roboflow 사이트을 사용했습니다! 이 사이트에서는 사용자 데이터를 업로드하여 bounding box로 라벨링할 수 있습니다. ლ(╹◡╹ლ)
먼저 Roboflow 사이트에 회원가입을 하고
사용목적 및 워크스페이스명을 입력하면 위와 같은 화면이 나옵니다.
가격정책을 선택하라는 것인데요, 무료인 Community 버전을 선택해도 충분합니다.
저는 YOLOv5라는 이름으로 워크스페이스를 생성했습니다. 이제 하단의 + Create New Project
를 클릭하여 프로젝트를 생성합니다.
참고로 좌측 하단의 Public Datasets
를 클릭하면 무료로 제공되는 데이터를 받을 수 있습니다. 무료 데이터셋으로 yolo 학습한 포스팅도 있으니 다음의 포스팅을 참고해보세요!
팝업에 자신의 프로젝트 정보를 적은 후 Create Public Project
를 클릭하면 준비가 끝납니다~
생성된 프로젝트의 모습입니다.
이제 Select Files
나 Select Folder
로 이미지를 선택해서, 라벨링하고자 하는 곳에 bounding box를 만들면 됩니다!
저는 심사정의 <홍련> 작품에서 물총새, 연꽃, 글자를 라벨링했습니다.
여러 사이트에서 화질, 밝기가 조금씩 다른 <홍련> 이미지를 모았고, 해당 이미지들을 띄운 화면을 측면에서 촬영한 사진들을 업로드했습니다.
실제 미술관에서는 반드시 정면에서만 촬영할 수 있는 것은 아니니까요!
업로드한 이미지를 각각 클릭하면, 다음과 같이 bounding box를 만들 수 있습니다!
저는 kingfisher, lotus, text 3가지로 라벨링해보았습니다. (~ ̄▽ ̄)~
위처럼 모든 이미지의 라벨링이 끝났다면, 우측 상단의 Save and Continue
버튼을 클릭합니다.
팝업에서 어떤 Set으로 설정할지 물어보게 되는데, 각 Set의 의미는 다음과 같습니다.
다음의 블로그를 참고하여 저는 6:2:2의 비율을 선택했습니다.
좌측 하단의 Dataset
을 클릭하면 업로드한 이미지들이 Trian, Valid, Test로 잘 나뉘어 업로드된 것을 확인할 수도 있습니다. (‾◡◝)
Roboflow에서는 위와 같은 단계를 거쳐 데이터를 정제할 수 있습니다!
세번째 단계인 Preprocessing에서는 위와 같은 기능을 추가하여 데이터를 조금씩 변화시킬 수 있습니다.
저는 사이즈 조정만 선택했습니다. 미술관에서 흑백이나 색 대비는 이루어지지 않을 것 같아서...
4번째 Augumentation(증강) 단계에서도 이미지를 다양한 방식으로 변형할 수 있습니다. image 전체 단위로도 가능하고, bounding box 단위로도 변형이 가능합니다!
저는 위와 같이 선택했습니다.
마지막 5번째 단계에서 Generate를 클릭하면 됩니다!
무료 버전에서는 3배까지 데이터를 증강시킬 수 있습니다. o( ̄▽ ̄)ブ
이제 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
이제 앞서 만든 데이터셋을 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 파일이 생성됩니다!
마찬가지로 현재 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
/content/data.yaml
으로 지정) yolov5s.yaml
으로 지정)yolov5s.pt
)결과 화면은 다음과 같습니다!
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파일을 클릭합니다.
위처럼 앞서 라벨링한 것들이 잘 인식된 것을 볼 수 있습니다 ヾ(⌐■_■)ノ♪
잘 읽었어요~