精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于國產AI編譯器ICRAFT部署YOLOv5邊緣端計算的實戰案例

國產FPGA之家 ? 來源:國產FPGA之家 ? 2024-01-03 10:17 ? 次閱讀

1)背景介紹

1.1 邊緣端部署

人工智能領域中各種算法模型的不斷研究和改進。隨著深度學習的興起,包括卷積神經網絡(CNN)、循環神經網絡(RNN)、生成對抗網絡(GAN)、transformer等在內的各種深度學習算法被廣泛應用于圖像識別、自然語言處理、語音識別等任務中。AI算法的作用是通過訓練模型來實現自動化的數據分析、決策和預測,幫助人類解決復雜的問題。

為了將AI算法賦能社會生產生活的各個領域中,AI加速芯片和配套使用的AI算法編譯器也逐漸發展成熟。本篇主要介紹在邊緣設備部署AI算法的經驗。邊緣設備一般指智能手機汽車電子智能工業、農業物聯網設備等。部署到邊緣設備上的AI模型能夠實時地對數據進行處理,可以在不需要云端服務器的情況下,提供快速的響應和處理能力。邊緣端AI部署的優勢主要體現在以下幾個方面:

1. 實時性:邊緣設備上部署的AI模型可以實時地對數據進行處理,不需要傳輸數據到云端服務器進行處理,能夠大大減少數據傳輸和處理延遲。

2. 隱私保護:由于邊緣設備上處理數據時不需要將數據傳輸到云端服務器,因此能夠更好地保護用戶隱私,減少因數據傳輸而帶來的潛在安全風險。

3. 節約成本:邊緣設備上的AI模型可以避免云端服務器的成本,能夠有效地節約部署成本,尤其是在大規模部署時效果更為明顯。

4. 靈活性:邊緣設備上的AI模型可以與其他不同類型的設備相結合,構建出更為靈活、智能化的系統,例如智能家居、互聯網醫療等。

1.2 AI加速芯片

為了在邊緣端設備部署AI算法,往往需要專用AI加速芯片來加速算法計算。相比于通用的圖形處理單元(GPU),用于邊緣端的專用AI加速芯片具有以下優勢:

- 高效性能:AI專用加速芯片采用了專門優化的計算架構,能夠更高效地執行深度學習計算,提供更快的推理速度和更低的能耗。

- 低功耗:AI專用加速芯片在設計上注重節能,能夠在相同計算能力下擁有更低的功耗,適合移動設備和嵌入式系統等對能耗要求較高的場景。

- 支持量化計算:AI專用加速芯片通常支持低精度的量化計算,能夠在保持模型精度的同時減少模型的內存占用和計算量。

- 專注深度學習:由于AI專用芯片是專門為深度學習任務設計的,因此在深度學習計算方面有著更好的優化和支持,能夠提供更好的用戶體驗和性能表現。

1.3 AI編譯器

AI編譯器是一種用于優化深度學習模型的工具,其主要功能是將高級的深度學習模型轉化為底層硬件能夠執行的低級指令序列,以提高模型的推理速度和效率。AI編譯器可以針對特定的硬件平臺進行優化,充分發揮硬件資源的性能潛力。 AI編譯器的主要工作流程包括模型解析、優化、代碼生成等過程。在模型解析階段,AI編譯器會解析深度學習模型的結構和參數,以便后續的優化工作。在優化階段,AI編譯器會進行各種優化技術,如張量融合、內存優化、量化計算等,以提高模型的性能和效率。最后,在代碼生成階段,AI編譯器會將優化后的模型轉化為特定硬件平臺上的可執行指令序列,以實現高效的模型推理。

2)YOLOv5介紹

b5528d0e-a959-11ee-8b88-92fbcf53809c.png

YOLOv5是一種目標檢測算法,它是YOLO(You Only Look Once)系列模型的經典版本。YOLOv5通過使用深度卷積神經網絡來實現實時、準確地檢測圖像或視頻中的多個對象。

