일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 포스코 교육
- 삼성코딩테스트
- 컴퓨팅사고
- 알고리즘
- DP
- 임베디드 딥러닝
- BFS
- MCU 딥러닝
- TensorFlow Lite
- sort
- 삼성역테
- dfs
- 삼성역량테스트
- 코테
- bfs문제
- tflite
- 코딩테스트
- tinyml
- 딥러닝
- 그리디
- DP문제
- 다이나믹프로그래밍
- 초소형머신러닝
- 포스코 AI교육
- 포스코 ai 교육
- 자료구조
- 코테 문제
- 삼성코테
- dfs문제
- 영상처리
- Today
- Total
코딩뚠뚠
[머신러닝 공부] Tiny ML -7 / MCU에 배포하기 본문
Chapter7. MCU(마이크로 컨트롤러)에 배포하기
"
이번 챕터에서는 장치에 코드를 배포해본다.
"
준비할 하드웨어등의 정보는 아래 포스팅에 기술
목차 :
- 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
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 또는 스피커 등 다른 구성요소를 제어
다음 포스팅에서는 호출어를 감지해 보드 출력을 내보내는 어플래케이션을 만들 예정이다.
'공부 > ML&DL' 카테고리의 다른 글
[머신러닝 공부] Tiny ML -9 / 음성인식 어플리케이션-2 (0) | 2022.01.31 |
---|---|
[머신러닝 공부] Tiny ML -8 / 음성인식 어플리케이션-1 (0) | 2022.01.13 |
[머신러닝 공부] Tiny ML -6 / 어플리케이션 구축-2 (0) | 2021.12.21 |
[머신러닝 공부] Tiny ML -5 / 어플리케이션 구축-1 (0) | 2021.12.08 |
[머신러닝 공부] Tiny ML -4 / 모델 구축과 훈련 (0) | 2021.11.16 |