STM32Cube.AI

사용 기술
콘테스트 프로젝트 진행 상황
각 Quest를 단계적으로 완성하는 프로젝트입니다.
Quest 1: STM32Cube.AI 개발 환경 구축
2022.08.01
1. cnn_gmp.h5 모델을 Analyze 후 출력된 화면입니다.

2. cnn_gmp.h5 모델을 Analyze 후 Show graph 기능을 통해 출력된 화면입니다.

3. Analyze의 결과인 network_analyze_report.txt입니다. (첨부파일을 참고해 주시기 바랍니다.)
Quest 2: Neural Network Model 생성 개발 환경 구축하기
2022.08.08
# Accuracy, Model Loss Function, Confusion matrix 그래프를 제출



# network_analyze_report.txt 제출(첨부파일을 참고 해 주세요.)
Quest 3: [Quest 3] B-L475E-IOT01A 보드에 바이너리 파일 라이팅하기
2022.09.01
1. B-L475E-IOT01A1 보드에 연결된 BLE 모듈인 BlueNRG의 Device Name을 변경하고 “STBLESensor” Mobile App에서 Device 검색화면을 Capture 후 제출합니다.
-> 'MAKE 닉네임(rudals)'을 BlueNRG의 Device Name으로 변경해 보았습니다.
2.“STBLESensor” Mobile App과 Board를 BLE로 연결하고 Activity Recognition을 선택하여 보드를 손으로 흔들어 보면서 Activity Recognition의 결과가 달라지는 것을 동영상으로 간단하게 촬영하여 제출합니다.
-> 아래 유투브 영상을 참고 해 주시기 바랍니다.
Quest 4: B-L475E-IOT01A 보드 가속도 센서 활용하여 AI 모델을 위한 Dataset 구성하기
2022.09.13
1.B-L475E-IOT01A1 보드와 STBLESensor Mobile App을 사용하여 Jogging, Stationary, Stairs, Walking을 라벨링하여 로깅한 파일을 제출합니다.
앱에서 아래와 같이 Jogging, Stationary, Stairs, Walking을 라벨링하였습니다.

10회 로깅한 데이터를 Quest4_Dataset_rudals.zip으로 압축하여 첨부파일로 올렸습니다.
.png)
Quest 5: 새로 생성한 학습된 Model을 STM32Cube.AI를 사용하여 프로젝트에 적용하기
2022.09.23
B-L475-IOT01A1 보드를 좌우로 천천히 움직이면서 Walking을 좌우로 빨리 움직이면서 Jogging을 로깅받았습니다.

로깅받은 데이터로부터 har_IGN.h5를 생성하였습니다.



새로운 har_IGN.h5로 업데이트하여 소스코드 생성 후 기존것과 새로운것중 일부분만 비교해 보았습니다.

생성된 데이터를 기존 FP-AI-SENSING1 프로젝트에 적용 후 보드에 다운로드 받았습니다.
.png)
아래는 적용후 테스트 영상입니다.
Quest 6: 숫자 맞추기(Guess the number) 게임기
2022.10.09
STM32 퀘스트 챌린지 - STM32Cube.AI
# 소개
이번 STM32Cube.AI 챌린지에서는 머신 러닝의 기본이라 생각되는 MNIST를 사용하여 ‘숫자 맞추기(Guess the number)’ 게임기를 제작해 보았습니다. MNIST(Modified National Institute of Standards and Technology database)는 숫자 0부터 9까지의 이미지로 구성된 손 글씨 데이터 셋인데 이것을 사용하여 사용자로부터 입력 받은 데이터를 B-L475E-IOT01A 보드가 추론한 결과값과 비교하여 맞춰가는 방식으로 동작됩니다
# 구성
대략적인 구성은 아래와 같습니다.

1. B-L475E-IOT01A 보드에 전원을 넣으면 랜덤하게 0~9중 하나의 숫자를 생성합니다.
2. 윈도우 PC에서 C# 프로그램을 사용하여 제작하였는데 사용자가 마우스로 숫자 0~9까지의 숫자 중 하나를 마우스로 그리면 입력된 이미지를 MNIST용 이미지로 변환 후 UART로 전송합니다.
3. 전송된 테스트 이미지는 STM32Cube.AI를 거쳐 추론된 결과값을 기존 값과 비교하여 높거나 낮은지를 판단한 결과 값을 OLED에 보여 줍니다.
# 구현
구현은 하드웨어적인 부분과 소프트웨어적인 부분으로 나눠 구현해 보았습니다.
하드웨어 구현
B-L475E-IOT01A 보드에서 게임 관련 정보를 표시하기 위해 아래와 같은 모듈을 만들어 보았습니다.
보드와 OLED가 I2C 인터페이스로 연결되기 때문에 단순히 4개의 라인만 연결시키면 되는 간단한 모듈입니다.

아래와 같은 식으로 연결하여 게임 정보 관련 내용을 디스플레이합니다.

소프트웨어 구현
- 사용자 입력 프로그램 제작
사용자로부터 숫자를 입력받기 위해 아래와 같은 프로그램을 C#을 사용하여 제작하였습니다.

