목록(0, 1)/손마리 (8)
0과 1 사이
아주 오래간만의 글이다. 그동안은 막학기와 졸업요건으로 인해 매우 바빴다.. 약 일년간의 프로젝트가 드디어 끝이 났다. 수상은 2주전부터 알았지만 오늘 드디어 상장이 왔다. 이노그리드에서 후원해주는 상인것 같다. 동상이다! 동상이지만 무려 200만원이나 주신다고 한다. (세금 4.4% 떼고 190만원 정도 준다.) 대상 타면 천만원! (세상에 넘 부럽다.) 수상도 한 김에, 대회에 참여하면서 얻게 된 것들에 대해 얘기해보려 한다. 기능테스트, 오픈소스 라이선스 1차 심사를 통과한 50팀에게는 기능테스트와 오픈소스 라이선스를 충족하는지 여부를 검사할 자격이 주어진다. 여기서 얻어낸 점수와 1차 심사 점수, 발표 점수를 합산해서 최종적으로 27팀에게 상을 수여한다. 그런데 기능테스트가 뭐야? 오픈소스 라이선..
이전에 잘 동작하던 프로그램이 갑자기 핵심 이미지가 세개인 수어를 인식할 때 매우 버벅거리는 문제가 생겼다. 이에 따라 코드 개선에 도전해봤다. 참고로 우리가 개발중인 손마리 프로그램은 detect한 결과들을 리스트에 저장한 뒤, 해당 리스트를 통해 최종 단어를 출력해주는 프로그램이다. 예를 들면 '쓰러지다1'과 '쓰러지다2'가 차례로 인식된 경우, ['쓰러지다1', '쓰러지다2'] 처럼 리스트에 결과를 저장한 뒤 '쓰러지다'를 출력하도록 코딩하는 것이다. 여기서는 이미지가 1,2로 두개로 나뉘어져있는 경우만 나와있지만 변비1,변비2,변비3 처럼 이미지가 세개인 단어들도 여럿 있다. 그렇다면 리스트에 결과를 저장하는 것은 어떻게 구현할까? 원래의 코드는 아래처럼 효율이 좀 떨어지고 직관적이지 않은 코드였..
pyqt를 잘 몰라서.. 의외로 이 파트가 어려웠다. ui는 간단하게 구현하기 위해 pyqt를 이용하였고 환자의 수어를 번역하여 출력하는 yolo 창만 남겨두고 최대한 단순화했다. 또한 내 노트북 상으로는 실행은 잘됐는데, 팀원 노트북에서는 실행도 되지 않았다. 다른 것들은 제외하고 pyqt로 darknet을 이용해 번역한 이미지를 가져오는 방법에 대해 설명해보겠다. 아래는 ui를 실행시키는 sonmari.py 코드이다. 핵심은 3중 쓰레드 마지막 줄에 보면 sonmari_video.drawing을 실행시키도록 되어있는데, self를 전달하여 해당 윈도우 객체를 전달해주는것이다. width = darknet.network_width(network) height = darknet.network_height..
이 파트는 어렵지 않다. 우선 파이썬 딕셔너리(밑의 코드 내에서는 continuous) 내에 단어에 따른 핵심클래스를 모두 정의해둔다. 바로 이전의 결과를 before_result에 저장한다.(단, 결과가 null이면 저장하지 않을것.) 현재의 결과는 result에 저장되고, before_result와 result를 비교해 미리 정의된 딕셔너리 내에서 대응되는 단어를 가져온다. 핵심동작이 1개인 단어도 있고 2개인 단어도 있다. 핵심동작이 1개인 경우, 실행속도가 너무 빨라 단어가 0.1초만에 출력되고 지나가버린다. 따라서 핵심동작 1개인 수화는 15번 프레임동안 출력되게 했다. 또한 2개인 수화의 경우 딕셔너리 안의 value값과 비교한후, 대응되는 단어를 가져와 출력한다. draw.text는 한글을 ..
커스텀 데이터를 이용해 YOLO를 트레이닝 하는 것은 인터넷에도 많이 나와있다. https://github.com/AlexeyAB/darknet#how-to-train-to-detect-your-custom-objects AlexeyAB/darknet YOLOv4 / Scaled-YOLOv4 / YOLO - Neural Networks for Object Detection (Windows and Linux version of Darknet ) - AlexeyAB/darknet github.com 위 링크를 많이 참고했다. YOLO는 학습시킬 트레이닝 이미지와 그에 대한 라벨링 파일(txt), 테스트 이미지만 있다면 쉽게 딥러닝을 트레이닝 시킬 수 있는 오픈소스이다. 우선은 라벨링이 필수적이다. 이미지 데..
대다수의 수어 번역 프로그램은 위와 같은 정지된 이미지(지화)에 대한 번역을 제공하고 있다. 또한 rnn을 이용하여 동적인 이미지를 번역하는 프로그램은 속도 저하로 인해 실시간 번역을 제공하기 어렵다는 문제가 있다. 이에 따라 동적인 이미지를 번역하면서도 실시간으로, 빠르게 수어를 번역할 수 있는 방법을 생각해보았다. 이 방법을 고민하는 데만 몇 달이 소요됐다. 방법은 수어 동작 별로 핵심 이미지를 검출하는 것. 예를 들면 '아파트'라는 단어의 경우, sldict.korean.go.kr/front/sign/signContentsView.do?origin_no=11964&top_category=CTE&category=&searchKeyword=%EC%95%84%ED%8C%8C%ED%8A%B8&searchC..
구글에 '수어 번역'을 검색하면 내 블로그가 제일 먼저 나온다. 꾸준하게 저 글만큼은 방문하는 사람이 정말 많다. 그러나... 나도 아직 주니어이다. ㅜ 저 프로젝트 또한 내 인생의 첫 개발프로젝트였다. 더군다나 문서화에 익숙지 않다보니 사람들이 한번 방문은 해보지만, 그냥 다시 나가는 듯 하여.... 혹여나 일년전의 나처럼 헤맬 누군가가 있을까봐 문서화를 좀 더 열심히 해보기로 했다. 반겨주시길!!^^ 기존의 수어 번역 CNN 오픈소스 EvilPort2 github.com/EvilPort2/Sign-Language GitHub - EvilPort2/Sign-Language: A very simple CNN project. A very simple CNN project. Contribute to Evil..
손동작을 어떻게 인식할 수 있을까? 다양한 방법을 찾아봤다. 대부분은 피부색의 범위를 설정해놓고 그에 부합하는 영역을 검출하는 방식이다. 그렇기 때문에 배경이 살색과 비슷할 경우 손동작을 검출하기 어려움. 테스트 결과 각각 다른 코드로 테스트 해봤다. 첫번째는 배경도 같이 검출되고, 두번째는 잡음이 심한 단점이 있다. 사실 참고한 코드가 작동을 안해서 어떻게든 동작하게 만들다 보니.. 결과가 좋지는 않은듯 이 코드의 대략적 알고리즘은 이렇다. 얼굴 인식 -> 얼굴에 해당하는 부분 제거 -> 살색 검출을 통해 손 인식 -> 경계선 검출 -> 손끝점 인식 가장 핵심적인 경계선 검출 알고리즘에 대해 이해한 바를 얘기해보겠다. 손가락 인식 파트에서 가장 중요한 기술은 손의 경계선을 검출하는 것이다. 화면과 같은..