졸업프로젝트_스마트팜

A-farm에서 사용하는 딥러닝 모델 [ DeepSort+YOLOv5 ]

미미수 2021. 11. 25. 20:57

2021 졸업프로젝트를 스마트팜을 주제로 참가하게 되었다!

 

큰 주제는 드론을 활용해 수집한 정보로 농작물 품질관리 및 재해예방을 도와주는 앱/웹이다.

 

프론트엔드 + 백엔드 + 드론 자율주행 Tech + 컴퓨터비전 네가지 분야로 역할을 분담했고, 저는 그 중 컴퓨터비전을 맡게 되었다!

 

이번 글의 목차는 아래와 같다.

 

1. 프로젝트 개요(딥러닝 측면)

2. Object Tracking : DeepSort

3. Object Detection : YOLOv5

4. DeepSort + YOLOv5 셋팅하기

5. 학습 결과

 


프로젝트 개요

 

그래서 프로젝트에 쓰이는 모델이 정확히 어떤 역할을 하는 거냐~!

 

우리가 사용하는 ipnut data는 각각의 농가에서 작물을 촬영한 영상이다.

어떤 작물/과수냐에 따라 학습된 모델은 다르겠지만,

드론 CPU에서 돌아가거나 스마트폰에 돌아가거나 하여튼 on device AI를 사용해야 하기 때문에 모델이 light해야 한다.

 

딥러닝 프로세스는 아래와 같다. (초기 test 작물은 포도로 선정했기 때문에 앞으로 포도가 주구장창 나올 예정이다)

 

포도 영상 촬영 - frame단위로 쪼개진 영상속 포도 객체 tracking - 각 포도의 등급 detect

데이터셋이 아직 확정 되지 않았기 때문에 포도 등급별 class를 나누지 않았다.

현재 단계에서는 단일 클래스 uva(포도냐 아니냐) 로 detection을 진행했다.

 

학습 데이터

학습 데이터는 위와 같이 생겼다. 여기서 포도를 감지하면 포도에 박스를 치고 얼만큼 확실한지 confidence score를 함께 제공한다.

 

중요한 점은 영상에서 object detection을 할때 모델은 video를 frame단위로, 즉 1초짜리 영상을 frame, 이미지로 나눈다.

그래서 앞선 이미지에 나온 포도가 다음 이미지에도 그 다음 이미지에도 나올 수 있기 때문에 Object Tracking 기술이 필수적이다.

 

 


Object Tracking : DeepSort

 

 

Object Tracking 순서도

Object Tracking은 Object Classification + Object Localization 을 매 순간하면서 객체를 추적하는 알고리즘이다.

Object Tracking의 SOTA모델이 현재 DeepSORT이기 때문에 DeepSORT를 선정하게 되었다.

 

Deep SORT의 특징을 간략히 설명하자면, 아래와 같다. 

SORT = 디텍터 + 칼만필터 + 헝가리안 알고리즘

DeepSORT = 딥러닝 + SORT

 

SORT는 전형적인 이미지 영상처리 알고리즘이다. 거기다가 feature extraction을 추가한게 DeepSORT이다.

 


Object Detection : YOLOv5

YOLO는 'You only look once'의 약자로, real-time에 적합한 Object Detection모델이다.

 

version1의 pipeline은 아래와 같다.

YOLOv1

1단계 : 입력이미지를 SxS 그리드 영역으로 나누기

2단계 : 각 그리드 영역마다 B개의 서로 다른 Bbox와 confidence score 계산

3단계 : 각 그리드 영역마다 C개의 class에 대한 해당 클래스일 확률 계산

 

Yolov5은 아직 논문이 공개가 되지 않았기 때문에 구체적인 구조를 뜯어보진 못했지만, 실험 결과 v4보다 훨씬 더 빨라졌다.

또한 적용방법이 간단하다. 구체적인 튜토리얼은 글 뒷편에 작성하겠다.


