Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

동그란 도그린

Yolov3를 이용한 화재 탐지 본문

프로젝트/졸업프로젝트

Yolov3를 이용한 화재 탐지

도그rin 2021. 11. 24. 01:35

이 프로젝트를 진행한지 3개월이 다 되어가는데요. 프로젝트를 진행하면서 머신러닝 공부를 하고 있습니다. (요즘 매일매일 시행착오를 겪으며 인내심을 기르는 중이랍니다..)

 

저희 팀 '자율주행 산불 탐지 드론'의 주요 기능은

1) 자율주행
2) 산불 탐지
3) 산불 위치정보 전송

이 3가지입니다. 이 중에서 산불 탐지는 아래와 같은 과정으로 하려고 합니다.

저희는 일단 드론에서 object detection을 하고, 드론의 영상을 통해 이차적으로 컴퓨터에서 classification을 하도록 구현할 예정입니다.

 

오늘은 object detection에 사용할 알고리즘에 대해 이야기하겠습니다.

 

왜 YOLO인가?

 

object detection을 할 때 정확도도 정말 중요하지만, 저희 프로젝트의 목표가 산불의 초기 대응을 돕는 것이기에 탐지 속도가 빠른 알고리즘을 찾고 있었습니다.

 

저희는 YOLO나 Faster R-CNN를 고려 중이었는데요,

Faster R-CNN는 처리 시간이 느려 실시간 객체 검출이 불가능한 반면에, YOLO는 처리 시간이 빠르고 실시간 객체 검출이 가능하다고 합니다.

 

따라서 저희 팀은 YOLO를 사용하기로 했고, 오늘은 Yolov3를 이용해 테스트해보려 합니다.

 

학습 데이터셋

 

저희는 화재 인식의 정확도를 높이기 위해 학습 데이터셋을 최대한 많이 확보하고자 했습니다. (kaggle에 데이터셋이 많으니 여기서 다운받으면 좋을 것 같습니다)

 

실제 산불 탐지 시에는 더 많은 데이터셋을 이용할 생각이나 일단 오늘은 100장의 사진을 학습 데이터셋으로 사용하려고 합니다.

 

학습 데이터셋을 만들기 위해서는 labelImg를 이용하여 아래와 같이 라벨링 작업을 해주어야 합니다.

1) 좌측의 open dir을 눌러 불러올 이미지 파일의 경로를 지정해줍니다.
2) 좌측의 change save dir을 눌러 결과물 저장 위치를 지정해줍니다.
3) 좌측에서 PascalVOC와 YOLO 모드 중에 YOLO를 선택해줍니다.
4) 좌측의 CreateRectBox를 누른 뒤 라벨링 작업을 합니다.

다들 이 작업이 힘들다는데 저는 아무 생각 없이 할 수 있어서 좋았답니다..ㅎㅎ

이렇게 라벨링 작업을 해주면 아래처럼 txt 파일들이 생깁니다.

 

그리고 .cfg 파일이 필요한데 이건 yolov3.cfg의 내용을 살짝 수정해주면 됩니다.

training 부분을 아래와 같이 수정해줍니다.

 batch=64
 subdivision=16
 max_batches=(class 개수)*2000 : 저는 class가 1개라서 max_batches=1로 설정했습니다.
 steps=(max_batches의 80%), (max_batches의 90%)
 filters=(class 개수+5)*3

 

학습 및 테스트하기

 

저는 사실 처음에 아래와 같은 장점 때문에 google의 Colab을 이용했습니다.

Colab의 장점
1) 무료이다.
2) 사용하기 편리하다.
3) 클라우드 기반으로, 여러명이 접속 및 수정 가능하다.
4) 성능이 좋고 빠르다.

Colab에서 yolov3를 실행하는 방법은 다음과 같습니다.


✔ 다음 코드를 실행하여 구글 드라이브에 연결해줍니다.

from google.colab import drive
drive.mount('/content/gdrive')
!ln -s /content/gdrive/My\ Drive/ /mydrive
!ls /mydrive

 

✔ 그리고나서 Darknet clone을 해줍니다.

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

 

✔ Nvidia GPU 이용해서 Darknet 컴파일해줍니다.

