우리 팀의 프로젝트 제목은 '딥러닝과 IoT 기반 코로나 탐지 및 예방 시스템' 이다.
우리 조가 제안하는 내용은 공공 실내 장소에서 기침을 하거나 마스크 미착용자를 자동으로 판별하여 관리자에게 알려주는 시스템이다.
프로젝트를 구현하기 위해서 1. 기침 소리 인식 딥러닝 모델 2. 마스크 착용 미착용 인식 딥러닝 모델 3. IoT- 라즈베리파이 4. 클라이언트에서 출력할 방법을 공부해야 했었다.
1. 기침 소리 인식 딥러닝 모델
딥러닝 기반 소리 인식 선행 연구를 공부해보니 오디오 인식을 위해서 입력된 신호에서 소리의 특징을 추출해야 했다. 가장 대표적으로 사용되는 MFCC 특징추출은 이론적으로는 다음과 같은 과정으로 신행된다.
1. 입력시간 도메인의 소리신호를 작은 크기 frame으로 자른다.
2. 파워스펙트럼의 주기도 평가를 계산
3. 멜 필터뱅크 적용
4. 각 필터에 대한 에너지 합
5. 로그 취함
6. dct 취한 값에서 계수 12개가 mfcc
이를 사용하기 쉽게 라이브러리로 만들어진 것이 파이썬으로 librosa 라이브러리이다.
librosa.load(파일명) 해서 샘플 데이터를 plot 해보니 위와 같은 모양으로 나온다.
이제 수집한 소리 데이터를 불러오기 위해 csv 형태로 저장된 데이터를 판다스 데이터프레임 형태로 불러왔다. 이때 데이터프레임에는 파일명과 정보, 분류되는 클래스명 등이 포함된다.
직접 수집한 기침소리 500개 파일을 포함한 9232개 파일 각각의 소리의 특징을 추출하여
데이터프레임에 소리 특징과 그에 해당하는 클래스를 저장했다. 이때 클래스는 범주형으로 바꾸게 되었다.
위에 데이터를 train과 test로 쪼개서 CNN 모델에 학습시킨다.
그리고 Convolution Neural Network에 학습시키기 위해서는 동일한 크기의 데이터가 필요한데 mfcc 특징 추출할 때 입력 데이터의 크기 (길이)가 모두 달랐기 때문에 train과 test 의 모양을 reshape할 필요가 있었다. 그래서 길이가 긴 파일을 기준으로 그것보다 길이가 긴 파일은 zero padding을 했고 그 길이보다 길이가 긴 몇 개의 파일은 직접 기침이 있는 부분만 잘라서 길이 조정을 했다.
초기에는 단순히 fully connected layer로 구성된 모델을 사용하여 다음과 같이 결과가 나왔다.
모델 구조를 다음과 다음과 같이 바꾸어
성능이 개선됨을 볼 수 있었다.
2. 마스크 착용 미착용 인식 딥러닝 모델
직접 웹상에서 다운받은 사진들에서 마스크를 착용한 자들과 마스크 미착용자들을 박스로 좌표값을 표시하고 각각을 not wearing mask와 wearing mask로 레이블링을 했다.
그런 다음 yolo v3 다크넷 네트워크를 이용하여 detect 하도록 했다. yolo 를 사용한 이유는 RCNN과 다르게 합성곱 신경망을 단 한번만 통과시켜서 실시간 객체 탐지에 적합한 모델이라서 이를 이용했다.
아래 링크 사이트를 보면서 공부했고, 마스크 / 비마스크 커스터마이즈 욜로 weight 얻게 되었다.
www.youtube.com/watch?v=10joRJt39Ns&t=1224s
결과로 나오는 detect 의 성능은 일반적으로 객체 탐지 분야에서 성능을 평가하기 위해 사용되는 수치인 mAP (mean Average Precision) 로 보면 63.4 mAP 이다.
다양한 이미지에 마스크를 인식시키니 다음과 같이 나왔다.
3. 라즈베리파이
처음에는 단순히 집에 아두이노 보드가 있어서 아두이노를 사용해보려고 시도했었다. 그러나 소리를 녹음시킬만한 마땅한 센서가 없었고 아두이노 와이파이 기능을 되게 하려고 여러가지 방법 시도했었으나 SoundSensor 연결해서 serial 통신으로 되는 것까지는 되었으나, 와이파이와 관련된 모듈이 키트 안에 있었는데 그것으로 시도했지만 잘 되지 않았고 기존의 소스도 많이 찾아보기 어려웠다. 그리고 데이터를 압축하는 방법도 찾아내는 것이 쉽지 않아서 라즈베리파이로 개발환경을 바꾸기로 결정했다.
초기셋팅에 신경써야할 부분이 많았다.
- raspbian os 설치 필요: sd 카드에 설치해서 라즈베리에 심어야 한다.
- 처음에는 시간 동기화가 되지 않아서 몇 시간동안 오류를 잡으려고 해서 결국에는 시간 동기화를 할 수 있게 되었다.
- 시간동기화가 되고 인터넷에 연결되면 그 이후에는 쉬워진다.
- 우선 pyaudio를 라즈베리파이 (클라이언트)에 설치한다. (왜냐하면 라즈베리파이에 연결한 마이크 모듈로부터 녹음된 소리를 서버로 보내기 위해서이다.)
- 내 pc (서버단)에 pyftplib를 설치한다.
서버: port에서 21 지정하여, 내 pc에서 특정 디렉토리에 클라이언트로부터 넘겨받은 파일을 저장하고 싶다면 demon 프로세스를 우선 띄우고
클라이언트: 서버랑 통신하려고 하면 서버가 연결된 IP 주소를 파라미터로 입력, 서버의 디렉토리명 지정한다.
4. 로컬 서버로 결과를 출력하는 방법
우리 프로젝트의 결과는 라즈베리파이에 연결된 마이크 모듈과 카메라 모듈로부터 전달받은 소리 데이터와 영상 데이터를 서버에서 동시에 인식시키고, 마스크 인식 관련해서는 웹페이지에 실시간 상황을 띄우고, 기침소리 인식 관련해서는 pc에 연결된 블루투스 스피커로 기침소리가 인식되었다는 알람이 출력된다.
관련된 모든 코드는 졸업프로젝트 github에서 볼 수 있을 것이다.