인공지능 과목 마지막 프로젝트

제안서 제작 기간 : 2016/11/12 ~ 11/24
PPT 제안서 : https://drive.google.com/file/d/0B3mC_hyBIvc8SXZmUzB6MUpWVms/view?usp=sharing

프로젝트 제작 기간 : 2016/11/24 ~ 12/08
PPT 결과 보고서 : https://drive.google.com/file/d/0B3mC_hyBIvc8aWFISEtnT016UG8/view?usp=sharing

소스코드 : https://github.com/nipa0711/Motorcycle-detection

테스트 데이터 : https://drive.google.com/file/d/0B3mC_hyBIvc8UHhxUUFnd19ndzQ/view?usp=sharing



최종 결과 영상



/////////////////////////////////////////////////////////////////////////////////////////////

수정 날짜 : 12/07

동영상을 실행하고, 동영상 내부에서 오토바이를 인식하도록 만들었습니다.

다만, 성능의 문제로 인하여 동영상 해상도는 낮은 것을 써야 될 수도 있습니다.

제 노트북 기준으로 HD 영상은 힘들더군요.



cascade 에 관해서인데, 인식률과 오인식률이 비례하는 듯한 느낌입니다.

높은 인식률은 그 만큼 높은 오인식률을 보여주더군요.

어떤걸 하는게 맞을까 고민하다가, 높은 인식률을 선택했습니다.

확실한것은 cascade의 학습량에 따라서 좀 더 개선될 여지는 충분합니다만,

일단 목표한 것은 달성했다고 볼 수 있겠습니다.



사실 이 이미지는, 당연히 인식이 되지 않을 것으로 예측하고 받은 이미지인데,

인식을 해 버리더군요.





최종본 다운로드 :
https://drive.google.com/file/d/0B3mC_hyBIvc8SXZmUzB6MUpWVms/view?usp=sharing






/////////////////////////////////////////////////////////////////////////////////////////////

수정 날짜 : 12/02

OpenCV 를 활용하여 제작하고 있습니다.




원본 입력시





아래와 같이 찾습니다.





현재 일부 샘플에 대해서는 원하는 결과를 바로 찾아주는 수준까지는 왔지만,

컴퓨터 사양의 문제상, 많은 샘플을 학습시킬 수가 없으며,

적은 샘플로는 여전히 오인식하는 경우가 많습니다.


버전1 다운로드 :
https://drive.google.com/file/d/0B3mC_hyBIvc8N3dpOG5PdW9jbTA/view?usp=sharing

이미지 처리만 가능합니다.

개학과 동시에 졸업작품을 제작하는 프로젝트가 시작은 되었지만,

실제로는 약 2주간은 제안서 작성으로 소모되는게 현실이고,

남은 2주간은 다시 부품 구매 제안서 및 허가가 나기를 기다립니다.




그리고 4월 3일 이후로 구매가 가능하며,  그 말은 실제 부품 수령등은 4월 둘째주에나 가능하게 됩니다만,

일단은 프로젝트가 마인드스톰 위에 라즈베리파이를 올리고 카메라와 연동하여 작동되는 무인자동차이니 만큼, 친구에게서 미리 라즈베리를 빌렸으며, 일단은 선행작업으로 OpenCV 공부 및 개발을 미리 진행하고 있습니다.




2015/03/20 작업내용




OpenCV 예제 2개를 엮어서, 간단한 속도안내판 인식을 테스트 해봤습니다.


문제점 : 템플릿을 이용한 방식 [ Template Matching ] 인데, 위에서 이용한 템플릿의 경우, 속도안내판 30과 40의 차이가 적은 관계로 둘다 동일하게 인식합니다.
즉, 차이를 더 주던가 아니면 템플릿 비교를 다른 인식 알고리즘으로 교체 혹은 다른 방법으로 개발해야 될 필요성이 있습니다.
또한 카메라와 일정거리에서만 제대로 작동하며, 아직 앞뒤로 움직일 경우의 인식에 대해서는 보장하지 못합니다.
템플릿 이미지 사이즈 조절등이 필요합니다.



노트북 웹캠 + VS2013 을 이용한 작업이였는데, 웹캠에서 실시간 영상을 받아와서 그 인식을 해봤다는데서 의의가 있습니다.
학교 영상처리 수업에서는 bmp파일만 다뤄봤었는데, OpenCV 를 활용하니 사실상 API 호출 수준으로 매우 쉽게 영상에서 프레임 단위로 뽑아와서 처리가 가능했습니다.




2015/03/25 작업내용




