캡스톤디자인프로젝트

[캡스톤A] YOLOv5 Custom dataset 학습 및 Object detection

2022. 11. 21. 03:10

안녕하세요.

'대면편취형 보이스피싱 예방을 위한 AI 모니터링 알림 서비스'를 주제로 프로젝트를 진행하고 있는 peacebite 팀의 팀원입니다. 이번 포스트에서는 YOLOv5 아키텍쳐 분석 및 Colab을 이용한 Custom dataset 학습 등을 다루어 보려고 합니다. 

1. 프로젝트 설명

앞서 말했듯, 저희 프로젝트는 대면편취형 보이스피싱 예방을 위한 AI 모니터링 알림 서비스입니다. 경찰청 자료에 따르면 코로나를 기점으로 보이스피싱 건수는 줄었으나 보이스피싱 피해액은 증가하고 있음을 알 수 있습니다. 또한 보이스피싱의 피해금을 편취하는 수법 중에서 "대면 편취형"으로 피해금을 전달하는 건수가 2019년에 비해 2021년에 7배나 증가했다는 것을 알 수 있습니다. 재산상 손해 뿐만 아니라 정신적 고통까지 받고 있는 보이스피싱 피해자가 더는 늘어나지 않도록 하기 위해, 해당 프로젝트를 진행하기로 하였습니다. 

 

저희는 ATM을 사용하는 고객이 보이스피싱 피해자임을 판단하기 위한 기준으로 세 가지를 고려하였습니다.

첫째, obect detection으로 고객이 통화 하고 있는 phone 인식

둘째, emotion recognition으로 고객의 불안함, 초조함 등 부정적인 감정 탐지

셋째, 고액 출금

 

이 세 결과값을 종합하여 고객이 보이스피싱을 당하고 있는 상황임을 판단한 후, 출금을 지연하고 경찰과의 연결을 제안하는 등의 대응을 제공할 생각입니다. 고객 탐지는 CCTV에 내장되어 있는 카메라를 활용할 것이며, 최종 촬영된 결과는 DB에 저장되게 하여 관리자가 나중에 다시 볼 수 있게 만들 예정입니다. 

 

이번 글에서는 object detection 기술을 사용해 Phone을 인식해보도록 하겠습니다.  


2. Object Detection이란? 

Object Detection은 컴퓨터비전(Computer vision), 영상처리(image processing)와 관계가 깊은 컴퓨터 기술입니다.

일반적으로 Object Detection 알고리즘은 찾고자 하는 Object의 특징(feature)을 사전에 추출하고 주어진 영상 내에서 해당 특징를 검출(detection)하는 접근을 주로 사용합니다. 결론적으로 Object Detection Algorithms은 영상에서 전처리 등을 통해서 노이즈를 제거하거나, 이미지를 선명하게 만든 후에 해당 이미지에서 특징들을 추출하고, 이 특징들을 이용하여 Object Detection에 대해 분류(Classifier)하는 파이프라인(pipe line)을 따릅니다.

 

Object Detection Algorithms에 대해서 대략적으로 요약하면 다음과 같이 작동합니다.

  • 전처리 (Pre-processing)
  • 특징 추출 (Feature Extraction)
  • 분류 (Classifier)

Object detection은 object의 class를 classification 할 뿐만 아니라 localization까지 함께 수행합니다. Localization이란 이미지 내에 하나의 object가 있을 때 그 object의 위치를 특정하는 것입니다.  즉, Object Detection은 여러 개의 object가 존재할 때 각 object의 존재 여부를 파악하고 위치를 특정하여 classification을 수행합니다.

3. Object Detection 모델 선정 - YOLOv5 

Object Detection에는 아래와 같이 수많은 알고리즘들이 있습니다. 저는 그 중 YOLOv5를 사용해서 object detection을 진행할 것입니다. 

※ YOLO(You Only Look Once)란?

YOLO는 이미지 내의 bounding box와 class probability를 single regression problem으로 간주하여, 이미지를 한 번 보는 것으로 object의 종류와 위치를 추측합니다.

 

기존 object detection model들과 비교했을 때, YOLO의 장점과 단점은 다음과 같습니다. 

 

장점

  • 간단한 처리과정으로 속도가 매우 빠르다. 기존의 다른 real-time detection system들과 비교할 때,2배 정도 높은 mAP를 보인다.
  • Image 전체를 한 번에 바라보는 방식으로 class에 대한 맥락적 이해도가 높다. 이로인해 낮은 backgound error(False-Positive)를 보인다.
  • Object에 대한 좀 더 일반화된 특징을 학습한다. 가령 natural image로 학습하고 이를 artwork에 테스트 했을때, 다른 Detection System들에 비해 훨씬 높은 성능을 보여준다.

