한국의 개발자들을 위한 Google for Developers 국문 블로그입니다.
Arduino에서 머신러닝을 시작하는 방법
2019년 11월 4일 월요일
블로그 원문은
이곳
에서 확인하실 수 있습니다.
게스트 게시자: Sandeep Mistry, Dominic Pajak(Arduino 팀)
Arduino
팀은 머신러닝을 누구나 사용할 수 있을 정도로 간편하게 만들겠다는 사명을 갖고 있습니다. 우리는 지난 몇 달간 TensorFlow Lite 팀과 협력해왔으며, 우리가 함께 힘을 합쳐 만들어낸 결과물을 보여드리게 되어 너무나 기쁩니다. 마침내 TensorFlow Lite Micro를
Arduino Nano 33 BLE Sense
로 가져오는 데 성공했습니다. 이 기사에서 현재
Arduino Library Manager
에서 구할 수 있는 여러 가지 새로운
TensorFlow Lite Micro
예시를 설치하고 실행하는 방법을 보여 드리겠습니다.
아래의 첫 번째 가이드에서는 Arduino 보드에 신경망을 설치해 간단한 음성 명령을 인식하는 방법을 보여드립니다.
예시 1: 미리 훈련한 micro_speech 추론 예시 실행.
다음으로, Colab에서 TensorFlow를 사용하여 Arduino를 위한 자체 맞춤 동작 인식 모델을 훈련하는 데 사용할 수 있는 더 심층적인 가이드를 소개하겠습니다. 이 자료는 Sandeep Mistry와 Don Coleman이 주최한 실무 워크숍을 기반으로 하는데,
현재 온라인
으로 제공되는 버전의 업데이트된 버전입니다.
예시 2: 자체 동작 분류 모델 훈련.
이전에 Arduino를 사용한 경험이 있다면, 이런 가이드가 두어 시간 내에 작동하도록 할 수 있을 것입니다. 마이크로컨트롤러를 전혀 사용해 본 적이 없다면, 좀 더 오래 걸릴 수 있습니다.
첫 예시들과 가이드를 통해 개발자 여러분이 여기서 빌드하게 될 결과물을 볼 수 있다는 사실에 기대됩니다. 그럼 시작해봅시다!
https://medium.com/media/b5f85ab7179553edce820a7a39a26968/href
참고: 다음 프로젝트는
TensorFlow 저장소
내에서 현재 실험 중인 TensorFlow Lite for Microcontrollers를 기반으로 합니다. 이는 여전히 새롭게 부상 중인 분야입니다!
마이크로컨트롤러와 TinyML
Arduino에 사용되는 것과 같은 마이크로컨트롤러는 저가의 단일 칩, 자급식 컴퓨터 시스템입니다. 마이크로컨트롤러는 웨어러블 기기, 드론, 3D 프린터, 장난감, 밥솥, 스마트 플러그, 전기 스쿠터, 세탁기와 같이 일상적으로 쓰이는
수십억 개의
전자 기기 내부에 보이지 않게 내장된 컴퓨터입니다. 이런 기기를 연결하려는 트렌드가 사물 인터넷으로 일컬어지는 기술의 한 부분을 이루고 있습니다.
Arduino는
누구나
마이크로컨트롤러 애플리케이션 개발에 접근할 수 있도록 하는 데 중점을 둔 오픈소스 플랫폼이자 커뮤니티입니다. 우리가 여기서 사용하는
보드
에는 1MB 플래시 메모리와 256KB RAM으로 64MHz에서 작동하는 Arm Cortex-M4 마이크로컨트롤러가 있습니다. 클라우드, PC 또는 모바일에 비하면 작지만, 마이크로컨트롤러 표준에서는 적당한 규격입니다.
Arduino Nano 33 BLE Sense 보드는 스틱형 껌 하나보다 작습니다.
ML을 마이크로컨트롤러에 집어넣고 싶어하는 데는 다음을 비롯한 실용적인 이유가 있기 때문입니다.
기능 — (인터넷과는 관계없이) 스마트 기기가 빠르게 로컬에서 동작하기를 원함.
비용 — 단순하고 저렴한 가격의 하드웨어로 이러한 목표 달성.
개인정보 보호 — 모든 센서 데이터를 외부에서 공유하고 싶지 않음.
효율성 — 더 작은 기기 폼 팩터, 에너지 하베스팅 또는 더 긴 배터리 수명.
다음과 같이 매우 중요한 빌드의 최종 목표가 있습니다.
머신러닝을 통해 임베디드 개발 경험이 없는 개발자가 마이크로컨트롤러에 접근할 수 있음
머신러닝 측면에서는 마이크로컨트롤러와 같이 메모리 제약이 있는 기기에 신경망 모델을 맞추기 위해 사용할 수 있는 기법이 있습니다. 주요 단계 중 하나는 부동 소수점에서 8비트 정수로의
가중치 양자화
입니다. 이는 추론 계산을 더 빠르게 수행하는 효과도 있어 클록 속도가 느린 기기에 더욱 적합합니다.
Tiny ML은 새롭게 떠오르는 분야로서 아직 할 일이 많이 남아있지만, 제대로 탐구되지 않은 방대한 응용 영역이 있다는 사실이 마음 설레게 하는 점입니다. 수십억 개의 마이크로컨트롤러가 온갖 종류의 장소에서 온갖 종류의 센서와 결합되므로 미래에 놀랍도록 창의적이고 소중한 가치를 지닌 Tiny ML 애플리케이션으로 이어질 수 있습니다.
시작하기 위해 필요한 사항
Arduino Nano 33 BLE Sense
보드
Arduino 보드를 데스크톱 컴퓨터에 연결하기 위한 마이크로 USB 케이블
Arduino Web Editor
를 사용하거나
Arduino IDE
를 설치하여 보드를 프로그래밍할 수 있습니다. 다음 섹션에서 이들을 설정하는 방법을 자세히 설명해 드리겠습니다.
Arduino Nano 33 BLE Sense는 다양한 온보드 센서가 있는데, 이는 곧 다음과 같이 멋진 Tiny ML 애플리케이션이 탄생할 잠재력이 있다는 의미입니다.
음성 — 디지털 마이크
모션 — 9축 IMU(가속도계, 가속도계, 자기계)
환경 — 온도, 습도, 압력
조명 — 밝기, 색상, 물체와의 거리
기존의 Arduino Uno와는 달리, 이 보드에는 마이크로컨트롤러와 온보드 센서가 결합되며 이는 곧 추가적인 하드웨어나 배선 없이도 수많은 사용 사례에 활용할 수 있다는 뜻입니다. 또한 이 보드는 웨어러블 기기와 같은 최종 애플리케이션에 사용할 수 있을 정도로 충분히 작습니다. 이름에서 알 수 있듯이, 이 보드는 블루투스 LE 연결 기능이 있으므로 노트북, 모바일 앱 또는 다른 BLE 보드와 주변기기로 데이터(또는 추론 결과)를 보낼 수 있습니다.
팁: USB 스틱의 센서
USB를 통해 BLE Sense 보드를 연결하면 추가적인 배선이나 하드웨어를 사용할 필요 없이 손쉽게 데이터를 캡처하고 단일 보드 컴퓨터에 여러 센서를 추가할 수 있으므로, 예컨대 Raspberry Pi에 추가하기에 좋습니다.
TensorFlow Lite for Microcontrollers 예시
TensorFlow Lite for Microcontrollers에 대한 추론 예시는 현재 패키지로 묶여 Arduino Library 관리자를 통해 제공되므로, 몇 차례의 클릭만으로 이들을 Arduino에 포함하고 실행할 수 있습니다. 이 섹션에서는 이들을 실행하는 방법을 보여 드리겠습니다. 예시는 다음과 같습니다.
micro_speech — 온보드 마이크를 사용한 음성 인식
magic_wand — 온보드 IMU를 사용한 동작 인식
person_detection — 외부 ArduCam 카메라를 사용한 사람 감지
TensorFlow 저장소
에 있는 소스를 살펴보면 예시의 배경이 되는 정보를 더 자세히 알 수 있습니다. 이런 예시의 모델은 이전에 훈련된 모델입니다. 아래 가이드에서는 이런 모델을 Arduino에 배포하고 실행하는 방법을 보여줍니다. 다음 섹션에서는 훈련에 관해 설명하겠습니다.
Arduino Create 웹 편집기를 사용하여 예시를 실행하는 방법
USB 케이블로 Arduino Nano 33 BLE Sense를 데스크톱 컴퓨터에 연결하면
Arduino Create
웹 편집기를 사용하여 보드에서 다음 TensorFlow 예시를 컴파일하고 실행할 수 있습니다.
Arduino_TensorFlowLite 라이브러리에서 예시 컴파일
음성 인식 예시에 집중하기 : micro_speech
Arduino 보드를 사용하는 첫 단계 중 하나는 LED가 점멸하도록 하는 것입니다. 여기서는 음성 키워드를 인식하는 TensorFlow Lite Micro를 사용하여 새로운 방식으로 이 작업을 해보겠습니다. '예'와 '아니요'라는 간단한 어휘를 사용합니다. 이 모델은 256KB에 불과한 RAM을 가진 마이크로컨트롤러의 로컬 위치에서 실행 중이므로, 상용 '음성 비서' 수준의 정확도를 기대하지는 마십시오. 이 모델은 인터넷 연결이 없는 상태에서 2,000배나 작은 로컬 RAM에서 사용할 수 있습니다.
이 보드는 배터리 전원으로 구동할 수도 있습니다. Arduino를 모터, 액추에이터 등에 연결할 수 있으므로, 이 점은 음성 제어 프로젝트에 잠재력을 제공합니다.
micro_speech 예시 실행
Arduino IDE를 사용하여 예시를 실행하는 방법
또는 Arduino IDE 애플리케이션을 사용하여 동일한 추론 예시를 시도할 수 있습니다.
먼저, 다음 섹션의 안내를 따릅니다
(Arduino IDE 설정 섹션).
Arduino IDE에서는 ArduinoIDE에서
File > Examples
>
Arduino_TensorFlowLite
메뉴를 통해 사용 가능한 예시를 볼 수 있습니다.
예시를 선택하면 스케치가 열립니다. 보드에서 예시를 컴파일, 업로드, 실행하려면 화살표 아이콘을 클릭하세요.
명령줄을 선호하는 고급 사용자를 위해
arduino-cli
도 있습니다.
Arduino용 TensorFlow Lite Micro 모델 훈련
Arduino BLE 33 Nano Sense를 통한 동작 분류(그림 이모티콘으로 출력됨)
다음으로, ML을 사용하여 Arduino 보드가 동작을 인식할 수 있도록 해보겠습니다. Arduino Nano 33 BLE Sense 보드에서 모션 데이터를 캡처하여 모델을 훈련할 TensorFlow로 가져오고 결과 classifier를 보드에 배포합니다.
이 가이드의 아이디어는 Charlie Gerard의 멋진
Arduino와 Tensorflow.js를 사용한 신체 동작이 적용된 스트리트 파이터 플레이
를 바탕으로 나왔습니다.
Charlie의 예시에서는 보드가 Arduino에서 보내는 모든 센서 데이터를 Tensorflow.js에서 동작 분류를 수행하는 다른 컴퓨터로 스트리밍하고 있습니다. 우리는 여기서 한 걸음 더 나아가 Arduino 보드 자체에서 동작 분류를 수행하여 이를 'TinyML화'합니다. 우리가 사용 중인 Arduino Nano 33 BLE Sense 보드는 더 강력한 Arm Cortex-M4 프로세서와 온보드 IMU가 있으므로 우리가 다루는 사례에서는 이 작업이 더 쉽게 이루어집니다.
우리는 아래에서 가이드를 적절히 조정하여 추가 하드웨어가 필요하지 않도록 했습니다. 그래서 보드의 움직임을 감지할 때 샘플링이 시작됩니다. 가이드의 본래 버전에는 브레드보드와 샘플링 트리거를 위해 누를 하드웨어 버튼이 추가되어 있습니다. 하드웨어에 대해 좀 더 알아보려면 그 버전을
대신
따라가면 됩니다.
Arduino IDE 설정
아래 단계를 따라 추론 모델을 보드에 업로드하고 보드에서 훈련 데이터를 다운로드하는 데(다음 섹션에서 설명) 사용되는 Arduino IDE 애플리케이션을 설정할 수 있습니다. 특정 보드와 라이브러리를 다운로드하여 Arduino IDE에 설치하는 데 필요할 것이므로, Arduino Create 웹 편집기를 사용할 때보다 몇 가지 더 많은 단계를 거치게 됩니다.
https://arduino.cc/downloads
에서 Arduino IDE를 다운로드하여 설치합니다.
방금 설치한 Arduino 애플리케이션을 엽니다.
Arduino IDE 메뉴에서
Tools > Board > Boards Manager…
를 선택합니다.
'Nano BLE'를 검색하고 Install on the board를 누릅니다.
설치하는 데 몇 분 정도 걸립니다.
설치가 완료되면 Boards Manager 창을 닫으세요.
이제 Library Manager
Tools > Manage Libraries…
로 이동합니다.
Arduino_TensorFlowLite
라이브러리를 검색하여 설치합니다.
다음으로,
Arduino_LSM9DS1
라이브러리를 검색하여 설치합니다.
마지막으로, 마이크로 USB 케이블을 보드와 컴퓨터에 연결합니다.
보드
Tools > Board > Arduino Nano 33 BLE
를 선택합니다.
포트
Tools > Port > COM5 (Arduino Nano 33 BLE)
를 선택합니다.
참고로, 실제 포트 이름은 컴퓨터에 따라 다를 수 있습니다.
도움이 필요할 경우 Arduino 사이트에 더 자세한
시작하기
및
문제해결
가이드가 있으므로 참조하세요.
Arduino 보드에서 센서 데이터 스트리밍
먼저 훈련 데이터를 캡처해야 합니다. 노트북이나 PC로 보드를 프로그래밍할 때 사용하는 것과 동일한 USB 케이블을 통해 Arduino 보드에서 센서 데이터 로그를 캡처할 수 있습니다.
Arduino 보드는 작은 애플리케이션(
스케치
라고도 함)을 실행하는데, 이런 애플리케이션은
.ino
형식의 Arduino 소스 코드에서 컴파일되고 Arduino IDE 또는 Arduino Create를 사용하여 보드에 프로그래밍됩니다.
우리는 다음과 같은 일을 하도록 미리 만든 스케치인
IMU_Capture.ino
를 사용할 것입니다.
보드의 가속도계와 자이로스코프 모니터링
보드의 상당한 선형 가속도를 감지할 때 샘플 창 트리거
119Hz에서 1초간 샘플링하여 USB를 통해 CSV 형식 데이터 출력
다음 동작을 위한 루프백 및 모니터링
우리가 보드에서 읽기 위해 선택하는 센서, 샘플링 레이트, 트리거 임계값, 데이터 출력을 CSV, JSON, 바이너리 또는 다른 형식 중 어떤 형식으로 스트리밍할지 여부는 모두 Arduino에서 실행 중인 스케치에서 사용자 설정 가능합니다. 데이터가 로그로 출력되기 전에 기기에서 신호 전처리와 필터링을 수행하는 범위도 있는데, 이에 관해서는 다른 블로그 게시물에서 다룰 수 있을 것입니다. 지금은 단지 스케치를 업로드하고 샘플링하는 단계까지 진행할 수 있을 뿐입니다.
Arduino IDE에서 이 스케치로 보드를 프로그래밍하려면:
IMU_Capture.ino
를 다운로드하여 Arduino IDE에서 엽니다.
이를 컴파일한 후
Sketch > Upload
로 보드에 업로드합니다.
Arduino 보드에서 라이브 센서 데이터 로그 시각화
위 작업을 완료했으므로, 이제 보드에서 나오는 데이터를 시각화할 수 있습니다. 아직은 우리가 데이터를 캡처하는 것은 아닙니다. 이는 단지 센서 데이터 캡처가 트리거되는 방식과 샘플 간격이 얼마나 긴지 감을 잡을 수 있게 하기 위함입니다. 이는 훈련 샘플을 수집할 때 도움이 됩니다.
Arduino IDE에서 Serial Plotter
Tools > Serial Plotter
를 엽니다.
보드를 사용할 수 없다는 오류가 발생하면 포트를 다시 선택합니다.
Tools > Port > 포트 이름(Arduino Nano 33 BLE)
보드를 선택하고 주먹질과 팔 근육 운동 동작을 훈련합니다.
1초의 간격 동안만 샘플링한 후 다음 동작을 기다리는 것을 알 수 있습니다.
센서 데이터 캡처의 라이브 그래프가 나타날 것입니다(아래 GIF 참조).
Arduino IDE Serial Plotter에 보드에서 출력되는 CSV 데이터의 라이브 그래프가 표시됨
다 마쳤으면 Serial Plotter 창을 꼭 닫으세요. 닫지 않으면 다음 단계가 작동하지 않으므로 중요한 사항입니다.
동작 훈련 데이터 캡처
데이터를 CSV 로그로 캡처하여 TensorFlow에 업로드하려면
Arduino IDE > Tools > Serial Monitor
를 사용하여 데이터를 보고 데스크톱 컴퓨터로 내보내면 됩니다.
맨 위에 있는 작은 흰색 버튼을 눌러 보드를 재설정합니다.
한 손으로 보드를 잡습니다(나중에 잡으면 샘플링이 시작됨).
Arduino IDE에서 Serial Monitor
Tools > Serial Monitor
를 엽니다.
보드를 사용할 수 없다는 오류가 발생하면 포트를 다시 선택합니다.
Tools > Port > 포트 이름(Arduino Nano 33 BLE)
손에 보드를 쥔 채로 주먹질 동작을 합니다(이 동작을 하는 동안 조심하세요!).
캡처를 트리거할 수 있을 만큼 충분히 빠르게 바깥쪽으로 주먹을 내지릅니다.
캡처를 다시 트리거하지 않도록 천천히 원래 자세로 돌아옵니다.
동작 캡처 단계를 10회 이상 반복해 데이터를 더 수집합니다.
Serial Console에서 데이터를 복사해 punch.csv라는 새 텍스트 파일에 붙여넣습니다.
콘솔 창 출력을 지우고 위의 모든 단계를 반복하되, 이번에는 flex.csv라는 파일에 팔 근육 운동 동작을 수행합니다.
매번 캡처를 트리거할 수 있을 만큼 충분히 빠르게 팔을 안쪽으로 구부린 후 천천히 원래 자세로 돌아갑니다.
두 csv 파일의 첫 번째 줄에 aX,aY,aZ,gX,gY,gZ 필드가 있을 것입니다.
Linux 팁:
원할 경우, 명령줄을 통해 Arduino에서 .csv 파일로 바로 센서 로그 출력을 리디렉션할 수 있습니다. Serial Plotter/Serial Monitor 창을 닫은 상태에서 다음을 사용합니다.
$ cat /dev/cu.usbmodem[nnnnn] > sensorlog.csv
TensorFlow에서의 훈련
Google Colab
을 사용해 우리가 이전 섹션에서 Arduino 보드로부터 수집한 데이터로 머신러닝 모델을 훈련해 보겠습니다. Colab은 웹브라우저에서 TensorFlow 훈련을 실행할 수 있게 해주는 Jupyter 노트북을 제공합니다.
Arduino 동작 인식 훈련 colab
Colab에서는 다음과 같이 단계별로 진행하게 됩니다.
Python 환경 설정
punch.csv 및 flex.csv 데이터 업로드
데이터 파싱 및 준비
모델 빌드 및 훈련
훈련한 모델을 TensorFlow Lite로 변환
Arduino 헤더 파일에서 모델 인코딩
Colab의 마지막 단계에서는 다음 섹션에서 다운로드하여 Arduino IDE 동작 classifier 프로젝트에 포함할 model.h 파일을 생성합니다.
Colab에서 노트북을 열고 셀의 단계를 따라 실행해 봅시다(
arduino_tinyml_workshop.ipynb
).
IMU 데이터 분류
다음으로, 이전 섹션에서 Colab에서 방금 훈련하고 다운로드한 model.h 파일을 Arduino IDE 프로젝트에 사용해 보겠습니다.
1. Arduino IDE에서
IMU_Classifier.ino
를 엽니다.
2. IDE에서 새 탭을 만듭니다. 탭의 이름을 지정하라는 요청이 있으면 model.h로 명명합니다.
3. model.h 탭을 열고 Colab에서 다운로드한 버전에 붙여넣습니다.
4. 스케치 업로드:
Sketch > Upload
5. Serial Monitor 열기:
Tools > Serial Monitor
6. 동작을 수행합니다.
7. 각 동작의 신뢰도가 Serial Monitor에 인쇄됩니다(0 = 낮은 신뢰도, 1 = 높은 신뢰도).
Arduino용 ML 애플리케이션의 첫 훈련을 무사히 끝마치신 것을 축하합니다!
Emoji_Button.ino
예시에서는 Linux와 macOS에 이모티콘 문자를 인쇄하는 USB 키보드를 만드는 방법을 보여주는데, 재미 삼아 보시면 좋겠습니다.
Emoji_Button.ino
예시와
IMU_Classifier.ino
스케치를 결합해 동작으로 제어되는 이모티콘 키보드👊를 만들어 보세요.
결론
Tiny ML에서 배우고 탐구할 점이 많이 무척 흥미로운 시간이었습니다. 이 블로그를 통해 Tiny ML의 잠재력을 엿보고 이를 자신의 프로젝트에 적용하기 시작하는 출발점으로 삼는 계기가 되길 바랍니다. 개발자 여러분이 빌드한 결과물을 알려주시고 Arduino 커뮤니티와
공유
해주세요.
이 글에서 다룬 TinyML에 관한 포괄적인 배경 지식과 예시 애플리케이션에 대해 자세히 알아보고 싶으신 분께는 Pete Warden과 Daniel Situnayake가 공저해 새로 내놓은 O’Reilly 도서 'TinyML: Machine Learning with TensorFlow on Arduino and Ultra-Low Power Microcontrollers(Arduino와 초저전력 마이크로컨트롤러에서 TensorFlow를 사용한 머신러닝)'를 추천해 드립니다.
Contents
ML/Tensorflow
Android
Flutter
Web/Chrome
Cloud
Google Play
Community
Game
Firebase
검색
Tag
인디게임페스티벌
정책 세미나
창구프로그램
AdMob
AI
Android
Android 12
Android 12L
Android 13
Android 14
Android Assistant
Android Auto
Android Games
Android Jetpack
Android Machine Learning
Android Privacy
Android Studio
Android TV
Android Wear
App Bundle
bootcamp
Business
Chrome
Cloud
Community
compose
Firebase
Flutter
Foldables
Game
gdg
GDSC
google
Google Developer Student Clubs
Google Play
Google Play Games
Interview
Jetpack
Jetpack Compose
kotlin
Large Screens
Library
ma
Material Design
Material You
ML/Tensorflow
mobile games
Now in Android
PC
Play Console
Policy
priva
wa
wear
Wearables
Web
Web/Chrome
Weeklyupdates
WorkManager
Archive
2024
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2023
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2022
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2021
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2020
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2019
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2018
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2017
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2016
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2015
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2014
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2013
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2012
12월
11월
10월
9월
8월
7월
6월
5월
3월
2월
1월
2011
12월
11월
Feed