현재까지 구현한 템플릿 매칭 알고리즘으로서는 위의 속도제한 표지판 30과 40을 구별해내지 못합니다.

그리하여 다른 알고리즘 확인을 테스트 해 볼겸 SURF 라는 알고리즘으로 구현된 예제를 발견, 적용해봤습니다.

일단 기존 템플릿이 30과 40을 전혀 구별하지 못했다면, SURF의 경우는 구별을 하는 경향이 있으나, 역시 완벽하지는 않았으며, 무엇보다 사각형을 제대로 그려주지 못하는 문제점이 있습니다.

제일 큰 문제점이라면 역시 속도 문제 입니다.




2015/03/27 작업내용




위 이미지를 참고하여 아래와 같이

실제 전시장에서 사용할 표지판을 포토샵을 이용하여 미리 제작하였습니다.

아무래도 영상처리 자체가 표지판을 기준으로 작업을 할 수 밖에 없는지라,

표지판 제작을 선행하는 것도 나쁘지 않다고 판단했습니다.





대략적으로 컬러로 규제표지와 지시표지를 식별한 뒤..

이리저리 해봐야 되지 않나 싶긴 하네요.





2015/03/31 작업내용




[ 각각의 인식 출력물을 GIF 로 만든 화면입니다. ]



템플릿 하나로 다양한 사이즈에서 인식하게 하는 것은 성공한 것 처럼 보입니다.

다만, 아직까지는 완벽한 조건하에서만 저렇게 작동하고 있습니다.

동작원리는 기존의 템플릿 매칭이 계속되고 있는 가운데,

기존 소스코드가 단순히 가능성이 높은 곳에서 사각형을 계속 그려주고 있었다면,

템플릿 매칭 이후에 그 영상을 그대로 갖고 와서

R,G,B 를 분리 후, R을 분리하여 빨간색 부분만 남긴 시점에서 이진화 했습니다.

그 이후 변형된 컨투어 트래킹을 이용하여 추출된 영상의 크기 값을 측정 후

여기서 사각 박스를 그려주고 있습니다.





하지만 같은 소스 코드를 이용하여 실제로 테스트 해보면



기대한 것 만큼 깔끔하게 나오고 있지는 않은 것을 확인 할 수 있습니다.




해당 영상의 이진 영상을 살펴보니..

뭔가 이상합니다 ㅠㅠ..

R값만 추출한거 같은데 제대로 동작을 안하는 거 같습니다만,

여튼..  변형된 컨투어 트래킹 원리상 잡음이 들어가면 잡음까지도 하나로 인식해버리는 문제점이 있습니다.

아마 옵션값의 문제인 듯 한데,

좀 더 연구해볼 필요성이 느껴집니다.




기존의 방식으로 같은 영상을 인식시켰을 경우 다음과 같습니다.





사각 박스를 그려주는게 템플릿의 이미지 크기 그대로 그려주는 코드기 때문에

거리가 달라질때 이미지 변화를 제대로 포착못하는 것 처럼 보여주는 문제점이 있습니다.








2015년 4월 3일 작업내용

...........

처음부터 접근을 잘못하고 있었습니다.

정확하게 생각을 잘못하고 있었습니다.

R,G,B 로 접근했었는데 [빨간색만 뽑아내면 되겠지~?]

그림자와 노이즈 처리에 상당한 애로사항이 있던 도중




영상처리 수업 시간에 만들었던 예제 프로그램을 이용하여

복습겸 하나씩 눌러봤습니다.

그리곤 깨달았습니다.

YUV로 하면 한방에 되겠구나.





그렇게 방향을 전환하자마자 이렇게 원하던 결과를 얻었습니다.

물론 다른 상황에서는 어떻게 될지 모르겠지만,

일단 현재 목표한 환경에서만큼은 기대했던 그대로 작동하는 것을 확인 할 수 있습니다.



Y가 흑백, 즉 밝기값만 갖고 있고,

U가 파란색 계통

V가 빨간색 계통으로 구성되어 있으니,

V값을 이용하여 추적했습니다.






2015년 4월 4일 작업내용





어제 성공한 표지판 추적을 바탕으로

오늘은 추적한 지점만 뽑아내는 ROI를 구현했습니다.




2015년 4월 5일 작업내용


인식용 표지판 획득.






2015년 4월 8일 작업내용



ROI 로 추출한 영상에서 다시 필요한 문자만 획득 시도해봤습니다.

문자 인식 영역을 파란 박스로 그려주고 있습니다.

