TensorFlow Lite를 사용하여 IoT 장치에 딥 러닝 모델 배포

최근에 저는 Raspberry pie를 사용하여 Fire-Fighting Bot 을 만드는 것을 목표로 하는 로봇 공학 프로젝트 의 일원이었습니다 . 실시간으로 화재를 감지해야하는 봇 의 비전 모듈 을 작업하고 있었습니다.

마이크로 프로세서 (예 : 라즈베리 파이)에서 생산을 위해 모델을 푸시하려는 모든 사람들을 위해 내 경험과 기본 자습서를 공유하고 있습니다.

화재 감지 모델

화재 감지를 위해 맞춤형 컨볼 루션 신경망을 만들었습니다 (CNN은 기존 이미징 기술보다 성능이 뛰어남). 내가 직면 한 제약은 제한된 계산 능력과 마이크로 프로세서의 주요 관심사 인 디스크 공간 이었습니다. 화재 감지와 함께 마이크로 프로세서는 봇의 다른 감지 및 작동 작업을 제어해야했습니다. 따라서 모델의 경량화 구현필요했습니다.

나는 가벼운 무게의 모델을 만드는 데 도움이 된 tensor-flow lite를 발견했습니다.

라이트 프레임 워크 가 무엇인지 살펴 보겠습니다 . 공식 문서에 따르면 TensorFlow Lite는 모바일 및 IoT 장치에 모델을 배포하는 데 도움이됩니다. 즉, TensorFlow 모델을 IoT 및 모바일 장치에 대해 고도로 최적화 된 모델로 변환합니다.

따라서 사전 훈련 된 (tflite는 이미 tflite 형식으로 된 일부 사전 훈련 된 최첨단 모델을 제공함) 모델을 변환하고, 전이 학습 또는 자체 사용자 정의 TensorFlow 모델 (내 경우에는 사용자 정의 모델)을 경량 변형으로 변환 할 수 있습니다. 가장 좋은 점은 api 가 더 높은 수준의 라이브러리 Keras를 지원 한다는 것 입니다.

Python API 부분을 다루고 있으며 프레임 워크는 Cpp, Java 및 JavaScript도 지원합니다.

주요 구성 요소 :

  1. TensorFlow Lite Converter : 이 도구는 일반 TensorFlow 또는 Keras 모델을 tflite 버전 (.tflite)으로 변환합니다.
  2. TensorFlow Lite 인터프리터 : 라즈베리 파이가 완전한 Tensorflow 패키지를 지원하지만 모델을 배포하고 실행하기 만하면 큰 TensorFlow 라이브러리로 디스크 공간을 낭비하는 이유는 무엇입니까? 이 인터프리터 전용 패키지는 전체 TensorFlow 패키지 크기의 일부이며 TensorFlow Lite로 추론을 실행하는 데 필요한 최소한의 코드를 포함합니다.

단계 및 샘플 스 니펫을 참조하십시오.

  1. 먼저 선호하는 모델을 선택하고 , 하이 엔드 GPU / CPU 시스템에서 모델 을 훈련, 테스트 및 검증합니다. 아래는 Keras를 사용하여 코딩 한 내 화재 감지 모델의 스크린 샷입니다 (참고 용).

