?前言
上回我們建立了 tensorflow 的開發(fā)環(huán)境,跑測(cè)試模型比較方便,但對(duì)于樹莓派來說览绿,還是太龐大了慌洪。僅有 0.3fps 無法滿足實(shí)時(shí)的生產(chǎn)環(huán)境需求顶燕,這篇我們部署一下專門為移動(dòng)端和嵌入式設(shè)備而生的 TensorFlow Lite,并跑幾個(gè)模型冈爹,測(cè)試一下純樹莓派上的極限幀率涌攻。
TensorFlow Lite 是一組工具,可幫助開發(fā)者在移動(dòng)設(shè)備频伤、嵌入式設(shè)備和 IoT 設(shè)備上運(yùn)行 TensorFlow 模型恳谎。它支持設(shè)備端機(jī)器學(xué)習(xí)推斷,延遲較低憋肖,并且二進(jìn)制文件很小因痛。
TensorFlow Lite 包括兩個(gè)主要組件:
TensorFlow Lite 解釋器,它可在手機(jī)岸更、嵌入式 Linux 設(shè)備和微控制器等很多不同類型的硬件上運(yùn)行經(jīng)過專門優(yōu)化的模型鸵膏。
TensorFlow Lite 轉(zhuǎn)換器,它可將 TensorFlow 模型轉(zhuǎn)換為高效形式以供解釋器使用怎炊,并可引入優(yōu)化以減小二進(jìn)制文件的大小和提高性能谭企。
轉(zhuǎn)換器一般在主電腦上完成,主要是為了靜態(tài)化計(jì)算圖评肆,轉(zhuǎn)換權(quán)重類型后赞咙,生成 .tflite 文件。而解釋器主要在嵌入式設(shè)備上運(yùn)行糟港,我們這里先在樹莓派上安裝一下 tensorflow lite攀操。
安裝 TensorFlow Lite
1 建立虛擬環(huán)境
python3 -m venv --system-site-packages ~/my_envs/tf_lite
2 安裝 2.1.0 版本
# 可以在官網(wǎng)里下載各個(gè)版本
3 啟用 opencv
cd ~/my_envs/tf_lite/lib/python3.7/site-packages
4 安裝完成
import tflite_runtime.interpreter as tflite
配置樹莓派攝像頭
1 測(cè)試攝像頭
先保證攝像頭排線已插入樹莓派的 CSI 接口,并在 raspi-config 里 Interfacing options -> camera 選項(xiàng)里啟用了攝像頭秸抚。
# 拍攝照片
看一下目錄里是否有拍攝的 demo.jpg 照片和 vid.h264 視頻文件速和,保證硬件沒有問題。
2 使用 picamera 控制攝像頭
pip install picamera
拍攝一張照片
import picamera
? Tip
一定要記得用完攝像頭后用 camera.close() 關(guān)閉剥汤,或是用 With 子句自動(dòng)釋放資源颠放。否則會(huì)收到 picamera.exc.PiCameraMMALError: Failed to enable connection: Out of resources 的錯(cuò)誤信息,只能 Kill python 進(jìn)程強(qiáng)制釋放了吭敢。
錄制一段視頻
with picamera.PiCamera() as camera:
3 使用 opencv 控制攝像頭
import cv2
? Tip
如果在OpenCV中調(diào)用CSI攝像頭會(huì)出現(xiàn)無數(shù)據(jù)的現(xiàn)象碰凶,這是因?yàn)闃漭芍械腸amera module是放在/boot/目錄中以固件形式加載的,不是一個(gè)標(biāo)準(zhǔn)的V4L2的攝像頭驅(qū)動(dòng),所以加載起來之后會(huì)找不到/dev/video0的設(shè)備節(jié)點(diǎn)欲低。我們?cè)?etc/modules里面添加一行bcm2835-v4l2 就能解決問題辕宏。
$sudo nano /etc/modules
添加:bcm2835-v4l2,保存關(guān)閉即可砾莱。
4 查詢其他 usb 視頻設(shè)備
ls -ltrh /dev/video*
使用 jupyter notebook
Jupyter Notebook是一個(gè)開源的Web應(yīng)用程序瑞筐,允許用戶創(chuàng)建和共享包含代碼、方程式腊瑟、可視化和文本的文檔聚假。廣泛的用于各種云平臺(tái)上,為了后續(xù)代碼的可移植性闰非,我們這里先安裝一下膘格。
1 安裝 jupyter
sudo apt install jupyter
2 創(chuàng)建配置文件
創(chuàng)建Jupyter notebook的配置文件jupyter_notebook_config.py,在終端中輸入:
jupyter notebook --generate-config
編輯配置文件 jupyter_notebook_config.py
c.NotebookApp.ip = '127.0.0.1'
c.NotebookApp.open_browser = True
這兩個(gè)去除注釋财松,監(jiān)聽本機(jī)端口地址 127.0.0.1 即可瘪贱。
3 配置虛擬環(huán)境到 jupyter 內(nèi)
pip install ipykernel
用 python -m ipykernel install --user --name 虛擬環(huán)境名 --display-name Jupyter中要顯示的名字,來綁定已有的虛擬環(huán)境游岳。
# 配置 pytorch 環(huán)境
4 啟動(dòng) notebook政敢,切換不同的環(huán)境
jupyter notebook
菜單里 服務(wù) -> 改變服務(wù) -> 列出了所有的虛擬環(huán)境。
Tensorflow Lite 應(yīng)用
1 克隆官方示例
git clone https://github.com/tensorflow/examples --depth 1
2 圖像分類應(yīng)用
首先安裝依賴包胚迫,再下載一個(gè) MobileNet 模型文件和分類標(biāo)簽文件到 tmp 目錄中喷户。
cd examples/lite/examples/image_classification/raspberry_pi
3 在 notebook 中運(yùn)行一下推理
jupyter notebook
我們新建一個(gè) classify_picamera.ipynb 文件,讀入tflite模型访锻,
labels = load_labels('/tmp/labels_mobilenet_quant_v1_224.txt')
調(diào)用 interpreter.invoke() 來推理褪尝,
def classify_image(interpreter, image, top_k=1):
最后在 opencv 的窗口來展示一下分類結(jié)果。
with picamera.PiCamera(resolution=(640, 480), framerate=30) as camera:
速度還是比較快的期犬,130ms一幀河哑,能達(dá)到大約是7-8fps,準(zhǔn)確率也很高龟虎,可見提升還是很明顯的璃谨。這既得益于 MobileNet 的小巧,也得益于 tflite 的精簡(jiǎn)模型的加速鲤妥,可達(dá)到準(zhǔn)實(shí)時(shí)的效果佳吞。
4 目標(biāo)檢測(cè)應(yīng)用
cd examples/lite/examples/object_detection/raspberry_pi
下載一個(gè) MobileNet ssd v2 模型文件和 coco 標(biāo)簽文件到 tmp 目錄中。
5 在 notebook 中運(yùn)行一下推理
jupyter notebook
我們新建一個(gè) detect_picamera.ipynb 文件棉安,讀入tflite模型底扳,
labels = load_labels('/tmp/coco_labels.txt')
調(diào)用 interpreter.invoke() 來推理,
def detect_objects(interpreter, image, threshold):
獲得標(biāo)注目標(biāo)贡耽,轉(zhuǎn)換標(biāo)注框和類別標(biāo)簽
def annotate_objects(annotator, results, labels):
最后用 opencv 合并一下視頻流和標(biāo)注層衷模,在 cv2 窗口展示鹊汛。
with picamera.PiCamera(
180-200ms一幀,5 fps左右阱冶,工作量上升了些刁憋,所以比分類任務(wù)稍慢了一些,這應(yīng)該已達(dá)到樹莓派 4代的極限熙揍。若要再提升性能职祷,就要用上 intel 神經(jīng)棒或 google coral 這類 usb 擴(kuò)展資源了氏涩。
安裝包和源碼下載
本期相關(guān)文件資料届囚,可在公眾號(hào)后臺(tái)回復(fù):“rpi06”,獲取下載鏈接是尖。
下一篇
我們將在 tersorflow lite 上****意系,
做一些有趣的應(yīng)用,
敬請(qǐng)期待...