国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【飛槳AI實(shí)戰(zhàn)】交通燈檢測(cè):手把手帶你入門(mén)PaddleDetection,從訓(xùn)練到部署

這篇具有很好參考價(jià)值的文章主要介紹了【飛槳AI實(shí)戰(zhàn)】交通燈檢測(cè):手把手帶你入門(mén)PaddleDetection,從訓(xùn)練到部署。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

前言

本次分享將帶領(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)。

can't call main_program when full_graph=false. use paddle.jit.to_static(full,AI實(shí)戰(zhàn),人工智能,計(jì)算機(jī)視覺(jué),目標(biāo)檢測(cè),python

數(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等。

can't call main_program when full_graph=false. use paddle.jit.to_static(full,AI實(shí)戰(zhàn),人工智能,計(jì)算機(jī)視覺(jué),目標(biāo)檢測(cè),python

飛漿深度學(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)題

can't call main_program when full_graph=false. use paddle.jit.to_static(full,AI實(shí)戰(zhàn),人工智能,計(jì)算機(jī)視覺(jué),目標(biāo)檢測(cè),python

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é)果如下圖所示:

can't call main_program when full_graph=false. use paddle.jit.to_static(full,AI實(shí)戰(zhàn),人工智能,計(jì)算機(jī)視覺(jué),目標(biāo)檢測(cè),python

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

can't call main_program when full_graph=false. use paddle.jit.to_static(full,AI實(shí)戰(zhàn),人工智能,計(jì)算機(jī)視覺(jué),目標(biāo)檢測(cè),python

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

can't call main_program when full_graph=false. use paddle.jit.to_static(full,AI實(shí)戰(zhàn),人工智能,計(jì)算機(jī)視覺(jué),目標(biāo)檢測(cè),python

由于我這里僅為了跑通流程,所以目前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)練。

can't call main_program when full_graph=false. use paddle.jit.to_static(full,AI實(shí)戰(zhàn),人工智能,計(jì)算機(jī)視覺(jué),目標(biāo)檢測(cè),python
can't call main_program when full_graph=false. use paddle.jit.to_static(full,AI實(shí)戰(zhàn),人工智能,計(jì)算機(jī)視覺(jué),目標(biāo)檢測(cè),python

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é)果

can't call main_program when full_graph=false. use paddle.jit.to_static(full,AI實(shí)戰(zhàn),人工智能,計(jì)算機(jī)視覺(jué),目標(biāo)檢測(cè),python

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é)果:

can't call main_program when full_graph=false. use paddle.jit.to_static(full,AI實(shí)戰(zhàn),人工智能,計(jì)算機(jī)視覺(jué),目標(biāo)檢測(cè),python

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

can't call main_program when full_graph=false. use paddle.jit.to_static(full,AI實(shí)戰(zhàn),人工智能,計(jì)算機(jī)視覺(jué),目標(biāo)檢測(cè),python

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

can't call main_program when full_graph=false. use paddle.jit.to_static(full,AI實(shí)戰(zhàn),人工智能,計(jì)算機(jī)視覺(jué),目標(biāo)檢測(cè),python

總結(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)用的案例。

