TensorFlow Lite for Microcontrollers 및 SparkFun Edge를 사용한 AI 음성 인식

1. 소개

빌드할 항목

이 Codelab에서는 마이크로컨트롤러용 TensorFlow Lite를 사용하여 SparkFun Edge 개발 보드에서 딥 러닝 모델을 실행하는 방법을 알아봅니다. 우리는 컨볼루셔널 신경망을 사용하여 '예'라는 단어를 감지하는 보드의 내장 음성 감지 모델로 작업할 것입니다. '아니요'를 선택합니다. 보드의 두 개의 마이크를 통해 말하고 있습니다.

bf256d403a1821af.gif

마이크로컨트롤러의 머신러닝

머신러닝은 사용자의 작업 효율을 높여주는 지능형 도구를 Google 어시스턴트처럼 더 편리한 생활을 누려보세요. 그러나 이러한 환경에는 강력한 클라우드 서버 또는 데스크톱이 포함될 수 있는 많은 컴퓨팅 또는 리소스가 필요한 경우가 많습니다. 그러나 이제 마이크로컨트롤러와 같은 작은 저전력 하드웨어에서 머신러닝 추론을 실행할 수 있습니다.

마이크로컨트롤러는 매우 일반적이고 저렴하며 에너지가 거의 필요하지 않고 매우 안정적입니다. 가전제품, 자동차, 장난감 등 온갖 가정용 기기의 일부입니다. 실제로 매년 약 300억 개의 마이크로컨트롤러 기반 기기가 생산됩니다.

1360b61fbfa33657.jpeg

머신러닝을 소형 마이크로컨트롤러에 도입함으로써 값비싼 하드웨어나 안정적인 인터넷 연결에 의존하지 않고도 생활에서 사용하는 수십억 대의 기기에 대한 지능을 강화할 수 있습니다. 일상생활에 적응할 수 있는 스마트 가전제품, 문제와 정상적인 작동의 차이를 파악하는 지능형 산업용 센서, 아이들이 재미있고 즐겁게 학습할 수 있도록 도와주는 마법 장난감이 있다고 상상해 보세요.

마이크로컨트롤러용 TensorFlow Lite (소프트웨어)

358ffdb9eb758b90.png

TensorFlow는 모델 학습 및 실행을 위한 Google의 오픈소스 머신러닝 프레임워크입니다. TensorFlow Lite는 TensorFlow의 최적화된 버전인 소프트웨어 프레임워크로, 휴대전화와 같이 상대적으로 저성능의 작은 기기에서 TensorFlow 모델을 실행하는 것을 목표로 합니다.

TensorFlow Lite For Microcontrollers는 TensorFlow의 최적화된 버전인 소프트웨어 프레임워크로, 마이크로컨트롤러와 같은 작은 저전력 하드웨어에서 TensorFlow 모델을 실행하는 것을 목표로 합니다. 이러한 임베디드 환경에서 요구되는 제약 조건을 준수합니다.즉, 바이너리 크기가 작고 운영체제 지원, 표준 C 또는 C++ 라이브러리, 동적 메모리 할당 등이 필요 없습니다.

SparkFun Edge (하드웨어)

SparkFun Edge는 마이크로컨트롤러 기반 플랫폼으로 단일 회로 기판에 있는 작은 컴퓨터입니다. 다른 기기로 디지털 신호를 송수신할 수 있게 해주는 프로세서, 메모리 및 I/O 하드웨어가 있습니다. 소프트웨어로 제어할 수 있는 4개의 Google 색상 LED가 있습니다.

aa4493835a2338c6.png

컴퓨터와 달리 마이크로컨트롤러는 운영 체제를 실행하지 않습니다. 대신 개발자가 작성하는 프로그램이 하드웨어에서 직접 실행됩니다. 컴퓨터에 코드를 작성하고 프로그래머라는 기기를 통해 마이크로컨트롤러에 다운로드합니다.

마이크로컨트롤러는 강력한 컴퓨터가 아닙니다. 프로세서는 작고 메모리가 많지 않습니다. 그러나 마이크로컨트롤러는 가능한 한 단순하게 설계되었기 때문에 에너지를 거의 사용하지 않을 수 있습니다. 프로그램의 역할에 따라 SparkFun Edge는 단일 코인 셀 배터리로 몇 주 동안 작동할 수 있습니다.

