코딩뚠뚠

[대학활동] 2019 ESW 본문

대학 활동

[대학활동] 2019 ESW

로디네로 2020. 12. 25. 18:59
반응형


2018년에 이어 2019년에도 참가했다.

2019년에는 이 대회 수상을 목표로 주력대회로 삼고 준비했다.

우수상 전자부품연구원장상 수상!


대회소개 :

임베디드SW와 산업간의 협업 아이디어를 제공하고 창의적이고 혁신적인 SW개발 아이디어를 획득을 통한 SW분야 우수인력 발굴 및 양성을 하기 위한 대회

주최 : 산업통상자원부

주관 : 임베디드소프트웨어,시스템산업협회


주제 :

처음 주제선정을 할 때부터 소외계층을 위한 프로젝트를 구상했다.

여러가지 이유로 소외된 사람들 중에서 우리가 구현한 시스템, 제품을 사용했을때 가장 큰 효과를 볼 사람들은 누구인가 생각해봤다.

결과적으로 제품을 만들어냄으로써 무언가를 대신해줄 수 있을 것이라고 생각했고, 그 대상은 시청각중복장애인이라고 생각했다.

듣지도 못하고 보지도 못하는 이들이 소통하는 방법 중 '점화' 라는 것을 알게되었고 이를 활용한 제품 개발을 진행했다.


방법 :

● 개발과정은 다음과 같았다.
아이디어 구상 → 구체화 → 선행기술 조사 → SW기초설계 → HW기초설계 → 기본 영상처리 → c++ knn algorithm → python tesseract → SSH서버와 연결 → HW제작 → 보완 및 오차분석

● 기본적으로 OpenCV를 이용한 프로젝트이다.
Python과 C++을 이용하였고 라즈베리파이4와 motor 동작을 위한 아두이노보드를 이용하였다.
입력장치로는 USB Camera를 이용하였다.

● 동작순서는 다음과 같다.
1. USB 카메라를 통해 목표 도서를 실시간 촬영, PC에 전송한다.
2. 촬영된 사진은 PC의 code에 의해 처리된다.
3. 처리 된 영상은 문자열의 형태로 MCU에 전송된다.
4. 전송된 문자열에 알맞게 MCU는 장갑에 장착된 모터를 진동시킨다.

● HW기능은 다음과 같다.

cap video : usb camera를 통해 영상을 촬영, 실시간으로 전송한다.
calculate algorithm : algorithm을 통해 촬영된 영상을 문자열로 변환한다.
serial communicate : serial communicate 를 통해 문자열을 MCU로 전송한다.
motor control : 전송된 문자열을 문자로 분리하여 문법에 맞게 motor를 진동시킨다.


● Software 구성은 다음과 같다.

Software

설명

Ubuntu linux

캐노니컬이 개발한 컴퓨터 운영체제이다. python, Tesseract, OpenCV 코드 등의 개발의 응용을 위하여 사용한 운영체제이다.

Python

귀도 반 로섬이 개발한 프로그래밍 언어이다. pytesseract와 pyserial, OpenCV의 코드 응용을 위하여 사용하였다.

OpenCV

영상처리를 위해 OpenCV 라이브러리를 사용하였고 영상이 tesseract OCR을 가장 효율적으로 사용할 수 있는 이미지로 변환을 한다.

Tesseract

tesseract OCR은 leptonica를 기반으로 작동한다. C++, Python을 기반으로 작동한다. 광학 문자 인식 기술로 영상에 출력되어있는 문자를 txt로 렌더링한다.

Knn Algorithm

글씨체나 필기체 등 tesseract ocr이 인식 할 수 없는 문자의 경우 knn 알고리즘을 이용, 머신러닝을 기반으로 하여 즉각적 학습을 시킬 수 있도록 하였다.

● Software 설계도


역할 :

팀은 전자공학과 2명과 앱제작을 위한 컴퓨터공학과 1명으로 구성

팀원으로 역할을 수행했다.