本文由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)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 51單片機(jī)——交通燈

    51單片機(jī)——交通燈

    ??1、基本功能就是如同紅綠燈一般,不做贅述。 ??2、紅燈時(shí)長(zhǎng)和綠燈時(shí)長(zhǎng)可通過(guò)按鍵設(shè)置,即按鍵列中的上面4個(gè),當(dāng)這4個(gè)按鍵有一個(gè)按下后便進(jìn)入時(shí)長(zhǎng)設(shè)置功能,設(shè)置完成后按最下面兩個(gè)按鍵(緊急控制按鈕)任意一個(gè)便可退出該功能。 ??3、有緊急控制功能,按下

    2024年02月11日
    瀏覽(22)
  • 單片機(jī)8051設(shè)計(jì)交通燈

    單片機(jī)8051設(shè)計(jì)交通燈

    目錄 一、功能要求 要求實(shí)現(xiàn)的功能 二、設(shè)計(jì)方案 1.系統(tǒng)時(shí)鐘 2.?紅綠燈時(shí)長(zhǎng)及夜間模式時(shí)間段的存儲(chǔ) 3.緊急情況設(shè)計(jì) 4.夜間模式設(shè)計(jì) 5.夜間行人過(guò)路設(shè)計(jì) 6.系統(tǒng)時(shí)鐘及系統(tǒng)參數(shù)設(shè)置顯示 7.數(shù)碼管顯示倒計(jì)時(shí) 8.LED顯示紅綠燈 三、系統(tǒng)硬件設(shè)計(jì) 1.數(shù)碼管顯示 2.矩陣鍵盤(pán) 3.蜂鳴器

    2024年01月17日
    瀏覽(31)
  • 單片機(jī)交通燈設(shè)計(jì)實(shí)例

    目錄 一、初步設(shè)計(jì) 二、實(shí)現(xiàn)過(guò)程 三、實(shí)現(xiàn)效果 一、初步設(shè)計(jì) 在Profession中設(shè)計(jì)一個(gè)交通燈的仿真圖,結(jié)合Keil編寫(xiě)c語(yǔ)言代碼實(shí)現(xiàn)十字路口的交通燈變化。設(shè)計(jì)的交通燈主要變化有如下五種情況:(可根據(jù)自身的交通燈變化情況進(jìn)行相應(yīng)的代碼修改) 第一種情況:東西紅燈,南

    2024年02月07日
    瀏覽(27)
  • 單片機(jī)交通燈控制系統(tǒng)

    單片機(jī)交通燈控制系統(tǒng)

    一、實(shí)驗(yàn)?zāi)康?掌握單片機(jī)的綜合應(yīng)用設(shè)計(jì)。 二、實(shí)驗(yàn)儀器、材料 Keil軟件、proteus軟件 三、實(shí)驗(yàn)內(nèi)容及要求 完成以下任務(wù):十字路口的交通燈控制系統(tǒng),四組燈對(duì)應(yīng)十字路口的四個(gè)方向,用兩位的數(shù)碼管顯示剩余的時(shí)間。 四、實(shí)驗(yàn)原理 五、實(shí)驗(yàn)過(guò)程及原始記錄(包括原理圖

    2024年02月11日
    瀏覽(23)
  • 基于Arduino的雙向交通燈系統(tǒng)

    基于Arduino的雙向交通燈系統(tǒng)

    ? 學(xué) ?號(hào) ? ? ? ?231 ???? ?? 姓 ?名 ? ? ??福福 ??????? 指導(dǎo)教師:趙志鵬 ? ?-- ?? 年 ?7 月 ?2 ? 日 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?實(shí)訓(xùn)題目:交通燈系統(tǒng) 1 ??系統(tǒng)設(shè)計(jì) ?設(shè)計(jì)要求 ?設(shè)計(jì)任務(wù) ???設(shè)計(jì)基于Arduino的雙向交通燈系統(tǒng),實(shí)現(xiàn)

    2024年02月07日
    瀏覽(59)
  • 基于單片機(jī)的交通燈設(shè)計(jì)

    本系統(tǒng)由單片機(jī)系統(tǒng)、鍵盤(pán)、LED 顯示、交通燈演示系統(tǒng)組成。系統(tǒng)包括人行道、左轉(zhuǎn)、右轉(zhuǎn)、以及基本的交通燈的功能。系統(tǒng)除基本交通燈功能外,還具有倒計(jì)時(shí)、時(shí)間設(shè)置、緊急情況處理、分時(shí)段調(diào)整信號(hào)燈的點(diǎn)亮?xí)r間以及根據(jù)具體情況手動(dòng)控制等功能。隨著社會(huì)經(jīng)濟(jì)的發(fā)

    2024年02月06日
    瀏覽(18)
  • 基于FPGA的交通燈設(shè)計(jì)與實(shí)現(xiàn)

    基于FPGA的交通燈設(shè)計(jì)與實(shí)現(xiàn)

    EDA工具:Modelsim and Vivado ##一、產(chǎn)品要求: 該控制器用于主干道和支道公路交叉口,優(yōu)先保證主干道通行,平時(shí)處于\\\"主干道綠燈,支道紅燈\\\"狀態(tài),支道有車(chē)輛要穿過(guò)主干道時(shí),信號(hào)燈改為\\\"主干道紅燈,支道綠燈\\\",支道無(wú)車(chē)輛時(shí),信號(hào)燈返回\\\"主干道綠燈,支道紅燈\\\"狀態(tài)。如

    2024年02月02日
    瀏覽(26)
  • 交通燈電路及verilog實(shí)現(xiàn)(狀態(tài)機(jī))

    交通燈電路及verilog實(shí)現(xiàn)(狀態(tài)機(jī))

    功能描述 : 1 )初始狀態(tài):主路綠燈、支路紅燈; 2 )檢測(cè)到支路有車(chē) (X=1),燈狀態(tài)的變化過(guò)程為: ????????①主路變黃燈、支路紅燈 ? ? ? ? ②主路變紅燈、支路紅燈 ? ? ? ? ③主路紅燈、支路變綠燈 3)當(dāng)支路沒(méi)車(chē)(X=0),燈狀態(tài)的變化過(guò)程為: ? ? ? ? ①主路紅燈、

    2024年02月06日
    瀏覽(24)
  • 數(shù)電課設(shè)交通燈控制器

    數(shù)電課設(shè)交通燈控制器

    1.通燈控制器內(nèi)容 設(shè)計(jì)一個(gè)紅綠燈控制器控制器,模擬十字路口交通燈 的狀態(tài)。設(shè)計(jì)要求: 南北主干道紅燈時(shí)間小于東西干道紅燈時(shí)間,東西干道紅燈時(shí)間為學(xué)號(hào)尾數(shù)兩位(20以前的+20),黃燈為5秒,紅燈時(shí)間=綠燈時(shí)間+黃燈時(shí)間。東西、南北4個(gè)方向的紅綠黃燈時(shí)間都用兩

    2024年02月09日
    瀏覽(20)
  • 單片機(jī)——交通燈(定時(shí)器中斷)

    單片機(jī)——交通燈(定時(shí)器中斷)

    1.基礎(chǔ)知識(shí) 1.1、中斷源 中斷源符號(hào) 名稱 中斷引起原因 中斷號(hào) /INT0 外部中斷0 P3.2引腳低電平或下降沿信號(hào) 0 T0 定時(shí)器0中斷 定時(shí),計(jì)數(shù)器0計(jì)數(shù)回0溢出 1 /INT01 外部中斷1 P3.3引腳低電平或下降沿信號(hào) 2 T1 定時(shí)器1中斷 定時(shí)/計(jì)數(shù)器1計(jì)數(shù)回0溢出 3 TI/RI 串行口中斷 串行通信完成一幀

    2024年02月08日
    瀏覽(23)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包