학습할 내용

  • 컴퓨터에서 SparkFun Edge용 샘플 프로그램 컴파일
  • 기기에 프로그램 배포
  • 프로그램을 변경하고 다시 배포

필요한 항목

다음 하드웨어가 필요합니다.

필요한 소프트웨어:

  • Git (명령줄에서 git를 실행하여 설치되었는지 확인)
  • Python 3 (명령줄에서 python3 또는 python --version를 실행하여 설치되었는지 확인)
  • Python 3용 Pip ( 유용한 StackOverflow 답변)
  • 4.2.1 이상 버전 만들기 (명령줄에서 make --version를 실행하여 설치되었는지 확인)
  • SparkFun Serial Basic 드라이버

2. 하드웨어 설정

SparkFun Edge 마이크로컨트롤러에는 음성 모델을 실행할 수 있는 바이너리가 사전 설치되어 있습니다. 이 버전을 덮어쓰기 전에 먼저 이 모델을 실행해 보겠습니다.

다음을 통해 보드를 강화하세요.

  1. 보드 뒷면의 배터리 커넥터에 코인 셀 배터리를 삽입합니다 (배터리의 '+' 쪽이 위로 향하도록 함). 보드에 배터리가 이미 삽입되어 있는 경우 플라스틱 탭을 빼내고 배터리를 밀어 완전히 삽입되었는지 확인합니다.)

25a6cc6b208e8a4e.png

  1. 코인 배터리가 없는 경우 SparkFun USB-C 직렬 기본 프로그래머 기기를 사용하여 보드에 전원을 공급할 수 있습니다. 이 기기를 보드에 연결하려면 다음 단계를 따르세요.
  • SparkFun Edge 측면에 있는 6개의 핀 헤더를 찾습니다.
  • SparkFun USB-C Serial Basic을 핀에 연결하고 핀에 'BLK' 라벨이 표시되어 있는지 확인합니다. 및 'GRN' 올바르게 정렬되어 있는지 확인합니다.
  • SparkFun USB-C Serial Basic과 컴퓨터를 USB-C 케이블을 연결합니다.

b140822f0019f92a.png

배터리를 삽입하거나 USB 프로그래머를 연결하여 보드에 전원을 공급하면 보드가 절전 모드에서 해제되어 마이크를 통해 듣기를 시작합니다. 파란색 표시등이 깜박이기 시작합니다.

보드의 머신러닝 모델은 '예'라는 단어를 인식하도록 학습됩니다. 음성의 존재와 부재를 감지합니다. 컬러 LED 조명으로 결과를 전달합니다. 다음 표는 각 LED 색상의 의미를 보여줍니다.

감지 결과

LED 색상

'예'

노란색

'아니요'

빨간색

알 수 없는 음성

초록색

음성 인식 실패

LED가 켜지지 않음

지금 확인해 보세요

보드를 입에 대고 '예'라고 말합니다. 할 수 있습니다. 노란색 LED가 깜박입니다. '예'라고 답했을 때 아무 반응이 없으면 다음과 같이 시도해 보세요.

  • 보드를 10인치 정도 듭니다. 입에서
  • 과도한 배경 소음 피하기
  • '예' 반복 빠르게 연속으로 여러 번("예, 예"라고 말해보세요.)

3. 소프트웨어 설정

이제 직접 마이크로컨트롤러에서 음성 모델을 다운로드하고 설치하고 실행하겠습니다. 이를 위해 먼저 이 프로그램의 소스 코드와 이를 빌드하는 데 필요한 종속 항목을 다운로드합니다. 이 프로그램은 C++로 작성되므로 보드에 다운로드하기 전에 바이너리로 컴파일해야 합니다. 바이너리는 SparkFun Edge 하드웨어에서 직접 실행할 수 있는 형식의 프로그램이 포함된 파일입니다.

다음 안내는 Linux 또는 MacOS용으로 작성되었습니다.

TensorFlow 저장소 다운로드

코드는 GitHub의 TensorFlow 저장소에 있는 다음 위치에서 제공됩니다.

https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/micro

