前言
本次分享將帶領(lǐng)大家從0到1完成一個(gè)目標(biāo)檢測(cè)任務(wù)的模型訓(xùn)練評(píng)估和推理部署全流程,項(xiàng)目將采用以PaddleDetection為核心的飛漿深度學(xué)習(xí)框架進(jìn)行開(kāi)發(fā),并總結(jié)開(kāi)發(fā)過(guò)程中踩過(guò)的一些坑,希望能為有類似項(xiàng)目需求的同學(xué)提供一點(diǎn)幫助。
項(xiàng)目背景和目標(biāo)
背景:
- 目標(biāo)檢測(cè)是計(jì)算機(jī)視覺(jué)的一個(gè)基礎(chǔ)任務(wù)。本次選用的案例來(lái)自智慧交通中的交通燈檢測(cè),由于自動(dòng)駕駛場(chǎng)景中對(duì)實(shí)時(shí)性有更高要求,本次采用YOLO系列神經(jīng)網(wǎng)絡(luò)進(jìn)行模型訓(xùn)練和部署。
目標(biāo):
- 基于paddlepaddle深度學(xué)習(xí)框架完成一個(gè)目標(biāo)檢測(cè)任務(wù);
- 完成模型的訓(xùn)練、評(píng)估、預(yù)測(cè)和部署等深度學(xué)習(xí)任務(wù)全過(guò)程。
百度AI Studio平臺(tái)
本次實(shí)驗(yàn)將采用AI Studio實(shí)訓(xùn)平臺(tái)中的免費(fèi)GPU資源,在平臺(tái)注冊(cè)賬號(hào)后,點(diǎn)擊創(chuàng)建項(xiàng)目-選擇NoteBook任務(wù),然后添加數(shù)據(jù)集,如下圖所示,完成項(xiàng)目創(chuàng)建。啟動(dòng)環(huán)境可以自行選擇CPU資源 or GPU資源,創(chuàng)建任務(wù)每天有8點(diǎn)免費(fèi)算力,推薦大家使用GPU資源進(jìn)行模型訓(xùn)練,這樣會(huì)大幅減少模型訓(xùn)練時(shí)長(zhǎng)。
數(shù)據(jù)集介紹
本次實(shí)驗(yàn)使用的數(shù)據(jù)集是BOSCH開(kāi)源的交通燈數(shù)據(jù)集,基于視覺(jué)的交通信號(hào)燈檢測(cè)和跟蹤是城市環(huán)境中實(shí)現(xiàn)全自動(dòng)駕駛的關(guān)鍵一步,數(shù)據(jù)集總共有5093張圖片,手動(dòng)劃分為訓(xùn)練集、驗(yàn)證集和測(cè)試集,其中訓(xùn)練集2832張,驗(yàn)證集1684,測(cè)試集577張。包含多種交通燈類型,包括RedLeft、Red、RedRight、GreenLeft、Green、GreenRight、Yellow和off等。
飛漿深度學(xué)習(xí)開(kāi)發(fā)框架介紹
PaddlePaddle百度提供的開(kāi)源深度學(xué)習(xí)框架,其中文名是“飛槳”,致力于為開(kāi)發(fā)者和企業(yè)提供最好的深度學(xué)習(xí)研發(fā)體驗(yàn),國(guó)產(chǎn)框架中絕對(duì)的榜一大哥!其核心優(yōu)勢(shì)是生態(tài)完善,目前集成了各種開(kāi)發(fā)套件,覆蓋了數(shù)據(jù)處理、模型訓(xùn)練、模型驗(yàn)證、模型部署等各個(gè)階段的工具。下面簡(jiǎn)要介紹一下本項(xiàng)目用到的幾個(gè)核心組件:
- PaddleDetection:一個(gè)目標(biāo)檢測(cè)任務(wù)的工具集,集成了豐富的主流檢測(cè)算法和百度自研的最新模型,提供覆蓋檢測(cè)任務(wù)全流程的API。
- PaddleSlim:一個(gè)模型壓縮庫(kù),集成了主流的模型壓縮算法,包括量化、裁剪等。
- PaddleServing:將模型部署成一個(gè)在線預(yù)測(cè)服務(wù)的庫(kù),支持服務(wù)端和客戶端之間的高并發(fā)和高效通信。
- PaddleLite:將模型轉(zhuǎn)換成可以端側(cè)推理的庫(kù),比如將模型部署到手機(jī)端進(jìn)行推理。
從零開(kāi)發(fā)
1 PaddleDetection完成模型訓(xùn)練
1.1 安裝PaddleDetection
在項(xiàng)目中打開(kāi)終端,然后運(yùn)行如下命令:
# (可選)conda安裝虛擬環(huán)境,環(huán)境會(huì)持久保存在項(xiàng)目中
conda create -p envs/py38 python=3.8
source activate envs/py38
# 安裝paddlepaddle,根據(jù)云端環(huán)境選擇cpu版本和gpu版本
pip install --upgrade paddlepaddle -i https://mirror.baidu.com/pypi/simple
pip install --upgrade paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
# 克隆PaddleDetection倉(cāng)庫(kù)
git clone https://github.com/PaddlePaddle/PaddleDetection.git
# 安裝其他依賴
cd PaddleDetection
pip install -r requirements.txt
# 編譯安裝paddledet
python setup.py install
# 測(cè)試是否安裝成功
python ppdet/modeling/tests/test_architectures.py
# 推理一張圖像試試
python tools/infer.py -c configs/ppyolo/ppyolo_r50vd_dcn_1x_coco.yml -o use_gpu=true weights=https://paddledet.bj.bcebos.com/models/ppyolo_r50vd_dcn_1x_coco.pdparams --infer_img=demo/000000014439.jpg
1.2 數(shù)據(jù)準(zhǔn)備
我們需要制作符合PaddleDetection框架要求的數(shù)據(jù)集格式:參考PrepareDetDataSet.md,這里選擇VOC格式。
step1: 解壓數(shù)據(jù)集
cd data
unzip data119115/traffic_light.zip
step2: 制作標(biāo)簽文件
python generate_voc_dataset.py
# 其中g(shù)enerate_dataset.py中的代碼如下:
import os
import numpy as np
import xml.etree.ElementTree as ET
root_dir = '/home/aistudio/data/traffic_light'
train_anno_dir = os.path.join(root_dir, 'train/annotations/xmls')
train_image_dir = os.path.join(root_dir, 'train/images')
valid_anno_dir = os.path.join(root_dir, 'var/annotations/xmls')
valid_image_dir = os.path.join(root_dir, 'var/images')
test_image_dir = os.path.join(root_dir, 'test/images')
# get class names
class_names = set()
anno_files = os.listdir(train_anno_dir) + os.listdir(valid_anno_dir)
for anno in anno_files:
fpath = os.path.join(train_anno_dir, anno)
if not os.path.exists(fpath):
fpath = os.path.join(valid_anno_dir, anno)
tree = ET.parse(fpath)
objs = tree.findall('object')
for i, obj in enumerate(objs):
cname = obj.find('name').text
class_names.add(cname)
print(class_names, len(class_names))
with open(os.path.join(root_dir, 'label_list.txt'), 'w') as f:
f.writelines(f'{cname}\n' for cname in class_names)
# get train data
image_files = os.listdir(train_image_dir)
with open(os.path.join(root_dir, 'train.txt'), 'w') as f:
for ifile in image_files:
afile = ifile.replace('.png', '.xml')
f.write(f'train/images/{ifile} train/annotations/xmls/{afile}\n')
print('train ready')
# get valid data
image_files = os.listdir(valid_image_dir)
with open(os.path.join(root_dir, 'valid.txt'), 'w') as f:
for ifile in image_files:
afile = ifile.replace('.png', '.xml')
f.write(f'var/images/{ifile} var/annotations/xmls/{afile}\n')
print('valid ready')
# get test data
image_files = os.listdir(test_image_dir)
with open(os.path.join(root_dir, 'test.txt'), 'w') as f:
for ifile in image_files:
f.write(f'test/images/{ifile}\n')
print('test ready')
step3: 新建數(shù)據(jù)集配置文件
# 新建數(shù)據(jù)集配置文件
在`PaddleDetection/configs/datasets`中新建traffic_light_voc.yml
其中寫(xiě)入:
metric: VOC
map_type: integral
num_classes: 12
TrainDataset:
name: VOCDataSet
dataset_dir: /home/aistudio/data/traffic_light
anno_path: train.txt
label_list: label_list.txt
data_fields: ['image', 'gt_bbox', 'gt_class', 'difficult']
EvalDataset:
name: VOCDataSet
dataset_dir: /home/aistudio/data/traffic_light
anno_path: valid.txt
label_list: label_list.txt
data_fields: ['image', 'gt_bbox', 'gt_class', 'difficult']
TestDataset:
name: ImageFolder
anno_path: /home/aistudio/data/traffic_light/label_list.txt
如上,我們便完成了數(shù)據(jù)的準(zhǔn)備工作,接下來(lái)將完成模型在該數(shù)據(jù)集上的訓(xùn)練。
1.3 模型訓(xùn)練:
這里我們以選用PaddleDetection自帶的yoloV3為例,有關(guān)該模型的介紹可參考官方文檔。
- 準(zhǔn)備訓(xùn)練配置文件:
配置文件具體含義說(shuō)明可參考:GETTING_STARTED_cn.md
# 復(fù)制一份訓(xùn)練配置文件,并改名為yolov3_mobilenet_v1_trafficlight.yml
cp configs/yolov3/yolov3_mobilenet_v1_roadsign.yml configs/yolov3/yolov3_mobilenet_v1_trafficlight.yml
# 修改其中的數(shù)據(jù)集配置為我們剛新建的數(shù)據(jù)集配置文件:
_BASE_: [
'../datasets/traffic_light_voc.yml',
...
]
- 開(kāi)啟訓(xùn)練
# 這里需要使用云端GPU環(huán)境,cpu環(huán)境訓(xùn)練跑不起來(lái)
python tools/train.py -c configs/yolov3/yolov3_mobilenet_v1_trafficlight.yml --eval
# 由于訓(xùn)練時(shí)間較長(zhǎng),將任務(wù)放到后臺(tái)運(yùn)行,避免關(guān)閉終端導(dǎo)致任務(wù)終止
nohup python tools/train.py -c configs/yolov3/yolov3_mobilenet_v1_trafficlight.yml --eval > output.log &
訓(xùn)練成功后,可以在終端查看訓(xùn)練過(guò)程,loss下降說(shuō)明沒(méi)問(wèn)題
1.4 模型評(píng)估和測(cè)試
默認(rèn)訓(xùn)練生成的模型保存在當(dāng)前output文件夾下
python tools/eval.py -c configs/yolov3/yolov3_mobilenet_v1_trafficlight.yml -o weights=output/best_model.pdparams
單張圖像測(cè)試
python tools/infer.py -c configs/yolov3/yolov3_mobilenet_v1_trafficlight.yml --infer_img=../data/traffic_light/train/images/100296.png -o weights=output/best_model.pdparams
1.5 模型導(dǎo)出
目的:將訓(xùn)練得到的最好模型轉(zhuǎn)成部署需要的inference model
python tools/export_model.py -c configs/yolov3/yolov3_mobilenet_v1_trafficlight.yml --output_dir=output/inference_model -o weights=output/best_model
運(yùn)行成功后結(jié)果如下圖所示:
2 PaddleSlim完成模型壓縮
為什么:訓(xùn)練得到的模型往往參數(shù)量較大,影響推理耗時(shí)。
怎么做:基于PaddleSlim進(jìn)行模型壓縮,推薦使用剪裁和蒸餾聯(lián)合訓(xùn)練,或者使用剪裁、量化訓(xùn)練和離線量化,進(jìn)行檢測(cè)模型壓縮。下面以裁剪為例,說(shuō)明如何對(duì)yolov3_mobilenet進(jìn)行模型壓縮。
2.1 安裝PaddleSlim
# 注意這里要用最新版的paddlepaddle=2.6.0,否則出現(xiàn)版本不匹配的問(wèn)題
## https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html這里可以看到paddle最新版本已經(jīng)不支持python3.7
pip install paddleslim -i https://pypi.tuna.tsinghua.edu.cn/simple
2.2 重新訓(xùn)練
# 需要指定--slim_config
python tools/train.py -c configs/yolov3/yolov3_mobilenet_v1_trafficlight.yml --slim_config configs/slim/prune/yolov3_prune_l1_norm.yml -o pretrain_weights=output/best_model.pdparams --eval
2.3 評(píng)估測(cè)試
# 評(píng)估
python tools/eval.py -c configs/yolov3/yolov3_mobilenet_v1_trafficlight.yml --slim_config configs/slim/prune/yolov3_prune_l1_norm.yml -o weights=output/best_model.pdparams
# 測(cè)試
python tools/infer.py -c configs/yolov3/yolov3_mobilenet_v1_trafficlight.yml --slim_config configs/slim/prune/yolov3_prune_l1_norm.yml --infer_img=../data/traffic_light/train/images/100296.png -o weights=output/best_model.pdparams
由于我這里僅為了跑通流程,所以目前mAP比較低,大家可以增加訓(xùn)練輪數(shù)。
2.4 模型導(dǎo)出
# 注意同樣要指定--slim_config
python tools/export_model.py -c configs/yolov3/yolov3_mobilenet_v1_trafficlight.yml --slim_config configs/slim/prune/yolov3_prune_l1_norm.yml --output_dir=output/inference_model -o weights=output/best_model
# 報(bào)錯(cuò)解決
`RuntimeError: Can't call main_program when full_graph=False. Use paddle.jit.to_static(full_graph=True) instead.`
# 需要對(duì)PaddleDetection/ppdet/engine/trainer.py進(jìn)行修改
if prune_input:
# static_model = paddle.jit.to_static(
# self.model, input_spec=input_spec)
static_model = paddle.jit.to_static(
self.model, input_spec=input_spec, full_graph=True)
3 模型推理部署
3.1 基于python預(yù)測(cè)引擎推理
直接調(diào)用PaddleDetection中的python接口
## 采用未裁剪模型
python deploy/python/infer.py --model_dir=./output/inference_model/yolov3_mobilenet_v1_trafficlight --image_file=../data/traffic_light/train/images/100296.png
## 采用裁剪后模型
python deploy/python/infer.py --model_dir=./output/inference_model/yolov3_prune_l1_norm --image_file=../data/traffic_light/train/images/100296.png
結(jié)果展示:可以發(fā)現(xiàn)裁剪后模型的耗時(shí)更低,但有漏檢,這是因?yàn)椴眉裟P蜕形吹玫匠浞钟?xùn)練。
3.2 PaddleServing服務(wù)端部署
這個(gè)部分的目的是將我們的模型部署成一個(gè)服務(wù),客戶端就可以通過(guò)http或rpc進(jìn)行,飛漿已對(duì)上述需求所需要的功能實(shí)現(xiàn)進(jìn)行了封裝,需要調(diào)用PaddleServing庫(kù),詳情可參考:deploy和deploy/serving
step1: 安裝PaddleServing包
pip install paddle-serving-client==0.7.0
pip install paddle-serving-app==0.7.0
## 若為CPU部署環(huán)境:
pip install paddle-serving-server==0.7.0
## 若為GPU部署環(huán)境:
pip install paddle-serving-server-gpu==0.7.0.post102
## 上述安裝包如果找不到,需要下載到本地安裝,在官網(wǎng)查找對(duì)應(yīng)的版本
https://github.com/PaddlePaddle/Serving/blob/v0.7.0/doc/Latest_Packages_CN.md
step2: 導(dǎo)出PaddleServing格式的模型
# 需要設(shè)置export_serving_model=True
python tools/export_model.py -c configs/yolov3/yolov3_mobilenet_v1_trafficlight.yml --output_dir=output/inference_model -o weights=output/best_model --export_serving_model=True
# 成功后會(huì)在output/inference_model/yolov3_mobilenet_v1_trafficlight文件夾下多出serving_client和serving_server文件夾
# 注意:需要修改serving_client和serving_server文件夾中"multiclass_nms3_0.tmp_0"對(duì)應(yīng)的is_lod_tensor: true
fetch_var {
name: "multiclass_nms3_0.tmp_0"
alias_name: "multiclass_nms3_0.tmp_0"
is_lod_tensor: true
fetch_type: 1
shape: 6
}
step3: 啟動(dòng)服務(wù)
# 用cpu
python -m paddle_serving_server.serve --model serving_server --port 9393
# 用gpu
python -m paddle_serving_server.serve --model serving_server --port 9393 --gpu_ids 0
注意,這里可能出現(xiàn)報(bào)錯(cuò):
ImportError: libnvinfer.so.7: cannot open shared object file: No such file or directory
。
- 原因分析:這是因?yàn)闆](méi)有安裝tensorrt。
- 怎么解決:可參考這篇博文:報(bào)錯(cuò)解決ImportError: libnvinfer.so.7
step4: 測(cè)試服務(wù)
python ../../../deploy/serving/test_client.py ~/data/traffic_light/label_list.txt ~/data/traffic_light/train/images/100296.png
注意,這里可能出現(xiàn)報(bào)錯(cuò):
ImportError: libcrypto.so.10: cannot open shared object file: No such file or directory ImportError: libssl.so.10: cannot open shared object file: No such file or directory
,
- 原因分析:這是因?yàn)閟sl版本的問(wèn)題
- 怎么解決:可參考這篇博文:報(bào)錯(cuò)解決ImportError: libcrypto.so.10
還可能出現(xiàn)報(bào)錯(cuò):
'ImageDraw' object has no attribute 'textsize'
- 原因分析:因?yàn)樽钚掳娴膒illow==10.0.0中textsize 已被棄用,正確的屬性是 textlength
- 怎么解決:安裝舊版本: pip install Pillow==9.5.0
再重新測(cè)試,成功后在當(dāng)前目錄的output下生成預(yù)測(cè)圖片和結(jié)果
3.3 PaddleLite端側(cè)部署
這個(gè)部分的目的是將我們的模型部署到移動(dòng)端(比如手機(jī)),這樣就不用依賴云端服務(wù)器來(lái)進(jìn)行推理了,飛漿已對(duì)上述需求所需要的功能實(shí)現(xiàn)進(jìn)行了封裝,主要體現(xiàn)在PaddleLite這個(gè)組件上,細(xì)節(jié)可參考官方教程PaddleLite端側(cè)部署。
端側(cè)部署相對(duì)稍微復(fù)雜一些,主要可以分為以下幾個(gè)步驟進(jìn)行:
3.3.1 模型優(yōu)化
考慮到端側(cè)對(duì)推理耗時(shí)要求比較高,故需要采用paddlelite對(duì)inference模型做進(jìn)一步優(yōu)化。
pip install paddlelite
# 在output/inference_model/yolov3_mobilenet_v1_trafficlight/文件夾下新建lite
mkdir lite
# 生成lite模型-FP32
paddle_lite_opt --valid_targets=arm --model_file=model.pdmodel --param_file=model.pdiparams --optimize_out=lite/model
# 生成lite模型-FP16
paddle_lite_opt --valid_targets=arm --model_file=model.pdmodel --param_file=model.pdiparams --optimize_out=lite/model --enable_fp16=true
# 將inference模型配置轉(zhuǎn)化為json格式
python ../../../deploy/lite/convert_yml_to_json.py infer_cfg.yml
# 以上兩步會(huì)生成lite/model.nb infer_cfg.json
3.3.2 準(zhǔn)備交叉編譯環(huán)境
這一步是為了在Linux系統(tǒng)中編譯生成在Android手機(jī)上的可執(zhí)行文件。
cd ~
# 下載 linux-x86_64 版本的 Android NDK, 并添加系統(tǒng)環(huán)境變量
wget https://dl.google.com/android/repository/android-ndk-r17c-linux-x86_64.zip
unzip android-ndk-r17c-linux-x86_64.zip
export NDK_ROOT=/home/aistudio/android-ndk-r17c # 注意路徑
# 下載paddlelite的交叉編譯庫(kù)-注意這里的版本2.13要和上面的paddlelite==2.13對(duì)應(yīng)上, 模型FP32/16版本需要與庫(kù)相對(duì)應(yīng)
wget https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.13-rc/inference_lite_lib.android.armv8.clang.c++_shared.with_extra.with_cv.arm82_fp16.tar.gz
# 如果國(guó)內(nèi)下載太慢,加上鏡像https://mirror.ghproxy.com/
wget https://mirror.ghproxy.com/https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.13-rc/inference_lite_lib.android.armv8.clang.c++_shared.with_extra.with_cv.arm82_fp16.tar.gz
tar -xf inference_lite_lib.android.armv8.clang.c++_shared.with_extra.with_cv.arm82_fp16.tar.gz
# 新建一個(gè)文件夾用于編譯
mkdir inference_lite_lib.android.armv8.clang.c++_shared.with_extra.with_cv.arm82_fp16/demo/cxx/lite
3.3.3 執(zhí)行編譯
這一步會(huì)得到手機(jī)端的可執(zhí)行文件main,下面以華為Mate30為例,其cpu是armv8架構(gòu),如果選用其他手機(jī),需要查看其處理器架構(gòu)是armv8還是armv7。
cd ~/PaddleDetection/deploy/lite
cp -r Makefile src/ include/ *runtime_config.json ~/inference_lite_lib.android.armv8.clang.c++_shared.with_extra.with_cv.arm82_fp16/demo/cxx/lite
cd inference_lite_lib.android.armv8.clang.c++_shared.with_extra.with_cv.arm82_fp16/demo/cxx/lite
# 執(zhí)行編譯命令
export NDK_ROOT=/home/aistudio/android-ndk-r17c # 注意路徑
make
## 編譯成功后,會(huì)在當(dāng)前目錄生成 main 可執(zhí)行文件,該文件用于手機(jī)端推理
3.3.4 準(zhǔn)備手機(jī)端推理的數(shù)據(jù)
mkdir deploy # 新建文件夾用于存放所有數(shù)據(jù)
cp main *runtime_config.json deploy/
mkdir deploy/model_det # 新建文件夾用于存放模型
cp ~/PaddleDetection/output/inference_model/yolov3_mobilenet_v1_trafficlight/lite/* deploy/model_det/
# 準(zhǔn)備一張測(cè)試圖片
cp ~/data/traffic_light/train/images/100296.png deploy/
# 將C++預(yù)測(cè)動(dòng)態(tài)庫(kù)so文件復(fù)制到deploy文件夾中
cp ../../../cxx/lib/libpaddle_light_api_shared.so deploy/
# 最終得到的文件目錄如下
deploy/
├── 100296.png
├── det_runtime_config.json
├── keypoint_runtime_config.json
├── libpaddle_light_api_shared.so
├── main
└── model_det
├── infer_cfg.json
└── model.nb
# 注意:det_runtime_config.json 包含了目標(biāo)檢測(cè)的超參數(shù),請(qǐng)按需進(jìn)行修改
3.3.5 和手機(jī)聯(lián)調(diào)
將可執(zhí)行文件、模型文件和測(cè)試圖片推送到手機(jī)上,進(jìn)行聯(lián)調(diào)。
# 第一步:windows安裝adb
谷歌的安卓平臺(tái)下載ADB軟件包進(jìn)行安裝:鏈接
安裝好后adb.exe 一般保存在C:\Users\用戶名xx\AppData\Local\Android\Sdk\platform-tools
需要將其加到系統(tǒng)環(huán)境變量中:
-- 以win11為例,系統(tǒng)-系統(tǒng)信息-高級(jí)系統(tǒng)設(shè)置-環(huán)境變量
-- 新建AndroidHome=C:\Users\用戶名xx\AppData\Local\Android\Sdk
-- Path-新建:%AndroidHome%\platform-tools
# 第二步:手機(jī)連接電腦
華為Mate30手機(jī)為例:
- 開(kāi)啟開(kāi)發(fā)者模式:設(shè)置-關(guān)于手機(jī)-點(diǎn)擊“版本號(hào)”多次直到提示“您已進(jìn)入開(kāi)發(fā)者模式”
- 打開(kāi)USB調(diào)試:設(shè)置-系統(tǒng)與更新-開(kāi)發(fā)人員選項(xiàng)-USB調(diào)試-選擇USB配置(多媒體傳輸)
# 第三步:文件傳輸?shù)绞謾C(jī)
- 將所需文件下載到D:\Downloads\lite
- 在D:\Downloads\lite下打開(kāi)終端:
adb devices # 顯示設(shè)備
adb shell ls # 查看手機(jī)系統(tǒng)目錄
# 使用adb push命令將文件夾中所有文件傳輸?shù)绞謾C(jī)上:
adb shell mkdir -p /data/local/tmp/
adb push deploy /data/local/tmp/
adb shell # 進(jìn)入手機(jī)目錄
cd /data/local/tmp/deploy
export LD_LIBRARY_PATH=/data/local/tmp/deploy:$LD_LIBRARY_PATH
# 修改權(quán)限為可執(zhí)行
chmod 777 main
# 以檢測(cè)為例,執(zhí)行程序
./main det_runtime_config.json
# 測(cè)試成功后,可將文件夾刪除 rm -r /data/local/tmp/deploy
預(yù)測(cè)成功,看到如下結(jié)果:
3.4 ONNX模型推理
什么是ONNX:ONNX(Open Neural Network Exchange)是一個(gè)標(biāo)準(zhǔn)化工具,將不同訓(xùn)練框架訓(xùn)練的模型轉(zhuǎn)換到統(tǒng)一的ONNX格式。ONNX模型中包含了神經(jīng)網(wǎng)絡(luò)模型的權(quán)重、結(jié)構(gòu)信息以及網(wǎng)絡(luò)中各層的輸入輸出等數(shù)據(jù)。
如何將paddle訓(xùn)練的模型轉(zhuǎn)換成ONNX模型進(jìn)行推理,兩步走:
step1: ONNX模型導(dǎo)出
# 將部署模型轉(zhuǎn)為ONNX格式
pip install paddle2onnx
# cd到inference模型路徑
cd ~/PaddleDetection/output/inference_model/yolov3_mobilenet_v1_trafficlight
# YOLOv3
paddle2onnx --model_dir ./ --model_filename model.pdmodel --params_filename model.pdiparams --opset_version 11 --save_file yolov3.onnx
## 導(dǎo)出后在當(dāng)前目錄生成yolov3.onnx
step2: onnxruntime進(jìn)行推理
pip install onnxruntime
# 執(zhí)行推理
python ../../../deploy/third_engine/onnx/infer.py --infer_cfg infer_cfg.yml --onnx_file yolov3.onnx --image_file ~/data/traffic_light/train/images/100296.png
總結(jié)
本文通過(guò)一個(gè)計(jì)算機(jī)視覺(jué)領(lǐng)域中最基礎(chǔ)的任務(wù)之目標(biāo)檢測(cè),帶領(lǐng)大家熟悉百度Paddle深度學(xué)習(xí)框架中的各種組件。案例選自智慧交通場(chǎng)景,有現(xiàn)實(shí)場(chǎng)景應(yīng)用需求,本系列的后續(xù)文章將沿襲這一思路,繼續(xù)分享更多采用Paddle深度學(xué)習(xí)框架服務(wù)更多產(chǎn)業(yè)應(yīng)用的案例。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-850007.html
本文由mdnice多平臺(tái)發(fā)布文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-850007.html
到了這里,關(guān)于【飛槳AI實(shí)戰(zhàn)】交通燈檢測(cè):手把手帶你入門(mén)PaddleDetection,從訓(xùn)練到部署的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!