Skip to content
/ Seesun Public

시각 장애인의 안전한 보행을 위한 객체 탐지 프로그램

Notifications You must be signed in to change notification settings

bosl95/Seesun

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

시선(視先)


구성원 : 박은소리, 안예지, 김유리


視先(볼 시, 먼저 선)

📢 "먼저 바라보고, 시각 기능을 제공하다."


시각 장애인의 안전한 보행을 위한 횡단보도/신호등 탐지 프로그램


👇 [YOLO 결과] 클릭하여 영상 재생 👇

Video Label

👇 [실행화면] 클릭하여 영상 재생 👇

Video Label


✔️ Contents

  1. Data processing

  2. Modify cfg for custom data

  3. Train YOLO Model

    3-1. Train YOLOv3 tiny on Google Colab
    3-2. Train YOLOv4 on Google Colab

  4. How to Increase Accuracy

  5. Detect on Video


📌 Project Summary

📚 개발 배경

  • 대중교통 이용의 불편함 [출처 : 유튜브 MBCNEWS]

    대중교통, 특히 버스의 경우 타고자 하는 버스가 오는지 안 오는지 확실하게 판단하기 힘들다. (ex.버스 탑승을 위해 평균 20~30분을 기다리는 시각장애인들, 잘못된 버스를 타는 경우도 흔함)

  • 시각 장애인의 눈이 되어 그들의 보행을 돕는 안내견 [출처 : 웰페어 뉴스]

    안내견 탑승 및 출입 거부는 위법행위임에도 불구하고 여전히 안내견에 대한 불편한 인식이 산재한다. (ex. 대중교통 탑승 거부, 식품접객업소 출입 거부 등등)


📝 개발 목적

안내견이나 기존의 시각 장애인 보조 서비스가 있음에도 불구하고, 실제 시각장애인들의 보행에 어려움이 많았다. 이를 개선하기 위해 음성 안내 서비스 '시선(視先, 먼저 보다)'을 고안하였다.

'시선'은 영상 처리를 활용하여 객체를 탐지하고, 음성으로 안내하는 서비스이다.

이를 통해 시각장애인들의 안전한 보행을 돕는 것을 목표로 한다.


💡 Insight

  • 시각 장애인과 비시각 장애인의 "안전" 차이
    • 시각 장애인의 안전 : 직접 부딪히고 닿아서 물체의 위치 확인. 벽에 붙어서 보행
    • 비시각 장애인의 안전 : 아무 물체가 없는 중간이 안전하다고 생각하고 중간으로 안내

    시각장애인의 needs에 초점을 맞춰 기능을 구현


📌 Background

✏️ Darknet

C언어로 작성된 물체 인식 오픈 소스 신경망
YOLO 개발자가 특별히 제작한 프레임워크 빠르고 GPU/CPU와 함께 사용이 가능하나, 리눅스에서만 호환된다.

✏️ Darkflow

Darknet을 Tensorflow에 적용
빠르고 GPU/CPU와 함께 사용이 가능하고 Linux/Mac/Window에서 호환이 가능하나, 설치가 복잡하다.

✏️ YOLO란?

⚡ CONCEPT

"darknet을 통해 학습된 신경망"

이전 탐지 시스템은 classifier나 localizer를 사용해 탐지를 수행한다.
하지만 YOLO는 하나의 신경망을 전체 이미지에 적용한다.
이 신경망은 이미지를 영역으로 분할하고 각 영역의 Bounding Box와 확률을 예측한다.
이런 Bounding Box는 예측된 확률에 의해 가중치가 적용된다.


❔ How to Run YOLOV4

🔥 Run YOLOv4

  1. dark net의 weight ⇒ yolov4.weights 으로 변환하는 과정.

    # Convert darknet weights to tensorflow
    ## yolov4  버전
    python save_model.py --weights ./data/yolov4.weights --output ./checkpoints/yolov4-416 --input_size 416 --model yolov4 
    
    ## yolov4-tiny 버전
    python save_model.py --weights ./data/yolov4-tiny.weights --output ./checkpoints/yolov4-tiny-416 --input_size 416 --model yolov4 --tiny
    
  2. object detection이 잘 되는 지 확인하기

    # Run demo tensorflow
    python detect.py --weights ./checkpoints/yolov4-416 --size 416 --model yolov4 --image ./data/kite.jpg
    
    python detect.py --weights ./checkpoints/yolov4-tiny-416 --size 416 --model yolov4 --image ./data/kite.jpg --tiny
    
  3. 결과

    ⇒ yolov4 weight (위) / yolo4-tiny (아래)

    속도는 tiny가 훨씬 빠르다.



Google Colab

👉 Click

yolo를 노트북에서도 사용하기 위해서는 GPU를 사용해야 한다.

이를 위해서 Google에서 지원하는 Colab을 이용해 yolo를 구동시킬 수 있다.


Colab을 세션을 12시간만 유지시켜주기 때문에 저장이 불가하다.

⇒ 구글 드라이브에 데이터를 저장해 놓고 마운트 해서 쓸 수 있다


💡 Colab 런타임 장시간 세션 유지하기

