Predicting COVID-19 using cough sounds classification
기침소리로 코로나-19 감염을 예측하는 인공지능 시스템
Predicting COVID-19 using cough sounds classification
기침소리로 코로나-19 감염을 예측하는 인공지능 시스템
기침소리로 코로나-19 감염을 예측하는 인공지능 시스템
1. 프롤로그
1. 프롤로그
사운드 분류는 어려운 작업이다. 특히, 사운드 샘플이 사람의 귀로 인식 할 수없는 약간의 변화 만있을 때에는 더욱 그러하다. 하지만 최근 기계학습 모델은 사운드 분류 문제를 해결하는데 효과적인 접근을 하기 시작하였다. 의학에서 이러한 응용프로그램은 질병의 진단을 개선하는 데 도움이 될 수 있으며, 심장 및 폐렴과 같은 분야에서 의미 있는 연구주제로 삼고 있다. 이중, COVID-19 기침을 식별하는 컨볼루션 신경망과 기침의 데이터를 사용하여 무증상 COVID-19 감염을 감지하는 M.I.T. AI Model 과 같은 최근의 혁신은 기침소리만으로 COVID-19 환자를 식별 할 수 있음을 보여준다.
수학생각(MATHOUGHT)은 COVID-19 오픈소스인 기침소리 데이터 세트를 사용하여 결과를 재현해보고자 한다. Mathematica를 이용하여 구현하고자 하는 접근방식은 순환신경망을 구성하고 MFCC 기능 추출을 사용하여 전처리 된 오디오 신호를 공급하는 것이다. 이 접근방식은 데이터 샘플이 121개로 매우 제한되어있는 경우임에도 M.I.T. 등 다른 연구에서 얻은 결과와 유사한 약 86%의 정확도를 얻었다.
수학생각(MATHOUGHT)은 COVID-19 오픈소스인 기침소리 데이터 세트를 사용하여 결과를 재현해보고자 한다. Mathematica를 이용하여 구현하고자 하는 접근방식은 순환신경망을 구성하고 MFCC 기능 추출을 사용하여 전처리 된 오디오 신호를 공급하는 것이다. 이 접근방식은 데이터 샘플이 121개로 매우 제한되어있는 경우임에도 M.I.T. 등 다른 연구에서 얻은 결과와 유사한 약 86%의 정확도를 얻었다.
(1) MIT AI-Model 뉴스 https://news.mit.edu/2020/covid-19-cough-cellphone-detection-1029
(2) 기침소리 오픈소스 https://github.com/virufy/virufy_data
(2) 기침소리 오픈소스 https://github.com/virufy/virufy_data
2. 기침소리 오픈소스 데이터셋 구축
2. 기침소리 오픈소스 데이터셋 구축
2.1. 오픈소스 정보
2.1. 오픈소스 정보
[original] 폴더 : 총 17명(음성 9명, 양성 7명)의 연속적인 기침소리 원본파일(mp3)이 [neg] 및 [pos] 에 각각 담겨있다.
[segmented] 폴더 : 위의 연속적인 기침소리를 1번의 기침소리로 분할하여 총 121개의 기침소리 데이터를 생성하였다.
[neg] 폴더에는 73개의 코로나 음성 기침소리, [pos] 폴더에는 48개의 코로나 양성 기침소리가 저장되어 있다.
[segmented] 폴더 : 위의 연속적인 기침소리를 1번의 기침소리로 분할하여 총 121개의 기침소리 데이터를 생성하였다.
[neg] 폴더에는 73개의 코로나 음성 기침소리, [pos] 폴더에는 48개의 코로나 양성 기침소리가 저장되어 있다.
2.2. 오픈소스 폴더 배치
2.2. 오픈소스 폴더 배치
현재 이 문서가 저장된 위치는 다음과 같다.
NotebookDirectory[]
이 문서가 저장된 위치에 기침소리 오픈소스 COVID-19.zip 압축파일을 풀어놓는다.
StringJoin[NotebookDirectory[],"COVID-19"]
2.2. 데이터셋 만들기
2.2. 데이터셋 만들기
기침소리 오픈소스 [COVID-19] 폴더 안에 있는 [segmented] 폴더를 불러와서, 파일명에 기록되어 있는 음성(neg), 양성(pos)을 데이터셋으로 생성하는 함수를 정의한다.
◼
명령문 실행 후, [segmented] 폴더 선택
dataSet=Map[File[#]FileNameTake[#,{-2}]&,FileNames["*.mp3",SystemDialogInput["Directory",StringJoin[NotebookDirectory[],"COVID-19"]],Infinity]];dataSet//Short
3. 훈련(train) 및 테스트(test) 데이터 분류
3. 훈련(train) 및 테스트(test) 데이터 분류
총 121개의 기침소리 데이터 세트를 랜덤으로 훈련용 데이터와 테스트용 데이터로 나눈다.
train=101;(*훈련용데이터개수*)test=20;(*테스트용데이터개수*)random=RandomSample[Range[121],121](*랜덤추출을위한번호*)
3.1. 훈련용 데이터 추출
3.1. 훈련용 데이터 추출
trainDataRandom=Map[dataSet[[#]]&,Take[random,{1,train}]];trainDataRandom//ShorttrainDataRandom//Length
(*훈련용데이터의음성,양성개수*){Total@Table[StringCount[trainDataRandom[[i,2]],"neg"],{i,1,Length[trainDataRandom]}],Total@Table[StringCount[trainDataRandom[[i,2]],"pos"],{i,1,Length[trainDataRandom]}]}
임의로 추출한 훈련용 데이터 101개는 음성(neg) 63개, 양성(pos) 38개의 기침소리로 구성되어 있다.
◼
훈련용 데이터의 기침소리 랜덤으로 추출해서 들어보기
pick=RandomChoice[trainDataRandom]Audio[Keys[pick]]
3.2. 테스트용 데이터 추출
3.2. 테스트용 데이터 추출
testDataRandom=Map[dataSet[[#]]&,Take[random,{train+1,train+test}]];testDataRandom//ShorttestDataRandom//Length
(*테스트용데이터의음성,양성개수*){Total@Table[StringCount[testDataRandom[[i,2]],"neg"],{i,1,Length[testDataRandom]}],Total@Table[StringCount[testDataRandom[[i,2]],"pos"],{i,1,Length[testDataRandom]}]}
임의로 추출한 데스트용 데이터 20개는 음성(neg) 10개, 양성(pos) 10개의 기침소리로 구성되어 있다.
◼
테스트용 데이터의 기침소리 랜덤으로 추출해서 들어보기
pick=RandomChoice[testDataRandom]Audio[Keys[pick]]
4. 오디오 MFCC 인코딩
4. 오디오 MFCC 인코딩
오디오 인코딩은 사람이 생성하는 모든 소리가 성대의 모양(혀, 치아 등)에 따라 결정되기 때문에 오디오 분류에 중요한 단계이다. 따라서 이 모양을 올바르게 결정할 수 있으면, 생성 된 모든 사운드를 정확하게 표현할 수 있다. 악기에서도 마찬가지다. 두 개의 다른 악기가 동일한 사운드 주파수를 생성할 수 있더라도 악기의 물리적 특성(피아노, 바이올린, 기타 등)으로 인해 다른 소리가 난다. 오디오 인코딩 방식중 하나인 MFCC(Mel-Frequency Cepstral Coefficient)는 오디오 신호에서 추출할 수 있는 특징값 중 하나로 소리의 고유한 특징을 나타내는 수치이다. 주로 음성인식, 화자인식, 음성합성, 음악장르분류 등에 사용된다. ( 참고. https://brightwon.tistory.com/m/11 ) 폐 질환과 같은 일부 질병은 공기가 호흡기를 통해 이동하는 방식에 영향을 미칠 수 있으므로 건강한 환자와 아픈 환자 사이에 소리의 차이가 유발될 수 있다. 이때 소리의 차이를 MFCC 인코딩을 통한 특징값으로 표현하여, 그것이 건강한 환자인지 아닌지를 구별해 볼 수 있다. 기침소리로 코로나의 음성, 양성을 구별해보고자 하는 것도 바로 이와 같은 원리다.
4.1. AudioMFCC 추출을 위한 NetEncoder 빌드
4.1. AudioMFCC 추출을 위한 NetEncoder 빌드
encoder=NetEncoder[{"AudioMFCC","TargetLength"All,"NumberOfCoefficients"40,"SampleRate"16000,"WindowSize"1024,"Offset"571,"Normalization""Max"}]
4.2. 훈련용 데이터(기침소리)의 MFCC 인코딩
4.2. 훈련용 데이터(기침소리)의 MFCC 인코딩
◼
임의의 훈련용 데이터에 대한 MFCC 인코딩 데이터 보기
Short[encoder[Audio[RandomChoice[Keys[trainDataRandom]]]],20]
4.3. 테스트용 데이터(기침소리)의 MFCC 인코딩
4.3. 테스트용 데이터(기침소리)의 MFCC 인코딩
◼
임의의 테스트용 데이터에 대한 MFCC 인코딩 데이터 보기
Short[encoder[Audio[RandomChoice[Keys[testDataRandom]]]],20]
5. 인공지능 신경망(Neural Networks) 설계 및 기계학습(Machine Learning)
5. 인공지능 신경망(Neural Networks) 설계 및 기계학습(Machine Learning)
5.1. 반복신경망 : Recurrent Neural Networks (RNN)
5.1. 반복신경망 : Recurrent Neural Networks (RNN)
RNN(Recurrent Neural Network)은 노드 간의 연결이 시간의 흐름에 따라 방향성 그래프를 형성하는 인공 신경망의 한 종류이다. 이를 통해 시간의 흐름에 따른 동적 동작을 모델링하여 필기 인식, 비디오 및 동작 분류 또는 음성 인식과 같은 작업에 적용 할 수 있다.
◼
COVID-19 기계학습을 위한 RNN 빌드
In[]:=
rnn=NetChain[{GatedRecurrentLayer[15,"Dropout"{"VariationalInput"0.2}],SequenceLastLayer[],LinearLayer[12],Ramp,DropoutLayer[.5],LinearLayer[],SoftmaxLayer[]},"Input"encoder,"Output"NetDecoder[{"Class",{"pos","neg"}}]]
5.2. 기계학습(Machine Learning) : NetTrain
5.2. 기계학습(Machine Learning) : NetTrain
훈련용 데이터 세트로 반복신경망(RNN)을 훈련시키고 테스트용 데이터 세트로 검증해보자.
◼
RNN 신경망으로 테스트용 데이터 세트 기계학습 훈련
In[]:=
resultObjectRNN=NetTrain[rnn,trainDataRandom,All,ValidationSettestDataRandom,"MaxTrainingRounds"140]
6. 시스템 검증 Part1 :: 테스트(test) 데이터 이용
6. 시스템 검증 Part1 :: 테스트(test) 데이터 이용
테스트용 데이터를 적용하여 학습수준을 확인해보자.
6.1. 테스트용 데이터셋
6.1. 테스트용 데이터셋
(*테스트용데이터*)testDataRandomtestDataRandom//Length
6.2. 예측 정확성(Accuracy)
6.2. 예측 정확성(Accuracy)
◼
기계학습된 모델(resultObjectRNN)에 테스트용 데이터를 적용한 결과의 정확도 계산
NetMeasurements[resultObjectRNN["TrainedNet"],testDataRandom,"Accuracy"]
◼
혼동행렬그래프(ConfusionMatrixPlot)
NetMeasurements[resultObjectRNN["TrainedNet"],testDataRandom,"ConfusionMatrixPlot"]
◼
개별 예측 확률값
probability=resultObjectRNN["TrainedNet"][Table[testDataRandom[[i,1]],{i,1,Length[testDataRandom]}],"TopProbabilities"];TableForm[Table[Join[{testDataRandom[[i,1]]},{probability[[i,1]]}],{i,1,Length[probability]}],TableHeadingsNone,"Actual Class - 파일명","판별 → 확률",TableAlignmentsLeft,TableSpacing{3,5}]
7. 시스템 검증 Part2 :: 자신의 기침 데이터 이용
7. 시스템 검증 Part2 :: 자신의 기침 데이터 이용
자신이 만든 기침소리로 테스트해보자.
7.1. Mathematica에서 직접 녹음하기
7.1. Mathematica에서 직접 녹음하기
◼
녹음
myCaugh=SystemDialogInput["RecordSound"]
◼
재단
◼
파일 내보내기(myCaugh.mp3)
◼
파일 불러오기(myCaugh.mp3)
◼
파일의 RNN 모델 적용 결과(코로나 판별)
7.2. Smart Phone에서 녹음한 것 이용하기
7.2. Smart Phone에서 녹음한 것 이용하기
◼
녹음
스마트폰으로 기침소리를 녹음하자.
◼
파일 내보내기(myCaugh.mp3)
녹음된 파일을 이 문서가 저장되어 있는 위치에 파일명을 myCaugh로 하여 저장하자.
만약, 스마트폰으로 저장된 파일이 m4a 형식이면, 다음의 사이트에서 mp3 형식으로 변환이 가능하다.
https://convertio.co/kr/m4a-mp3
만약, 스마트폰으로 저장된 파일이 m4a 형식이면, 다음의 사이트에서 mp3 형식으로 변환이 가능하다.
https://convertio.co/kr/m4a-mp3
◼
파일 불러오기(myCaugh.mp3)
◼
재단
◼
파일의 RNN 모델 적용 결과(코로나 판별)
8. 에필로그
8. 에필로그
20개의 다양한 테스트용 데이터 세트에 대한 평가 결과 80% 수준의 정확도로 기침 소리를 분류하여 COVID-19를 감지 할 수있는 모델을 구성하였다. 이는 호흡기(폐) 질환과 같은 의료 과제를 해결하는데 유용함이 있음을 보여준 사례라고 할 수 있다. 비록 본 연구에 사용된 데이터 세트의 총 개수는 121개로 작았지만, 좀 더 많은 데이터 세트를 대상으로 한다면 더욱 좋은 결과가 나올것이라 기대한다.
◼
참고문헌
COVID-19 Cough Classification using Machine Learning and Global Smartphone Recordings” Madhurananda Pahar, Marisa Klopper, Robin Warren, and Thomas Niesler (2020)
“High accuracy classification of COVID-19 coughs using Mel-frequency cepstral coefficients and a Convolutional Neural Network with a use case for smart home devices” Rob Dunne, Tim Morris and Simon Harper (2020) DOI: https://doi.org/10.21203/rs.3.
“From Frequency to Quefrency: A History of the Cepstrum” Alan V. Oppenheim and Ronald W. Schafer (2004)
The dummy’s guide to MFCC.
Artificial intelligence model detects asymptomatic Covid-19 infections through cellphone-recorded coughs.
“Virufy: Global Applicability of Crowdsourced and Clinical Datasets for AI Detection of COVID-19 from Coug”, Gunvant Chaudhari, Xinyi Jiang, Ahmed Fakhry, Asriel Han, Jaclyn Xiao, Sabrina Shen, Amil Khanzada (2020)
“High accuracy classification of COVID-19 coughs using Mel-frequency cepstral coefficients and a Convolutional Neural Network with a use case for smart home devices” Rob Dunne, Tim Morris and Simon Harper (2020) DOI: https://doi.org/10.21203/rs.3.
“From Frequency to Quefrency: A History of the Cepstrum” Alan V. Oppenheim and Ronald W. Schafer (2004)
The dummy’s guide to MFCC.
Artificial intelligence model detects asymptomatic Covid-19 infections through cellphone-recorded coughs.
“Virufy: Global Applicability of Crowdsourced and Clinical Datasets for AI Detection of COVID-19 from Coug”, Gunvant Chaudhari, Xinyi Jiang, Ahmed Fakhry, Asriel Han, Jaclyn Xiao, Sabrina Shen, Amil Khanzada (2020)