yolo v4를 이용하여 도로 위 객체 인식하기

zziyuni·2022년 11월 24일
1

졸업프로젝트

목록 보기
1/1

목차

  1. 프로젝트 소개
  2. yolo란?
  3. yolo 시작하기
  4. yolo로 야간 CCTV영상 분석하기
  5. 필요한 물체만 detection한 후 bounding box 좌표값 가져오기

프로젝트 소개

저는 이번에 졸업 프로젝트로 "spotnight"를 개발할 예정입니다.
spotnight는 spotlight와 night의 합성어로 야간 보행자의 길을 밝혀주는 시스템입니다. 야간 보행자를 인식해 조명을 켜주어야하기 때문에 객체인식 기술이 필요했는데요, yolo가 이에 적합해 보여 yolo를 사용해보려 합니다.

YOLO란?

"You Only Look Once"의 약자로, 다른 모델들에 비해 빠른 처리속도를 보여 실시간으로 객체탐지가 가능합니다.

🙌YOLO 시작하기

colab 환경에서 실행해주겠습니다.

우선 추후에 구글 드라이브에서 테스트할 데이터를 가져와 사용해주어야 하기 때문에 google drive와 연동하는 코드를 작성해줍니다.

그 후 깃허브에서 모델을 가져와 줍니다.
https://github.com/AlexeyAB/darknet

위 링크에 들어가셔서 아래 사진을 참고하여 링크를 복사해준 후

아래처럼 코드를 작성하여 주면 됩니다.

다음으로 연산속도 가속을 위해 OPENCV와 GPU를 사용할 수 있도록 밑에 코드를 작성해줍니다.

Yolov4는 coco dataset의 80 class를 학습한 pretrained weight를 제공하는데, 이를 다운받으면 80개 클래스에 속한 object들에 대한 detection을 추가 학습 없이 할 수 있다고 합니다.

하단에 dataset중 상위 13개 데이터만 예시로 첨부하였습니다^^
(출처: https://tech.amikelive.com/node-718/what-object-categories-labels-are-in-coco-dataset/comment-page-1/)

저희는 사람(person)의 존재에 대한 detection만이 필요하기 때문에 따로 train을 하지않고 아래 코드를 작성하여 yolov4.weight을 다운받아주려합니다.

그 후 분석결과를 가시화 할 수 있는 함수를 작성해줍니다.

그럼 드라이브에 저장해두었던 야간 사진을 한번 분석해보겠습니다.
(참고: !./darknet detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights 이후에는 저장된 사진 경로명을 입력해주시면 됩니다!)

앞서 만들어둔 inShow함수로 분석 결과를 보면 객체를 잘 감지하는 것을 볼 수 있었습니다. (사진 출처: http://www.buan114.com/news/articleView.html?idxno=151)

📹YOLO로 야간 CCTV영상 분석하기

이번에는 YOLO를 이용해 영상을 분석해볼건데요!
데이터는 AI hub의 "어린이 보호구역 내 어린이 도로보행 위험행동 영상" 데이터셋이 있더라구요. 저희가 하려는 프로젝트와 잘 맞는 영상 데이터셋인 것 같아 가져와 보았습니다.
(링크: 어린이 보호구역 데이터셋)

사진 테스트를 했던 것처럼 드라이브에 영상을 업로드하고 코드를 작성해주시면 되는데 찾아보니 colab환경에서는 동영상 출력이 안된다고 하여 "result.avi"로 결과 영상을 저장한 후 다운받아 로컬 환경에서 실행시켜보았습니다.
(참고로 darknet > data 폴더 안에 영상 업로드후 진행하였습니다!)

그런데 아래와 같이 Video-stream stopped!라는 문구가 끊임없이 뜨더라구요ㅠㅠ

열심히 구글링 해보니.. 밑에 링크를 발견했습니다..
https://github.com/stereolabs/zed-yolo/issues/17

시도한 방법들

  1. 경로 문제라기에 영상 저장한 위치 바꾸기..
  2. 현재 위치한 경로 바꿔서 시도해보기..
  3. 위 링크에서 설치하라는거 설치해보기
  4. 특정 코드 추가해주기..

위에 4가지 방법 모두 소용이 없었습니다.. 끊임없이 뜨는 "Video-stream stopped"..😂
그래서 그냥 "다시 처음부터 차근차근 해보자!" 하는 마음으로 파일 업로드도 다시하고 모든 코드를 처음부터 작성해보았습니다!

근데....갑자기 됐습니다....
이전에 왜 안됐는지확실하지는 않지만 제가 내린 결론은 "파일 업로드를 제대로 안해서" 입니다.
분명 이전에는 파일을 업로드하는 시간이 짧았는데 이번에는 업로드하는데 시간이 오래걸리더라구요!
몇 시간을 고생했는데 쉽게 해결돼서 조금 허무하긴하네요ㅎㅎ..

혹시라도 같은 에러가 발생하시는 분들은 파일 업로드를 제대로 했는지 확인해보시는거 추천 드립니다..👍

원본 영상

분석 결과 영상

이렇게 yolo를 이용한 detection이 잘되는 것을 확인할 수 있었습니다!

🚶🏻‍♀️필요한 물체만 detection한 후 bounding box 좌표값 가져오기

이제 저희 프로젝트 주제에 맞게 몇가지 작업을 더 진행하여 볼텐데요,

우선 사람이 아닌 다른 사물을 detection할 필요가 없기 때문에 필요한 output만 남기고 나머지는 제거해주었습니다.
방법은 간단하게 darknet/data/coco.names에서 필요없는 output 앞에 dont_show를 붙여주면 됩니다!

밑에 결과화면을 보시면 이전과 다르게 car, truck등의 bounding box가 생기지 않는 것을 확인하실 수 있습니다.

결과화면

다음으로 bounding box의 좌표값을 가져오는 작업을 해보겠습니다.
앞서 작성했던 코드 끝에 -ext_output 만 추가해주면 아래와 같이 bounding box의 좌표 값들이 나옵니다.

결과화면

제가 이번에 사용한 COCO의 경우 (좌상단 x, 좌상단 y, bouding box의 W, bounding box의 H)의 형태로 좌표값을 출력합니다.

이제 남은 과제는

  1. 어두운 환경에서도 detection이 잘 되는지 확인하기
    -> 영상의 밝기를 낮추어 테스트 해보면 되지 않을까..!
  2. bounding box 좌표(centerX, centerY, w, h) 형식으로 바꾸기
  3. 아두이노와 연결하기

등등이 남아있는 것 같습니다.

이렇게 YOLO를 사용해보는 시간을 가졌고 앞으로 남은 과제들도 하나 하나 해결하여 찾아뵙도록 하겠습니다😊

참고 링크
bounding box 좌표 출력
필요한 output만 출력

1개의 댓글

comment-user-thumbnail
2022년 12월 22일

잘 읽었어요~

답글 달기