컴퓨터에서 터미널을 열고 일반적으로 코딩 프로젝트를 저장하는 디렉터리로 변경한 다음 TensorFlow 저장소를 다운로드하고 아래와 같이 생성된 디렉터리를 입력합니다.

cd ~  # change into your home (or any other) directory
git clone --depth 1 https://github.com/tensorflow/tensorflow.git
cd tensorflow

Python 종속 항목 다운로드

Python 3을 사용하여 바이너리를 준비하고 기기에 플래시합니다. Python 스크립트는 사용 가능한 특정 라이브러리에 따라 다릅니다. 다음 명령어를 실행하여 이러한 종속 항목을 설치합니다.

pip3 install pycrypto pyserial --user

4. 바이너리 빌드 및 준비

바이너리를 빌드하고 기기에 다운로드하기 위해 준비하는 명령어를 실행합니다.

바이너리 빌드

다음 명령어를 실행하여 필요한 모든 종속 항목을 다운로드하고 바이너리를 만듭니다.

make -f tensorflow/lite/micro/tools/make/Makefile TARGET=sparkfun_edge micro_speech_bin

빌드가 성공적으로 완료되면 출력의 마지막 줄이 다음과 같이 표시됩니다.

arm-none-eabi-objcopy tensorflow/lite/micro/tools/make/gen/sparkfun_edge_cortex-m4/bin/micro_speech tensorflow/lite/micro/tools/make/gen/sparkfun_edge_cortex-m4/bin/micro_speech.bin -O binary

바이너리가 성공적으로 생성되었는지 확인하려면 다음 명령어를 실행합니다.

test -f \
tensorflow/lite/micro/tools/make/gen/sparkfun_edge_cortex-m4/bin/micro_speech.bin && \
 echo "Binary was successfully created" || echo "Binary is missing"

콘솔에 Binary was successfully created가 출력됩니다. Binary is missing가 표시되면 디버깅이 필요한 빌드 프로세스에 문제가 있는 것입니다.

바이너리 준비

바이너리는 기기에 배포될 암호화 키로 서명되어야 합니다. 이제 SparkFun Edge에 다운로드할 수 있도록 바이너리에 서명하는 몇 가지 명령어를 실행하겠습니다.

다음 명령어를 입력하여 개발에 사용할 수 있는 더미 암호화 키를 설정합니다.

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/bin/micro_speech.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라는 파일이 있습니다. 기기에 플래시할 파일입니다.

5. 바이너리 플래시 준비

플래싱이란 무엇인가요?

SparkFun Edge는 현재 실행 중인 프로그램을 512킬로바이트의 플래시 메모리에 저장합니다. 보드에서 새 프로그램을 실행하려면 보드로 보내야 합니다. 그러면 보드가 플래시 메모리에 저장하여 이전에 저장된 모든 프로그램을 덮어씁니다.

이 프로세스를 '플래싱'이라고 하며, 이 프로세스를 사용하여 프로그램을 보드로 전송합니다.

프로그래머를 보드에 연결

새 프로그램을 보드로 다운로드하기 위해 SparkFun USB-C Serial Basic 직렬 프로그래머를 사용합니다. 이 장치를 사용하면 컴퓨터가 USB를 통해 마이크로컨트롤러와 통신할 수 있습니다.

이 기기를 보드에 연결하려면 다음 단계를 따르세요.

  1. SparkFun Edge 측면에 있는 6개의 핀 헤더를 찾습니다.
  2. SparkFun USB-C Serial Basic을 핀에 연결하고 핀에 'BLK' 라벨이 표시되어 있는지 확인합니다. 및 'GRN' 올바르게 정렬되어 있는지 확인합니다.

b140822f0019f92a.png

컴퓨터에 프로그래머 연결하기

USB를 통해 보드를 컴퓨터에 연결합니다. 보드를 프로그래밍하려면 컴퓨터가 장치에 지정한 이름을 알아야 합니다. 가장 좋은 방법은 컴퓨터 장착하기 전과 장착 후의 모든 기기 목록을 확인하고 어떤 기기가 새 기기인지 확인하는 것입니다.

USB를 통해 기기를 연결하기 전에 다음 명령어를 실행합니다.