1. 高精度:YOLOv5在目標檢測任務上取得了很好的性能,相較于之前版本的YOLO,YOLOv5在速度和準確率方面都有所提升。

2. 輕量級:YOLOv5采用了輕量級的網絡結構設計,具有較少的參數量和計算量,適合在資源受限的環境下部署和應用。

3. 多尺度檢測:YOLOv5引入了多尺度檢測機制,可以在不同尺度下對目標進行檢測,提高了對小目標和遠距離目標的檢測效果。

4. 強大的數據增強:YOLOv5采用了大量的數據增強技術,如隨機縮放、隨機扭曲等,來擴充訓練集,提高模型的泛化能力和魯棒性。

5. 簡單易用:YOLOv5提供了簡潔的代碼和易于使用的接口,用戶可以方便地進行訓練、測試和部署。

3)ICRAFT編譯器介紹 ICRAFT是一款輕量易用的純國產自主研發AI編譯器,其優勢有:

- 易用性:安裝環境簡單,使用方便

- 擴展性強:支持用戶自定義算子,以及算子后端

- 性能優秀:在同類產品中(相同算力后端芯片),推力性能以及模型精度處于上游水平

目前支持pytorch,tensorflow,paddle-paddle,darknet,caffe等主流框架所保存的模型轉換。編譯器將各環節組件打包成可執行程序,通過命令行調用,配合外部ini配置文件執行各個組件。如圖所示,目前ICRAFT按功能層次劃分了5個組件,分別是:

- 解析:將模型解析并用ICRAFT IR重新表達、序列化成新模型

- 優化:做圖優化,減少計算量

- 量化:將模型參數量化

- 硬件適配:根據硬件情況進行計算圖優化

- 指令生成:生成硬件指令

每個環節產生的中間模型都會被保存用于仿真驗證。

b5987c7e-a959-11ee-8b88-92fbcf53809c.png

此外,ICRAFT還提供了c/c++(未來還會提供python)的device和runtime庫用于在硬件上部署編譯后的模型。 下面我們就以yolov5為例,為大家介紹模型的編譯部署流程。

4)基于ICRAFT部署YOLOv5的流程 部署流程分為3步:

1. 框架模型導出

2. 使用ICRAFT編譯模型

3. 運行時工程搭建

下面結合pytorch框架下的yolov5分別介紹每一步操作:

3.1 框架模型導出

框架模型導出目的:導出能夠被ICRAFT編譯的模型 框架模型導出背景:

1. pytorch保存的模型文件為.pt或.pth等格式。不同的保存方式會導致模型里面的內容不同。目前ICRAFT能夠編譯的pytorch模型需要是帶有計算圖的靜態模型,因此需要用pytorch的`torch.jit.trace`保存出torchscript模型。

2. 由于ICRAFT的目標硬件是異構融合的芯片,包括npu、cpu、fpga等硬件資源,一個模型算法的不同計算部分由不同的后端執行。在ICRAFT2.x版本中,ICRAFT編譯的部分是在npu上執行的部分,而模型的前后處理是在其他后端進行的,因此在導出模型時,需要把前后處理部分去掉。

了解以上背景后,我們來看看在yolov5這個算法。此算法導出模型時需要處理的有兩點:

1)`export.py`已經提供了導出torchscript模型的方法,但是我們需要把`yolo.py`中的 `Detect`類中的一部分處理bbox的算子從模型中移出,處理方法就是,在導出模型時,修改detect類的forward函數:

   class Detect(nn.Module):
       stride = None  # strides computed during build
       onnx_dynamic = False  # ONNX export parameter
       export = False  # export mode
       trace = False
       ...
       def forward(self, x):
           z = []  # inference output
           for i in range(self.nl):
               x[i] = self.m[i](x[i])  # conv
               if not self.trace:
                   ...
           if self.trace:
returnx
在detetct類中加入trace的判斷條件,在導出模型時設置為true,使這部分的計算流停止到最后一層卷積算子的計算,即`x[i] = self.m[i](x[i]) # conv`,之后立刻返回結果。當然,這只是一種操作辦法,能達到相同的效果的方法都可以使用。