#Keras code -- model layers(reference Code)
use tf 1.x version or tf 2.x version(here used)
import tensorflow as tf
from tf.keras.datasets import cifar10
from tf.keras.preprocessing.image import ImageDataGenerator
from tf.keras.models import Sequential
from tf.keras.layers import Dense, Dropout, Activation, Flatten
from tf.keras.layers import Conv2D, AveragePooling2D
model = Sequential()
model.add(Conv2D(filters=16, kernel_size=(3, 3), activation='relu', input_shape=X.shape[1:]))
model.add(AveragePooling2D())
model.add(Dropout(0.5))
model.add(Conv2D(filters=32, kernel_size=(3, 3), activation='relu'))
model.add(AveragePooling2D())
model.add(Dropout(0.5))
model.add(Conv2D(filters=64, kernel_size=(3, 3), activation='relu'))
model.add(AveragePooling2D())
model.add(Dropout(0.5))
model.add(Flatten())
model.add(Dense(units=256, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(units=128, activation='relu'))
model.add(Dense(units=2, activation = 'softmax'))
model.compile(loss='sparse_categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])
Model Training

model.save('TrainedModels/Fire-64x64-color-v7.1-soft.h5')

#Converting tf.keras models
#tensorflow 1.X implementation
import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_keras_model_file('/content/Fire-64x64-color-v7-soft.h5')
tfmodel = converter.convert()
#saving tflite model
open("fire_lite_model.tflite","wb").write(tfmodel)
#tensorflow 2.X implementation
import tensorflow as tf
model = tf.keras.models.load_model('C:/Users/samar/fireDet/Fire-64x64-color-v7-soft.h5')
# Convert the model.
converter = tf.lite.TFLiteConverter.from_keras_model(model)
#save tflite model
tflite_model = converter.convert()
open("model.tflite","wb").write(tflite_model)
TFLITE 크기 대 원본 파일 (H5) 크기

Raspberry 파이에 배포 :

다음 단계는 라즈베리 파이에서 작업하고 변환 된 모델을 배포하는 것입니다. 나는 당신이 라즈베리 파이에서 파이썬과 OpenCV를 사용하는 것에 익숙하다고 가정하고 있습니다 (내 친구 Nikhil에게 감사드립니다, 그는이 부분을 도와주었습니다).

라즈베리 파이

4. .tflite 모델을 복사하여 Raspberry 파이에 저장합니다.

5. RPI 에서 TFlite 통역사 다운로드 및 설정 .

(참고 : 모델을 학습 시키거나 라즈베리 파이에서 TensorFlow 기능을 사용하려면 전체 TensorFlow 패키지를 설치해야합니다.)

# Using python 3.7 (Rasberry pie 4b running Raspbian Buster)
pip3 install https://dl.google.com/coral/python/tflite_runtime-2.1.0.post1-cp37-cp37m-linux_armv7l.whl

6. 런타임 인터프리터를 다운로드 한 후 python 파일을 만들어 모델을 실행하고 예측합니다.

#test.py
# Load tflite model and allocate tensorsimport tflite_runtime.interpreter as tflite
import numpy as np
#Used for reading image from path or using live camera
import cv2
interpreter = tf.lite.Interpreter(model_path="modelpath/fire_lite_model.tflite")
interpreter.allocate_tensors()
# Get input and output tensors
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
#Load input image
input_image = cv2.imread("/path/")
input_shape = input_details[0]['shape']
#Reshape input_image 
np.reshape((input_image,input_shape)
#Set the value of Input tensor
interpreter.set_tensor(input_details[0]['index'], input_image)
interpreter.invoke()
#prediction for input data
output_data = interpreter.get_tensor(output_details[0]['index'])
fire_probability = output_data[0][0] * 100 #prediction probability

위 코드에서 입력 / 출력 세부 정보는 Keras 모델에서 정의한 모델의 입력 / 출력 레이어 일뿐입니다. 입력 이미지를로드 한 후 필요한 경우 입력 이미지의 모양을 모델에 필요한 모양으로 변경합니다. 다음으로, 입력 텐서의 값은 set_tensor를 사용하여 입력 이미지로 할당됩니다.

인터프리터는 invoke 메소드를 사용하여 실행됩니다. get_tensor ()를 사용하여 입력에 대한 예측 클래스를 얻습니다 .

모델의 결과는 output_details 모양입니다. 응용 프로그램에 유용한 의미있는 방식으로 텐서를 해석해야합니다.

선택 사항 : tensorflow 최적화 툴킷을 사용하여 모델을 추가로 최적화 할 수 있습니다.https://www.tensorflow.org/lite/performance/model_optimization

짜잔! 우리는 끝났습니다. 우리의 모델은 Raspberry 파이에 쉽게 배포되며 이제 수많은 객체 감지 모델에 대해 동일한 프로세스를 확장 할 수 있습니다. 이 경험이 완전한 문서를 읽는 데 시간을 절약하기를 바랍니다. 저는 아직 배우고 있으며 제 글과 과정에 대한 피드백을 받고 싶습니다.

추신. 이것은 소방 로봇의 프로토 타입입니다 : D

참조 :

Suggested posts

계층화 된 정규화 : 추가 정보를 사용하여 신경망의 성능 향상

EEG 기반 감정 분류 데이터 세트에서 연구 된 심층 신경망 훈련을위한 새로운 정규화 방법.

계층화 된 정규화 : 추가 정보를 사용하여 신경망의 성능 향상

몇 달 전, 저는 뇌 영상 방법을 개발할 때 가장 어려운 문제인 참가자들 간의 EEG 활동의 열악한 동질성에 빠르게 직면했을 때 EEG 기록을 사용하여 유발 된 감정을 분류하는 방법을 연구하기 시작했습니다. 이 문제는 그림 1을 사용하여 쉽게 설명 할 수 있으며, 플롯은 먼저 각 비디오 및 참가자에 대한 각 EEG 기록에 대한 특징을 추출한 다음 데이터를 포함하기 위해 차원 감소 도구 UMAP를 구현하여 얻었습니다.

신경망 소개 — 다층 퍼셉트론

신경망 소개 — 다층 퍼셉트론

신경망은 때로 범용 함수 근사값이라고도합니다. 이 명명법은 자연어 처리 및 생성에서 로봇 제어 및 비디오 스트림 처리에 이르기까지 많은 영역에서 현재 인기와 성공을 가져온 신경망의 힘과 일반성을 보여줍니다.

Related posts

Spotify의 마법 성분 : 기계 학습

Spotify의 마법 성분 : 기계 학습

면책 조항 :이 기사는 Spotify와 관련이 없으며 Spotify 및 현재 관련이 없을 수있는 과거 구조에 대한 확인되지 않은 정보로 구성 될 수 있습니다. 음악은 표현의 한 형태, 예술의 형태, 전체적인 문화 활동입니다.

2021 년 2 월에 읽을 4 가지 딥 러닝 논문

2021 년 2 월에 읽을 4 가지 딥 러닝 논문

신경 과학에서 자동 분화, 신경망 이론 및 신경 과정의 과소 적합에 이르기까지 현재 추구되고있는 다양한 딥 러닝 연구 흐름에 대한 더 나은 개요를 얻고 싶으십니까? 합리적으로 통과하기에는 열려있는 arXiv 탭이 너무 많습니까? 전체 동영상을 볼 시간이 너무 적습니까? 논문의 핵심 아이디어와 개념에 대한 간략한 요약 만 있다면. 그런 다음 '머신-러닝-콜라주'시리즈를 소개하게되어 기쁩니다.

내부의 관심 네트워크 그래프

수학에서 NumPy까지 단계별 가이드

내부의 관심 네트워크 그래프

그래프 신경망 (GNN)은 그래프 데이터에서 학습 할 수있는 표준 도구 상자로 등장했습니다. GNN은 콘텐츠 추천 또는 신약 발견과 같은 다양한 분야에서 영향이 큰 문제를 개선 할 수 있습니다.

분할에 대한 고정 2 부 : Python으로 이미지 분할을 수행하는 방법

분할에 대한 고정 2 부 : Python으로 이미지 분할을 수행하는 방법

안녕하세요! 이미지 분할에 대한이 짧은 시리즈의 첫 번째 부분을 읽지 않았다면 여기에서 읽으십시오. 이전 이야기에서 임계 값 및 색상 분할에 대해 논의 했으므로 2 부에서는 색도 분할과 이미지 차이에 중점을 둘 것입니다.