0xSEUNGJU
CodeMonkie
0xSEUNGJU
전체 방문자
오늘
어제
  • 분류 전체보기 (15)
    • linux (8)
    • web (2)
    • android (0)
    • data science (1)
    • algorithms (3)
    • 보안 (1)
    • hardware (0)

블로그 메뉴

  • github
  • playground

공지사항

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
0xSEUNGJU

CodeMonkie

[vision] YOLO Object Detection
data science

[vision] YOLO Object Detection

2022. 10. 23. 14:16

인공지능 비전 시스템은 눈의 역할을 하는 감지 장치와 뇌의 기능을 맡아 이미지 해석과 분류를 맡는 알고리즘 이렇게 두가지 요소로 구성된다.

 

yolo(You Only Look Once) 재학습은 크게 세 단계로 나뉜다.

 

1. 데이터 확보

  • labelImg와 같은 툴을 이용하여 직접 이미지와 데이터 파일을 생성 (이미지를 크롤링이나 이런 방식으로 모은 다음 하나하나 수작업으로 데이터 파일 생성)
  • VOC/COCO 데이터셋 형태로 제공되는 이미지 데이터 사용 (convert2YOLO와 같은 tool을 사용해서 데이터 파일을 변환)

2. 데이터를 이용한 재학습

  • 재학습을 하기 위해서는 처음 부터 학습을 하는게 아니라 전이학습을 이용한 pre-trained model 을 이용해야 한다. 이미 학습된 가중치 파일을 이용한다는 말 (yolov4.conv.137)
  • 재학습이 어떻게 진행되는지 학습에 대한 config 파일이 있어야한다. (darknet/cfg 폴더 아래의 yolov4-custom.cfg)
  • class에 대한 정보가 들어있는 파일을 생성(~.names 파일)
  • 학습을 진행 > 가중치 파일을 얻음(~.weights)

3. Object Detection 수행 (./darknet detector test ~.data ~.cfg ~.weights ~.jpg)

 

YOLO 개발환경 세팅

YOLO를 구동할 개발환경을 세팅하고 darknet을 컴파일하여 샘플파일의 Object Detection 해보자.

1. cmake 설치

2. Visual Studio 설치

(2019)vs_community__351230765.1635520102.zip
1.28MB

 

2019 버전을 설치해야한다. 설치하고 나면 아래와 같이 나오는데 수정을 눌러서 C++ 패캐지를 추가로 설치해줘야한다.

3. open cv 설치(4.5.4)

4. Darknet 설치

powershell

Set-ExecutionPolicy unrestricted -Scope CurrentUser -Force

workspace에서 

git clone https://github.com/AlexeyAB/darknet.git

Darknet 컴파일한다. 컴파일이 끝나면 다크넷 플랫폼이 pc에 설치된다.

.\build.ps1 -UseVCPKG -EnableOPENCV

 

5. Object Detection 실행

학습이 끝난 가중치 파일을 다운로드해서 YOLO 파일을 수행해보자

 

이미지 파일을 이용해서 Object Detection이 수행되는 걸 확인  

 

기존에 샘플이미지를 이용해서 detection을 진행 > 개, 자전거, 자동차를 탐지

화재가 난 사진을 하나 이용해서 detection을 진행 > 불은 탐지가 안되고 소방관은 탐지가 된다.  > 불을 탐지하려면?

> 재학습을 해야함 > 이미지 셋이 있어야함 > 이 이미지 셋을 YOLO가 인식할 수 있도록 데이터를 변경 > 데이터를 학습

 

재학습이라는 과정을 이해하기 위해 가중치 파일이 필요하다. 가중치 파일을 다운받아서 workspace에 넣고 powershell에서 yolo를 실행시켜보자.

./darknet detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights data/dog.jpg
  • test: image / demo: 동영상

 

 

Custom Object Detection --가중치 파일 직접 만들어 수행

이미 학습된 가중치 파일을 이용하여 Object Detection을 수행하였다. 새로운 데이터를 사용하여 학습하려면 어떻게 해야할까?

1. Convert To Yolo

재학습할 데이터셋을 다운받자.

  •   Annotations 폴더 : XML파일들이 들어 있다. 이 XML파일은 각각의 이미지와 1:1 매핑되고 각각의 이미지에 대한 설명이 이 XML안에 기록되어 있다.
  • JPEGImages 폴더 : 학습에 사용할 이미지들이 들어가 있다.

xml파일에는 해당 이미지에 대한 bounding box와 label을 명시하고 있다.

비행기의 위치가 바운딩 박스에 명시되있다.

 

VOC 폴더에 voc.names 파일 생성하고 xml 파일에 있는 class name 목록을 작성한다.

aeroplane
bicycle
bird
boat
bottle
bus
car
cat
chair
cow
diningtable
dog
horse
motorbike
person
pottedplant
sheep
sofa
train
tvmonitor