2)在yolov5早期版本中,算法起始部分使用了`focus`(有些算法里叫`reorg`)模塊,這種操作在硬件上支持起來并不劃算,為此我們可以用一個卷積來等效該操作: 為了方便理解,我們把weights用數字的方式展現:
   class Focus(nn.Module):
       device = torch.device("cpu")
       weights = torch.tensor([[[[1,0],[0,0]],[[0,0],[0,0]],[[0,0],[0,0]]],
                                 [[[0,0],[0,0]],[[1,0],[0,0]],[[0,0],[0,0]]],
                                 [[[0,0],[0,0]],[[0,0],[0,0]],[[1,0],[0,0]]],
   
                                 [[[0,0],[1,0]],[[0,0],[0,0]],[[0,0],[0,0]]],
                                 [[[0,0],[0,0]],[[0,0],[1,0]],[[0,0],[0,0]]],
                                 [[[0,0],[0,0]],[[0,0],[0,0]],[[0,0],[1,0]]],
   
                                 [[[0,1],[0,0]],[[0,0],[0,0]],[[0,0],[0,0]]],
                                 [[[0,0],[0,0]],[[0,1],[0,0]],[[0,0],[0,0]]],
                                 [[[0,0],[0,0]],[[0,0],[0,0]],[[0,1],[0,0]]],
       
                                 [[[0,0],[0,1]],[[0,0],[0,0]],[[0,0],[0,0]]],  
                                 [[[0,0],[0,0]],[[0,0],[0,1]],[[0,0],[0,0]]],
                                 [[[0,0],[0,0]],[[0,0],[0,0]],[[0,0],[0,1]]]],
                              dtype=torch.float32).to(device)
   
       def __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True):  # ch_in, ch_out, kernel, stride, padding, groups
           super(Focus, self).__init__()
           self.conv = Conv(c1 * 4, c2, k, s, p, g, act)   
   
       def forward(self, x):  
           x = nn.functional.conv2d(x,self.weights,bias=None,stride=2)
           x = self.conv(x)
           return x
這個后加入的`nn.functional.conv2d`與`focus`中的若干`slice` ,`concat`計算等效,可以不用重訓模型。

3.2 ICRAFT編譯

使用icraft編譯模型十分方便,只需要準備好編譯模型所需的若干文件后,在命令行執行:`icraft compile [配置文件路徑]`即可一鍵編譯。 需要準備的文件有3方面:

1. 第一步導出的模型

2. 配置文件

3. 量化校準集

配置文件說明: icraft2.x及之前版本,需要一份`.ini`格式的配置文件,下面以icraft2.2版本的yolov5配置文件為例展開說明:(涉及到具體某個組件的所有配置參數與說明,可以參考隨ICRAFT外發的用戶手冊說明)
# 在icraft的使用中,此文件以“#”作為注釋符,而不是默認的“;”


# config用來配置使用哪些內置的FPGA算子(后面簡稱硬算子)用于加速
# ImageMake的作用是加速輸入圖片的傳入速率
# IcorePost的作用是為目標檢測網絡做閾值篩選,將合格的目標信息傳出,加速輸出速率
# customop_config是硬算子的配置文件,后面介紹
[config]
customop_on = ImageMake, IcorePost
customop_config = configs/customop/yolov5.ini


# parse section 用于配置解析組件的參數
[parse]
name = YoloV5s            # 編譯成的json/raw模型名字
framework = pytorch          # 使用的框架
frame_version = 1.9          # pytorch的版本
input = 1, 640, 640, 3        # 輸入的dims,4維輸入要按照NHWC的順序;其他維度與框架一致
input_format = NHWC          # 輸入的layout,4維:NHWC;其他:FD
pre_method = resize          # 前處理方法,默認寫resize即可
pre_scale = 255, 255, 255      # 輸出歸一化參數
pre_mean = 0, 0, 0          # 輸出歸一化參數
chann_swap = 2, 1, 0        # 圖像輸入,按照opencv讀入可能需要做bgr轉rgb
network = models/YoloV5/YoloV5s_640x640_traced.pt  # 第一步導出的模型地址
jr_path = json&raw/YoloV5s_BY/    # 編譯后產生的中間模型保存路徑
        
