STM32Cube.AI를 활용한 Acoustic Scene Classification(음향 장면 분류) 구현

사용 기술
콘테스트 프로젝트 진행 상황
각 Quest를 단계적으로 완성하는 프로젝트입니다.
Quest 1: Quest 1 과제 수행
2022.08.01
1. Analyze 종료 화면
- X-CUBE-AI > Artificial Intelligence V7.2.0 사용

2. Show Graph 화면

3. Analyze Report
- 첨부파일 참조 (network_analyze_report.txt)
Quest 2: Quest 2 과제 제출
2022.08.08
- 닉네임 : 자작공작소
- 폴더이름 : DIY_Workshop
1. Accuracy 그래프를 Capture

2. Model Loss Function 그래프를 Capture

3. Confusion matrix 그래프를 Capture

4. STM32Cube.AI Analyze 결과 화면 제출

5. Analyze 결과 화면에서 표기된 Creating txt report file 경로에서 network_analyze_report.txt 파일을 제출
- 첨부 파일 참조
Quest 3: Quest 3 과제 제출
2022.08.29
※ 보내주시는 보드가 아직 도착하지 않아서 가지고 있던 보드로 진행 하였습니다.
1. B-L475E-IOT01A1 보드에 연결된 BLE 모듈인 BlueNRG의 Device Name을 변경하고 “STBLESensor” Mobile App에서 Device 검색화면을 Capture 후 제출합니다.
Device Name : DIYWORK(자작공작)

2. “STBLESensor” Mobile App과 Board를 BLE로 연결하고 Activity Recognition을 선택하여 보드를 손으로 흔들어 보면서 Activity Recognition의 결과가 달라지는 것을 동영상으로 간단하게 촬영하여 제출합니다.
Quest 4: Quest 4 과제 제출
2022.09.18
1. PC에 이동식 디스크 형태로 연결 후에 로깅한 데이터를 저장 후 제출합니다.
Jogging, Stationary, Stairs, Walking에 대해서 10번 정도 로깅하여 10개의 csv 파일을 압축하여 제출합니다.

>> Jogging, Stationary, Walking는 30초 정도, Stairs는 10초 정도의 데이터를 로깅하였습니다.
학습 데이터를 모으는 것이 중요하고 힘든 과정 이였습니다.
Quest 5: Quest 5 과제 제출
2022.09.23
1. Mobile App과 B-L475-IOT01A1 보드를 이용하여 Human Activity Recognition 을 진행하는 짧은 영상을 레코딩하여 업로드합니다.
아래 조건으로 Quest를 진행합니다.
1) Quest 4에서 로깅한 데이터 40개를 사용해서 har_ign 모델을 만듭니다.
![]() |
![]() |
![]() |
Accuracy for each class is given below.
Jogging : 95.2 %
Stationary : 98.82 %
Stairs : 68.65 %
Walking : 86.36 %
2) CubeMX를 이용해서 위에서 만든 모델을 STM32용으로 변환합니다. X-CUBE-AI 버전 문제(최신 버전으로 제너레이션하면 만들어지는 헤더와 소스파일 구조가 예제와 다름, SENSING1에서 컴파일 오류 발생)로 다운그레이 하여 SENSING1프로젝트에서 빌드가 되도록 합니다.
- Python 3.7
- keras 2.2.4
- X-CUBE-AI 4.1.0 (SENSING1 예제에서 사용한 버전으로 다운그레이)
// har_ign.c
#define AI_TOOLS_VERSION_MAJOR 4
#define AI_TOOLS_VERSION_MINOR 1
#define AI_TOOLS_VERSION_MICRO 0
3) 평가보드로 다운로드하고 Human Activity Recognition을 테스트합니다.
▣ 평가보드를 허리전대에 넣고 테스트 진행

▣ 테스트 영상
Quest 6: Quest 6 과제 제출 ( Audio Scene Classification)
2022.10.10
1. 개발하신 어플리케이션이B-L475E-IOT01A 보드에서 구동하는 동영상을 업로드 해주세요.
2. 상용 머신러닝 툴에서 사용한 Source Code를 업로드 해주세요.
3. B-L475E-IOT01A에 적용된 Application Source Code와 해당 Application에 대한 소개 및 설명을 포함하는 PDF 문서를 업로드 해주세요.
(PDF 문서에는 2번의 머신러닝 툴에서의 Model에 대한 설명도 포함 합니다. 예를 들어 Model의 구성 설명이나 Accuracy 등과 같은 내용을 설명해 주시면 됩니다.)
마지막 퀘스트 도전 주제는 Audio Scene Classification (ASC)입니다.