단점

  • 상대적으로 낮은 정확도 (특히, 작은 object에 대해)

YOLO는 다른 Object detection 모델에 비해 정확도 측면에서 부족하지만 속도 측면에서는 압도적입니다.  저희 프로젝트는 ATM기 앞의 고객을 실시간으로 빠르게 탐지하는 것이 중요하기 때문에 실시간 객체 탐지에 많이 쓰이는 YOLO 모델을 선택하게 되었습니다. 

※  YOLOv5

YOLOv5는 YOLOv4를 기반으로 개선되었으며, 실행 속도가 크게 향상되어 가장 빠른 연산 속도가 초당 140프레임에 도달합니다. 또한, 모델의 가중치 파일 크기도 Yolov4 보다 작아서 실시간 탐지를 구현하기에 더 적합합니다. 

 

Yolov5 네트워크의 장점

(1) high detection accuracy(높은 탐지의 정확도)

(2) lightweight characteristics(경량화 특성)

(3) fast detection speed at the same time(빠른속도로 탐지)

 

YOLOv5에는 YOLOv5-s, m, l, x 총 4가지 버전이 있습니다.

 

 

 

YOLOv5에 대한 파일들은 아래의 링크에서 git clone을 통해 다운로드 받을 수 있습니다. 

https://github.com/ultralytics/yolov5

 

GitHub - ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite

YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite. Contribute to ultralytics/yolov5 development by creating an account on GitHub.

github.com

 


4. Colab을 이용한 YOLOv5 Custom 학습

(0) 개발 환경