# optimize section 用于配置優化組件的參數
# 該組件只有少數情況需要特別配置,例如在某些圖優化導致bug時,關閉某些優化pass
[optimize]
target = BUYI                    # 目標硬件
json = json&raw/YoloV5s_BY/YoloV5s_parsed.json    # 上一個組件產生的中間模型
raw = json&raw/YoloV5s_BY/YoloV5s_parsed.raw    # 上一個組件產生的中間模型
jr_path = json&raw/YoloV5s_BY/            # 編譯后產生的中間模型保存路徑
debug = false


# quantize section 用于配置量化組件的參數
[quantize]
forward_mode = image                 # 圖片輸入的方式
saturation = kld                  # 量化飽和點選取方式
per = tensor                    # 按層/通道的量化方式
forward_dir = images/coco              # 量化校準集圖片文件夾路徑
forward_list = images/coco.txt             # 量化校準集選取哪些圖片的txt配置
batch = 1                      # 量化前向每次推理的圖片數
bits = 8                      # 量化到多少bit
json = json&raw/YoloV5s_BY/YoloV5s_optimized.json   # 上一個組件產生的中間模型
raw = json&raw/YoloV5s_BY/YoloV5s_optimized.raw   # 上一個組件產生的中間模型
jr_path = json&raw/YoloV5s_BY/            # 編譯后產生的中間模型保存路徑  


# adapt section 用于配置硬件適配組件的參數
# 該組件與optmize組件類似都是會做一些圖結構的等效修改
[adapt]  
target = BUYI                    
json = json&raw/YoloV5s_BY/YoloV5s_quantized.json 
raw = json&raw/YoloV5s_BY/YoloV5s_quantized.raw 
jr_path = json&raw/YoloV5s_BY/
debug = false


# generate section 用于配置指令生成組件的參數
[generate]
json = json&raw/YoloV5s_BY/YoloV5s_adapted.json
raw = json&raw/YoloV5s_BY/YoloV5s_adapted.raw
jr_path = json&raw/YoloV5s_BY/
log_path = ./logs/
qbits = 8                      # 與量化bit數保持一致  
rows = 4                      # 使用MPE核心數,默認即可
cols = 4                      # 使用MPE核心數,默認即可


# simulate section 用于配置仿真組件的參數
[simulate]  
target = BUYI                # 目標硬件
log_time = true
log_io = true
dump_ftmp = SFB                # 保存網絡每個算子計算結果;SFB:浮點;SQB:定點
show = true                  # 少數分類網絡可以直接查看結果
names = names/coco.names
json = json&raw/YoloV5s_BY/YoloV5s_BY.json  # 待仿真的中間模型路徑
raw = json&raw/YoloV5s_BY/YoloV5s_BY.raw  # 待仿真的中間模型路徑
image = images/coco/test_640x640.jpg    # 輸入圖片路徑
硬算子配置文件:
[IcorePost]
forward_dll = C:Icraft-CLIcustomopIcorePostIcorePost.dll
forward_so = /home/fmsh/ModelZoo/Deps/so/libcustom_IcorePost.so
quantized = true
# 需要修改之處
cmp_en = 1      # 是否做閾值比較
thr_f = 0.1     # 閾值 測精度時改為0.001
groups = 3      # 有幾個輸出head
anchor_num = 3    # 每個cell對應幾個anchor;anchor free的情況配1
position = 5    # socre所在的位置;如果沒有score,則配all,通過所有類別prob選?。?