If you are using Linux: ls /dev/tty*
If you are using MacOS: ls /dev/cu*

다음과 같이 연결된 기기 목록이 출력됩니다.

/dev/cu.Bluetooth-Incoming-Port
/dev/cu.MALS
/dev/cu.SOC

이제 프로그래머를 컴퓨터의 USB 포트에 연결합니다. 다음 명령어를 다시 입력합니다.

If you are using Linux: ls /dev/tty*
If you are using MacOS: ls /dev/cu*

아래 예와 같이 출력에 추가 항목이 표시됩니다. 새 항목의 이름이 다를 수 있습니다. 이 새 항목은 기기의 이름입니다.

/dev/cu.Bluetooth-Incoming-Port
/dev/cu.MALS
/dev/cu.SOC
/dev/cu.wchusbserial-1450

먼저 기기 이름을 식별할 환경 변수를 만듭니다.

export DEVICENAME=put your device name here

다음으로 데이터가 기기로 전송되는 속도인 전송 속도를 지정하는 환경 변수를 만듭니다.

export BAUD_RATE=921600

6. 바이너리 플래시

스크립트를 실행하여 보드 플래시

보드를 플래시하려면 특별한 '부트로더' 이 상태를 전송합니다. 그런 다음 바이너리를 보드로 보내는 스크립트를 실행합니다.

보드에 있는 다음 버튼에 관해 알아보겠습니다.

64c620570b9d2f83.png

다음 단계에 따라 보드를 재설정하고 플래시합니다.

  1. 보드가 프로그래머에 연결되어 있고 전체 설정이 USB를 통해 컴퓨터에 연결되어 있는지 확인하세요.
  2. 보드에서 14로 표시된 버튼을 길게 눌러 시작합니다. 6단계까지 길게 누릅니다.
  3. 14로 표시된 버튼을 계속 누른 상태에서 보드를 부트로더 상태로 재설정하려면 RST로 표시된 버튼을 클릭하여 보드를 재설정합니다.
  4. 14 버튼을 계속 누른 상태에서 다음 명령어를 터미널에 붙여넣고 Enter 키를 눌러 실행합니다. 편의를 위해 버튼을 누르기 전에 터미널에 이 명령어를 붙여넣을 수 있지만 이 단계에 도달할 때까지는 Enter 키를 누르면 안 됩니다.
python3 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
  1. 14로 표시된 버튼을 계속 누르고 있으면 이제 화면에 다음과 같이 표시됩니다.
Connecting with Corvette over serial port /dev/cu.usbserial-1440...
Sending Hello.
Received response for Hello
Received Status
length =  0x58
version =  0x3
Max Storage =  0x4ffa0
Status =  0x2
State =  0x7
AMInfo =
0x1
0xff2da3ff
0x55fff
0x1
0x49f40003
0xffffffff
[...lots more 0xffffffff...]
Sending OTA Descriptor =  0xfe000
Sending Update Command.
number of updates needed =  1
Sending block of size  0x158b0  from  0x0  to  0x158b0
Sending Data Packet of length  8180
Sending Data Packet of length  8180
[...lots more Sending Data Packet of length  8180...]
  1. Sending Data Packet of length 8180가 표시된 후 보드에서 14로 표시된 버튼을 중지합니다. 하지만 계속 누르고 있어도 괜찮습니다. 프로그램은 터미널에 줄을 계속 출력합니다. 최종적으로는 다음과 같이 표시됩니다.
[...lots more Sending Data Packet of length  8180...]
Sending Data Packet of length  8180
Sending Data Packet of length  6440
Sending Reset Command.
Done.

Done가 표시되면 성공적인 플래싱을 나타냅니다. 프로그램 출력이 오류로 끝나면 Sending Reset Command가 출력되었는지 확인합니다. 그렇다면 오류가 있더라도 성공적으로 플래싱되었을 수 있습니다.

Linux 컴퓨터에서 NoResponse Error이 발생할 수 있습니다. 이는 ch34x 직렬 드라이버가 기존 직렬 드라이버와 함께 설치되었기 때문입니다. 이 문제는 다음과 같이 해결할 수 있습니다.

