COVID19는 전 세계에 매우 심각한 영향을 미치는 역사적인 대유행이며 사람들은 이에 맞서 싸울 새로운 장치를 많이 만들고 있습니다. 또한 비접촉식 온도 스크리닝을위한 자동 살균 장치와 Thermal Gun도 구축했습니다. 오늘 우리는 코로나 바이러스와 싸우는 데 도움이되는 장치를 하나 더 만들 것입니다. 그것은이다 기침 탐지 시스템 소음 및 기침 소리를 구별 할 수 및 코로나 용의자를 찾는 데 도움이 될 수 있습니다. 이를 위해 기계 학습 기술을 사용합니다.
이 튜토리얼에서는 Arduino 33 BLE Sense 및 Edge Impulse Studio를 사용하여 기침 감지 시스템 을 구축 할 것 입니다. 실시간 오디오에서 정상적인 배경 소음과 기침을 구분할 수 있습니다. 우리는 Edge Impulse Studio를 사용하여 기침 및 배경 소음 샘플 데이터 세트를 훈련하고 실시간으로 기침 소리를 감지 할 수있는 고도로 최적화 된 TInyML 모델을 구축했습니다.
필요한 구성 요소
하드웨어
- Arduino 33 BLE Sense
- LED
- 점퍼 와이어
소프트웨어
- 에지 임펄스 스튜디오
- Arduino IDE
Arduino 33 BLE Sense에 대한 자세한 자습서를 다루었습니다.
회로도
Arduino 33 BLE Sense를 사용한 기침 감지 회로도 는 다음과 같습니다. Arduino 33 BLE의 Fritzing 부분은 사용할 수 없었기 때문에 둘 다 동일한 핀아웃을 가지고 있기 때문에 Arduino Nano를 사용했습니다.
LED의 양극 리드는 Arduino 33 BLE 감지의 디지털 핀 4에 연결되고 음극 리드는 Arduino의 GND 핀에 연결됩니다.
기침 감지 기계를위한 데이터 셋 생성
앞서 언급했듯이 기침 감지 모델을 훈련하기 위해 Edge Impulse Studio를 사용하고 있습니다. 이를 위해 Arduino에서 인식 할 수있는 데이터 샘플이있는 데이터 세트를 수집해야합니다. 목표는 기침을 감지하는 것이므로 기침과 다른 소음을 구분할 수 있도록 일부 샘플과 소음에 대한 다른 샘플을 수집해야합니다.
"기침"과 "노이즈"클래스의 두 가지 데이터 세트를 만듭니다. 데이터 세트를 만들려면 Edge Impulse 계정을 만들고 계정을 확인한 다음 새 프로젝트를 시작하세요. 모바일, Arduino 보드를 사용하여 샘플을로드하거나 데이터 세트를 에지 임펄스 계정으로 가져올 수 있습니다. 샘플을 계정에로드하는 가장 쉬운 방법은 휴대폰을 사용하는 것입니다. 이를 위해서는 모바일을 Edge Impulse와 연결해야합니다.
휴대폰을 연결하려면 ' 장치 '를 클릭 한 다음 ' 새 장치 연결 '을 클릭하십시오.
이제 다음 창에서 ' Use your Mobile Phone'을 클릭 하면 QR 코드가 나타납니다. Google 렌즈 또는 기타 QR 코드 스캐너 앱을 사용하여 휴대폰으로 QR 코드를 스캔합니다.
그러면 휴대폰이 Edge Impulse 스튜디오와 연결됩니다.
휴대폰을 Edge Impulse Studio에 연결하면 이제 샘플을로드 할 수 있습니다. 샘플을로드하려면 ' 데이터 수집'을 클릭하십시오. 이제 데이터 수집 페이지에서 레이블 이름을 입력하고 마이크를 센서로 선택한 다음 샘플 길이를 입력합니다. 40 초 샘플 샘플링을 시작 하려면 ' 샘플링 시작 '을 클릭하십시오. 기침을 강요하는 대신 길이가 다른 온라인 기침 샘플을 사용할 수 있습니다. 길이가 다른 총 10 ~ 12 개의 기침 샘플을 기록합니다.
기침 샘플을 업로드 한 후 이제 라벨을 '노이즈'로 설정하고 다른 10 ~ 12 개의 노이즈 샘플을 수집합니다.
이 샘플은 모듈 교육용이며 다음 단계에서 테스트 데이터를 수집합니다. 테스트 데이터는 학습 데이터의 30 % 이상이어야하므로 '잡음'샘플 3 개와 '기침'샘플 4 ~ 5 개를 수집합니다.
데이터를 수집하는 대신 Edge Impulse CLI 업 로더를 사용하여 데이터 세트를 Edge Impulse 계정으로 가져올 수 있습니다.
CLI 업 로더를 설치하려면 먼저 노트북에 Node.js를 다운로드하여 설치하십시오. 그 후 명령 프롬프트를 열고 아래 명령을 입력하십시오.
npm install -g edge-impulse-cli
이제 데이터 세트 (Dataset Link)를 다운로드하고 프로젝트 폴더에서 파일을 추출합니다. 명령 프롬프트를 열고 데이터 세트 위치로 이동 한 후 아래 명령을 실행합니다.
edge-impulse-uploader --clean edge-impulse-uploader --category training training / *. json edge-impulse-uploader-카테고리 training training / *. cbor edge-impulse-uploader --category testing testing / *. json edge-impulse-uploader-카테고리 테스트 테스트 /*.cbor
모델 훈련 및 코드 조정
데이터 세트가 준비되었으므로 이제 데이터에 대한 임펄스를 생성합니다. 이를 위해 ' 충동 생성 '페이지 로 이동 하십시오.
이제 ' 임펄스 만들기' 페이지에서 ' 처리 블록 추가 '를 클릭합니다. 다음 창에서 오디오 (MFCC) 블록을 선택합니다. 그 후 ' 학습 블록 추가 '를 클릭 하고 신경망 (Keras) 블록을 선택합니다. 그런 다음 ' Save Impulse'를 클릭하십시오.
다음 단계에서 MFCC 페이지로 이동 한 다음 ' 기능 생성 '을 클릭합니다. 모든 오디오 창에 대해 MFCC 블록을 생성합니다.
그런 다음 ' NN 분류기' 페이지 로 이동 하여 ' 신경망 설정' 의 오른쪽 상단 모서리에있는 세 개의 점을 클릭하고 ' Keras (전문가) 모드로 전환 ' 을 선택 합니다 .
원본을 다음 코드로 바꾸고 ' 최소 신뢰도' 를 '0.70'으로 변경합니다. 그런 다음 ' 훈련 시작' 버튼을 클릭하십시오. 모델 학습이 시작됩니다.
tensorflow.keras.models에서 tf로 tensorflow 가져 오기 tensorflow.keras.layers에서 Sequential import Dense, InputLayer, Dropout, Flatten, Reshape, BatchNormalization, Conv2D, MaxPooling2D, AveragePooling2D from tensorflow.keras.optimizers import Adam from tensorflow.keras. import MaxNorm # 모델 아키텍처 모델 = Sequential () model.add (InputLayer (input_shape = (X_train.shape,), name = 'x_input')) model.add (Reshape ((int (X_train.shape / 13), 13, 1), input_shape = (X_train.shape,))) model.add (Conv2D (10, kernel_size = 5, activation = 'relu', padding = 'same', kernel_constraint = MaxNorm (3))) model.add (AveragePooling2D (pool_size = 2, padding = 'same')) model.add (Conv2D (5, kernel_size = 5, activation = 'relu', padding = 'same', kernel_constraint = MaxNorm (3))) model.add (AveragePooling2D (pool_size = 2,padding = 'same')) model.add (Flatten ()) model.add (Dense (classes, activation = 'softmax', name = 'y_pred', kernel_constraint = MaxNorm (3))) # 학습률을 제어합니다. = Adam (lr = 0.005, beta_1 = 0.9, beta_2 = 0.999) # 신경망 모델 훈련.compile (loss = 'categorical_crossentropy', optimizer = opt, metrics =) model.fit (X_train, Y_train, batch_size = 32, epochs = 9, validation_data = (X_test, Y_test), verbose = 2)verbose = 2)verbose = 2)
모델을 훈련 한 후 훈련 성능을 보여줍니다. 저에게있어 정확도는 96.5 % 였고 손실은 0.10이었습니다.
이제 기침 감지 모델이 준비되었으므로이 모델을 Arduino 라이브러리로 배포합니다. 모델을 라이브러리로 다운로드하기 전에 ' 라이브 분류 ' 페이지 로 이동하여 성능을 테스트 할 수 있습니다.
' 배포 '페이지로 이동하여 ' 아두 이노 라이브러리'를 선택 합니다. 이제 아래로 스크롤하고 'Build' 를 클릭 하여 프로세스를 시작하십시오. 그러면 프로젝트에 대한 Arduino 라이브러리가 빌드됩니다.
이제 Arduino IDE에 라이브러리를 추가하십시오. 이를 위해 Arduino IDE를 연 다음 Sketch> Include Library> Add.ZIP 라이브러리 를 클릭 합니다.
그런 다음 File> Examples> Your project name-Edge Impulse> nano_ble33_sense_microphone 으로 이동하여 예제를로드합니다 .
Arduino가 기침을 감지 할 때 경고음을 낼 수 있도록 코드를 약간 변경합니다. 이를 위해 부저가 Arduino와 연동되어 기침이 감지 될 때마다 LED가 세 번 깜박입니다.
노이즈와 기침 값을 인쇄하는 void loop () 함수 에서 변경 됩니다. 원래 코드에서는 레이블과 해당 값을 함께 인쇄합니다.
for (size_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {ei_printf ("% s: %.5f \ n", result.classification.label, result.classification.value); }
소음과 기침 값을 다른 변수에 저장하고 소음 값을 비교할 것입니다. 소음 값이 0.50 미만이면 기침 값이 0.50 이상임을 의미하며 소리가납니다. 원래 for loop () 코드를 다음으로 바꿉니다.
for (size_t ix = 1; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {Serial.print (result.classification.value); float 데이터 = result.classification.value; if (Data <0.50) {Serial.print ("기침 감지"); 경보(); }}
변경 한 후 코드를 Arduino에 업로드하십시오. 115200 보드에서 직렬 모니터를 엽니 다.
이것이 기침 감지 기계를 만드는 방법입니다. COVID19 용의자를 찾는 데 매우 효과적인 방법은 아니지만 혼잡 한 지역에서는 잘 작동 할 수 있습니다.
라이브러리 및 코드가 포함 된 전체 작업 비디오는 다음과 같습니다.