[ImageMake]
forward_dll = C:Icraft-CLIcustomopImageMakeImageMake.dll
forward_so = /home/fmsh/ModelZoo/Deps/so/libcustom_ImageMake.so
no_imkpad = 0
#mode = 1
quantized = true
準備好以上文件后,執行編譯命令,得到最終的`yolov5_BY.json`,`yolov5_BY.raw`,即可進行下一步。

3.3 運行時工程

icraft提供了device 和運行時庫,只需要新建一個c++工程依賴這些api,即可調用專用的AI硬件執行模型推理。

主要運行時api介紹:
# 打開設備
auto device = icraft::open(url.data());
# 傳入json和raw文件,構造網絡
auto network_ptr = std::make_shared(jsonPath.data(), rawPath.data());
# 構造runtime
icraft::Runtime runtime(network_ptr, device);
# 前處理
...
# 執行前向
# 輸入需要是RutimeTensor的數據結構,只需要了解其構造方式即可自行做好前處理后傳入
auto result_tensor = runtime_view->forward({ img_tensor });
# 得到的result_tensor也是RutimeTensor的數據結構,繼續做后處理即可
# 后處理
完成運行時工程的編寫后,即可在片上系統或交叉編譯環境編譯出可執行程序。然后在片上執行,即可得到推理結果。

b5ab923c-a959-11ee-8b88-92fbcf53809c.png






審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • gpu
    gpu
    +關注

    關注

    28

    文章

    4703

    瀏覽量

    128723
  • 物聯網
    +關注

    關注

    2904

    文章

    44304

    瀏覽量

    371447
  • 人工智能
    +關注

    關注

    1791

    文章

    46896

    瀏覽量

    237660
  • AI芯片
    +關注

    關注

    17

    文章

    1860

    瀏覽量

    34917
  • 卷積神經網絡

    關注

    4

    文章

    366

    瀏覽量

    11853

原文標題:ICRAFT部署實戰之YOLOv5邊緣端部署詳細流程