%cd darknet
!sed -i 's/OPENCV=0/OPENCV=1/' Makefile
!sed -i 's/GPU=0/GPU=1/' Makefile
!sed -i 's/CUDNN=0/CUDNN=1/' Makefile
!make

 

✔ Darknet 네트워크 알아내고 다음 명령어를 통해 학습 데이터셋을 만들어줍니다. (.cfg 파일에서 어느 부분을 수정해야하는지는 위에 데이터셋 만드는 부분에 적어놨습니다!)

!cp cfg/yolov3.cfg cfg/yolov3_training.cfg
!sed -i 's/batch=1/batch=64/' cfg/yolov3_training.cfg
!sed -i 's/subdivisions=1/subdivisions=16/' cfg/yolov3_training.cfg
!sed -i 's/max_batches=500200/max_batches=4000/' cfg/yolov3_training.cfg
!sed -i 's/610 s@classes=80@classes=1@' cfg/yolov3_training.cfg
!sed -i 's/696 s@classes=80@classes=1@' cfg/yolov3_training.cfg
!sed -i 's/783 s@classes=80@classes=1@' cfg/yolov3_training.cfg
!sed -i 's/603 s@filters=255@filters=18@' cfg/yolov3_training.cfg
!sed -i 's/689 s@filters=255@filters=18@' cfg/yolov3_training.cfg
!sed -i 's/776 s@filters=255@filters=18@' cfg/yolov3_training.cfg
!mkdir "/mydrive/yolov3"
!echo "fire" > data/obj.names
!echo -e 'classes= 1\ntrain = data/train.txt\nvalid = data/test.txt\nnames = data/obj.names\nbackup = /mydrive/yolov3' > data/obj.data
!mkdir data/obj
!wget https://pjreddie.com/media/files/darknet53.conv.74

 

✔ 다음 명령어를 통해 image 파일 압축을 풀어주고, 이미지를 추출해줍니다. (참고로 제가 사용한 images.zip 파일은 위에서 라벨링 작업 결과물인 .txt 파일들과 이미지 파일들을 압축한 파일입니다)

!unzip /mydrive/yolov3/images.zip -d data/obj
import glob
images_list = glob.glob("data/obj/*.jpg")
print(images_list)
file = open("data/train.txt","w")
file.write("\n".join(images_list))
file.close()

 

✔ 마지막으로 다음 명령어를 통해 학습을 시킵니다.

!./darknet detector train data/obj.data cfg/yolov3_training.cfg darknet53.conv.74 -dont_show

위의 명령어를 실행했을 때 이런 화면이 뜨면서 학습됩니다!


하지만 Colab을 이용하다보니 단점이 크게 다가와 우분투로 갈아타게 되었습니다..

Colab과 우분투 중에 고민 중이시라면 이를 참고하시면 좋을 것 같습니다! (저는 개인적으로 우분투를 추천드립니다)

Colab의 단점
1) 세션 유지 제한 시간이 12시간이다.
2) gui 지원을 하지 않는다.

 

우분투에서 아래 명령어를 이용해서 학습시켰고,

./darknet detector train data/obj.data cfg/yolov3_training.cfg darknet53.conv.74 -dont_show

정말 우여곡절 끝에 학습을 완료했습니다.

 

학습 중인 화면은 위와 같습니다! (학습 시간이 오래 걸리므로 여유있을 때 하시는 게 좋을 것 같습니다..)

 

마지막으로, 아래와 같은 명령어를 사용하여 테스트하면 됩니다!

./darknet detector test data/obj.data cfg/yolov3_training.cfg yolov3_training_last.weights

 


제가 머신러닝을 공부하면서 느끼는 건데 이건 정말 인내심이 필요한 작업인 것 같습니다. 학습시키는 시간이 정말 오래 걸려 전 난생처음으로 노트북을 켜놓고 자기도 했습니다(아래 사진처럼..) 그래도 막상 결과물을 보면 힘든 순간은 다 잊혀지고 뿌듯함만 남게 되는 것 같습니다. (사실 힘든 순간이 전부 다 잊혀지지는 않습니다..ㅎㅎ)

어둠 속에서 혼자 돌아가는 컴퓨터(코랩 돌리다가 결국 실패했지만요..)

그럼 이만 글을 마치도록 하겠습니다!

 

Comments