코딩뚠뚠

[머신러닝 공부] Tiny ML -7 / MCU에 배포하기 본문

공부/ML&DL

[머신러닝 공부] Tiny ML -7 / MCU에 배포하기

로디네로 2022. 1. 8. 22:53
반응형

 

Chapter7. MCU(마이크로 컨트롤러)에 배포하기

 

"
이번 챕터에서는 장치에 코드를 배포해본다.
"

 

 

준비할 하드웨어등의 정보는 아래 포스팅에 기술

 

[머신러닝 공부] Tiny ML -2 / 서론,시작하기

매우작은 머신러닝 TinyML ! Edge 기기에 ML을 탑재하기 위한 방법이다. 개요는 아래 포스팅에.. [머신러닝 공부] Tiny ML -1 개요 Tiny ML 이란? Tiny ML = Tiny Machine Learning 을 직역하면 "매우 작은 머신러..

dbstndi6316.tistory.com

 

 

목차 :

  • MCU(Sparkfun Edge) 에서 출력 처리하기
  • 예제 실행하기
  • 프로그램 테스트
  • 디버그데이터 확인
  • 커스텀버전 만들기

 


 

 

Sparkfun MCU는 머신러닝을 실험하기 위한 플랫폼으로 설계되었음 ARM Cortex M4 가 장착된 Ambiq Apollo3 MPU가 탑재되어있다.

 


 

MCU에서 출력 처리하기

 

 

우선 어떤 출력이 나오는지 출력을 내보자

 

네 개의 LED는 빨간색, 초록색, 파란색, 노란색 순으로 배치되어 있으며 출력y에 의해 점등 패턴이 달라진다.

 

LED 사이클 속도는 constants.cc에 정의된 kInferencesPerCycle을 조정하면 되며

 

출력처리 구현 코드는 hello_world/sparkfun_edge/output_handler.cc에 있다.

 

소스코드는 아래 깃헙을 참고한다

https://github.com/yunho0130/tensorflow-lite/tree/master/tensorflow/lite/micro/examples/hello_world

 

GitHub - yunho0130/tensorflow-lite: O'Reilly <TinyML: 텐서플로우 라이트 Tensorflow Lite> 소스코드 저장소

O'Reilly <TinyML: 텐서플로우 라이트 Tensorflow Lite> 소스코드 저장소 - GitHub - yunho0130/tensorflow-lite: O'Reilly <TinyML: 텐서플로우 라이트 Tensorflow Lite> 소스코드 저장소

github.com

 

HandleOutput() 中 일부 해석