정 - C++를 이용한 KNN algorithm 작성
-> tesseract로 인한 방식도 있지만 KNN (k-nearest neighbor) 알고리즘(쉬운 지도학습 머신러닝 - supervised machine learning)을 이용하여 문자를 직접 학습시키기도 하였다. 필기체나 악필 등의 글씨는 tesseract가 인식하지 못하기 때문에 직접 여러개의 상황을 가정하여 학습시키고 인식시키는 과정을 거쳤다.

부 - python을 이용한 opencv 전체코드 작성
-> 팀장과 함께 영상처리 알고리즘을 작성하고 구현하였다. 실시간으로 비디오를 받아오고 알고리즘의 어떤 조건에 걸리게 된다면 그 때의 화면을 캡쳐하여 이미지 전처리를 하고 tesseract로 문자로 변환하였다. 이를 점화형식 출력으로 변환하어 진동모터로 출력하였다.


결과 :

https://youtu.be/O23K3e7kRdg

위와 같은 결과를 도출할 수 있었고 작년 PT발표를 보완해서 우리의 소프트웨어적인 강점을 잘 설명하며 어필할 수 있었다.

우수상인 전자부품연구원장상을 수상할수 있었다.


어려웠던점과 해결방안 :


검지손가락 끝에 달린 카메라가 허공을 가르면서 문자를 가리킬 때 실시간으로 그 영상을 문자로 변환해야 했다.

문자의 길이가 띄어쓰기 없이 길다면 한 프레임 안에 들어오지 않아 인식된 부분만 읽을 수 있었지만 그보다 큰 문제는 한번 읽은 문자를 어떻게하면 또 읽지 않을까 라는 문제였다.

기존 개발한 알고리즘으로는 손가락의 포인터박스가 (크기 2pixel*30pixel) 박스를 가리킬 때 박스의 첫 세로줄 임계점을 통과하면 그 때의 문자를 읽어 문자로 변환했다.

하지만 박스의 끝을 나타낼 무언가가 없었고, 시작 후 매 프레임마다 박스를 캡쳐하여 수백개의 이미지가 반환되게 되었다.

이에 우리 팀은 frame의 복사본을 하나 더 만들어 그 복사본으로 작업을 하였고 복사본 frame은 모든 점을 mophology 연산 중 dilation 연산을 하여 팽창시켰다.

5배쯤으로 팽창시키게되며 문자를 담고있는 박스는 문자의 색으로 가득차게 된다.

이에 손가락의 포인터박스 (2*30크기) 는 흰색으로 초기화 시켜놓고 문자의 박스 안에 들어가게 되면 어느정도는 검정색으로 바뀌게 될 것이다.

바뀔 때 영상을 한 번 캡쳐하고 박스 전체가 흰색이 아니라면 캡쳐하지 않는 방식을 사용하여 박스 하나당 한번만 캡쳐하는 방식을 구현하였다.

이를 우리팀은 no whilte 알고리즘으로 명명하였다.


여담 :

지금보면 별거아닌것 같은데 그땐 왜그리 힘들었을까 모르겠다.

대회가 기말고사와도 겹치고 다른 대회랑도 겹쳐서 대회장에서도 기말고사 공부를 하고 팀원이 뿔뿔이 흩어져서 각자 다른 대회에 출전해 PT한 신기한 경험을 했다. 이 대회는 팀장없이 내가 PT했다. 팀장도 물론 상을 타왔다!

두번째 ESW 출전이여서 긴장을 덜했던 것도있고 발표때 질문들을 좀 예상해뒀었다. 대회의 이름답게 소프트웨어를 많이 물어보더라.

컴공친구를 끼워서 어플도 만들어놓으니 좀더 그럴듯해보였던 프로젝트였다. (추후 안드로이드도 배워보고싶어서 Kotlin을 공부하다 내 길이 아니라는것을 깨달음ㅋㅋ)

코엑스 밥맛은 여전하더라

끝!

반응형