마이크로 컨트롤러 및 SparkFun Edge 용 TensorFlow Lite를 사용한 AI 음성 인식

무엇을 만들 것인가

이 코드 랩에서는 TensorFlow Lite For Microcontrollers 를 사용하여 SparkFun Edge 개발 보드 에서 딥 러닝 모델을 실행하는 방법을 배웁니다. 우리는 보드의 내장 된 음성 감지 모델로 작업 할 것입니다.이 모델은 컨볼 루션 신경망을 사용하여 보드의 두 마이크를 통해 말하는 "예"및 "아니오"단어를 감지합니다.

bf256d403a1821af.gif

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

머신 러닝을 사용하여 Google 어시스턴트 와 같이 사용자의 삶을 편하게 해주는 지능형 도구를 만들 수 있습니다. 그러나 종종 이러한 경험에는 강력한 클라우드 서버 또는 데스크톱을 포함 할 수있는 많은 계산 또는 리소스가 필요합니다. 그러나 이제 마이크로 컨트롤러와 같은 소형 저전력 하드웨어에서 기계 학습 추론을 실행할 수 있습니다.

마이크로 컨트롤러는 매우 일반적이고 저렴하며 에너지가 거의 필요하지 않으며 매우 안정적입니다. 그것들은 모든 종류의 가정용 기기의 일부입니다 : 가전 제품, 자동차 및 장난감. 실제로 매년 약 300 억 개의 마이크로 컨트롤러 구동 장치가 생산되고 있습니다.

1360b61fbfa33657.jpeg

기계 학습을 소형 마이크로 컨트롤러로 가져옴으로써 값 비싼 하드웨어 나 안정적인 인터넷 연결에 의존하지 않고도 우리가 생활에서 사용하는 수십억 대의 장치에 대한 지능을 높일 수 있습니다. 일상 생활에 적응할 수있는 스마트 기기, 문제와 정상 작동의 차이를 이해하는 지능형 산업용 센서, 아이들이 재미 있고 즐거운 방법으로 학습 할 수 있도록 도와주는 마법의 장난감을 상상해보십시오.

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

358ffdb9eb758b90.png

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

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

SparkFun Edge (하드웨어)

SparkFun Edge 는 단일 회로 기판에있는 작은 컴퓨터 인 마이크로 컨트롤러 기반 플랫폼입니다. 프로세서, 메모리 및 I / O 하드웨어가있어 다른 장치에 디지털 신호를 보내고받을 수 있습니다. 좋아하는 Google 색상의 소프트웨어로 제어 가능한 4 개의 LED가 있습니다.

aa4493835a2338c6.png

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

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

배울 것

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

필요한 것

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

다음 소프트웨어가 필요합니다.

  • Git (명령 줄에서 git 을 실행하여 설치되었는지 확인)
  • Python 3 (명령 줄에서 python3 또는 python --version 을 실행하여 설치되었는지 확인)
  • Python 3 용 Pip ( 도움이되는 StackOverflow 답변 )
  • 4.2.1 이상을 만듭니다 (명령 줄에서 make --version 을 실행 make --version 설치되었는지 확인).
  • SparkFun Serial Basic 드라이버

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 인치 정도 보드를 잡습니다.
  • 과도한 배경 소음 방지
  • 빠르게 연속해서 "예"를 여러 번 반복합니다 ( "예 예 예"라고 말해보세요).

이제 마이크로 컨트롤러에서 음성 모델을 직접 다운로드, 설치 및 실행할 것입니다. 이를 위해 먼저이 프로그램의 소스 코드와이를 빌드하는 데 필요한 종속성을 다운로드합니다. 이 프로그램은 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

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

바이너리 빌드

필요한 모든 종속성을 다운로드하고 바이너리를 생성하려면 다음 명령을 실행합니다.

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 이라는 파일이 있어야합니다. 이것은 우리가 장치에 플래시 할 파일입니다.

깜박임이란 무엇입니까?

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

이 프로세스를 "플래싱"이라고하며이를 사용하여 프로그램을 보드로 보냅니다.

프로그래머를 보드에 연결

새로운 프로그램을 보드에 다운로드하기 위해 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

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

보드를 플래시하려면 새 바이너리를받을 수 있도록 준비하는 특별한 "부트 로더"상태로 만들어야합니다. 그런 다음 스크립트를 실행하여 바이너리를 보드로 보냅니다.

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

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. 정지 표시된 버튼을 잡고 14 본 후 보드를 Sending Data Packet of length 8180 (그러나 당신이 그것을 계속 누르고 있으면 괜찮아). 프로그램은 계속해서 터미널에 줄을 인쇄합니다. 결국 다음과 같이 보일 것입니다.
[...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"인지 확인하십시오.

프로그램을 사용해보십시오

보드가 성공적으로 플래시되면 표시된 버튼을 누르십시오.

RST 는 보드를 다시 시작하고 프로그램을 시작합니다. 파란색 LED가 깜박이기 시작하면 깜박임이 성공한 것입니다. 그렇지 않은 경우 " 작동하지 않으면 어떻게합니까?"로 스크롤합니다. 아래 섹션.

bf256d403a1821af.gif

보드의 기계 학습 모델은 "예"와 "아니오"라는 단어를 인식하고 말의 유무를 감지하도록 훈련되었습니다. 컬러 LED를 켜서 결과를 전달합니다. 다음 표는 각 LED 색상의 의미를 보여줍니다.

탐지 결과

LED 색상

"예"

노랑

"아니"

빨간

알 수없는 연설

초록

음성이 감지되지 않음

LED가 켜지지 않음

시도 해봐

보드를 입에 대고 몇 번 "예"라고 말합니다. 노란색 LED가 깜박입니다. "예"라고 대답해도 아무 일도 일어나지 않으면 다음과 같은 방법을 시도해보십시오.

  • 입에서 10 인치 정도 보드를 잡습니다.
  • 과도한 배경 소음 방지
  • 빠르게 연속해서 "예"를 여러 번 반복합니다 ( "예 예 예"라고 말해보세요).

작동하지 않으면?

다음은 몇 가지 가능한 문제와 디버깅 방법입니다.

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

해결책 : RST 버튼을 누르거나 프로그래머로부터 보드를 분리했다가 다시 연결해보십시오. 이들 중 어느 것도 작동하지 않으면 보드를 다시 플래시 해보십시오.

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

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

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

직렬 연결 열기

기본적으로 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);

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

이제 SparkFun Edge를 빌드하고 플래시하는 방법을 알았으므로 코드를 사용하여 장치에 배포하여 결과를 볼 수 있습니다.

코드 읽기

코드 읽기를 시작하기에 좋은 위치는 command_responder.cc. 파일 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);
}

4 개의 LED 뱅크가 있으므로 주어진 명령 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 의 값에 따라 다시 켜집니다.

재 구축 및 플래시

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

축하합니다. 마이크로 컨트롤러에 첫 번째 음성 감지기를 성공적으로 구축했습니다!

마이크로 컨트롤러 용 TensorFlow Lite를 사용한 개발에 대한이 간략한 소개를 즐기 셨기를 바랍니다. 마이크로 컨트롤러에 대한 딥 러닝 아이디어는 새롭고 흥미 롭습니다. 우리는 여러분이 나가서 실험 해 볼 것을 권장합니다!

참조 문서

26699b18f2b199f.png

감사합니다. 즐거운 시간 되세요!