- 계곡의 물 흐르는 ASMR - 0_water.wav
- 장작 타는소리 ASMR - 1_fire.wav
- 늦은 밤 귀뚜라미 ASMR - 2_night.wav
위 세가지를 케라스 CNN을 이용하여 모델을 만들고 STM32 보드에서 실행하였습니다.
SENSING1 소스에 있는 ASC 프로세싱 소스의 경우 INT8 타입의 입출력 가충치 값만을 사용하도록 되어 있어서 케라스에서 만든 FLOAT32의 가중치 값을 사용하기 위해서는 예제 소스 수정이 필요했습니다. 아래는 수정한 코드의 일부입니다.
또한 ASC 코드가 동작하기 위해서는 힙메모리 확보가 필요했습니다. 그래서 필요없는 HAR 관련 코드를 삭제하였습니다.
ASC_StatusTypeDef ASC_NN_Run(float32_t *pSpectrogram, float32_t *pNetworkOut)
{
ASC_StatusTypeDef ret = ASC_ERROR;
//ai_i8 AscNnOutput[AI_ASC_OUT_1_SIZE] = {};
//ai_i8 AscNnInput[AI_ASC_IN_1_SIZE] = {};
/* Z-Score Scaling on input feature */
for (uint32_t i = 0; i < SPECTROGRAM_ROWS * SPECTROGRAM_COLS; i++)
{
pSpectrogram[i] = (pSpectrogram[i] - featureScalerMean[i]) / featureScalerStd[i];
}
//aiConvertInputFloat_2_Int8(AI_ASC_MODEL_NAME, AI_ASC_MODEL_CTX,pSpectrogram, AscNnInput);
//aiRun(AI_ASC_MODEL_NAME, AI_ASC_MODEL_CTX, AscNnInput, AscNnOutput); // org
aiRun(AI_ASC_MODEL_NAME, AI_ASC_MODEL_CTX, pSpectrogram, pNetworkOut);
//aiConvertOutputInt8_2_Float(AI_ASC_MODEL_NAME, AI_ASC_MODEL_CTX,AscNnOutput, pNetworkOut);
ret = ASC_OK;
return ret;
}
아래는 세가지 소리에 대한 결과입니다.

잘 동작합니다.
자세한 내용은 첨부된 PDF 레포트를 확인해 주십시오.
:)
프로젝트 갤러리
프로젝트 제작 과정과 최종 결과물을 담은 이미지 갤러리입니다.












.png)





프로젝트 자료실
프로젝트를 재현하거나 학습하는데 필요한 모든 자료를 제공합니다.
등록된 자료가 없습니다.
프로젝트 소개
사용 기술
코드 & 회로도
등록된 코드/회로 자료가 없습니다.
댓글 6개
오홋, HAR 코드를 삭제하여 여유 메모리 용량을 확보 할수 있는 방법도 있는데, 전 미쳐 그 생각을 못했습니다. 팁 감사합니다. Thumbs up.
다음에는 RTOS를 사용하지 않는 Bare Metal 환경에서 DFSDM(DMA)설정과 AI-CUBE-X 7.x.x버전에서 동작하는 ASC를 만들어 봐야겠습니다. 당초 계획이었는데 wav파일 전처리 과정을 구현하는데 시간이 필요해 SENSING1소스를 사용하는 것으로 방향을 선회하였습니다. SENSING1의 경우 BSP 드라이버를 사용하는데 이 부분을 참고하면 되겠습니다.
ASC로 노래 제목을 분류하는 것을 처음 목표로 하였으나 SENSING1을 사용해 녹음된 wav파일을 들어 보았을때 연속성이 부족함을 느끼고 실제 추론 과정에서 사용되는 입력 데이터 품질도 유사할 것으로 생각 되었습니다. 따라서 현재 구조에서는 리듬감이 있는 음원으로는 한계가 있어 보입니다. 하지만 장면을 분류하는 것은 음원의 연속성이 중요하지 않아 잘 작동함을 알 수 있습니다.
자작공작소님도 수상 축하드립니다. 저도 제출해주신 내용으로 Audio Scene Classification 한번 도전 해 봐야겠습니다.
고맙습니다. 공유해 드린 X-CUBE-AI의 버그를 수정하시면 잘 동작하는 ASC를 구현해 보실 수 있습니다.

쓰다 보니 자작공작소가 주유공작소가 되었네요. 황금 연휴가 퀘스트와 함께 날아갔습니다. T.T