상세 컨텐츠

본문 제목

수어 통역 프로그램 - 손마리

카테고리 없음

by 밍밍한고밍 밍밍한고밍 2020. 12. 1. 18:52

본문

우리 팀은 회의 끝에 졸업 프로젝트로 딥러닝을 활용한 수어 통역 프로그램을 만들기로 했다.

가끔 수어를 수화로 혼동하시는 분이있는데 수어도 하나의 언어이므로 수화보다는 수어라고 표현하는 것이 적절할 것이다.

 

어려울것 같다는 얘기를 많이 들었으나.. 대안으로 제시한 주제들을 지도교수님이 모두 별로라고 하셨다.

처음엔 무식해서 용감했는데 알아보면 알아볼수록 어려운 주제라는 것을 실감하고 있음.

 

여튼, 주제는 그렇게 정했고. 

한 단어도 번역하는것이 어려워서, 카테고리를 한정했다. 우선은 응급상황에 자주 쓰는 말들을 쓰기로 했는데, 응급상황보다는 일상생활에 사용하는 것이 낫겠다는 의견을 듣고 카테고리를 조금 더 논의해볼 예정이다.

병원에서 쓰는 말로 바꾸면 어떨까 고민도 해보고 있음.

그리고 아무래도 기술이 어려워서 문장 단위로 번역하는 것보다는 단어 하나를 번역하기로 했다. 

 

간단정리

프로그램에 대한 이해를 돕기 위해 아주 간단한 틀로 구조를 그렸다.

핵심은 영상을 입력받아서, 손모양만 인식한 후 딥러닝 cnn, rnn을 통해 이를 번역하여 한국어로 바꿔주는 것이다. 이후 바꾼 결과를 화면에 출력한다

 

 

 

간단하죠? 조금 수정했는데 다시 가져오기가 좀 귀찮네요..

 

 

 

따라서 이 프로그램의 핵심 기능은 두가지라고 할수 있다. 인식번역이다. 

 

요구사항

틀을 토대로 요구사항을 작성해봤다. 가장 핵심적인 내용만 담았음.

번호

요구사항명

요구사항 내용

1

번역

수어->한국어의 번역을 제공한다.

2

번역 카테고리

응급상황에 사용하는 언어들을 번역할 수 있어야 한다. 유튜브 위급상황 수화 채널을 참고할 예정

3

촬영

어플을 클릭하면 카메라 버튼이 뜨고, 버튼을 누르면 핸드폰 카메라를 통해 영상을 촬영할 수 있도록 한다.

4

인식

촬영된 영상에서 손모양만 인식한다.

5

번역

인식된 영상을 딥러닝을 통해 한국어로 번역한다.

6

출력

한국어로 번역한 내용을 화면에 출력한다.

7

번역 시간

응급 상황인 만큼 번역 시간을 30초 이내로 제한한다.

기술 - 인식

그렇다면 손동작을 어떻게 인식할 수 있을까?

다양한 방법을 찾아봤다.

 

대부분은 피부색의 범위를 설정해놓고 그에 부합하는 영역을 검출하는 방식이다. 그렇기 때문에 배경이 살색과 비슷할 경우 손동작을 검출하기 어려움.

 

 

테스트 결과

 

 

 

 

각각 다른 코드로 테스트 해봤다.

첫번째는 배경도 같이 검출되고, 두번째는 잡음이 심한 단점이 있다.

사실 참고한 코드가 작동을 안해서 어떻게든 동작하게 만들다 보니.. 결과가 좋지는 않은듯

 

 

이 코드의 대략적 알고리즘은 이렇다.

얼굴 인식 -> 얼굴에 해당하는 부분 제거 -> 살색 검출을 통해 손 인식 -> 경계선 검출 -> 손끝점 인식 

 

가장 핵심적인 경계선 검출 알고리즘에 대해 간략히 소개하고 넘어가자면,

 

 

 

 