void HandleOutput(tflite::ErrorReporter* error_reporter, float x_value,
                  float y_value) {
  // 메서드를 최초로 실행할 때 LED 설정한다.
  static bool is_initialized = false;
  if (!is_initialized) {
    // LED를 출력으로 설정해준다.
#ifdef AM_BSP_NUM_LEDS
    am_devices_led_array_init(am_bsp_psLEDs, AM_BSP_NUM_LEDS);
    // 모든 핀의 출력 초기화
    am_devices_led_array_out(am_bsp_psLEDs, AM_BSP_NUM_LEDS, 0x00000000);
#endif
    is_initialized = true;
  }
  // y값 (출력) 이 음수일때 LED 색을 설정해준다.
  if (y_value < 0) {
    // LED출력 초기화
    am_devices_led_off(am_bsp_psLEDs, AM_BSP_LED_GREEN);
    am_devices_led_off(am_bsp_psLEDs, AM_BSP_LED_YELLOW);
    // 음수에는 파란색 LED점등
    am_devices_led_on(am_bsp_psLEDs, AM_BSP_LED_BLUE);
    // 임부 값에는 파란색 LED 점등
    if (y_value <= -0.75) {
      am_devices_led_on(am_bsp_psLEDs, AM_BSP_LED_RED);
    } else {
      am_devices_led_off(am_bsp_psLEDs, AM_BSP_LED_RED);
    }
// 양수 값에 LED가 출력할 색을 설정한다.
  } else if (y_value > 0) {
    // LED 초기화
    am_devices_led_off(am_bsp_psLEDs, AM_BSP_LED_RED);
    am_devices_led_off(am_bsp_psLEDs, AM_BSP_LED_BLUE);
    // 양수에는 초록색 LED 점등
    am_devices_led_on(am_bsp_psLEDs, AM_BSP_LED_GREEN);
    // 일부 값에는 노란색 LED 점등
    if (y_value >= 0.75) {
      am_devices_led_on(am_bsp_psLEDs, AM_BSP_LED_YELLOW);
    } else {
      am_devices_led_off(am_bsp_psLEDs, AM_BSP_LED_YELLOW);
    }

 


 

예제 실행하기 

 

예제 프로제스에는 일부분 파이썬 스크립트 실행이 포함되어 있어 파이썬3가 설치됐는지 확인해야한다.

 

텐서플로 저장소를  clone 해온다.

git clone https://github.com/tensorflow/tflite-micro.git

 

바이너리 빌드하기

make -f tflite-micro/tensorflow/lite/micro/tools/make/Makefile hello_world_bin

 

위와 같이하면 현재(2021/1월) 기준 안된다ㅎㅎ

 

2021/7/25이후 tensorflow -> tflite-micro 로 이전된것도 모자라 sparkfun_edge 지원도 하지 않는것 같다.

 

따라서 github에 올라온 이전 버전을 내려받아 사용했다. 방법은 아래와 같다.

tensorflow/tensorflow/lite/micro 에서 없어진 파일들을 볼 수 있다.
- 오른쪽에 History 클릭
- Delete 되기 전인 Jun 29,2021 버전 클릭
- 오른쪽에 Browse files 클릭
- 초록버튼 Code 클릭
- Download ZIP 클릭 후 압축 풀어서 사용

간단하게 사용할 수 있게 링크도 첨부한다

https://github.com/tensorflow/tensorflow/tree/2ece1cec9f5a5c56345750d592bfe12fd3a58ad0

 

그러면 아래와 같이 make가 되는것을 확인할 수 있다.

 

바이너리 서명하기

 

build 후 장치에 배포하려면 암호화키로 서명해야 한다.

tensorflow 폴더에서 아래 명령어를 실행한다.

cp tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/ \
tools/apollo3_scripts/keys_info0.py tensorflow/lite/micro/tools/make/ \
downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/keys_info.py

이후 서명된 바이너리를 생성한다.

python3 tensorflow/lite/micro/tools/make/downloads/ \
AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/create_cust_image_blob.py \
--bin tensorflow/lite/micro/tools/make/gen/sparkfun_edge_cortex-m4_micro/ \
bin/hello_world.bin --load-address 0xC000 --magic-num 0xCB -o \
main_nonsecure_ota --version 0x0

이 명령을 통해 main_nonsecure_ota.bin 파일이 생성되었고 이를 실행해 최종 파일을 만든다.

python3 tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/ \
tools/apollo3_scripts/create_cust_wireupdate_blob.py --load-address 0x20000 \
--bin main_nonsecure_ota.bin -i 6 -o main_nonsecure_wire --options 0x1

main_nonsecure_wire.bin 파일이 생성되었다.

 

 

바이너리 플래시하기

 

우선 USB로 장치를 연결해준다.

이후 변수를 미리 설정해준다.

export DEVICENAME=/dev/ttyUSB0
export BAUD_RATE=921600

다음은 플래시 명령어이다. 이 명령어는 보드의 14번 버튼을 누른 상태에서 Reset버튼을 눌렀다 뗀 후 명령어를 실행한다.

python tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/ \
tools/apollo3_scripts/uart_wired_update.py -b ${BAUD_RATE} ${DEVICENAME} \
-r 1 -f main_nonsecure_wire.bin -i 6

>>> 하지만 이 과정에서 permission denied 에러가 떴다. 아래와 같은 방법으로 해결했다.

sudo chmod 666 /dev/ttyUSB0

플래싱이 성공적으로 끝나 RST 키를 눌러 재부팅 시켜주면 원하는 LED출력이 나옴을 볼 수 있다.

 

 

커스텀버전 만들기

 

지금까지 tensorflow lite에서 제공하는 sparkfun edge MCU의 플래싱 예제를 실행해봤다.

앞으로는 자신만의 버전을 만들어 볼 수 있을것이다.

(tensorflow/lite/micro/examples/hello_world 폴더에서 애플리케이션 코드 참고.)

  • 사이클 당 추론 수를 조정해서 LED가 느리게 깜빡이게 하기
  • 시리얼 포트에 텍스트 기반 애니메이션 기록하도록 하기
  • 사인파 사용하여 추가 LED 또는 스피커 등 다른 구성요소를 제어

 


 

 

다음 포스팅에서는 호출어를 감지해 보드 출력을 내보내는 어플래케이션을 만들 예정이다.

 

반응형