본문 바로가기

프로젝트/활동

시각장애인을 위한 거리 측정 보행 보조 안내 프로젝트 회고 - 3학년 캡스톤 디자인

728x90
반응형

이 프로젝트를 진행할 때는 "어 이거 잘만 하면 괜찮겠는데" 라고 생각을 했는데

'잘만 하면'이 잘 안되는게 이런거구나 하고 깨닫게 해준 프로젝트였습니다.

 

이번 회고는 3학년 2학기 캡스톤디자인 프로젝트에 대한 회고입니다.

 

저는 평소에 밥을 먹을 때 유튜브가 없으면 밥먹기가 힘든 병에 걸려서 뉴스든 예능이든 뭐든 틀어놔야합니다.

평소처럼 밥을 먹으면서 유튜브를 틀어놨는데 이 날 만큼은 그냥 뉴스가 보고싶더라구요.. 

 

그래서 아무 뉴스나 틀어놨는데 시각장애인이 킥보드 때문에 길거리 걷기가 힘들다는 뉴스를 보게되었습니다.

그리고 바로 뭔가 하나 떠올렸는데 그게 바로 이번 캡스톤 디자인의 프로젝트 주제였습니다.

 


 

 

어려웠던점


갑자기 뜬금없이 바로 어려웠던점이 나오는데 이번에는 이렇게 해야 뭔가 제 한이 풀릴것같은 느낌이 들어서

이렇게 써보려고 합니다.

 

시각장애인이 킥보드 때문에 보행이 어렵다면 보행하는 길거리에 뭐가 있는지 알려주면 어느정도 해소가 되지 않을까 하는 생각에 스마트폰 또는 로봇카를 활용하여 객체를 인식하고 거리를 측정하는 프로젝트를 계획했습니다.

 

 

객체를 인식하는거야 yolo나 다른 인식모델이 있으니 후순위로 미루고 인식이 되었을 때

해당 객체와 얼마나 멀리 떨어져있는지 거리를 측정해서 알려줘야 하는데 이걸 어떻게 해야할지 몰랐습니다.

 

인터넷에 찾아보니 스테레오 비전 기법을 이용하면 실제 거리를 계산할 수 있다고 하던데,

 

 

스테레오비전에 대해 찾아보니 두 개의 카메라를 이용하는 것이더군요.

 

"오 내 폰에 카메라 두 개 이상 달려있는데 그냥 이대로 사용하면 되나?" 싶었는데

동일한 두 카메라를 사용해야 정확한 결과가 나온다고 하더군요.

 

유튜브에 스테레오 비전을 사용해서 거리를 측정하는 영상이 있나 찾아보니 은근히 있었습니다.

두 개의 웹캠을 연결해서 OpenCV에 스테레오 비전 함수를 사용하면 간단하게 되는 것 같아서 

 

웹캠을 스마트폰에 연결하고 영상을 어떻게 가져올지 찾아보았습니다.

아마 여기가 이번 프로젝트의 가장 큰 난관이 아니었을까 싶습니다...

 

 

대강 카메라 두 개를 허브에 연결해서 스마트폰에 연결하면 되지 않을까 그리고 안드로이드 API같은게 있지 않을까

했는데 아니었습니다.

 

ANDROID DEVELOPER에 USB Camera에 대해 찾아보니 문서가 있긴 한데 C++로 작성되어있고 

뭔소린지 하나도 몰랐습니다

 

JNI에 대해 어느정도 정말 어느정도 거의 쥐의 발톱만큼 알고 있었지만 이걸 여기서 사용할줄은 몰랐네요

웹캠을 연결하는 과정을 처음부터 작성해야한다고 생각하니 약간 어지러웠는데

 

어떤 일본인이 만든 UVCCamera 라는 라이브러리를 알게 되고 프로젝트랑 연결을 해보려고 했는데

해당 라이브러리가 마지막으로 업데이트 된 날짜가 6년전 7년전 이래서 현재 버전이랑 하나도 안맞고

애초에 C++로 만들어져있어서 이걸 어떻게 JAVA로 변환해야하는지도 모르겠고

연결 조차 안되어서 이걸 계속 해야하나 하던중

 

어떤 중국인이 만든 Libusbcamera 라는 라이브러리를 알게되었습니다. 이게 저의 구세주가 될줄은 몰랐죠

이 사람이 만든라이브러리는 UVCCamera 라이브러리를 기반으로 helper 클래스 등등을 만든 라이브러리인데

 

사실 이런거 필요없고 저는 UVCCaemra 라이브러리가 Java로 되어있는 부분이 정말 필요했습니다.

이 라이브러리는 비교적 최근거여서 버전이 맞는지 제대로 돌아갔고 결국 프로젝트에서 동작하였습니다.

 

하지만 Libusbcamera에서 사용하는 UVCCamera 버전은 최신 버전이 아니어서 업데이트가 안되어 있는 부분이 있는데

이런 부분은 일부 수정을 거쳐서 사용했습니다.

 

이렇게 개발환경 세팅하는데 거의 한 달 정도? 사용한 것 같습니다. 다른 일도 겹쳐서 여러 일을 동시에 하는데

정말 바빴던 것 같습니다

 


 

 

프로젝트 소개


앞서 설명했던 대로 이 프로젝트는 시각장애인이 안전하게 보행할 수 있도록 객체를 인식하고 거리를 측정할 수 있도록 개발하는 프로젝트입니다.

 

여기서는 스마트폰과 카메라가 연결되어있는 구성 1과 스마트폰과 로봇카가 연결되어 있는 구성 2 둘 중에 하나만 사용하거나 둘 다 사용하여 동작할 수 있도록 계획하였습니다.

 

거리를 측정하는 방식은 구성 1에서는 스테레오 비전, 구성 2에서는 라이다 센서를 이용합니다.

 

 

 

 

스마트폰에 연결되어 있는 두 개의 카메라를 이용해서 거리를 측정하는데 OpenCV 책을 보면서 스테레오 비전에 대해 

공부를 하면서 진행했습니다.

 

컴퓨터 비전에 대해서 이번에 처음 접한 분야이고 자바-코틀린, 애플리케이션에서 진행된 다른 프로젝트가 없다보니

참고할만한 예제가 없어서 상당히 어려웠던 것 같습니다.

 

객체가 탐지되고 거리를 측정하면 일정 주기로 사용자에게 TTS로 안내하면 안전하게 보행할수 있지 않을까

하는 것이 저희 프로젝트의 목표입니다.

 

 

파이썬으로 되어 있는 프로젝트를 참고해서 앱을 구현해봤는데, 문제점이 발생했습니다. 일단 USB CAMERA의 영상을 받아오는 함수가 인터페이스로 구현되어지는데 이게 카메라당 하나로 구현되는게 문제였습니다. 

 

파이썬에서는 하나의 반복문에서 동기식으로 구현되지만 앱에서는 비동기식으로 구현해야하니 영상이 매칭되지 않는 현상?이 발생했습니다.

 

이를 해결하기 위해 임시 방편으로 각각의 인터페이스 함수에서 거리 계산이 모두 동작되도록?

그냥 먼저 영상을 받아오면 그대로 거리 계산 함수가 동작되도록 코드를 구현했더니

어느정도 개선이 되었지만 완벽하게 해결하는 방법이 아니다보니 나중에 해결해야할 문제가 되었습니다.

 

지금까지 구현된건 Haar cascade를 이용해서 얼굴을 인식하고 disparity를 기반으로 거리를 계산합니다.

그리고 측정된 거리를 반환합니다.

딱 여기까지.... 그래서 완벽하게 개발된것이 아니며 프로토타입이라고 할수있는....

 

로봇카는 다른 팀원이 작업하는것이라 저는 잘 모르고 일단 제가 담당했던 애플리케이션은 여기까지 입니다..

 

시각장애인이 어떻게 애플리케이션을 동작시키냐 라고 생각할 수 있는데, 그래서 스마트폰을 흔드는 방식으로 제어할 수 있도록 Shake Gesture 방식을 도입했습니다. 스마트폰을 두 번 흔드면 바로 화면이 넘어갈 수 있도록 하는겁니다.

 

그리고 어느정도 시력이 존재하는 저시력자들을 위해 보색을 이용해서 화면을 구성했구요.

 

이 프로젝트가 계속될지는 모르겠는데 괜찮은 도전이었다고 생각됩니다.

 


 

 

만족했던 점


1. 비록 사용되지는 못했지만 CameraX 에대해 공부할 수 있는 기회가 생겼습니다.

 

처음에는 Camera X를 이용해서 인식을 할까 했는데 카메라 두 개가 필요한 것을 깨닫고 다른 방식으로 구현되었습니다. 만약 CameraX가 외부 카메라를 인식해서 사용할 수 있게 했다면 좋았을 테지만요.. 그래도 CameraX에 대해 공부할 수 있는 기회였습니다.

 

 

2. OpenCV에 대해 공부할 수 있는 기회가 생겼습니다.

 

OpenCV는 이번 프로젝트의 핵심 라이브러리중 하나입니다. 스테레오 비전을 이용하려면 이 라이브러리를 이용할 수 밖에 없죠. 아니면 일일이 구현하거나. 러닝 OpenCV3 책을 도서관에서 빌려 읽다가 이제는 구입까지 했습니다. 방학에 이 책을 정독해서 배워볼까 합니다. 이책은 C++로 적혀있어서 일단 C++로 시작하고 안드로이드에서는 네이티브 c 로 프로젝트를 시작하는 방식으로 변경할까 고민중에 있습니다.

 

c++로 하면 일단 동작시간이 빠른데, 사실 OpenCV 라이브러리가 C++로 되어있으면 별차이 없지 않을까 생각이 들지만요.

 

 

3. 이 프로젝트를 기회로 Tensorflow Lite에 관심이 생겼습니다.

 

단안카메라로 시차맵을 생성해서 거리를 측정할 수 있는 방법이 없을까 찾아보던중 Tensorflow Lite로 하는 프로젝트가 있었습니다. 아쉽지만 해당 프로젝트는 실제 거리를 반환하지는 않지만 신기해서 따라서 해보면서 공부하고 있습니다.

 

조금 더 응용하면 실제 거리도 측정하는 방법을 찾을 수 있지 않을까요.

 

 


 

 

 

아쉬웠던점


1. 몰랐던 분야여서 공부하며 진행했기 때문에 역시나 개발 속도가 늦어졌습니다.

 

하던 분야에서는 그저 그런 프로젝트가 나올 것이 분명했기에 새로운 분야를 찾을 수 밖에 없었습니다. 그리고 결과는 역시나 원래의 목표만큼 진행되지는 못했습니다. 이러한 부분은 어쩔 수 없었나봅니다.

 

 

2. 인원 역할 분배

 

약간 반 억지로 팀을 구성해서 진행해서 그런지 팀원들이 자율적으로 진행하지 않았습니다. 하자 해야 하고 먼저 말을 하지 않으면 하지 않는 형태였습니다. 친구들이여서 팀을 꾸렸지만 프로젝트에서는 현실적인 거리와 멀었나봅니다. 이전에도 비슷한 경험을 하였는데 팀을 꾸릴 당시 비슷한 시기여서 같은 실수를 또 반복했네요.

 

 

3. 짧은 개발 기간

 

한 학기 거의 3달 동안 진행한 결과였는데, 보통은 1학기때부터 이어서 하지만 도중에 새로운 주제로 하다보니 개발 기간이 짧았습니다. 이번 프로젝트를 이어서 진행할지 아니면 새로운 프로젝트를 진행할지는 더 고민을 해봐야겠습니다.

 

 

4. 스테레오 카메라 

 

웹 캠 두개를 사용하지 않고 애초에 스테레오 카메라를 구매해서 사용했다면 프레임 동기화 문제는 이미 해결했을텐데 이 부분이 정말 아쉽습니다. 라이브러리 특성을 잘 모르고 재료를 구매한 결과였던 것 같습니다. 파이썬에서는 상관없지만 안드로이드에서는 카메라 하나당 콜백함수로 구현되기 때문에 많이 아쉬운 결저이었던 것 같습니다.

 


 

 

다음에 시도해볼점


1. 스테레오 카메라

 

이 프로젝트를 계속 진행한다면 우선 스테레오 카메라부터 구매할 예정입니다. 카메라를 하나의 쓰레드로 관리한다면 그것만으로도 성능 개선의 효과를 가져올 수 있다고 생각하고 있습니다.

 

 

2. c++ 프로젝트

 

안드로이드를 C++로 개발할 수 있습니다. OpenCV 라이브러리는 C++로 작성되어있기 때문에 이미지 처리 과정을 전부 C++에서 동작하게 만든다면 속도 개선효과를 가져올 수 있다고 생각합니다.

 

 

 

728x90
반응형