DeepSort + YOLOv5 셋팅하기

 

사용한 코드 ↓

 

GitHub - mikel-brostrom/Yolov5_DeepSort_Pytorch: Real-time multi-object tracker using YOLO v5 and deep sort

Real-time multi-object tracker using YOLO v5 and deep sort - GitHub - mikel-brostrom/Yolov5_DeepSort_Pytorch: Real-time multi-object tracker using YOLO v5 and deep sort

github.com

 

사용한 데이터셋

 

GitHub - thsant/wgisd: Embrapa Wine Grape Instance Segmentation Dataset - Embrapa WGISD

Embrapa Wine Grape Instance Segmentation Dataset - Embrapa WGISD - GitHub - thsant/wgisd: Embrapa Wine Grape Instance Segmentation Dataset - Embrapa WGISD

github.com

 

[YOLOv5 학습]

※가상환경 만들어서 들어가기 python version은 3.9로※

  1. git clone https://github.com/mikel-brostrom/Yolov5_DeepSort_Pytorch
  2. cd Yolov5_DeepSort_Pytorch
  3. git clone https://github.com/thsant/wgisd.git
  4. git clone https://github.com/ultralytics/yolov5.git
  5. cd yolov5
  6. pip install -r requirements.txt
  7. custom_dataset.yaml 파일 만들어서 yolov5/data 에 넣음.
# Train YOLOv5s on COCO128 for 200 epochs
# python train.py --img 640 --batch 16 --epochs 200 --data coco128.yaml --weights yolov5l.pt


# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: /opt/ml/Yolov5_DeepSort_Pytorch/wgisd/data  # dataset root dir
# train: train.txt  # train images 
train: images/train
# val: val_berries.txt  # train images (relative to 'path') 5000 images
val: images/val
test: test.txt  # 20288 of 40670 images, submit to 

# Classes
nc: 1  # number of classes
names: ['uva']  # class names

 

[데이터셋 준비]

  1. wgisd/data/images 에 사진 넣고 ( .jpg파일 다 옮긴다는뜻)
  2. wgisd/data/labels 에 annotation txt파일들 넣고 ( .txt파일 다 옮긴다는뜻)
  3. 실행 하면 끝!!
  4. python train.py --img 640 --batch 16 --epochs 200 --data coco128.yaml --weights yolov5l.pt

[DeepSORT 실행]

1. 학습이 완료된 YOLOv5 weight/pth의 경로 기억하고 --yolo_weights 에 args 전달

2.

python track.py --source 0 --yolo_weights yolov5n.pt --img 640

 


학습 결과

 

현재 Yolo 모델은 학습이 완료된 상태이고, DeepSORT를 테스트해보기 위한 적절한 test data를 찾지 못해서 실험해보지 못했다.

우선 실험한 YOLO모델 결과를 보자면 아래와 같다.

 

train_loss

 

train loss는 안정적으로 튀는구간 없이 학습이 되었고,

 

label (정답)
prediction (모델 예측 결과)

3시간도 채 안되는 시간동안 학습시킨 결과 꽤 정확하게 결과를 예측함을 알 수 있다. 

 

 


이제 다음에 적용해 볼 모델은 각 boundung box 별로 포도에 id를 부여해 해당 포도의 포도알 개수가 몇개인지를 추론하는 과정이다.

농가를 돌아다니는 드론이 촬영한 영상은 길이를 기준으로 구역을 나눌 예정이다.

그렇게 되면 해당 구역에 있는 포도들의 개수와 포도알 평균개수, 그리고 color, size등도 적용해

결과적으로 포도 품질을 보고서 형식으로 제공할 예정이다.

 

 

아직 갈길이 멀고 하나의 관문을 넘을 수록 장애물이 생기지만 하나하나 깨가는 재미로 도전해야 겠다.

 

이상! 다음 진행상황이 생기면 다시 돌아오겠다!