0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用旭日X3派的BPU部署Yolov5

新機(jī)器視覺 ? 來源:新機(jī)器視覺 ? 2023-04-26 14:20 ? 次閱讀

本次主要介紹在旭日x3的BPU中部署yolov5。首先在ubuntu20.04安裝yolov5,并運(yùn)行yolov5并使用pytoch的pt模型文件轉(zhuǎn)ONNX;

然后將ONNX模型轉(zhuǎn)換BPU模型;最后上板運(yùn)行代碼測試,并利用Cypython封裝后處理代碼。

一. 安裝Anaconda

Anaconda 是一個(gè)用于科學(xué)計(jì)算的 Python 發(fā)行版,支持 Linux, Mac, Windows, 包含了眾多流行的科學(xué)計(jì)算、數(shù)據(jù)分析的 Python 包。

a. 先去官方地址下載好對應(yīng)的安裝包

b.然后安裝anaconda

bash ~/Downloads/Anaconda3-2023.03-Linux-x86_64.sh (bash ~/安裝包位置/安裝包名稱)

全部選yes,anaconda會自動將環(huán)境變量添加到PATH里面,如果后面你發(fā)現(xiàn)輸出conda提示沒有該命令,那么你需要執(zhí)行命令 source ~/.bashrc 更新環(huán)境變量,就可以正常使用了。

如果發(fā)現(xiàn)這樣還是沒用,那么需要添加環(huán)境變量。編輯~/.bashrc 文件,在最后面加上

export PATH=/home/

主機(jī)名稱/anaconda3/bin:$PATH

注意:路徑應(yīng)改為自己機(jī)器上的路徑

保存退出后執(zhí)行:source ~/.bashrc 再次輸入 conda list 測試看看,應(yīng)該沒有問題。

c.添加Aanaconda國內(nèi)鏡像配置

添加Aanaconda國內(nèi)鏡

conda config --add channels 


https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/






conda config --add channels 


https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/






conda config --set show_channel_urls yes像配置

二. 安裝pytorch,onnx

首先為pytorch創(chuàng)建一個(gè)anaconda虛擬環(huán)境,python=3.10,環(huán)境名字可自己確定,這里本人使用yolov5作為環(huán)境名:

conda create -n yolov5 python=3.10

進(jìn)入創(chuàng)建的yolov5環(huán)境

conda activate yolov5

安裝關(guān)鍵包ONNX

pip install -i 


https://pypi.tuna.tsinghua.edu.cn/simple onnx

安裝yolov5依賴的pytorch

pip install torch==1.11.0 torchvision==0.12.0 torchaudio==0.11.0

三. yolov5項(xiàng)目克隆和安裝

1.克隆yolov5項(xiàng)目

git clone -b (下載指定版本或下載最新把-b去掉即可)https://github.com/ultralytics/yolov5.git

2.使用清華源安裝所需庫

pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple 

3.下載與訓(xùn)練的權(quán)重文件

在https://pypi.tuna.tsinghua.edu.cn/simple 中找到下載版本的權(quán)重文件,并并放置在育yolov5文件夾下

0da5cf94-e352-11ed-ab56-dac502259ad0.jpg

4.安裝測試

在yolov5路徑下執(zhí)行:python detect.py

5.pytorch的pt模型文件轉(zhuǎn)onnx

BPU的工具鏈沒有支持onnx的所有版本的算子,即當(dāng)前BPU支持onnx的opset版本為10和11,執(zhí)行:

python export.py --weights yolov5s.pt --include onnx --opset 11

轉(zhuǎn)換成功后,控制臺顯示如下log信息,轉(zhuǎn)換模型造yolov5文件夾下

0dc00b0c-e352-11ed-ab56-dac502259ad0.jpg

四. ONNX模型轉(zhuǎn)換

安裝docker

可以使用魚香ros一鍵安裝Docker,安裝完成之后輸入命令sudo docker pull

openexplorer/ai_toolchain_centos_7:v1.13.6,之后自動開始docker的安裝。 配置天工開物 OpenExplorer

OpenExplorer工具包的下載,需要wget支持,在ubuntu中安裝wget, sudo apt-get install wget ,

參考官網(wǎng)信息

https://developer.horizon.ai/forumDetail/136488103547258769,下載horizon_xj3_open_explorer

