STM32CubeAI를 이용한 XOR 게이트 모델

오늘은 STM32CubeAI를 이용한 아주 간단한 XOR 게이트 머신러닝을 알아보도록 하겠습니다. 

 

요즘 워낙 A.I 어플리케이션이 많이 활용되어 어디에서든 쉽게 AI 모델을 찾아 활용할 수 있습니다. 이번 포스트에서는 이런 모델중에서도 가장 쉬운 XOR 게이트 모델을 통해 STM32CubeAI의 활용중에 아주 기초적인 사용법을 익히도록 하겠습니다.

 

1. 모델생성 및 .h파일 만들기

우선 model을 아래와 같이 만듭니다. 아래 모델은 Google에서 찾았으나 어느 사이트였는지 기억이 나지않아 링크를 걸지 못했습니다. (보통 왠만한 모델들은 검색을 통해 쉽게 찾을 수 있습니다.) 아래 모델은 각각 XOR의 Input값과 Output 값을 sigmoid 활성화 함수, mse 손실함수와 함께 4000번 학습시킨 결과입니다.

import tensorflow as tf
import numpy as np

x = np.array([[1, 1], [1, 0], [0, 1], [0, 0]])
y = np.array([[0], [1], [1], [0]])

model = tf.keras.Sequential([
                             tf.keras.layers.Dense(units=2, activation='sigmoid', input_shape=(2,)),
                             tf.keras.layers.Dense(units=1, activation='sigmoid')
])
model.compile(optimizer=tf.keras.optimizers.SGD(learning_rate=0.1), loss='mse')
history = model.fit(x, y, epochs=4000, batch_size=1)
model.predict(x)

 

 

만들어지 모델을 토대로 .h 파일로 export 해줍니다. 

model.save("xor_gate.h5")

 

저는 위의 모델을 콜랩에서 만들었으며 콜랩(Colab)은 구글이 제공하는 클라우드 기반의 머신러닝과 데이터 분석을 위한 플랫폼입니다. 주로 Jupyter 노트북 환경에서 작업할 수 있으며, GPU나 TPU 같은 가속기를 무료로 사용할 수 있는 장점이 있습니다. Colab은 구글 드라이브와 연동되어 노트북을 저장하고 공유할 수 있습니다. 또한, Python을 비롯한 다양한 프로그래밍 언어를 지원하며, 텐서플로, 케라스, 판다스, 맷플롯립 등 다양한 라이브러리와 패키지를 사용할 수 있습니다. Colab을 사용하면 브라우저에서 바로 머신러닝 모델을 개발하고 실행할 수 있어 편리하게 활용할 수 있습니다.

 

2. STM32CubeMX에 STM32CubeAI 설치하기

아래 링크에 자세한 설치방법이 설명되어 있으니 확인해 보세요.

https://wiki.st.com/stm32mcu/wiki/AI:How_to_install_X-CUBE-AI_through_STM32CubeMX

 

AI:How to install X-CUBE-AI through STM32CubeMX - stm32mcu

This article describes how to install the X-CUBE-AI Expansion Package through STM32CubeMX. Information X-CUBE-AI is a software that generates optimized C code for STM32 microcontrollers and neural network inference. It is delivered under the Mix Ultimate L

wiki.st.com

 

 

3. STM32CubeMX 설정

CubeMX에서 .h5을 찾아 아래와 같이 import해 줍니다.

etc-image-0

 

그리고 [Analyze] 버튼을 눌러봅니다. 아래와 같이 모델에 대한 자세한 분석 정보가 표시됩니다. 

etc-image-1

 

이제 코드를 생성하고 STM32CubeIDE나 원하는 IDE에서 불러옵니다.

 

4. 추가 코드작성

우선 input 데이터와 추론결과를 저장할 output 데이타를 저장할 배열을 선언해 줍니다.

float user_input[4][2] =
{
    {1.0, 1.0},
    {1.0, 0.0},
    {0.0, 1.0},
    {0.0, 0.0},
};
float user_output[4] = {0.0,};

 

app_x-cube-ai.c 파일을 열어 아래 함수에 추가 코드를 작성해 줍니다.

void MX_X_CUBE_AI_Process(void)
{
  /* USER CODE BEGIN 6 */
  extern float user_input[4][2];
  extern float user_output[4];
  int res = -1;
  int idx = 0;

  printf("TEMPLATE - run - main loop\r\n");

  if (network) {

    do {
      ai_input[0].data = &user_input[idx][0];
      ai_output[0].data = &user_output[idx];

      data_ins[0] = ai_input[0].data;
      data_outs[0] = ai_output[0].data;

      idx++;

      if(idx > 3)
      {
        idx = 0;
      }

      /* 1 - acquire and pre-process input data */
      res = acquire_and_process_data(data_ins);
      /* 2 - process the data - call inference engine */
      if (res == 0)
        res = ai_run();
      /* 3- post-process the predictions */
      if (res == 0)
        res = post_process(data_outs);
    } while (res==0);
  }

  if (res) {
    ai_error err = {AI_ERROR_INVALID_STATE, AI_ERROR_CODE_NETWORK};
    ai_log_err(err, "Process has FAILED");
  }
    /* USER CODE END 6 */
}

 

5. 결과 확인

etc-image-2

원래 기대했던 0, 1, ,1, 0 과 거의 비슷한 결과가 나왔습니다. 아마 학습 모델을 잘 만든다면 더 정교한 결과를 만들 수 있을 것 같습니다.

 

STM32CubeAI는 TensorFlow Lite보다 더 성능이 좋은 것으로 알려져있습니다. 초보자 분들은 AI 어렵게 생각하지 마시고 한번 쉬운것 부터 도전해 봤으면 좋겠습니다.

 

6. Full source

https://github.com/soloungos/stm32g431rb_xor_gate_model