1단계: 올바른 버전의 ch34x 라이브러리를 다시 설치합니다. 설치하는 동안 기기에서 기기의 연결을 해제했는지 확인합니다.

git clone https://github.com/juliagoda/CH341SER.git
cd CH341SER/
make
sudo insmod ch34x.ko
sudo rmmod ch341

2단계: 보드 USB를 연결하고 다음을 실행합니다.

dmesg | grep "ch34x"

다음과 같은 메시지가 나타납니다.

[ 1299.444724]  ch34x_attach+0x1af/0x280 [ch34x]
[ 1299.445386] usb 2-13.1: ch34x converter now attached to ttyUSB0

사용된 드라이버가 'ch34x'가 아닌 경우 (예: ch341) 다음 명령어를 실행하여 다른 드라이버를 비활성화합니다.

rmmod <non-ch34x driver name>

기기를 분리했다가 다시 연결하고 사용 중인 드라이버가 'ch34x'인지 확인합니다.

7. 데모

프로그램 사용해 보기

보드가 플래시되고 나면 버튼을 누릅니다 .

RST: 보드를 다시 시작하고 프로그램을 시작합니다. 파란색 LED가 깜박이기 시작하면 깜박이는 것입니다. 표시되지 않는 경우 아래의 '작동하지 않으면 어떻게 해야 하나요?' 섹션까지 아래로 스크롤합니다.

bf256d403a1821af.gif

보드의 머신러닝 모델은 '예'라는 단어를 인식하도록 학습됩니다. 음성의 존재와 부재를 감지합니다. 컬러 LED 조명으로 결과를 전달합니다. 다음 표는 각 LED 색상의 의미를 보여줍니다.

감지 결과

LED 색상

'예'

노란색

'아니요'

빨간색

알 수 없는 음성

초록색

음성 인식 실패

LED가 켜지지 않음

지금 확인해 보세요

보드를 입에 대고 '예'라고 말합니다. 할 수 있습니다. 노란색 LED가 깜박입니다. '예'라고 답했을 때 아무 반응이 없으면 다음과 같이 시도해 보세요.

  • 보드를 10인치 정도 듭니다. 입에서
  • 과도한 배경 소음 피하기
  • '예' 반복 빠르게 연속으로 여러 번("예, 예"라고 말해보세요.)

작동하지 않으면 어떻게 해야 하나요?

다음은 발생 가능한 문제와 이를 디버그하는 방법입니다.

문제: 깜박이는 후 LED가 켜지지 않습니다.

해결 방법: RST 버튼을 누르거나 보드와 프로그래머의 연결을 해제했다가 다시 연결해 보세요. 그래도 문제가 해결되지 않으면 보드를 다시 플래시해 보세요.

문제: 파란색 LED가 켜지지만 매우 어둡습니다.

해결 방법: 배터리가 부족하면 배터리를 교체합니다. 또는 프로그래머와 케이블을 사용하여 컴퓨터로 보드에 전원을 공급할 수 있습니다.

8. 디버그 출력 읽기 (선택사항)

문제가 발생하여 코드를 자세히 디버그해야 하는 경우 이 섹션을 검토하세요. 코드가 실행될 때 마이크로컨트롤러에서 어떤 일이 일어나는지 파악하기 위해 보드의 직렬 연결을 통해 디버깅 정보를 출력할 수 있습니다. 컴퓨터를 사용하여 보드에 연결하고 보드가 보내는 데이터를 표시합니다.

직렬 연결 열기

기본적으로 SparkFun Edge 샘플 코드는 모든 음성 명령을 해당 음성과 함께 기록합니다. 보드 출력을 보려면 다음 명령어를 실행하면 됩니다.

screen ${DEVICENAME} 115200

처음에는 다음과 같은 출력이 표시될 수 있습니다(보드가 연결되고 재설정된 경우에만 나타납니다. 그러지 않으면 디버그 정보가 표시될 수 있습니다).

Apollo3 Burst Mode is Available

                               Apollo3 operating in Burst Mode (96MHz)

'예'라고 말하여 몇 가지 명령어를 실행해 봅니다. 또는 '아니요'입니다. 각 명령어의 보드 출력 디버그 정보가 표시됩니다.

 Heard yes (202) @65536ms

