딥러닝 CNN 모델을 이용한 고양이 자두의 통조림 요청 울음소리인식
목 차 |
|
1. 서론
1.1 문제해결의 배경 및 목적
1.2. 문제해결의 과정 및 구성
2. 본론
2.1 데이터 수집, 전처리 및 적용이론 고찰
2.2 MFCC 알고리즘 및 CNN 적용 |
3. 결론 및 향후 과제
참고문헌 |
1. 서론
1.1 문제해결의 배경 및 목적
죽어가던 새끼 고양이를 우연히 구조 후, 치료해주다가 입양까지 하게 되었는데. 오전에는 거의 어머니와 고양이가 단 둘이 지내게 되었다. 개만 20년을 키운 어머니는 고양이의 습성이나 울음소리에 대해서 전혀 알지 못했다. 고양이가 기분이 좋아서 골골거리는 소리를 듣고 놀라서 ‘고양이가 감기 걸려서 가래가 끓는 것 같다, 애가 고장이 났다’라며 전화를 할 정도로 고양이에 대해서 알지 못했다.
자두는 사료 외에 캔을 간식으로 먹는데 캔이 먹고 싶을 때 내는 특유의 울음 소리가 있다. 어머니는 캔 달라는 울음소리와 기타 다른 울음소리를 구별하지 못했다. 그래서 캔 달라는 울음 소리에 배변을 했나, 심심한가, 졸린가, 배가 고파서 사료를 먹고 싶은가 해서 여러가지 다른 것을 해주었다.
자두의 캔 달라는 의사 표시를 원활하게 전달하기 위한 장치를 모색하게 되었다. 그 해결방법으로 딥러닝과 라즈베리 파이가 결합된 생활 편의 장치를 구상하게 되었다.
1.2 문제 해결의 과정 및 구성
프로젝트는 표1-1의 순서로 진행했다.
데이터 준비 단계에서 데이터를 직접 녹음기로 수집 후 음성파일을 위한 전처리를 수행했다. 분석방법에 적용할 이론으로 MFCC 알고리즘과 CNN 알고리즘을 선정했다. 소리신호처리(sound processing)에서 소리(sound)를 전력 스펙트럼(power spectrum)으로 표현하는 방법을 mfcc라고 한다. 전처리를 통해 mfcc 알고리즘을 이용하여 오디오 데이터 변환 작업을 진행했다. 전처리된 데이터의 특징을 시각적으로 파악 후 CNN 알고리즘으로 자두의 울음소리를 학습시켰다. 학습된 결과를 해석 후 실생활에 적용할 계획이다.
2. 본론
2.1 데이터 수집, 전처리 및 적용이론 고찰
2.1.1 데이터 수집
데이터는 자두의 울음소리가 필요했기 때문에 자두가 캔을 달라는 울음소리를 낼 때, 기타 다른 이유로 울 때마다 필자가 직접 녹음기로 녹음했다. 총 400개의 raw data가 수집되었다. 수집된 오디오 파일은 모두 WAV 포맷으로 저장되었다. WAV 포맷을 사용하는 이유는 시간에 따른 모든 정보를 나열 했기 때문이다. 우리가 흔히 사용하는 mp3 파일은 가청 주파수 밖의 신호는 잘라내기 때문에 데이터 손실이 일어난다. 반면, WAV는 모든 정보를 가지고 있다. 1
2.1.2 데이터 전처리 및 적용 이론 고찰
신호(signal)는 그 의미가 매우 넓어 정의하기 어렵지만 일반적으로 측정 가능한 양을 표현하는 함수라고 할 수 있다. 우리 주변에는 다양한 신호가 존재한다. 예를 들어 소리는 공기의 진동을 통해 전달되며, 사람은 청각 기관을 통해 이를 인지한다. 공기를 비롯한 다양한 매질은 신호 그 자체만을 전달하는 것이 아니라 필연적으로 잡음을 함께 전달하며, 이와 같은 잡음을 제어하고 신호를 구별해 내는 장치를 시스템이라 한다. 프로젝트 자두는 이 시스템을 완성하는 과정이라 할 수 있다.
일반적으로 신호는 시간에 따라 그 크기가 변화하며, 이는 수학적으로 시간에 따른 함수로 표현된다. 자연계의 대부분의 신호는 모든 시점에서 신호의 크기가 존재하고, 시간에 따라 그 크기가 변화하는 연속시간 신호(continuous time signal)이다. 이와 달리 이산적으로 존재하는, 즉 일정 시점에만 존재하는 신호를 이산시간 신호(discrete time signal)라 한다.
우리가 사용하는 디지털 컴퓨터는 연속시간 신호는 다룰 수 없으며, 이산시간 신호의 처리만이 가능하다. 따라서 자연계에 존재하는 연속시간 신호를 이산시간 신호로 변환할 필요가 있다. 이를 위해 일정한 시간 간격 T_s마다 연속시간 신호 x(t)의 값을 가져와 이산시간 신호 x[n]을 만드는 과정을 샘플링(sampling)이라고 한다.
샘플 값을 얻는 시간 간격 T_s를 샘플링 주기(sampling period)라고 하며, f_s=1/T_s 를 샘플링 주파수(sampling frequency)라고 한다. 예를 들어 그림1과 같은 연속시간 신호를 그림2의 이산시간 신호로 변화시킨다.
그림 1 연속시간 신호
그림 2
이산시간 신호
연속시간 신호를 이산시간 신호로 샘플링할 때는 필연적으로 정보의 손실이 발생하는데, 따라서 세심한 주의가 필요하다. 다행스럽게 샘플링 주파수를 결정하는 이론적 근거가 존재하며, Nyquist-Shannon의 샘플링 정리(Nyquist-Shannon sampling theorem)가 그것이다. 이 정리의 내용은 다음과 같다. 최대 주파수가 f_max Hz인 연속시간 신호 x(t)가 있다고 가정하자. 이 신호를 x[n]=x(nT_s) 로부터 복원하기 위해서는 샘플링 주파수 f_s=1/T_s 는 2f_max 보다 큰 값을 가져야 한다는 것이다.
예를 들어 x(t)=2 sin(20*π*t+ π/4)+3cos(30*π*t+ π/6) 라는 연속신호가 존재한다고 가정하자.
sin(2*π*f*t)=sin(20*π*t) 이므로 2*π*f_1=20* π. 따라서 f_1=10Hz 이다. cos(2*π*f*t)=cos(30*π*t) 이므로 3*π*f_2=30* π.
f_2=15Hz 이다. f_1과 f_2 중 최대값은 15Hz 이므로 f_max=15Hz 이고, 따라서 f_s≥2*15=30Hz 가 된다. 이런 신호의 특성을 고려하고, 기타 다른 문헌을 참조하여 프로젝트 자두에서는 신호 데이터 처리에 주의를 기울였다.
음성파일에서 특징값을 추출하는 알고리즘으로 mfcc를 사용하였다. mfcc란 소리신호처리(sound processing)에서 소리(sound)를 전력 스펙트럼(power spectrum)으로 표현하는 방법이다. 입력된 소리를 일정 구간씩 나누어서 이 구간에 대한 스펙트럼을 분석하여 특징값을 추출한다. mfcc는 크게 4단계로 진행된다. 2
1) 신호는 FIR(Finite Impulse Response)필터에 의해 필터링 된다. 고주파를 미리 증폭시켜 놓기 위함이다. 필터링된 신호 S.fil 는 S.fil(t)=S(t)-a*S(t-1)이다. a는 FIR필터를 조정하는 매개변수이고, t는 시간이다.
2) 신호는 프레임으로 변환되며 각 길이는 hamming window 크기에 따라 달라진다. 해밍 윈도우는 변환으로 인해 각 프레임의 포인트에 부정적인 영향을 미치지 않도록하기 위해 사용된다. 좀더 직관적으로 설명하면 그림3에서 잔물결이 있는데 이러한 잔물결은 감소시키고 signal's frequency spectrum을 정확하게 해주는 역할을 하는 것이다.
3) DFT (Discrete Fourier Transform) 신호는 Mel scale filter bank에 맵핑된다. 즉, 이 단계에서 파워스펙트럼이 구해진다.
4) 마지막으로 역 코사인 변환을 신호에 적용한다.
위 단계를 python 패키지 librosa를 이용하여 변환하였다.
딥러닝 알고리즘 중에 CNN을 사용한 이유는 입력 데이터로 부터 특징을 추출하는 Convolutional Layer를 사용하기 때문이다. 이런 convolutional filter를 다중으로 적용한다. 이때 여러개의 필터를 거치면서 특징값이 손실될 수 있는데 CNN은 padding 기법을 이용하여 특징값이 손실되는 것을 방지하고 오버피팅 가능성도 낮춰준다. 4
컨볼루셔널 계층을 통해서 어느정도 특징이 추출 되었으면, 이 모든 특징을 가지고 판단을 할 필요가 없다. 예를 들면, 우리가 고해상도 사진을 보고 물체를 판별할 수 있지만, 작은 사진을 가지고도 그 사진의 내용이 어떤 사진인지 판단할 수 있는 원리이다. 자두의 울음소리도 마찬가지 원리로 mfcc 알고리즘을 통해 신호의 특징값을 추출하고, CNN을 이용하여 다시 특징을 훈련 시켰다.
2.2 MFCC 알고리즘 및 CNN 적용
2.2.1 MFCC알고리즘 적용
총 400개의 데이터 중 320개는 캔 달라는 울음소리가 녹음 된 파일이고, 80개는 노이즈 파일이다. 노이즈 파일에는 가족 목소리, 자두의 여러 다른 상황의 울음소리, 흔히 고양이와 비슷하다고 하는 아기 울음소리, 필자 집의 생활소음, 여자목소리가 들어 있다.
자두 음성파일 256개는 트레이닝 데이터, 64개는 테스트 데이터이다. 노이즈 파일 80개도 64개는 트레이닝 데이터, 16개는 테스트 데이터로 분할했다. (표2)
표 2 데이터 분할
그림5는 원본 파일 일부를 시각화한 그림이다. 교류신호를 이용하여 그래프로 나타내었다. 전류의 극성이 변화하는 것을 교류라고 하고 교류를 함수로 나타낸 것이 교류신호이다.
그림 5 캔 요청 울음소리 시각화
스펙트럼은 파장에 따라 분해하여 배열한 것인데 각 주파수의 빈도를 나타내 준다고 이해할 수있다.
그림6은 원본 파일 일부를 주파수 형태로 시각화한 것이다. Y축은 데시벨을 나타내며 데시벨은 소리의 어떤 기준 전력에 대한 상대적인 값을 나타낸 것이다. y축에 음의 값이 나타난 이유는 자두 음성의 전력이 기준 전력에 비해 작은 값이라는 것을 의미한다.
그림 6 Spectrum plot
그림7은 Mel scale을 spectrogram으로 시각화한 것이다. Mel scale이란 주파수를 이용해서 얼만큼 거리가 떨어져있는지 나타내는 변환값을 의미한다.
그림
MFC(Mel-frequency cepstrum)는 단구간 신호의 파워스펙트럼을 표현하는 방법 중 하나로, 비선형적인 Mel scale의 주파수 도메인에서 로그파워스펙트럼에 코사인변환 (cosine transform)을 취함으로써 얻을 수 있다. MFCCs(Mel-frequency cepstral coefficients) 는 여러 MFC들을 모아 놓은 계수들을 의미한다. MFCC와 일반적인 캡스트럼(Cepstrum)의 차이는 일반적인 캡스트럼의 경우 주파수 밴드가 균등하게 나누어져 있는 반면 MFCC의 경우 주파수 밴드가 Mel scale에서 균등하게 나누어진다는 것이다. Mel scale로의 주파수 워핑은 소리를 더욱 잘 표현할 수 있는 장점이 있다. 따라서 오디오 압축 등에서 사용된다. 5
Python의 librosa 패키지를 이용하여 400개의 파일에 mfcc 알고리즘을 적용하여 특징값을 추출했다.
자두 음성 데이터와 노이즈 데이터를 나누어서 mfcc 알고리즘을 적용하였다. 윈도우는 25로 설정하였다. 추출 후 자두 음성데이터는 320행의 입력 파일, 625열의 변수, 각 열은 다시 행은 31개의 수치로 구성되었다. 노이즈 데이터는 80행의 입력 파일, 625열의 변수, 각 열은 다시 행은 31개의 수치로 구성되었다. .(그림8에서는 전체 데이터를 표현해서 400행이다.)
분포를 추론하기에 표본평균이 적합하므로 음성데이터와 노이즈 데이터를 각 윈도우에서 추출된 31개의 값을 표본평균을 낸다.
그림 8
다음으로 test집합과 train 집합을 만들었다. 자두 음성 데이터 320개 중 훈련용 집합 256개, 테스트 데이터 64개는 1로 레이블링 했다. 노이즈 데이터 중 트레이닝 데이터 16개, 테스트 데이터 64개는 0으로 레이블링 했다.
총 훈련 데이터 272개 테스트 데이터 128개로 분류 되었다.
2.2.1 딥러닝 : CNN 알고리즘 적용
텐서플로우에 데이터 입력을 원활하기 위해서 평균값을 구한 데이터에서 각 행을 분류하여 1행 625열 데이터를 28행 28열 형태로 변환하였다(그림9).
그림 9 Convolution, pulling 1회 작업 예시
첫번째 레이어 L1은 커널 크기를 3x3로 정하고 필터 갯수를 32개, strides는 1x1으로 정했다. 그리고 ReLu함수에 값을 대입 후 출력된 값을 max pulling 했다. 이때 max pulling 사이즈는 2x2, strides는 2x2로 설정했다. 두번째 레이어 L2는 커널 크기를 3x3로 정하고 필터 갯수를 64개, strides는 1x1으로 정했다. 마찬가지로 ReLu함수에 값을 대입 후 출력된 값을 max pulling 했다. max pulling 사이즈는 2x2, strides는 2x2로 설정했다. (그림10)
그림 10 Convolution, pulling 전체 과정
이렇게 추출된 L2를 2x2x64개, 즉 256열의 벡터로 만들었다. L3는 1x256의 벡터로 나열되어 있고 여기에 256개의 weight 벡터를 곱해서 XW=x_1 w_1+x_2 w_2+⋯+x_256 w_256가 생성되었다. 이렇게 해서 모델 훈련 후 나온 결과가 그림11이다. cost = 0.693, 정확도 = 0.9 의 결과값이 나왔다.
그림 11 학습 결과
3. 결론 및 향후 과제
cost = 0.693는 모델로 분류한 값과 실제 데이터 간의 차이를 의미한다. 정확도 = 0.9는 90%의 확률로 실제 데이터를 분류해 낼 수 있다는 의미이다.
처음 기대에 미치 못하는 결과이기는 하지만, 분류기로서 작동할 가능성을 확인할 수 있었다. 더 많은 데이터가 있었으면 정확도가 올라갈 수 있지 않을까라는 아쉬움이 있다. 또한 딥러닝의 취지와는 어긋나는 측면이 있지만 정규화를 진행 후에 할 경우 성능이 향상될 수 있지 않을까 추측해본다. 학습할 때 윈도우 수를 줄이면 노이즈도 함께 줄어들기 때문에 이 경우도 시도해 볼 계획이다.
CNN을 적용하기 전에 베이스 모델로 SVM을 이용하고 분류 했는데 테스트 데이터에서 구별 못한 소리를 실제로 확인한 결과 예상대로 아기 울음소리, 운동장에서 아이들이 뛰어 노는 소리였다. 아기 울음소리의 경우 사람도 구별하기 힘든 경우가 있어서 이 데이터에 대해서 모델이 추가적으로 개선될 수 있을지는 의구심이 든다.
향후 더 많은 데이터의 수집과 신경망의 개선 과정을 통해 성능 향상이 필요하며, 이렇게 학습된 모델을 배포하여 모바일 기기와의 연동이 요구된다.
[참고문헌]
[1] The Math Trick Behind MP3s, JPEGs, and Homer Simpson’s Face
[2] Mel Frequency Cepstral Coefficients
https://www.rdocumentation.org/packages/tuneR/versions/0.2-6/topics/MFCC
[3] https://stackoverflow.com/questions/5418951/what-is-the-hamming-window-for
[4] 3분 딥러닝, 김진중
[5
[6] 모두를 위한 머신러닝/딥러닝, 김성훈
[7] 밑바닥부터 시작하는 딥러닝, 사이토 고키
[8] 핵심이 보이는 신호 및 시스템, 이철희
[9] Schaum’s Outline of Signals and Systems, 3rd Edition (Schaum's Outlines), Hwei P Hsu
[10
- The Math Trick Behind MP3s, JPEGs, and Homer Simpson’s Face http://nautil.us/blog/the-math-trick-behind-mp3s-jpegs-and-homer-simpsons-face [본문으로]
- Mel Frequency Cepstral Coefficients https://www.rdocumentation.org/packages/tuneR/versions/0.2-6/topics/MFCC [본문으로]
- https://stackoverflow.com/questions/5418951/what-is-the-hamming-window-for [본문으로]
- http://bcho.tistory.com/ [본문으로]
- https://en.wikipedia.org/wiki/Mel-frequency_cepstrum http://www.speech.cs.cmu.edu/15-492/slides/03_mfcc.pdf [본문으로]