CPU Docker:

wget-c 
ftp://vrftp.horizon.ai/Open_Explorer_gcc_9.3.0/2.5.2/docker_openexplorer_ubuntu_20_xj3_cpu_v2.5.2_py38.tar.gz

啟動docker

這一部分文件我參考

https://blog.csdn.net/Zhaoxi_Li/article/details/125516265

天工開物OpenExplorer根目錄:

我的環(huán)境下是

"/home/bingda/dd/horizon_xj3_openexplorer_v2.5.2_py38_doc"記得加雙引號防止出現(xiàn)空格,該目錄要掛載在docker中/open_explorer的目錄下:

sudo docker run -it --rm -v "/home/bingda/dd/horizon_xj3_openexplorer_v2.5.2_py38_doc":/open_explorer 
-v "home/bingda/dd/Codes":/data/horizon_x3/codes 
openexplorer/ai_toolchain_centos_7:v1.13.6 

已經(jīng)成功通過Docker鏡像進(jìn)入了完整的工具鏈開發(fā)環(huán)境。

可以鍵入 hb_mapper --help命令驗(yàn)證下是否可以正常得到幫助信息。其中hb_mapper --help是工具鏈的一個(gè)常用工具。

0ddc96a0-e352-11ed-ab56-dac502259ad0.jpg

創(chuàng)建一個(gè)文件(我這里角yolo)中,,把前面轉(zhuǎn)好的yolov5s.onnx放進(jìn)這個(gè)文件夾里,輸入:

sudo docker run -it --rm -v "/home/bingda/dd/yolo":/bpucodes openexplorer/ai_toolchain_centos_7:v1.13.6




在docker中,進(jìn)入bpucodes

模型檢查

文件夾,開始我們的模型轉(zhuǎn)換。輸入指令hb_mapper checker --model-type onnx --march bernoulli2 --model yolov5s.onnx,

開始檢查模型,顯示如下內(nèi)容表示模型檢查通過。

0df39a30-e352-11ed-ab56-dac502259ad0.jpg

校準(zhǔn)數(shù)據(jù)參考以下的yolov3校準(zhǔn)代碼:

https://blog.csdn.net/Zhaoxi_Li/article/details/125516265

輸入prepare_calibration_data.py可以得到校準(zhǔn)數(shù)據(jù)。

# 修改輸入圖像大小為640x640#
img = imequalresize(img, (640, 640))
# 指定輸出的校準(zhǔn)圖像根目錄


dst_root = '/data/horizon_x3/codes/yolov5/bpucodes/calibration_data

開始轉(zhuǎn)換BPU模型

輸入命令hb_mapper makertbin --config convert_yolov5s.yaml --model-type onnx

開始轉(zhuǎn)換我們的模型。校準(zhǔn)過后會輸出每一層的量化損失,轉(zhuǎn)換成功后,得到model_output/yolov5s.bin,這個(gè)文件拿出來,拷貝到旭日X3派上使用,它也是我們上板運(yùn)行所需要的模型文件。

五. 上板運(yùn)行

文件準(zhǔn)備

下載百度云的文件,拷貝到旭日X3派開發(fā)板中,其中yolov5s.bin就是我們轉(zhuǎn)換后的模型,coco_classes.names僅用在畫框的時(shí)候,如果用自己的數(shù)據(jù)集的話,參考coco_classes.names創(chuàng)建個(gè)新的名字文件即可。

輸入sudo apt-get install libopencv-dev安裝opencv庫,之后進(jìn)入代碼根目錄,輸入python3 setup.py build_ext --inplace,編譯后處理代碼,得到lib/pyyolotools.cpython-38-aarch64-linux-gnu.so文件。

0e07960c-e352-11ed-ab56-dac502259ad0.jpg

運(yùn)行推理代碼

模型推理的代碼可參考https://blog.csdn.net/Zhaoxi_Li/article/details/126651890,其中yolotools.pypostprocess_yolov5為C++實(shí)現(xiàn)的后處理功能。

這里補(bǔ)充旭日x3通過opencv調(diào)用攝像頭,對每個(gè)圖像進(jìn)行實(shí)時(shí)處理

import numpy as np
import cv2
import os
from hobot_dnn import pyeasy_dnn as dnn
from bputools.format_convert import imequalresize, bgr2nv12_opencv


