Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

0과 1 사이

기존의 수어 번역 오픈소스 조사 본문

(0, 1)/손마리

기존의 수어 번역 오픈소스 조사

고후 2021. 4. 24. 18:16

구글에 '수어 번역'을 검색하면 내 블로그가 제일 먼저 나온다. 꾸준하게 저 글만큼은 방문하는 사람이 정말 많다. 

좀 영광이다.

 

 

그러나... 나도 아직 주니어이다. ㅜ 저 프로젝트 또한 내 인생의 첫 개발프로젝트였다. 더군다나 문서화에 익숙지 않다보니 사람들이 한번 방문은 해보지만, 그냥 다시 나가는 듯 하여....

혹여나 일년전의 나처럼 헤맬 누군가가 있을까봐 문서화를 좀 더 열심히 해보기로 했다. 반겨주시길!!^^

 

 

기존의 수어 번역  CNN 오픈소스 EvilPort2

github.com/EvilPort2/Sign-Language

 

GitHub - EvilPort2/Sign-Language: A very simple CNN project.

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

github.com

나는 이 프로젝트를 정말 열심히 뜯어 헤쳐보고 찾아봤다. 그래도 깃허브에서 sign language로 가장 유명한 프로젝트인 것 같아서. 조금 더 발전시킬 수 있을거라 생각했지만... 

 

각설하고. 해당 깃허브를 클론 후 압축해제하면 여러분이 만날 수많은 파일이 있다. .yml 파일부터 .db 파일 .txt파일.. 매우많다. 그러나 그것들은 일단 신경끄시길! 여러분이 신경써야할 파일은 다음과 같다. 이것만 신경쓰면 된다.

 

파일별로 설명

 

 

cnn_keras: keras를 이용한 cnn 구현

cnn_tf: tensorflow를 이용한 cnn 구현

 

tensorflow와 keras를 모두 이용해 각각 cnn을 구현했다. 나중에 recognize_gesture에서 사용되는 것을 보면 알겠지만 keras, tensorflow를 이용해 각각 인식하고 둘 중에 정확도가 높은 것을 출력해주는 시스템이다

 

set_hand_hist: 사람마다 손의 색이 다르다. 따라서 정확한 손모양 인식을 위해서는 사람의 고유한 손 색상을 가져올 필요가 있다. 이 파일을 이용해 사용자의 손 색상을 확인한 뒤 나중에 손 모양 인식을 위해 활용하는 것이다. 

 

load_images: 데이터를 이용해 모델을 트레이닝하는 파일

 

flip_images: 다운받은 데이터를 좌우전환해서 데이터를 두배로 뻥튀기하는 파일

 

get_model_reports: 예측의 정확도를 측정한다

 

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

 

 

활용된 데이터

 

데이터는 gestures 파일에 폴더 0부터 43까지 저장돼있다. 매우많다. 

 

 

예를 들어 27 폴더에 들어가보면 

비슷한 사진들만 2400장의 이미지가 나온다. 이미 flip_images를 수행하여 1200장의 이미지를 좌우대칭시킨 2400장의 이미지들이 저장되어있다.

모두 50*50 픽셀 크기인 데이터들이다

 

 

0부터 1200까지의 데이터는 왼손을 촬영한 이미지

1200부터 2400까지의 데이터는 오른손을 촬영한 이미지이다.

같은 숫자를 의미하는 데이터들은 모두 하나의 폴더에 저장되어있고,

폴더명과 숫자는 gesture_db.db파일을 보면 확인할 수 있다. 

 

 

26 폴더는 숫자 0을 의미하고, 27 폴더는 숫자 1을 의미.. 

 

 

Recognize_gesture

자! 데이터도 있겠다 이미 학습된 cnn도 있겠다 !!그러면 이제 cnn을 이용해 손동작을 번역하는 과정만 남았다. 그 과정이 바로 recognize_gesture라는 파일 안에 모두 담겨있다.