손가락 인식 파트에서 가장 중요한 기술은 손의 경계선을 검출하는 것이다. 화면과 같은 지구의 경계선을 검출한다고 가정할 때, 우선 동일한 색상을 가진 부분의 가장자리를 연결하여, 영역을 나눈다. 그후 이미지 전체를 회색조의 이미지로 변환한다. 이때 찾으려는 부분은 흰색으로 변환하고, 배경은 검정색으로 변환해야 한다. 이후 흰색 부분에 대한 경계선만 검출하면 되는 것.

 

손가락 검출에서도 마찬가지다. 같은 색상 스펙트럼을 가진 부분끼리 영역을 나눠둔다.

이 과정에서 살색 부분의 영역이 검출되는 것이다. 영역을 나눈뒤에는 회색조의 이미지로 변환하고 살색부분의 영역을 흰색으로 변환해야한다.

왜 흰색으로 변환해야 하냐면.. cv2에서 제공하는 경계선 검출 함수가 회색조이미지를 디폴트로 하기 때문.

 

 

구글 미디어파이프

이렇게 다양한 방식으로 테스트를 진행하던 중.. 구글이 만든 핸드트래킹 오픈소스를 발견했는데.

이에 대해선 할말이 매우 많음..

my-pick.tistory.com/entry/%EA%B5%AC%EA%B8%80%EC%9D%B4-%EB%A7%8C%EB%93%9C%EB%8A%94-AI-%EC%88%98%ED%99%94-%EC%9D%B8%EC%8B%9D-%ED%86%B5%EC%97%AD-%EC%8B%9C%EC%8A%A4%ED%85%9C

구글이 만드는 AI 수화 인식 통역 시스템

손의 모양과 움직임을 인식하는 능력은 다양한 기술 영역과 플랫폼에서 사용자 경험을 개선하는 데 있어 필수적인 요소일 수 있습니다. 예를 들어, 수화 이해와 손동작 제어를 위한 기초를 형성

www.gentlehan.com

발견했을 때만해도 .. 신나있었는데 .. 

대충 미리보기로만 봐도 알겠지만 인식률, 정확도가 굉장히 좋다. 그래서 이거라면 번역을 할 수 있겠다고 생각했는데,

미디어파이프.. 설치가 너무 어렵다. 정말로 복잡하다.. 꼬박 3일을 투자했으나 제대로 설치되지 않음..

우선 미디어파이프를 윈도우 운영체제에서 쓰려면 바젤,오픈jdk, 비주얼스튜디오 빌드툴, 오픈cv, 등등 설치할것이 엄청나게 많다. 다 설치하는데만 .. 3시간정도 걸린듯.

그런데 문제는 바젤. 바젤이 설치가 가장 까다로웠다. cmd에서 bazel version을 쳐봐도 그런 파일이 없대. 아니 있다니까???? 아무리 찾아봐도 왜 이런 오류가 나오는지 알수없었다.

 

수많은 에러들을 만났다.

우선 numpy가 분명 있는데 numpy가 없다는 에러.

바젤이 있는데 바젤이 없다는 에러.

그런 패키지를 찾을수 없다는 에러... 그러고보니 다 뭐가 없다는 에러네.

게다가 너무 최신버전의 우분투를 설치하는 바람에, 발생하는 에러들을 고치기도 힘들었다. 

그래서 일단 중지하고, 방학때 다시 시도해보기로 했다.

 

 

기술-번역

 

cnn과 rnn을 이용해 촬영한 수어영상을 번역하기로 했다. 입력받은 영상을 프레임 단위로 여러개의 영상으로 자른다. 이후 각각의 작은 영상을 cnn을 이용해 특성을 추출해내고, 이 여러개의 시퀀스데이터를 다시 rnn에 입력하여 전체적인 번역결과를 도출하는 것이 번역 파트의 핵심이다.

 

그러나 번역 과정에 관해 감이 잡히지 않아서 우선 이미지부터 번역해보고 이후에 영상을 번역하기로 했다. 숫자 1,2,3,4,5를 번역하는 것이다.

 

 

 

 

 

 

 

번역을 위해 우선 각 숫자별로 50*50 픽셀 크기인 1200장의 데이터를 모았다. 숫자 1에 관한 데이터들이다.

 

 

 

 또한 앞의 1200장을 대칭시킨 이미지를 모두 저장하여 2400장의 학습용 이미지를 수집했다. 같은 숫자를 의미하는 데이터들은 모두 하나의 폴더에 저장해두었고,

 

 

데이터베이스를 만들어 폴더명과 숫자를 매칭시켜두었다.

이를 토대로 training, test 시켰다. 대칭시킨 이미지를 저장했기 때문에 이 프로그램은 왼손, 오른손을 모두 인식할 수 있다.

 

시연영상이다.

 

 

 

 

 

1, 2,3,4,5를 인식시키는 영상인데, 4,5의 경우 정확히 출력되지 않는다. 단어 단위의 번역으로 들어가게 되면, 이처럼 정확도가 높지 않은 단어만 데이터를 더 늘려 정확도를 개선할 예정

 

 

 

 

 

소스코드에 py 파일만 모아둔 것이다. 파일별로 설명을 하자면,

 

cnn_keras는 케라스를 이용해 cnn을 구현한 것이고, cnn_tf는 텐서플로우를 이용해 cnn을 구현한 것이다.

 

 

 

두 파일에서 사용된 신경망의 구조이다.

이미지 데이터를 덴스 레이어로 번역하는 과정인데, 컨볼루션 레이어와 풀링 레이어를 반복하여 각각 총 세겹으로 구성하고, 플래튼,덴스, 드롭아웃 레이어를 통해 과적합을 막는다. <- 사실 아직 완전히 이해하지 못함... 더 공부해야겠다.

 

 

최종적인 신경망 구성을 입출력의 관점에서 자세하게 나타낸것이다. 여기서 써있는 숫자의 조합들은 이미지를 구성하는 픽셀에 대한 정보를 뽑아내 처리한것이다.

 

Set_hand_hist, Flip_images, load_images는 손모양을 인식해 가져오는 과정을 담고있다. 인식파트에서 다뤘으니 넘어간다.

Get_model_reports는 예측의 정확도를 측정하는 것이고,

Recognize_gesture는 cnn 파일을 임포트해 수어를 실제로 번역하는 파일이다. 번역에 관한 구체적인 내용을 담고있는 핵심적인 파일이다.

 

 

Recognize_gesture에 대해 좀더 자세히 설명하면,

 

 

 

메인 알고리즘은 위처럼 딱 두줄. keras_predict 함수를 이용해 예측의 정확도와 예측한 결과값을 반환받은 뒤, recognize 함수를 이용해 정확도가 80프로 이상일 경우에만 결과값을 출력하는 것이다.

 

그럼 여기서 recognize함수를 자세히 알아보면

 

 

                                             

여기까지는 경계선을 인식해 손모양을 검출하고, 그 결과 이미지를 저장하는 과정이다. 앞서 설명했으니 생략

 

 

                                             

이후 keras_predict 함수를 이용해 예측값과 예측 정확도를 반환받고, 정확도가 80프로 이상일때만 예측한 결과인 text를 출력한다.

그 이후는 thresh창과 recognizing gesture창을 생성해 그 창에 이미지와 결과를 출력하는 과정을 나타낸 것이다.

만약 사용자가 q를 입력하면 이 프로그램은 종료됨

 

 

github.com/EvilPort2/Sign-Language

 

수어 번역은 이분 사이트를 참고했다. 영어에 관한 번역만 하기 때문에.. 참고해서 한국어 수어로 번역할 수 있도록 해야겠다. 

EvilPort2/Sign-Language

A very simple CNN project. Contribute to EvilPort2/Sign-Language development by creating an account on GitHub.

github.com

그런데 문제는 1000장 가량의 한국어 수어 데이터를 어디서 모으냐는 것인데....

일단 감사하게도 데이터를 모아둔 사이트가 있어서 참고를 좀 해볼 예정이다.

aihub.or.kr/aidata/7965

수어 영상 | AI Hub

수어영상 AI데이터 Korean sign language dataset for vision basis AI development

aihub.or.kr

여튼 컴공 졸업이 정말 힘들구나.. 를 깨닫고 있다.

무슨 부귀영화를 누리자고 복전을 했을까? 
그래도 생각보다 개발 좀 재밌다. 주전보다 나은듯

댓글 영역