현재로서는 노이즈에 약한 모습을 보여주고 있습니다.






2015 년 4월 12일 작업내용



이전 문자 인식 대비 노이즈는 어느정도 잡았습니다만,

여전히 특정 각도 이상에서는 메롱되는것은

현재 실력으로서는 어떻게 할 방법을 모르겠습니다.

당장은 시간 투자 대비 효과가 낮다고 판단하여 다음 단계로 넘어갈 예정입니다.







앞 문자만 추출하는 것을 시도해봤습니다.

레이블링 된 것을 바탕으로 앞에것만 추출을 시도했는데,

이유는 모르겠지만, 때때로 레이블링이 바뀌는거 같습니다.

음..

아마 위에서 노이즈를 제거하기 위해 2개의 큰 레이블링 값만 남기는 방식으로 이용한 것 때문에 생기는게 아닌가 싶은데, 해결방법은 모르겠습니다만,

어차피 모멘트를 하던 뭘 하던간에 결과엔 큰 영향을 주지 않을것이라 보고 있습니다.






2015년 5월 1일 작업내용



모멘트 값을 이용하여, 추출한 앞 문자들의 모멘트 값에 따라

속도 표지판을 구별하는 영상입니다.



아직 방향표지판을 구별하는 기능을 추가하지 못했기에,

방향 표지판만 나오는 영상에서는 오류가 뿜어져 나오는 것을 볼 수 있습니다만..

아마도 구현과 동시에 사라지지 않을까 기대해봅니다.





2015년 5월 8일 작업내용



속도표지판과 도로표지판 인식을 시도하여 성공했습니다.

일차적으로 졸업작품의 프리뷰버전이 완성되었다고 볼 수 있겠습니다.

라즈베리파이가 비록 최신형이긴 하지만,

영상처리를 얼마나 해줄 수 있는지에 관해서

전혀 알고 있지 않기에, [라즈베리를 이용하여 가능하다는 수준만 알고 있었습니다]

최대한 간단하게 색상인식 기반을 바탕으로 약간의 꼼수를 이용하였습니다.

특징점 이용한 방법은 유감스럽게도 라즈베리에서 충분한 속도를 뽑아줄지 의심스럽습니다.



이제 앞으로 라즈베리파이에 옮긴 뒤,

지속된 테스트와 더불어 조정에 들어가면 될 듯 합니다.



물론 라즈베리에서 충분히 버텨준다면,

인식하는 방법을 조금 더 고급스럽게 올려보고 싶네요.





2015년 5월 19일 작업내용



라즈베리파이에 코드를 옮기고 실행해본 화면입니다.

카메라 실행이 안되서 식겁했었는데,

여전히 카메라 실행이 되었다 안되었다를 반복하고 있습니다.



또한 예상보다 표지판 인식률이 낮은데, 이는 카메라가 바뀌면서 그런건지는 몰라도

값 자체를 다시 조절해야 될 필요성도 느껴집니다.

XRDP 문제인지는 몰라도, 실행 속도 또한 상당히 낮네요.






2015년 5월 20일 작업내용



나름 최적화라고 시도해봤지만

실행속도에는 전혀 체감 상승이 없습니다.

또한 어제 문제는 오늘도 여전합니다.



실행이 항상 된다는 보장이 없는게 가장 큰 문제네요.






2015년 5월 24일 작업내용



프리뷰 버전2에 해당하는 영상입니다.

실제 주행 인식 영상은 아니고..

마인드스톰 위에 휴대폰 올려서 촬영한 영상을 받아서

PC로 영상인식을 테스트 한 영상입니다.



마인드스톰은 조원들이 학교에서 작업하고,

영상처리는 제가 집에서 작업하는 형태인지라..

무엇보다 라즈베리파이를 현재 제가 갖고 있습니다 ㅋ..

그런고로 작업 자체는 따로따로 진행중에 있습니다.




결과를 평가하자면,

일단은 중간중간에 나타나면 안되는데 나타나 버리는 엉뚱한 인식들이 문제네요.

더 문제는 라즈베리파이에서도 제 속도가 안나온다는 거..

콘솔 화면창에 오류들이 뿜어나오는 것을 도무지 해결할 능력이 없기에,

아예 화면 위에다가 방향 인식했다고 출력을 시키기로 결정하여,

그렇게 출력시키고 있습니다.




개인적으로는 차라리 이 편이 훨씬 보기도 좋고 나은 듯 합니다.





기존 문제가, 출력해야 되는 시간안에 assertion error 등이 떠버리면

출력이 안되고

에러가 끝나고 난뒤에 다시 출력이 되서

중간 중간 끊기기에

아예 그러면 에러가 뜨기전에 출력자체를 끝내버리면 어떨까 싶어서

3초간 출력에서 1초간 출력으로 바꿔봤습니다 =ㅅ=




발표 시연용으론 충분할듯 합니다.

발표는 실제 보여주는게 아닌, 시간 관계상 보통 동영상으로 보여주는 경우가 많다기에..






2015 년 5월 29일 작업내용



영상에 좌우 출력하는거 자체가

콘솔화면에 뜨는 무수한 에러를 잡지 못해서였는데,

오늘 드디어




요 2가지 에러에 한해서 잡았습니다!!



덕분에 콘솔 화면은 안정적으로 출력되고 있습니다만,

저 동영상이외의 환경에서는 여전히 불안합니다.





2015년 6월 8일 - 프로젝트 종료 및 발표



OpenCV 를 사용하였으며, 라즈베리파이2와 마인드스톰을 이용한 무인자율주행 자동차 개발을 목표로 하였습니다.

다만 라즈베리파이에서 카메라가 불안정한데다 (몇번이나 교환을 받았음에도 불구하고)

라즈베리 이용시에는, PC와 달리 오류발생시 대처가 어렵다는 문제가 있어서,

일종의 네트워크 카메라를 이용한 방식으로 선회하였습니다.

폰카를 마인드스톰 앞에 거치시킨 뒤, 폰카의 영상을 네트워크를 통해 PC로 연결,

PC에서 영상처리 후 마인드스톰에 값을 보내는 방식이죠.

다만 네트워크 상태에 따라 마인드스톰으로 값이 제대로 넘어가지 않는 점이 있었으며,

영상인식쪽은 색상인식 기반인지라 그림자등의 잡음에 민감한 편이였습니다.

다만 그래도, 예상보다는 잘 인식되더군요.




위 영상은 조원이 촬영 및 제작하였습니다.








원 블로그 주소 : http://www.nipa0711.net/2015/03/OpenCV-Graduation-project-autonomous-car.html


위 블로그에 있던 내용을, 티스토리로 옮겼습니다.


2014년 2학기 타전공으로 전자무역학 캡스톤 디자인 수업을 들었습니다.




모델링은 제 친구가 했고.. (다른 팀, 같은 수업)

전 유니티를 이용하여 배치하고 카메라 워킹하고 등등 나머지 모든 것을 했습니다.

친구가 제 팀의 모델링을 해주고, 저 역시 친구팀꺼를 유니티로 만들었습니다만,

문제는 교수님의 의도와는 거리가 멀었습니다.




원래는 부스모형으로 모든게 판가름 날 계획이였는데,

교수들도 실제 부스모형 외주제작을 이용하는 것은 처음이였는지라

예산 자체가 턱없이 부족했고,

결국 한 업체에 6개 팀이 몰아주다보니

모형 자체의 퀄리티는 거기서 거기가 되어버렸습니다.

그래서 발표 비중이 높아지게 되었는데..


그 와중에 의도를 잘못 파악하고, 밤을 세서 Unity3D를 이용하여 부스 홍보 영상을 제작하였습니다.





노력한 시간 대비, 팀 내부 점수가 낮아서 성적은 엉망이였던 과목입니다.


모임도 매번 참석했는데도 불구하고, 이유를 모르겠습니다.


수업 조 전체에서 1등해서 경진대회까지 나갔음에도 불구하고, 팀 기여도가 낮았다나...


도통 이해할 수 없는 일입니다.


이런 일 때문에, 저 개인적으로는 팀 프로젝트 보다는 개인 프로젝트를 선호합니다.





최소한, 명확한 제 책임이라는 것이 있으니까요.






저희 조 결과물 입니다.




친구 조 결과물 입니다.





둘 다 Unity3D를 이용한 제작은 제가, 모델링은 친구가 했습니다.






2014년 2학기 게임모바일공학과의 게임프로젝트의 기말과제이자 개별프로젝트 입니다.


주제는 자유였는데, 키넥트등을 활용할 경우 가산점을 준다는 말에 혹해서 시작했습니다.



키넥트는 구형 XBOX360 용을 이용하였고, MS-SDK 를 이용하였습니다.

게임엔진은 Unity3D를 활용했습니다.





최초 제안서 다운로드 :

https://drive.google.com/open?id=0B3mC_hyBIvc8QzcwRG9oamFjUlE




마지막 발표 보고서 다운로드 :