이미지를 촬영하고 그 이미지안에 손모양을 인식하고, 그 인식된 손모양을 번역하는 과정이 모두 recognize_gesture에 담긴 내용이다.

 

 

 

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

 

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

 

 

                                             

여기까지는 경계선을 인식해 손모양을 검출하고, 그 결과 이미지를 저장하는 과정이다. 

 

 

                                             

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

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

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

 

 

직접 테스트한 영상

 

 

 

 

 

 

 

 

덧. CNN에 대한 간략한 설명

깃허브에 model.png라는 파일이 있다. 확인하면 이런 이미지가 나온다.

CNN을 처음 접하는 사람들은 이게뭐지 싶을 것이다. 그동안 내가 공부했던 바를 압축해 전달하자면 이렇다.

 

CNN이라는 것은, 데이터를 분류하기 위한 필터를 생성해내는 과정이다.

말이 어려운가....

 

만약 여러분이 1000장의 개와 고양이에 대한 이미지가 있다고 치자. 그리고 그에 대한 정답이 적힌 텍스트도 있다고 치자. 그러면 CNN이 알아서!!!! 학습을 해준다. 무엇을? 고양이와 개를 분류하기 위한 필터를 점점 학습하는 거다. 그럼 이후에는 정답이 적힌 텍스트 없이도! 개와 고양이를 알아서 분류할 수 있게되는 것이다.

 

그렇다면 개랑 고양이말고도, 손모양에 대한 이미지도 학습할 수 있는가? 답은 예스! 이미지와 정답이 적힌 텍스트만 있다면 CNN이 알아서 학습을 한다. 이후에는 훈련되지 않은 이미지를 알아서 분류할 수 있다.

그러나 기계인 만큼.. 간혹 1을 2라고 평가하고, 2를 3이라고 평가하는 경우가 있겠지? 그럼 그런 오류를 줄여야겠지? 그래서 계속 모델의 정확도를 평가하고 조금 더 정확도를 높일 수 있도록 많은 데이터를 학습시키는 것이다.

 

그러면 도대체 학습이라는 과정이 어떻게 진행되는가.. 어떻게 학습을 하는 것인가.. 를 model.png에 써놓은 것이다. ^^

그러나 솔직히 AI 대학원 진학을 생각하고 전문가가 될 것이 아니라면 저 모델을 굳이 뜯어 살펴보고 덴스 레이어, 맥스풀링 레이어에 대해 공부할 필요는 없다. 

단순히 CNN을 프로젝트에 조금 이용할 생각이라면 그냥 딱 여기까지만 알면 충분하다.

물론 전문가가 되고 싶다면 공부해야한다.

 

그리고, 내가 느꼈던 이 오픈소스 프로젝트의 단점, 개선점

1. 흑백 이미지를 사용한다.

용량을 아끼기 위해서인 것 같은데, 흑백 이미지를 사용하기 때문에 어떤 손동작의 경우에는 인식이 매우 어렵다.

이미지를 흑백으로 바꾸면 명암과 그림자 같은 정보가 전부 사라진다.. 그 이미지를 열심히 트레이닝 시켜도 같은 동작에 대해 인식 정확도가 떨어진다. 

주어진 이미지 데이터 말고 다른 이미지 데이터를 이용해 직접 ! 트레이닝 시켜본 경험에 근거해 말씀 드린다. 

흑백 이미지를 이용해 트레이닝 하는 건 .. 용량 면에서는 장점이 될 수 있으나 정확도가 색채 이미지에 비해 떨어진다.. ㅜ

 

2. 동적인 영상에 대한 번역이 불가능하다.

가장 고민스러운 부분.. CNN만을 활용하고 있기 때문에 동적인 영상에 대해 번역 하는 것은 이 프로젝트와 차원이 다른 문제이다. 결국 다른 해결책을 생각해봐야했다.

 

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

 

Comments