powershell

python example.py --datasets VOC --img_path E:/workspace/ml/VOC/VOCdevkit/VOC2012/JPEGImages/ --label E:/workspace/ml/VOC/VOCdevkit/VOC2012/Annotations/ --convert_output_path E:/workspace/ml/VOC/VOC_to_YOLO/ --img_type ".jpg" --manifest_path E:/workspace/ml/VOC/ --cls_list_file E:/workspace/ml/VOC/voc.names
  • --datasets VOC
  • --img_path C:/VOC/VOCdevkit/VOC2012/JPEGImages/
  • --label C:/VOC/VOCdevkit/VOC2012/Annotations/
  • --convert_output_path C:/VOC/VOC_to_YOLO/ --img_type ".jpg"
  • --manifest_path C:/VOC/
  • --cls_list_file C:/VOC/voc.names

 

그 결과

  • VOC_to_YOLO 
  • mainfest.txt

 

VOC_to_YOLO 폴더아래에 각각의 이미지에 대한 텍스트 파일이 만들어진다.

14 0.538 0.452 0.36 0.5
  • 14: label(voc.names의 라인넘버)
  • 0.538 0.452 0.36 0.5: bounding box(좌표)

 

이미지 경로 정보를 가진 manifest.txt 파일이 생긴다.

 

darknet 폴더아래에 복사하기

 

VOC Data set 을 darknet/data/voc 폴더에 복사

manifest.txt (학습할 이미지 파일 경로) 를 복사해서 darknet/data/my_manifest.txt로 생성하고 경로도 수정해준다.

 

 

Darknet을 이용하여 YOLO를 재학습해보자

class 20개인 voc data set과 이미지 2G를 사용하여 YOLO를 재학습해보자.

 

1. 전이 학습 파일 준비

pre-trained model의 weight 파일이 필요하다.

https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.conv.137

학습이 된 가중치 파일이다.

 

2. Configuration(설정)

config 파일이 필요하다. 

ObjectDetection/darknet/cfg 폴더내의 yolo4-custom.cgf 파일을 복사해서 편집하여 사용한다.

 

yolov4-custom.cfg
0.01MB

[net]
# Testing
#batch=1
#subdivisions=1
# Training
batch=64
subdivisions=16
# width=608
width=416
# height=608
height=416
channels=3
momentum=0.949
decay=0.0005
angle=0
saturation = 1.5
exposure = 1.5
hue=.1

learning_rate=0.001
burn_in=1000
# max_batches = 500500
max_batches = 40000
policy=steps
# steps=400000,450000
steps=32000,36000
scales=.1,.1
  • batch
  • subdivisions
  • width, height: 들어오는 이미지 크기
  • max_batches: 현재 클래스 수 * 2000으로 설정
  • steps: max_batches의 80% 수치와 90% 수치로 작성

'yolo' 로 검색해서 수정 (3번나오는데 전부 수정해야함)

[convolutional]
size=1
stride=1
pad=1
# filters=255
filters=75
activation=linear


[yolo]
mask = 0,1,2
anchors = 12, 16, 19, 36, 40, 28, 36, 75, 76, 55, 72, 146, 142, 110, 192, 243, 459, 401
# classes=80
classes=20
  • filter: (5 + class개수) * 3
  • classes: class 개수

 

darknet/data 폴더 아래에 myvoc.data 파일 생성

classes = 20
train = data/my_manifest.txt
names = data/myvoc.names
backup = voc_backup
  • darknet/voc_backup 폴더를 생성하고 여기다 학습을 마친 데이터를 받음

 

3. 학습진행

./darknet detector train data/myvoc.data cfg/yolov4-custom-copy.cfg yolov4.conv.137
  • data/myvoc.data
  • cfg/yolov4-custom-copy.cfg
  • yolov4.conv.137

시간이 너무 오래걸려서 끝까지 진행하지는 못했다.

 

Annotation 만들기 (with labelImg)

화재 이미지에 대한 label 정보와 bounding box를 얻는 annotation 파일을 생성해보자.

여기서 zip파일을 다운 받아서 열어보면 다음과 같이 class 정보를 가진 파일과 실행파일을 볼 수 있다.

 

class를 fire 하나만 남기고 labelImg.exe 를 실행시키자.

 

좌측 메뉴에 Pascal VOC를 클릭하여 YOLO 데이터 셋으로 변환하고 fire.jpg 파일을 open한다.

여기서 우클릭 Create RectBox를 클릭해서 fire가 있는 부분을 잡아준다.

저장하면 fire.txt 파일을 얻을 수 있다.

 

Reference

  • 인공지능 프로젝트를 위한 화재감지 데이터 셋
    0xSEUNGJU
    0xSEUNGJU

    티스토리툴바