모델 학습을 위한 환경으로는 Google Colab(https://colab.research.google.com/)을 이용하였고, 개발 프레임워크로 PyTorch를 사용하였습니다.

 

먼저, 구글 드라이브에 프로젝트를 위한 파일을 만들고 새 노트를 만들었습니다. 새 노트를 클릭하면 .ipynb 확장자의 노트북이 만들어집니다.

Colab의 런타임 유형은 GPU로 선택합니다.

(런타임 > 런타임 유형 변경 > 하드웨어 가속기 GPU로 번경 > 저장)  

 

저장을 누르면 이제부터 무료로 12시간의 GPU를 사용할 수 있습니다. 여기까지 개발 환경 세팅을 마쳤습니다.

 

(1) Download dataset

딥러닝 모델을 학습시키기 위해서는  image파일과 image속의 객체를 labeling한 txt파일(yolov5)이 필요합니다. COCO, Mars, Market1501 등과 같은 데이터셋은 구글링으로 쉽게 찾아볼 수 있으며, Roboflow라는 사이트를 방문하면, 여러가지 Dataset과 label 데이터를 다운로드 받을 수 있습니다.

단기간에 dataset을 만드는 것은 어렵기 때문에 Roboflow(https://roboflow.com/)에서 dataset을 구해서 모델을 훈련하도록 하겠습니다. 

 

저는 phone dataset을 활용하였습니다. 

Download Format을 지정 할 수 있는데, COCO, Pascal VOC 등 다양한 Format의 형태로 Export 할 수 있습니다. 저는 YOLOv5 PyTorch를 선택하였습니다.

 

다운로드 버튼을 누르면, zip파일로 받을 것인지, 다운로드 코드로 받을 것인지 선택하는 창이 나옵니다. 저는 Colab에서 수행 할 예정이므로 download code를 선택하였습니다. 

 

Colab 또는 Jupyter Notebook/lab으로 실습할 경우 Jupyter 탭을, 터미널로 실습할 경우 Terminal 탭에 있는 코드를 치면됩니다. 저는 Colab으로 실습을 진행할 것이므로 Jupyter 탭에 있는 코드를 사용하였습니다.

 

위에서 복사한 Download code를 Colab에 붙여넣고 코드를 수행하여 Download를 진행합니다.

!pip install roboflow

 

from roboflow import Roboflow
rf = Roboflow(api_key="diDXt1HBi9z8bPTkdkeJ")
project = rf.workspace("objectdetection-lryar").project("dataset-un2vt")
dataset = project.version(3).download("yolov5")

 

Download가 완료되면 왼쪽 파일과 디렉토리가 생성된 것을 확인 하실 수 있습니다.  

[ train, valid, README.dataset.txt, README.roboflow.txt, data.yaml] 가 생성됩니다.

저는 사용하기 편하도록  dataset이라는 폴더를 만들고, 이들을 전부 dataset 폴더에 이동시켰습니다. 

(2) Split Data

훈련과 검증, 테스트를 위해서 dataset을 나눠야 합니다. 하지만 roboflow에서 제공하는 data는 이미 나누어져 있기 때문에 이 단계는 건너뛰도록 하겠습니다.

  • train set : 학습에 사용되는 훈련용 데이터
  • valid set : 모델의 일반화 능력을 높이기 위해 학습 중에 평가에 사용되는 검증 데이터
  • test set : 학습 후에 모델의 성능을 평가하기 위해서만 사용되는 테스트용 데이터

(3) Label

label format은 다음과 같습니다. roboflow에서 제공하는 data에는 label 파일이 존재하기때문에 별도 labeling은 필요 없습니다.

label 파일은 멀티클래스 형태로 구성할 수 있으며 여러 클래스 정보가 있을 때는 줄 단위로 구분해서 입력합니다. 각 줄은 label, 중심 X좌표, 중심 Y좌표, 너비, 높이 순서로 공백으로 구분해서 정보를 입력하며 좌표와 너비는 0~1 사이의 범위로 입력하면 됩니다.

labels 파일에서 labeling이 된 것을 확인해보았습니다.

 

(4) Installling the YOLOv5 Environment

git clone을 통해서 원하는 작업 디렉토리 위치에 관련 파일들을 다운로드 받아줍니다.

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

 

yolov5 내 requirements.txt파일을 통해 YOLOv5 개발환경과 동일한 버젼을 다운로드 받아줍니다.

%cd /content/yolov5/
!pip install -r requirements.txt

 

(5) Make yaml

함께 Download 된 data.yaml 파일을 살펴보면 아래와 같이 클래스 이름들과 클래수 개수 그리고 train과 valid set의 주소가 적혀있습니다.  

%cat /content/dataset/data.yaml

 

train 폴더와 valid 폴더에 있는 이미지 리스트를 glob 라이브러리를 이용해 가져옵니다.

%cd /
from glob import glob
 
# 이미지들의 주소 리스트로 만들어줌
train_img_list = glob('/content/dataset/train/images/*.jpg')
valid_img_list = glob('/content/dataset/valid/images/*.jpg')
print(len(train_img_list))
print(len(valid_img_list))

 

여기서 dataset을 가르키는 주소가 정확히 되어있지 않기 때문에, 이미지의 주소들을 txt파일로 모아준 뒤 경로 재설정 해줍니다. 

# train, valid image 경로를 txt 파일로 저장
with open('/content/dataset/train.txt', 'w') as f:
  f.write('\n/'.join(train_img_list) + '\n')

with open('/content/dataset/valid.txt', 'w') as f:
  f.write('\n/'.join(valid_img_list) + '\n')

 

훈련 데이터와 검증 데이터로 분류한 리스트를 data.yaml에 업데이트 합니다.

import yaml

with open('/content/dataset/data.yaml', 'r') as f:
  data = yaml.safe_load(f)

print(data)

data['train'] = '/content/dataset/train.txt'
data['val'] = '/content/dataset/valid.txt'

with open('/content/dataset/data.yaml', 'w') as f:
  yaml.dump(data, f)

print(data)

폴더의 위치를 바꿨으니 훈련 데이터와 검증 데이터 경로를 재설정합니다. data.yaml의 train set과 valid set의 경로를 바꾸어주었습니다. 훈련, 검증 데이터 경로와 class정보의 수정이 필요하다면 yaml 파일을 열어서 수정합니다. 

 

(6) Train YOLOv5

드디어 학습을 시작해보겠습니다! YOLOv5 디렉토리로 이동한 뒤, train.py 파일을 이용해 학습을 시켜주면 됩니다. 

 

학습을 시키기 전 YOLOv5의 모델 중 어떤 것을 사용할지 결정합니다. 크기가 크면 클수록 복잡해지고 정확성이 높아지는 대신, 시간이 오래걸리고 GPU의 메모리를 많이 차지하게 됩니다. 저는 빠르게 학습시키기 위해 제일 작은 YOLOv5s 모델을 사용해보겠습니다.

%cd /content/yolov5/

# Train YOLOv5s on COCO128 for 100 epochs
! python train.py --img 640 --batch 16 --epochs 100 --data /content/dataset/data.yaml --cfg ./models/yolov5s.yaml --weights yolov5s.pt --name phone_yolov5s_results

 

--img : 이미지 크기

--batch : 배치 크기

--epochs : epoch 크기

--data : 데이터파일 (data.yaml 파일 경로 지정)

--cfg : 모델 크기 (yolov5/models 폴더에 yaml파일로 저장되어 있음)

--weights : 가중치에 대한 사용자 정의 경로 지정 (yolov5s.pt 등의 형식으로 다운로드 가능)

--name : 학습된 모델의 이름

 

 

학습도중에도, 학습이 끝난 후에도 yolov5/runs/train/(모델의 이름) 폴더 안을 살펴보면, train 및 test batch마다의 실제 정답(레이블링)과 예측된 학습결과를 미리볼 수 있습니다. 

 

val_batch1_pred.jpg를 선택해 학습결과를 미리 확인해 보았습니다. 

 

(7) Performance evaluation

%load_ext tensorboard
%tensorboard --logdir /content/yolov5/runs/

 

학습 결과를 그래프로 확인합니다. Train 학습 그래프가 우상향하고, Loss 그래프는 우하향하고 있는 것을 확인할 수 있습니다. 아직 정확도가 부족하지만, 모델이 제대로 학습되었다는 점을 확인할 수 있습니다.

 

 

(8) Prediction 

yolov5 안에 있는 detect.py를 이용하면 다른 사진들을 가지고도 모델을 실행시켜볼 수 있습니다. 사진 뿐 아니라 동영상, 웹캠, 유튜브 영상도 이용할 수 있습니다. 

 

# 사진 

먼저 사진에서 phone 객체들이 인식되었는지 확인해보겠습니다. 

# 테스트 데이터로 추론하기 (Prediction)
from IPython.display import Image
import os

val_img_path = valid_img_list[3]

!python detect.py --weights /content/yolov5/runs/train/phone_yolov5s_results/weights/best.pt --img 416 --conf 0.5 --source "{val_img_path}"

 

결과가 runs/detect/exp3에 저장되었습니다. 

 

사진 속 phone이 인식되었음을 확인할 수 있었습니다.

 

# 영상

이제 YOLOv5 모델 안에 있는 detect.py를 이용해 video에서 phone 객체들을 인식해보도록 하겠습니다. 

ATM기 앞에서 phone으로 전화 통화하는 영상을 촬영하였고, 이를 모델에 실행해보았습니다. 

# 영상 추론 
%%time 
!python detect.py --weights /content/yolov5/runs/train/phone_yolov5s_results/weights/best.pt --img 416 --conf 0.5 --source '파일 위치'

--weights 다음에 위에서 학습한 모델 경로명을 작성하고,

--source 다음에 추론할 비디오 경로명을 작성합니다.

--img 다음에 이미지 크기를 넣고,

--conf는 0~1 사이 값의 conf_threshold로 저는 0.5로 지정하였습니다.

 

detect 결과 파일은 runs/detect/exp4 에서 확인할 수 있습니다. 

 

영상 삭제

 

다음과 같이 모델을 이용해 객체 인식한 영상 결과가 나왔습니다!!

아직 학습을 많이 시키지 않아 정확도가 높게 나오지는 않지만, 앞으로 더 학습시키면서 정확도를 올려보려고 합니다. 

 

※ 참고 아래는 다른 팀원이 진행한 감정 분석 관련 POC 입니다.

https://velog.io/@kang1221/Fonitor-대면편취형-보이스피싱-을-예방하기-위한-모니터링-서비스

 

[PONITOR] 대면편취형 보이스피싱 예방을 위한 모니터링 서비스

대면편취형 보이스피싱을 예방하기 위한 모니터링 서비스ATM 카메라를 사용해 사용자의 감정 및 통화여부를 판단하여 보이스피싱 피해 가능성을 예측피해자로 예측된 사용자에게는 ATM 화면에

velog.io

5. Reference

https://www.newspim.com/news/view/20220825000402

 

금감원, 9월부터 '대면편취형 보이스피싱' 피해 예방 강화

[서울=뉴스핌] 홍보영 기자=9월부터 은행권에서 고액현금 인출시 성별, 연령 등 고객 특성에 맞는 맞춤형 문진을 실시하는 등 '대면편취형 보이스피싱' 피해예방 활동이 강화된다.금융감독원은 2

newspim.com

https://deepbaksuvision.github.io/Modu_ObjectDetection/posts/01_00_What_is_Object_Detection.html

 

01. Object Detection 이란? · GitBook

No results matching ""

deepbaksuvision.github.io

https://curt-park.github.io/2017-03-26/yolo/

 

[분석] YOLO

Paper study of YOLO published in May 2016

curt-park.github.io

https://blog.roboflow.com/how-to-train-yolov5-on-a-custom-dataset/?ref=ultralytics 

 

How to Train YOLOv5 On a Custom Dataset

In this post, we will walk through how you can train YOLOv5 to recognize your custom objects for your custom use case.

blog.roboflow.com

www.youtube.com/watch?v=T0DO1C8uYP8&t=612s