文章出處:【微信號:國產FPGA之家,微信公眾號:國產FPGA之家】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    YOLOv5】LabVIEW+YOLOv5快速實現實時物體識別(Object Detection)含源碼

    前面我們給大家介紹了基于LabVIEW+YOLOv3/YOLOv4的物體識別(對象檢測),今天接著上次的內容再來看看YOLOv5。本次主要是和大家分享使用LabVIEW快速實現yolov5
    的頭像 發表于 03-13 16:01 ?2089次閱讀

    Yolov5算法解讀

    ,這幾個模型的結構基本一樣,不同的是depth_multiple模型深度和width_multiple模型寬度這兩個參數。 yolov5主要分為輸入,backbone,Neck,和head
    的頭像 發表于 05-17 16:38 ?8653次閱讀
    <b class='flag-5'>Yolov5</b>算法解讀

    YOLOv5】LabVIEW+TensorRT的yolov5部署實戰(含源碼)

    今天主要和大家分享在LabVIEW中使用純TensoRT工具包快速部署并實現yolov5的物體識別
    的頭像 發表于 08-21 22:20 ?1282次閱讀
    【<b class='flag-5'>YOLOv5</b>】LabVIEW+TensorRT的<b class='flag-5'>yolov5</b><b class='flag-5'>部署</b><b class='flag-5'>實戰</b>(含源碼)

    yolov5轉onnx在cubeAI上部署失敗的原因?

    第一個我是轉onnx時 想把權重文件變小點 就用了半精度 --half,則說17版本不支持半精度 后面則是沒有縮小的單精度 但是顯示哪里溢出了···· 也不說是哪里、、。。。 到底能不能部署yolov5這種東西???? 也沒看見幾個部署
    發表于 03-14 06:23

    基于迅為RK3588【RKNPU2項目實戰1】:YOLOV5實時目標分類

    [/url] 【RKNPU2 人工智能開發】 【AI深度學習推理加速】——RKNPU2 從入門到實踐(基于RK3588和RK3568) 【RKNPU2項目實戰1】:YOLOV5實時目
    發表于 08-15 10:51

    如何YOLOv5測試代碼?

    使用文檔“使用 YOLOv5 進行對象檢測”我試圖從文檔第 10 頁訪問以下鏈接(在 i.MX8MP 上部署 yolov5s 的步驟 - NXP 社區) ...但是這樣做時會被拒絕訪問。該文檔沒有說明需要特殊許可才能下載 tes
    發表于 05-18 06:08

    yolov5轉onnx在cubeAI進行部署的時候失敗了是什么原因造成的?

    第一個我是轉onnx時 想把權重文件變小點 就用了半精度 --half,則說17版本不支持半精度 后面則是沒有縮小的單精度 但是顯示哪里溢出了···· 也不說是哪里、 到底能不能部署yolov5這種東西啊?? 也沒看見幾個部署
    發表于 08-08 07:55

    【愛芯派 Pro 開發板試用體驗】部署愛芯派官方YOLOV5模型

    繼上文開箱后,本文主要依托愛芯元智官方的實例,進行官方YOLOV5模型的部署和測試。 一、環境搭建 由于8核A55的SoC,加上目前Debian OS的工具齊全,所以決定直接在板上編譯
    發表于 12-12 22:58

    YOLOv5 7.0版本下載與運行測試

    支持實例分割了,從此YOLOv5實現了圖像分類、對象檢測、實例分割三個支持,從訓練到部署
    的頭像 發表于 11-30 15:55 ?3721次閱讀

    yolov5訓練部署全鏈路教程

    本教程針對目標檢測算法yolov5的訓練和部署到EASY-EAI-Nano(RV1126)進行說明。
    的頭像 發表于 01-05 18:00 ?3128次閱讀
    <b class='flag-5'>yolov5</b>訓練<b class='flag-5'>部署</b>全鏈路教程

    在C++中使用OpenVINO工具包部署YOLOv5模型

    下載并轉換YOLOv5預訓練模型的詳細步驟,請參考:《基于OpenVINO?2022.2和蝰蛇峽谷優化并部署YOLOv5模型》,本文所使用的OpenVINO是2022.3 LTS版。
    的頭像 發表于 02-15 16:53 ?4580次閱讀

    使用旭日X3派的BPU部署Yolov5

    本次主要介紹在旭日x3的BPU中部署yolov5。首先在ubuntu20.04安裝yolov5,并運行yolov5并使用pytoch的pt模型文件轉ONNX。
    的頭像 發表于 04-26 14:20 ?853次閱讀
    使用旭日X3派的BPU<b class='flag-5'>部署</b><b class='flag-5'>Yolov5</b>

    【教程】yolov5訓練部署全鏈路教程

    本教程針對目標檢測算法yolov5的訓練和部署到EASY-EAI-Nano(RV1126)進行說明,而數據標注方法可以參考我們往期的文章《Labelimg的安裝與使用》。
    的頭像 發表于 01-29 15:25 ?3341次閱讀
    【教程】<b class='flag-5'>yolov5</b>訓練<b class='flag-5'>部署</b>全鏈路教程

    yolov5和YOLOX正負樣本分配策略

    整體上在正負樣本分配中,yolov7的策略算是yolov5和YOLOX的結合。因此本文先從yolov5和YOLOX正負樣本分配策略分析入手,后引入到YOLOv7的解析中。
    發表于 08-14 11:45 ?2209次閱讀
    <b class='flag-5'>yolov5</b>和YOLOX正負樣本分配策略

    在樹莓派上部署YOLOv5進行動物目標檢測的完整流程

    卓越的性能。本文將詳細介紹如何在性能更強的計算機上訓練YOLOv5模型,并將訓練好的模型部署到樹莓派4B上,通過樹莓派的攝像頭進行實時動物目標檢測。 一、在電腦上訓練YOLOv5
    的頭像 發表于 11-11 10:38 ?468次閱讀
    在樹莓派上<b class='flag-5'>部署</b><b class='flag-5'>YOLOv5</b>進行動物目標檢測的完整流程