https://drive.google.com/open?id=0B3mC_hyBIvc8dnlTS3FQM0s1YzQ







개발 과정


< 1주차 >




키넥트와 SDK를 이용한 동작인식 확인 및 유니티와의 연동 위주로 개발했습니다.



< 2주차 >





 

간단한 캐릭터를 만들고 키넥트와의 연동을 개발했습니다.
 
키넥트가 사용자의 몸 모양을 읽고 유니티에서 캐릭터가 이 모습을 받아들이는지를 중점으로 개발했습니다.



< 3주차 >



실제로 캐릭터를 앞으로 전진시키는 것을 위주로 개발했습니다.




< 4주차 >




캐릭터 조작을 개발 완료 한 뒤, 맵 개발을 시작했습니다.




< 5주차 >



중력을 넣고 게임성을 높이는 방향으로 개발했습니다.




< 6주차 >


게임성을 향상시키기 위해서 이것저것 시도해봤습니다.




< 7주차 - 마지막 >




현실성, 속도감등을 높이고 싶었지만, 혼자서의 능력으로서는 힘들었습니다.
 
또한 저번주차의 교수님 피드백이 플레이 타임이 너무 짧다는 것을 받아들여
 
최대한 플레이 타임을 늘리는 방향으로 개발했습니다.











전반적으로 많은 아쉬움이 남았던 개발이였습니다.

다만 혼자서 하는 개인 개발이 아닌 팀을 짠 뒤, 충분한 시간을 가지고 개발을 했더라면

더 좋은 퀄리티를 갖출 수 있지 않았을까 생각해봅니다.




키넥트 개발은 커녕, 키넥트라는 것을 이용하는 것 조차 처음이였기에,

키넥트와 관련된 에로사항에 있어서, 유니티 어셋 스토어의 개발자 분과

이메일을 주고 받으면서 개발을 진행했습니다.

2013년 10월 참가

발표평가 진출팀은 아이디어 부문 20개, 앱 개발 부문 20개로 총 40개 팀 입니다.

아이디어 부문으로 친구와 2명이서 참가하였습니다.





아이디어 부문에서 상위 20개팀에 선정되었습니다.




2013년 10월 28일에 열린 공공데이터 활용 창업경진대회 발표평가에 참가했습니다.







아이디어는 위와 같았습니다.





아쉽게 상위 17개팀에 포함되지 못하여, 본선 진출에는 실패하였습니다.



여기에 대해 몇 가지 뼈아픈 실수와 상황이 있었는데,

1. 발표는 대표자가 해야 된다고 하여, 내가 발표를 할 수 밖에 없었습니다.

2. 친구가 수업이 있어서 같이 서울로 가지 못하였고, 결국 혼자서 모든 부담감을 질 수 밖에 없었습니다.

3. 발표시 엄청 떠는 증상이 있기에, 가급적 발표를 하지 않는 것이 제 원칙이나, 유감스럽게도 제가 발표를 할 수 밖에 없었습니다.

4. 기술발표임에도 불구하고 프레지를 활용했다는 점 입니다.





당시 대학교에서는 PT도구로 프레지가 한창 인기가 있을때였으며, 마침 친구가 프레지를 꽤나 다룰줄 알았기에 발표 도구로 프레지를 선정하였습니다.

무엇보다 당시 좋은 발표는 참가자들의 감성을 자극하는 것이란 내용에 관련하여 수업을 듣기도 했었습니다.



하지만 떨어지고 나서야 깨달은 점은,

A. 내가 맡은 이 발표는 대중을 향한 발표가 아닌 기술발표였다는 것.

B. 기술발표는 감성 자극이 아닌 명확한 팩트와 사실 서술이 필요하다는 점.

C. 프레지는 그 특유의 활용성상 PPT 처럼 프린트하여 제공하기에 애로사항이 크다는 점.



이 3가지에 관하여 당시에는 전혀 깨닫지 못했습니다.





당시 발표는 덜덜 떨어버려서 제 시간안에 끝마치지도 못했고,

무엇보다 당시 평가단의 질문에 대해 제대로 답변하지 못했습니다.




기억나는 단 한가지의 질문은,

요즘 많은 회사들이 이와 비슷한 것을 개발하고 있거나 개발할려고 하는데,

만약 참가자가 이것을 만들고 있는 도중에 대기업이 같은걸 시도한다면 어떻게 하겠는가?

라는 질문을 받았습니다.




뭐라 대답했는지는 기억나지 않지만, 지금이라면 대기업에 팔아버리겠다 라고 말할것 같습니다.



+ Recent posts