위 로그에서 yes는 명령어를 나타냅니다. 숫자 202은 명령어가 인식되었다는 신뢰도 수준을 나타냅니다 (최소 200). 마지막으로 65536ms는 마이크로컨트롤러가 마지막으로 재설정된 후 경과된 시간을 나타냅니다.

디버그 출력 보기를 중지하려면 Ctrl+A를 누르고 바로 K 키를 누른 다음 Y 키를 누릅니다.

디버그 로그 작성

이 정보를 기록하는 코드는 방금 작업하고 있던 command_responder.cc 파일에서 볼 수 있습니다:

tensorflow/lite/micro/examples/micro_speech/sparkfun_edge/command_responder.cc

데이터를 로깅하려면 error_reporter->Report() 메서드를 호출하면 됩니다. 또한 로그에 중요한 정보를 포함하는 데 사용할 수 있는 문자열 보간 유형을 위한 표준 printf 토큰을 지원합니다.

error_reporter->Report("Heard %s (%d) @%dms", found_command, score, current_time);

이 메서드는 다음 섹션에서 직접 코드를 변경할 때 유용합니다.

9. 코드 확장 (선택사항)

이제 SparkFun Edge를 빌드하고 플래시하는 방법을 알게 되었으므로 코드를 사용해 보고 기기에 배포하여 결과를 확인할 수 있습니다.

코드 읽기

다음 파일에서 코드 읽기를 시작하는 것이 좋습니다. command_responder.cc.

tensorflow/lite/micro/examples/micro_speech/sparkfun_edge/command_responder.cc

여기에서 GitHub에서 파일을 확인할 수 있습니다.

음성 명령이 감지되면 이 파일의 메서드 RespondToCommand가 호출됩니다. 기존 코드는 '예', '아니요' 또는 알 수 없는 명령이 인식되었는지에 따라 다른 LED를 켭니다. 다음 스니펫은 작동 방식을 보여줍니다.

if (found_command[0] == 'y') {
  am_hal_gpio_output_set(AM_BSP_GPIO_LED_YELLOW);
}
if (found_command[0] == 'n') {
  am_hal_gpio_output_set(AM_BSP_GPIO_LED_RED);
}
if (found_command[0] == 'u') {
  am_hal_gpio_output_set(AM_BSP_GPIO_LED_GREEN);
}

found_command 인수에는 감지된 명령어의 이름이 포함됩니다. 이 if 문 집합은 첫 번째 문자를 확인하여 어떤 LED를 켤지 결정합니다.

RespondToCommand 메서드는 다음과 같은 여러 인수로 호출됩니다.

