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해 줍니다.

 

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

 

이제 코드를 생성하고 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. 결과 확인

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

 

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

 

6. Full source

https://github.com/soloungos/stm32g431rb_xor_gate_model