import lib.pyyolotools as yolotools


def get_hw(pro):
  if pro.layout == "NCHW":
    return pro.shape[2], pro.shape[3]
  else:
    return pro.shape[1], pro.shape[2]


def format_yolov5(frame):
  row, col, _ = frame.shape
  _max = max(col, row)
  result = np.zeros((_max, _max, 3), np.uint8)
  result[0:row, 0:col] = frame
  return result


# # img_path 圖像完整路徑
# img_path = '20220904134315.jpg'


# model_path 量化模型完整路徑
model_path = 'yolov5s.bin'
# 類別名文件
classes_name_path = 'coco_classes.names'
# 設(shè)置參數(shù)
thre_confidence = 0.4
thre_score = 0.25
thre_nms = 0.45
# 框顏色設(shè)置
colors = [(255, 255, 0), (0, 255, 0), (0, 255, 255), (255, 0, 0)]


#利用opencv讀取攝像頭,對每個(gè)圖像進(jìn)行實(shí)時(shí)處理
cap = cv2.VideoCapture(0)
i = 0
while (1):
  ret, imgOri = cap.read()


  # 1. 加載模型,獲取所需輸出HW
  models = dnn.load(model_path)
  model_h, model_w = get_hw(models[0].inputs[0].properties)
  print(model_h, model_w)
  # 2 加載圖像,根據(jù)前面模型,轉(zhuǎn)換后的模型是以NV12作為輸入的
  # 但在OE驗(yàn)證的時(shí)候,需要將圖像再由NV12轉(zhuǎn)為YUV444
  inputImage = format_yolov5(imgOri)
  img = imequalresize(inputImage, (model_w, model_h))
  nv12 = bgr2nv12_opencv(img)


  # 3 模型推理
  t1 = cv2.getTickCount()
  outputs = models[0].forward(nv12)
  t2 = cv2.getTickCount()
  outputs = outputs[0].buffer # 25200x85x1 
  print('time consumption {0} ms'.format((t2-t1)*1000/cv2.getTickFrequency()))


  # 4 后處理
  image_width, image_height, _ = inputImage.shape
  fx, fy = image_width / model_w, image_height / model_h
  t1 = cv2.getTickCount()
  class_ids, confidences, boxes = yolotools.pypostprocess_yolov5(outputs[0][:, :, 0], fx, fy, 
                                thre_confidence, thre_score, thre_nms)
  t2 = cv2.getTickCount()
  print('post consumption {0} ms'.format((t2-t1)*1000/cv2.getTickFrequency()))




  # 5 繪制檢測框
  with open(classes_name_path, "r") as f:
    class_list = [cname.strip() for cname in f.readlines()]
  t1 = cv2.getTickCount()
  for (classid, confidence, box) in zip(class_ids, confidences, boxes):
    color = colors[int(classid) % len(colors)]
    cv2.rectangle(imgOri, box, color, 2)
    cv2.rectangle(imgOri, (box[0], box[1] - 20), (box[0] + box[2], box[1]), color, -1)
    cv2.putText(imgOri, class_list[classid], (box[0], box[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, .5, (0,0,0))
  t2 = cv2.getTickCount()
  print('draw rect consumption {0} ms'.format((t2-t1)*1000/cv2.getTickFrequency()))
  # print('draw rect consumption {0} inputImage = format_yolov5(imgOri)')
  img = imequalresize(inputImage, (model_w, model_h))
  nv12 = bgr2nv12_opencv(img)


  k = cv2.waitKey(1)
  if k == 27: # 按下ESC退出窗口
    break
  elif k == ord('s'): # 按下s保存圖片
    cv2.imwrite('./' + str(i) + '.jpg', imgOri)
    i += 1
  cv2.imshow("capture", imgOri)
cap.release()

輸入sudo python3 inference_bpu.py,效果演示如下圖

0e1c01be-e352-11ed-ab56-dac502259ad0.jpg

六. 利用Cython封裝后處理代碼

①寫后處理的C++代碼

首先,創(chuàng)建頭文件yolotools.h,用來記錄函數(shù)聲明,方便其他代碼調(diào)用。

因?yàn)镃ython調(diào)用時(shí),調(diào)用C++的一些類并不方便,所以寫成C語言接口更方便調(diào)用。后處理的函數(shù)名為postprocess_yolov5,創(chuàng)建 yolov5postprocess.cpp來對后處理函數(shù)進(jìn)行實(shí)現(xiàn)。

②寫Cython所需的Pyx文件

同級目錄下創(chuàng)建pyyolotools.pyx,切記文件名不要跟某個(gè)CPP重復(fù)了,因?yàn)閏ython會將pyyolotools.pyx轉(zhuǎn)為pyyolotools.cpp,如果有重復(fù)的話可能會導(dǎo)致文件被覆蓋掉。