void RespondToCommand(tflite::ErrorReporter* error_reporter,
    int32_t current_time, const char* found_command,
    uint8_t score, bool is_new_command) {
  • error_reporter는 디버그 정보를 로깅하는 데 사용됩니다 (자세한 내용은 뒷부분 참고).
  • current_time은 명령어가 감지된 시간을 나타냅니다.
  • found_command는 감지된 명령어를 알려줍니다.
  • score는 명령어를 감지했음을 얼마나 확신하는지 알려줍니다.
  • is_new_command는 명령어를 처음 듣는 경우 이를 알려줍니다.

score는 명령어가 감지될 확률을 나타내는 0~255 사이의 정수입니다. 샘플 코드는 점수가 200을 초과하는 경우에만 명령어를 유효한 것으로 간주합니다. 테스트에 따르면 가장 유효한 명령은 200~210 범위에 속합니다.

코드 수정

SparkFun Edge 보드에는 4개의 LED가 있습니다. 현재 인식이 진행 중임을 나타내기 위해 파란색 LED가 깜박입니다. command_responder.cc 파일에서 이를 확인할 수 있습니다.

static int count = 0;

// Toggle the blue LED every time an inference is performed.
++count;
if (count & 1) {
  am_hal_gpio_output_set(AM_BSP_GPIO_LED_BLUE);
} else {
  am_hal_gpio_output_clear(AM_BSP_GPIO_LED_BLUE);
}

LED 뱅크가 4개 있으므로 이를 특정 명령어의 score의 시각적 표시기로 사용하도록 프로그램을 수정해 보겠습니다. 낮은 점수는 LED를 하나만 켜는 것이 좋고 점수가 높으면 여러 개의 조명이 켜집니다.

프로그램이 실행 중인지 알 수 있도록 빨간색 LED가 파란색 대신 계속 깜박이도록 합니다. 인접한 파란색, 녹색, 노란색 LED는 최근 score의 강도를 표시하는 데 사용됩니다. 편의상 '예'라는 단어가 표시될 때만 LED를 켜겠습니다. 말씀드리겠습니다. 다른 단어가 감지되면 LED가 사라집니다.

이렇게 변경하려면 command_responder.cc 파일의 모든 코드를 다음 스니펫으로 바꿉니다.

#include "tensorflow/lite/micro/examples/micro_speech/command_responder.h"

#include "am_bsp.h"

// This implementation will light up the LEDs on the board in response to different commands.
void RespondToCommand(tflite::ErrorReporter* error_reporter,
                      int32_t current_time, const char* found_command,
                      uint8_t score, bool is_new_command) {
  static bool is_initialized = false;
  if (!is_initialized) {
    // Setup LEDs as outputs
    am_hal_gpio_pinconfig(AM_BSP_GPIO_LED_RED, g_AM_HAL_GPIO_OUTPUT_12);
    am_hal_gpio_pinconfig(AM_BSP_GPIO_LED_BLUE, g_AM_HAL_GPIO_OUTPUT_12);
    am_hal_gpio_pinconfig(AM_BSP_GPIO_LED_GREEN, g_AM_HAL_GPIO_OUTPUT_12);
    am_hal_gpio_pinconfig(AM_BSP_GPIO_LED_YELLOW, g_AM_HAL_GPIO_OUTPUT_12);
    // Ensure all pins are cleared
    am_hal_gpio_output_clear(AM_BSP_GPIO_LED_RED);
    am_hal_gpio_output_clear(AM_BSP_GPIO_LED_BLUE);
    am_hal_gpio_output_clear(AM_BSP_GPIO_LED_GREEN);
    am_hal_gpio_output_clear(AM_BSP_GPIO_LED_YELLOW);
    is_initialized = true;
  }
  static int count = 0;

   // Toggle the red LED every time an inference is performed.
   ++count;
   if (count & 1) {
     am_hal_gpio_output_set(AM_BSP_GPIO_LED_RED);
   } else {
     am_hal_gpio_output_clear(AM_BSP_GPIO_LED_RED);
   }

  if (is_new_command) {
    // Clear the last three LEDs
    am_hal_gpio_output_clear(AM_BSP_GPIO_LED_BLUE);
    am_hal_gpio_output_clear(AM_BSP_GPIO_LED_GREEN);
    am_hal_gpio_output_clear(AM_BSP_GPIO_LED_YELLOW);
    error_reporter->Report("Heard %s (%d) @%dms", found_command, score,
                           current_time);
    // Only indicate a 'yes'
    if (found_command[0] == 'y') {
      // Always light the blue LED
      am_hal_gpio_output_set(AM_BSP_GPIO_LED_BLUE);
      // Light the other LEDs depending on score
      if (score >= 205) {
        am_hal_gpio_output_set(AM_BSP_GPIO_LED_GREEN);
      }
      if(score >= 210) {
        am_hal_gpio_output_set(AM_BSP_GPIO_LED_YELLOW);
      }
    }
  }
}

새 명령어가 감지되면 is_new_command가 true가 됩니다. 파란색, 녹색, 노란색 LED를 지운 다음 found_commandscore의 값에 따라 다시 켭니다.

재빌드 및 플래시

코드를 변경했으면 바이너리 빌드 및 준비의 모든 단계를 실행하여 테스트합니다.

10. 다음 단계

축하합니다. 마이크로컨트롤러에서 첫 번째 음성 감지기를 빌드했습니다.

TensorFlow Lite for Microcontrollers를 사용한 개발에 관한 간단한 소개가 도움이 되었기를 바랍니다. 마이크로컨트롤러에 관한 딥 러닝은 새롭고 흥미진진한 주제입니다. 여러분이 직접 실험해 보시기 바랍니다!

참조 문서

26699b18f2b199f.png

감사합니다. 즐겁게 빌드하세요!