Uart Log 영역은 B-L475E-IOT01A의 로그가 출력됩니다.
WebCam 영역은 웹캠으로 입력된 B-L475E-IOT01A의 현재 상태를 모니터링 하는 용도입니다.
Handwriting Board 영역은 사용자로부터 마우스로 그린 숫자를 입력받는 용도입니다.
사용자로가 마우스로 숫자를 그린 후 아래의 Send 버튼을 누르면 입력된 숫자 이미지를 MNIST에 필요한 이미지로 변환 후 uart를 통해 전송됩니다. 전송된 데이트는 STM32Cube.AI에 입력되고 추론된 결과를 OLED에 보여줍니다.
- 모델 생성 코드
아래 소스코드를 사용하여 모델을 생성하였습니다.
keras의 mnist.load_data로 MNIST 데이터셋을 얻은 후 CNN을 사용하였습니다.
|
import numpy as np batch_size = 128
x_train = x_train.astype("float32") / 255 x_train = np.expand_dims(x_train, -1) print("x_train shape:", x_train.shape) y_train = keras.utils.to_categorical(y_train, num_classes) return x_train, x_test, y_train, y_test
test_loss, test_acc = model.evaluate(x_test, y_test) plt.plot(history.history['acc']) plt.plot(history.history['loss'])
predictedClassCode = np.argmax(predictions, axis=1) cM = metrics.confusion_matrix(groundTruthClassCode, predictedClassCode)
fig, ax = plt.subplots(figsize=(7, 7)) im = ax.imshow(cmNormalized, interpolation='nearest', cmap=plt.cm.Blues) plt.xlabel('Predicted Values') classes = [str(x) for x in range(0, 10)] width, height = cM.shape print('Accuracy for each class is given below.') plt.tight_layout() plt.savefig('_confusion_matrix.png') x_train, x_test, y_train, y_test = prepare_data() |
Accuracy, Loss 그래프와 Confusion Matrix 차트를 출력해 보았습니다.


# 테스트 환경
아래와 같은 테스트 환경을 구축하여 테스트 하였습니다.
.png)
# 테스트 영상
프로젝트 갤러리
프로젝트 제작 과정과 최종 결과물을 담은 이미지 갤러리입니다.







![[Quest 3] B-L475E-IOT01A 보드에 바이너리 파일 라이팅하기](https://cdn.e4ds.com/make/images/a0hip8gv26ymb62d943w.jpg)
![[Quest 3] B-L475E-IOT01A 보드에 바이너리 파일 라이팅하기](https://cdn.e4ds.com/images/ck/p6m1crlenupccir6yfvi.png)


.png)








프로젝트 자료실
프로젝트를 재현하거나 학습하는데 필요한 모든 자료를 제공합니다.
등록된 자료가 없습니다.
프로젝트 소개
사용 기술
코드 & 회로도
등록된 코드/회로 자료가 없습니다.
댓글 11개
게시글의 첨부파일을 새로 업데이트해도 맨 처음 올린 파일만 등록되고 그 후의 다시 올린 파일들은 등록이 안되는 문제로 문서 및 코드가 게시글과 다를수 있습니다.
저도 그랬는데.. rudals님도 그러시군요.. 그래도 좋은 결과를 얻으신것 같아서 부럽습니다.. 저는 실험에 실패한채로 제출했는데 업로드도 이상하네요. -_-;
Rudals님의 참신한 작품 잘 감상하였습니다. 멋지십니다. ^^ MNIST는 정말 딥러닝계의 정석 (like 수학의 정석) 느낌입니다. UART외에 Bluetooth 인터페이스 버젼도 추후 기대합니다. Thums up. :)
많이 배웠습니다. Model과 학습 Data를 어떻게 만드셨는지 궁금하네요.
prepare_data 메서드를 보면 keras.datasets.mnist.load_data() 를 호출하면 70000만개의 데이터를 로딩해 주며 train_model 메서드를 보면 model.save('model.h5') 부분에서 모델을 저장합니다. 그 이후는 이번 퀘스트에서 했던 방법과 동일하게 CubeMX를 통해 프로젝트를 생성 후 OLED를 추가하는 작업을 해 주었습니다.
원래는 좀 더 범용적으로 사용하기 위해 WiFi 인터페이스를 적용하여 웹 브라우저에서 동작 테스트를 하던중 데스크탑에서는 괜찮은데 모바일에서는 선을 그리면 터치로 동작되어 웹페이지가 위/아래로 스크롤 동작이 되어 방법을 강구해 보다가... 차선책으로 UART로 전환하여 동작시켰습니다. ^^;;;
감사합니다. MNIST 자료를 찾아보니 비슷한 내용이 있네요. "[텐서플로2] MNIST 데이터를 훈련 데이터로 사용한 DNN 학습"
MNIST가 머신러닝계의 Hello World 정도의 내용이라 조금 검색해 보시면 다양한 내용을 쉽게 찾아 보실수 있을겁니다.
수상을 축하드립니다.^^
감사합니다. 자작공작소님도 축하드립니다.

.jpg)
게시글의 첨부파일을 새로 업데이트해도 맨 처음 올린 파일만 등록되고 그 후의 파일들은 등록이 안되는 문제로 문서 및 코드가 게시글과 다를수 있습니다.