코딩공작소

[영상처리/딥러닝]졸업프로젝트 느끼고 배운점 본문

강의정리/IT지식&플젝

[영상처리/딥러닝]졸업프로젝트 느끼고 배운점

안잡아모찌 2019. 6. 9. 15:54

처음 차선인식을 하려고 했을 때, OpenCV를 통해서 접근했다.

이미지 처리는 처음 배우는 것이었기 때문에, 생소했다. opencv를 설치하고 여러 기본함수들을

실행해보고 , 차선인식에 필요한 가우시안필터, ROI, 그레이 스케줄, 허프변환 알고리즘등을 사용해

실행해보았다. 진행 중에, 딥러닝을 이용한 차선인식을 하기로 했고, LaneNet 네트워크를 이용해

차선인식을 하기로 했다. 본래 전방화면을 기준으로 인식하는 네트워크였다. 오픈소스이지만

이해하고 사용하기까지는 일주일정도 시간이 걸렸다. 딥러닝을 처음 다루는 경험이었기때문에,

어디서 훈련하고 실행하는지 어려움을 겪었다. 글을 계속 보고 코드들을 살펴보면서 어떤방식으로

코드가 진행되고 실행하는지 조금씩 이해하였다. 그리고 학습데이터를 어떻게 만들어야되는지 서칭을

통해 찾아냈고 제이슨형식으로 정해진 틀이 있었다.

딥러닝은 기존의 학습된 모델을 가져와서 여러 파라미터들과 입력값을 통해 실행하는것에 성공했다. 그리고 우리의 데이터셋을 학습하기위해 툴을 설치해 태깅을 해주었고, 태깅되어있는

제이슨파일을 우리의 데이터셋의 형식에 맞게 새롭게 만들어주었다. 그리고 데이터셋을 만들고 훈련을 진행해서

우리의 avm이미지로의 딥러닝을 실행했다. 어떤데이터를 어떻게 태깅하느냐에 따라 결과도 많이 달라진다는것을 깨달았다. 계속 학습을 진행하면서 LDWS 를 구현하였다. 인식된 차선의 마스크와 차량의 위치를 알 수 있었기 때문에

차량과 차선과의 거리를 6분할지점으로 측정하여 그중 최소값이 최소거리에 입력해주었다.

좌/우 최소거리를 기준으로 가까워짐과 밟고있는지에 대한 여부를 판단하였고 그에 따라 메세지를 출력해주었다.

그리고 인식된 차선의 중점과 차량의 중점의 벡터를 연결해 수직벡터와 내적을 이용해 차선중앙으로의 화살표도 출력해주었다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

아 그리고 실시간 기반으로 처리하기로 했는데 (15fps) 차선을 클러스터링 하는 부분에서 시간이 너무 마니 걸렷다.

그래서 클러스터링을 하지않고, 기존의 임베딩 마스크를 RGB필터로 요리조리 하다보니까 차선을 구분해주는

채널별로의 차선이 나왔다. 그래서 그거를 & , | (and,or)연산자를 통해 색깔을 입히는 식으로 구현해주었다.

np.where(if조건문) 같은 함수가 있더라..  그러면 [[y list],[x list]]식으로 데이터가 담겨서 나왔다.

이렇게 LDWS의 기본틀을 만들고 다른 라이다센서팀과 욜로팀과의 통합을 위해 ros코드를 공부하였다.

깊게 공부하진 않았지만, ros는 node들을 만들고 다루어 통합에 매우 편이하였다.

노드를 설정해준 후, ros를 통해 넘기고 싶은 데이터를 publish를 통해 흩뿌려(?)주었다.

그리고 그것을 받고싶을 때는 subscribe를 통해 topic이름을 설정해서 받아준 후, callback이라는 함수를 통해

넘어오는 메세지를 받을때마다 반복적으로 callback함수를 실행해주는 구조를 가지고 있었다.

딥러닝을 로스로 돌리기 위해서 세션을 실행하는 부분을 제외한 모델을 불러오고 전처리를 하는 부분은 모두

글로벌로 처리해주었다. 그후 콜백함수에 세션을 실행시켜서 그 부분만 반복적으로 실행해 주었고, 결과화면을

publish해주었다.

++ ) 추후, 음성 시스템까지 추가하였는데 playsound라는 패키지를 통해 음성을 불러서 실행할 수 있었다.

병렬적으로 음성이 나와야 realtime으로 진행되기 때문에 음성을 출력해주는 노드또한 필요했다.

그래서 경고의 상황마다 Int16형의 메세지를 publish해주었고, 그 노드를 음성출력노드에서 subscribe해준후,

콜백을 실행해서 그 메세지가 들어왔을 경우에만 경보를 울려주었다.

자동으로 그렇게 되었다 콜백이라는 함수가 원래 그런 구조 .. 그리고 카운트를 해주었는데 함수안에 global count라는

구문을 사용해야 사용할 수 있더라 .. 카운트를 주어 5번당 한번 꼴로 음성을 출력해주는 방법으로 했다.

여러가지 메세지 타입이 있지만 이미지를 제외한 나머지 다음들은 @(@(.data로 접근 할 수 있다더라.

이미지는 너무 커서 압축(?)같은 느낌으로 cv2로 바꿔준다 함.

++ ) GUI 프로그래밍도 처음 해봤다. PYQT5를 이용해 모든 결과들을 통합한 화면을 출력해주엇따.

디자이너를 이용해서 기본틀을 잡아 주었다. 라벨을 설정해주어서, 코드안에서 pixmap 등의 이미지 처리 함수를

이용하면 이미지를 화면에 출력할 수 있었다. QT는 객체위주(?)로 실행되어서 class를 만들어 다루었다.

그래서 그안에 __init__() 생성자 함수를 통해 실행하고잇은 함수들과 변수들을 초기화했다.

로스로 받아온 사진들도 큐티에서 실행하기위해서 콜백, subcribe등의 함수를 초기화해주었고 콜백안에서

이미지를 띄워주었다.

'강의정리 > IT지식&플젝' 카테고리의 다른 글

[FaceNet+MTCNN]  (0) 2019.10.24
[졸프에 대한 이론공부]  (0) 2019.10.24
[DB]웹툰구독  (0) 2019.10.15
[알고리즘설계]유전자알고리즘  (0) 2019.10.15
자율주행 기술 레벨6  (0) 2019.10.07