③寫編譯Pyx所需的python代碼

創(chuàng)建setup.py文件,將下面代碼放進(jìn)去,配置好opencv的頭文件目錄、庫目錄、以及所需的庫文件。

在Extension中配置封裝的函數(shù)所依賴的文件,然后在控制臺輸入python3 setup.py build_ext --inplace即 。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11123

    瀏覽量

    207894
  • Ubuntu
    +關(guān)注

    關(guān)注

    5

    文章

    552

    瀏覽量

    29294
  • 模型
    +關(guān)注

    關(guān)注

    1

    文章

    3032

    瀏覽量

    48348
  • python
    +關(guān)注

    關(guān)注

    53

    文章

    4753

    瀏覽量

    84068
  • 鏡像
    +關(guān)注

    關(guān)注

    0

    文章

    158

    瀏覽量

    10651

原文標(biāo)題:使用旭日X3派的BPU部署Yolov5

文章出處:【微信號:vision263com,微信公眾號:新機(jī)器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    【地平線旭日X3試用體驗(yàn)】開箱與板載資源介紹視頻

    本視頻為地平線旭日X3的開箱視頻,講解板載資源.
    發(fā)表于 07-10 00:14

    【地平線旭日X3試用體驗(yàn)】開箱篇硬件介紹

    的GPIO信號,基本可以滿足各種各樣的機(jī)器人開發(fā)啦。旭日X3的硬件資源,CPU配置:不是樹莓,勝似樹莓。CPU是四核A53,頻率1.2Hz,在系統(tǒng)內(nèi)還可以進(jìn)行超頻,BPU就是硬件級的
    發(fā)表于 07-26 19:13

    【 地平線旭日X3試用體驗(yàn)】01. X3開箱及上手

    1、開箱突然一天接到地平線官方小姐姐的電話說我的X3申請?jiān)囉猛ㄟ^了,確實(shí)讓我有點(diǎn)意外被選中成為試用者,非常感謝地平線官方和電子發(fā)燒友開展本次旭日X3
    發(fā)表于 08-09 17:32

    #旭日X3首百嘗鮮# 用solidworks畫了一個(gè)旭日X3的模型

    前幾天突然看到了一個(gè)樹莓的炫酷電腦機(jī)箱外殼,想著也給旭日X3安排一個(gè)。在設(shè)計(jì)機(jī)箱之前需要先有旭日X3
    發(fā)表于 08-31 11:18

    【 地平線旭日X3試用體驗(yàn)】地平線旭日X3AGV智能車設(shè)計(jì)

    本項(xiàng)目是做一個(gè)基于地平線旭日X3ROS-SLAM激光雷達(dá)自主導(dǎo)航AGV機(jī)器人原型設(shè)計(jì)。地平線旭日X3
    發(fā)表于 09-12 19:25

    解決旭日X3串口登陸時(shí),控制窗口小的情況

    一鍵解決旭日X3串口登陸控制窗口過小……
    的頭像 發(fā)表于 07-13 15:02 ?579次閱讀
    解決<b class='flag-5'>旭日</b><b class='flag-5'>X3</b><b class='flag-5'>派</b>串口登陸時(shí),控制窗口小的情況

    旭日X3燒錄最小啟動固件

    手把手燒錄旭日X3開發(fā)板最小啟動鏡像
    的頭像 發(fā)表于 07-18 14:24 ?562次閱讀
    <b class='flag-5'>旭日</b><b class='flag-5'>X3</b><b class='flag-5'>派</b>燒錄最小啟動固件

    #旭日X3首百嘗鮮#旭日x3移植mjpg-streamer

    「地平線旭日X3,開啟你的嵌入式開發(fā)之旅」,歡迎正在閱讀的你一起交流開發(fā)心得
    的頭像 發(fā)表于 08-10 14:17 ?971次閱讀
    #<b class='flag-5'>旭日</b><b class='flag-5'>X3</b><b class='flag-5'>派</b>首百嘗鮮#<b class='flag-5'>旭日</b><b class='flag-5'>x3</b><b class='flag-5'>派</b>移植mjpg-streamer

    旭日,從地平線升起——地平線旭日X3開箱試用

    地平線旭日X3,開啟你的嵌入式開發(fā)之旅
    的頭像 發(fā)表于 11-08 15:22 ?1453次閱讀
    <b class='flag-5'>旭日</b>,從地平線升起——地平線<b class='flag-5'>旭日</b><b class='flag-5'>X3</b><b class='flag-5'>派</b>開箱試用

    旭日X3更新最小啟動固件

    本文介紹通過更新旭日X3的最小啟動固件的方式來提高SD卡的兼容性
    的頭像 發(fā)表于 11-10 10:27 ?685次閱讀
    <b class='flag-5'>旭日</b><b class='flag-5'>X3</b><b class='flag-5'>派</b>更新最小啟動固件

    旭日X3首百嘗鮮 | 借助旭日X3玩轉(zhuǎn)智能家居

    、自動化等。考慮到智能家居的實(shí)用性和經(jīng)濟(jì)型,一直開機(jī)、永遠(yuǎn)在線、低功耗、高性能的地平線旭日?X3是開發(fā)者的不二選擇……
    的頭像 發(fā)表于 11-28 17:29 ?541次閱讀
    <b class='flag-5'>旭日</b><b class='flag-5'>X3</b><b class='flag-5'>派</b>首百嘗鮮 | 借助<b class='flag-5'>旭日</b><b class='flag-5'>X3</b><b class='flag-5'>派</b>玩轉(zhuǎn)智能家居

    旭日X3BPU部署教程系列之帶你輕松走出模型部署新手村

    BPU,是地平線自主研發(fā)的可編程AI加速引擎,相比GPU昂貴的價(jià)格,使用地平線旭日?X3BPU進(jìn)行推理
    的頭像 發(fā)表于 11-29 14:37 ?1018次閱讀
    <b class='flag-5'>旭日</b><b class='flag-5'>X3</b><b class='flag-5'>派</b><b class='flag-5'>BPU</b><b class='flag-5'>部署</b>教程系列之帶你輕松走出模型<b class='flag-5'>部署</b>新手村

    旭日X3BPU部署教程系列之手把手帶你成功部署YOLOv5

    平線旭日X3BPU進(jìn)行推理部署,在地平線“芯片+算法+工具鏈+開發(fā)平臺”的模式基礎(chǔ)之上,使之成為經(jīng)濟(jì)有效、高效開源的推理方案之一……
    的頭像 發(fā)表于 12-14 10:57 ?1264次閱讀
    <b class='flag-5'>旭日</b><b class='flag-5'>X3</b><b class='flag-5'>派</b><b class='flag-5'>BPU</b><b class='flag-5'>部署</b>教程系列之手把手帶你成功<b class='flag-5'>部署</b><b class='flag-5'>YOLOv5</b>

    平平無奇縱享絲滑,旭日X3高速網(wǎng)絡(luò)新體驗(yàn)

    地平線旭日?X3(下文簡稱旭日X3)作為一款用于機(jī)器人的板子,在應(yīng)用中除了需要高性能
    的頭像 發(fā)表于 02-21 14:43 ?710次閱讀
    平平無奇縱享絲滑,<b class='flag-5'>旭日</b><b class='flag-5'>X3</b><b class='flag-5'>派</b>高速網(wǎng)絡(luò)新體驗(yàn)

    當(dāng)旭日X3遇上ChatGPT,我們能「chat」什么

    地平線旭日?X3(下文簡稱旭日X3)是一款擁有著高算力,面向生態(tài)開發(fā)者的嵌入式開發(fā)板,可用于
    的頭像 發(fā)表于 02-24 11:07 ?692次閱讀
    當(dāng)<b class='flag-5'>旭日</b><b class='flag-5'>X3</b><b class='flag-5'>派</b>遇上ChatGPT,我們能「chat」什么