function ClickConnect() { // 백엔드를 할당하지 못했습니다. // GPU이(가) 있는 백엔드를 사용할 수 없습니다. 가속기가 없는 런타임을 사용하시겠습니까? // 취소 버튼을 찾아서 클릭 var buttons = document.querySelectorAll("colab-dialog.yes-no-dialog paper-button#cancel"); buttons.forEach(function(btn) { btn.click(); }); console.log("1분마다 자동 재연결"); document.querySelector("#top-toolbar > colab-connect-button").click(); } setInterval(ClickConnect,1000*60);  

F12를 눌러 자바 스크립트 창에 입력해주면 된다.

💡 주피터 노트북이 명령 프롬트에서 입력한 것처럼 처리하는 명령어

  • ! : 쉘이 끝나면 유지 되지 않음
  • % : 쉘이 끝난 후에도 계속 유지

<실행 화면>


📌 Custom YOLO Model

✏️ Data Processing

👉 Click

🔎 신호등 데이터셋 : [AI Hub]

신호등이 있는 사진과 Bounding Box가 되어있는 xml파일을 받았으나, :warning: 보행등과 차량등이 분류가 되어있지 않다⚠️ 는 문제점이 발생하였다.

💡 해결방안

  1. 우선적으로 데이터 셋에 신호등이 다 있는 것도 아니기 때문에 1차적으로 신호등을 찾아준다.
    ⇒ 신호등 label을 갖는 사진을 분류한다는 의미

  2. label을 확인함과 동시에 신호등 사진을 띄운다. 그 사진속에 있는 신호등이 보행등이라면 저장, 차량등이라면 저장하지 않고 넘어간다.

  3. 사진을 저장하는 경우에 label 데이터는 가공이 필요하다.
    현재 AI hub에서 제공되는 Bounding Box 좌표 ⇒ (좌상단 x, 좌상단 y, 우하단 x, 우하단 y좌표)


✏️ Data File for YOLO

👉 Click

📃 obj.data : 학습을 위한 내용이 담긴 파일

  • classes 개수
  • train.txt와 valid.txt의 경로
  • obj.names의 경로
  • weight을 저장할 폴더의 경로

📃 obj.cfg : 모델 구조 및 train과 관련된 설정이 들어있는 파일

  • batch : 한번에 몇 장을 처리할 지
  • subdivisions : batch를 이 값만큼 나누어 처리이즈
  • width, height
  • learning late, burn_in, max_batches, policy, steps, scales 설정
  • filter : (4+1+class수) x 3
  • classes
  • anchors : 초기의 크기(너비, 높이), (개체 크기에 가장 가까운)일부는 신경망(최종 기능 맵)의 일부 출력을 사용하여 개체 크기로 크기가 조정
  • mask

📃 weight : 미리 트레이닝된 모델 또는 darknet53.conv.74 등의 가중치 파일

📃 obj.names : annotation에 포함되어있는 라벨링 이름 목록. 검출하고자 하는 목록

📃 train.txt : 학습시킬 이미지들의 경로들이 담긴 리스트

📃 valid.txt : 학습 시 validation 할 이미지들의 경로들이 담긴 리스트


✏️ Modify cfg For Custom Data

👉 Click

⚡ cfg 설정



🔹 max_batches = number of classes * 2000
🔹 steps = max_batches의 80%, max_batches의 90%

⚡ anchor 계산

ℹ️ Source

👉 How To set cfg File

🔥 https://murra.tistory.com/115
📍 https://keyog.tistory.com/22
📍 https://eehoeskrap.tistory.com/370
📍 https://codingzzangmimi.tistory.com/76
📍 https://go-programming.tistory.com/160
📍 https://github.com/AlexeyAB/darknet#how-to-train-to-detect-your-custom-objects



✏️ Train YOLOv3 tiny on Google Colab

👉 Click

🔥 train custom data

!./darknet detector train custom/custom.data custom/custom_yolov3-tiny.cfg custom/yolov3-tiny.conv.15 -dont_show 
  • 원래 map과 loss에 대한 그래프가 나오는데 코랩의 리눅스 상에서는 볼 수 없는 듯하다.
    에러가 나기 때문에 dont_show를 추가해 보지 않는 것으로 처리해준다.

📃 yolov3-tiny.conv.15 : pre-train된 weight

Fine-Tuning을 하고 싶을 떄 마지막 레이어를 삭제하고 모델 파일과 가중치 파일을 이용하여 darknet53.conv.74 처럼 가중치 파일을 생성 할 수도 있다.

./darknet partial cfg / yolov3-tiny.cfg yolov3-tiny.weights yolov3-tiny.conv.15 15

🔥 detect custom model

!./darknet detector test custom/custom.data custom/custom_yolov4-tiny.cfg custom_yolov4-tiny_last.weights -thresh 0.25 -dont_show -ext_output < custom/train.txt > result.txt  

❌ tarin.txt에 있는 이미지의 경로를 읽어오지 못한다는 에러 발생

⇒ 경로가 제대로 설정 되어 있음에도 에러가 발생한다면,

1. 절대 경로로 재설정

2. 리눅스상에서 읽을 수 있는 포맷으로 변환 ( module : dos2unix )

!apt-get install dos2unix   
!dos2unix custom/train.txt  # to linux format

✏️ Train YOLOv4 on Google Colab

👉 Click
!./darknet detector train custom/class.data cfg/yolov4.cfg yolov4.conv.137 -dont_show -map

학습 전까지의 과정은 YOLOv3-tiny와 크게 다른 점은 없다.


✏️ How to Increase Accuracy


✏️ Detect on Video


⚡ Using Python OpenCV

파이썬의 OpenCV를 사용하기 위해 Darknet 모델을 Keras 모델로 변환

👉 Click



📌 YOLO Object Detection on Android

✏️ Make yolo tensorflow for Android

👉 Click

It's too slow for real-time detection. 😂


✏️ Detection on Linux server

👉 Click


📌 Text To Speech

횡단보도와 신호등을 TTS 음성을 통해 안내

👉 Click


About

시각 장애인의 안전한 보행을 위한 객체 탐지 프로그램

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages