수행기록퀘스트6
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 차트를 출력해 보았습니다.
# 테스트 환경
아래와 같은 테스트 환경을 구축하여 테스트 하였습니다.
# 테스트 영상
- 첨부파일
- Quest6_MNIST_Demo_rudals.zip 다운로드










로그인 후
참가 상태를 확인할 수 있습니다.