在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

如何在KV260上快速體驗Vitsi AI圖像分類示例程序

電子發燒友論壇 ? 來源:電子發燒友論壇 ? 2023-09-12 10:02 ? 次閱讀

本文首先將會對Vitis統一軟件平臺和Vitsi AI進行簡單介紹,然后介紹如何在KV260上部署DPU鏡像,最后在KV260 DPU鏡像上運行Vitis AI自帶的圖像分類示例。通過本文,你將會對Vitis軟件平臺、Vitsi AI架構有初步認識,并知道如何在KV260上快速體驗Vitsi AI圖像分類示例程序。

01一、背景簡介

開始本文的實操環節之前,這里我先介紹一些背景知識,分別是Vitis統一軟件平臺和Vitis AI。

1.1 Vitis 統一軟件平臺簡介

來自Xilinx官網的簡介,Vitis 統一軟件平臺包括:

全面的內核開發套件,可無縫構建加速應用

完整的硬件加速開源庫,針對 AMD FPGA 和 Versal 自適應 SoC 硬件平臺進行了優化

插入特定領域的開發環境,可直接在熟悉的更高層次框架中進行開發

不斷發展的硬件加速合作伙伴庫和預建應用生態系統

Vitis Model Composer 是一款基于模型的設計工具,不僅可在 MathWorks MATLABSimulink 環境中實現快速設計探索與驗證 ,而且還可加速 AMD 器件的生產進程。

Vitis Networking P4 允許創建軟定義網絡。VitisNetP4 數據平面構建器生成的系統可以針對從簡單的數據包分類到復雜的數據包編輯的各種數據包處理功能進行編程

來自官網的Vitis統一軟件平臺架構圖:

fe278d48-50ff-11ee-a25d-92fbcf53809c.jpg

從官網的介紹頁面我們也可以看到,Vitis 統一軟件平臺包括如下組件:

Vitis AI

Vitis 視頻分析SDK

Vitis 庫

Vitis HLS

Vitis Model Composer

今天我們將會重點介紹Vitis AI。

1.2 Vitsi AI簡介

本節內容主要參考了自官方github.io文檔。

AMD Vitis AI 是一個集成開發環境,可用于加速 AMD 平臺上的 AI 推理。該工具鏈提供優化的IP、工具、庫、模型以及資源,例如示例設計和教程,可在整個開發過程中為用戶提供幫助。它在設計時充分考慮了高效率和易用性,在 AMD 自適應 SoC 和 Alveo 數據中心加速卡上釋放了 AI 加速的全部潛力。

Vitis AI 解決方案由三個主要組件組成:

深度學習處理器單元 (DPU),用于優化 ML 模型推理的硬件引擎。

模型開發工具,用于為 DPU 編譯和優化 ML 模型。

模型部署庫和 API,用于從軟件應用程序在 DPU 引擎上集成和執行 ML 模型。

Vitis AI 解決方案的打包和交付方式如下:

AMD 開放下載:集成 DPU 的預構建目標映像(以下簡稱“DPU鏡像”)

Vitis AI Docker容器:模型開發工具

Vitis AI github 存儲庫:模型部署庫、設置腳本、示例和參考設計

02二、部署DPU鏡像到KV260

2.1 下載DPU鏡像

在KV260開發板上正式體驗Vitis AI之前,需要將上一節中提到的DPU鏡像下載下來并燒錄到SD上。

支持KV260的最新DPU鏡像下載鏈接:https://china.xilinx.com/member/forms/download/design-license-xef.html?filename=xilinx-kv260-dpu-v2022.2-v3.0.0.img.gz

2.2 寫入DPU鏡像到SD卡

下載完成后,解壓壓縮包,通過Rufus將解壓的wic文件寫入SD卡。使用Rufus選擇文件時,需要注意將右側的默認文件類型修改為全部文件,否則默認不支持wic文件:

fe35e672-50ff-11ee-a25d-92fbcf53809c.png

寫入過程顯示進度:

fe4d145a-50ff-11ee-a25d-92fbcf53809c.png

2.3 啟動DPU鏡像系統

完成DPU鏡像寫入SD卡后,將SD卡讀卡器從PC移除后,將SD卡插入到開發板,插好串口線,打開串口終端,波特率設置為115200,就可以準備上電開機了。

啟動之后會自動登錄root賬號(默認密碼為root):

fe5ae396-50ff-11ee-a25d-92fbcf53809c.png

插上網線的話,啟動后還可以看到輸出了dashborad訪問鏈接:

fe8685d2-50ff-11ee-a25d-92fbcf53809c.png

根據ifconfig查看的IP地址,瀏覽器訪問dashboard鏈接,可以看到實時狀態監控:

fea2b068-50ff-11ee-a25d-92fbcf53809c.png

03三、運行Vitsi AI圖像分類示例

3.1 DPU鏡像自帶的一些文件介紹

DPU鏡像默認帶有SSH服務,并且是開機啟動的,因此可以使用MobaXterm的SSH客戶端通過網絡登錄KV260,如下圖所示:

fecb22be-50ff-11ee-a25d-92fbcf53809c.png

MobaXterm的SSH客戶端時帶有X11-forwarding功能的,支持將遠程程序界面通過SSH協議顯示在本地。

登錄系統后,可以看到,/home/root目錄下已經有了兩個目錄。

使用tree命令,可以看到Vitis-AI目錄結構:

fef4319a-50ff-11ee-a25d-92fbcf53809c.png

接下來我們將會嘗試運行vai_runtime下的resnet50示例程序,我們先看看這個目錄下的文件結構:

ff018192-50ff-11ee-a25d-92fbcf53809c.png

里面有文件的作用分別為:

build.sh,編譯腳本,里面包含編譯src/main.cc的命令

resnet50,已經編譯好的可執行程序,由src/main.cc編譯生成

readme,說明文件

words.txt,分類標簽

src/main.cc,示例程序源碼

DPU鏡像默認已經安裝了gcc,直接運行build.sh就可以編譯src/main.cc,并生成resnet50可執行文件。可以嘗試將resnet50可執行文件刪除掉,再運行build.sh腳本,觀察是否重新生成了resnet50。

ff1950ce-50ff-11ee-a25d-92fbcf53809c.png

3.2 下載resnet50測試圖片

通過以下命令,下載并解壓resnet50測試圖片:

cd ~
wget https://china.xilinx.com/bin/public/openDownload?filename=vitis_ai_runtime_r3.0.0_image_video.tar.gz -O vitis_ai_runtime_r3.0.0_image_video.tar.gz
mkdir vitis_ai_runtime_r3.0.0_image_video
tar -C vitis_ai_runtime_r3.0.0_image_video -xzvf vitis_ai_runtime_r3.0.0_image_video.tar.gz

(左右移動查看全部內容)

3.3 運行resnet50示例程序

接下來,通過如下命令,運行resnet50示例程序:

cd ~/Vitis-AI/examples/vai_runtime/resnet50
./resnet50 /usr/share/vitis_ai_library/models/resnet50/resnet50.xmodel

(左右移動查看全部內容)

運行結果如下:

ff22e12a-50ff-11ee-a25d-92fbcf53809c.png

報錯說../images目錄找不到。

創建../images目錄,并將剛剛下載的resnet50測試圖片拷貝到該目錄中:

mkdir -v ../images
cp -vr ~/vitis_ai_runtime_r3.0.0_image_video/images/* ../images/

(左右移動查看全部內容)

運行輸出如下:

ff4dfd06-50ff-11ee-a25d-92fbcf53809c.png

再次運行resnet50示例程序:

ff6a080c-50ff-11ee-a25d-92fbcf53809c.png

成功識別了。

命令行第二個參數 /usr/share/vitis_ai_library/models/resnet50/resnet50.xmodel 是resnet50的DPU模型文件,該文件在DPU鏡像中已經有了,因此不需要手動下載。

3.4 使用金魚圖片進行測試

words.txt 文件中是resnet50識別結果的分類標簽,可以看到前面幾行中包含金魚(goldfish)分類:

ff84b134-50ff-11ee-a25d-92fbcf53809c.png

因此,可以找一個金魚圖片進行測試。

隨便找了一張:

通過MobaXterm左側邊欄的上傳功能傳到開發板上:

ffbca742-50ff-11ee-a25d-92fbcf53809c.png

默認上傳位置為HOME目錄(~)。

接下來,將金魚圖片拷貝到../images目錄,并將原來的測試圖片刪除掉,重新運行resnet50示例程序,可以看到成功識別了金魚:

ffd5b354-50ff-11ee-a25d-92fbcf53809c.png

04四、示例程序源碼解讀

接下來我們看看resnet50目錄下的src/main.cc文件內容。

4.2 main函數

首先是main函數:

/**
 * [url=home.php?mod=space&uid=2666770]@Brief[/url] Entry for runing ResNet50 neural network
 *
 * [url=home.php?mod=space&uid=1902110]@NOTE[/url] Runner APIs prefixed with "dpu" are used to easily program &
 *    deploy ResNet50 on DPU platform.
 *
 */
int main(int argc, char* argv[]) {
 // Check args
 if (argc != 2) {
  cout << "Usage of resnet50 demo: ./resnet50 [model_file]" << endl;
 ? ?return -1;
 ?}
 ?auto graph = xir::deserialize(argv[1]);
 ?auto subgraph = get_dpu_subgraph(graph.get());
 ?CHECK_EQ(subgraph.size(), 1u)
 ? ? ?<< "resnet50 should have one and only one dpu subgraph.";
 ?LOG(INFO) << "create running for subgraph: " << subgraph[0]->get_name();
 /*create runner*/
 auto runner = vart::create_runner(subgraph[0], "run");
 // ai::XdpuRunner* runner = new ai::XdpuRunner("./");
 /*get in/out tensor*/
 auto inputTensors = runner->get_input_tensors();
 auto outputTensors = runner->get_output_tensors();


 /*get in/out tensor shape*/
 int inputCnt = inputTensors.size();
 int outputCnt = outputTensors.size();
 TensorShape inshapes[inputCnt];
 TensorShape outshapes[outputCnt];
 shapes.inTensorList = inshapes;
 shapes.outTensorList = outshapes;
 getTensorShape(runner.get(), &shapes, inputCnt, outputCnt);


 /*run with batch*/
 runResnet50(runner.get());
 return 0;
}

(左右移動查看全部內容)

其中:

auto graph = xir::deserialize(argv[1]); 用于加載模型

auto runner = vart::create_runner(subgraph[0], "run"); 用于創建Runner對象

auto inputTensors = runner->get_input_tensors(); 用于獲取輸入Tensor對象

auto outputTensors = runner->get_output_tensors(); 用于獲取輸出Tensor對象

最后的 runResnet50(runner.get()); 運行模型

4.2 runRestnet50函數

接下來我們看看runReset50函數:

/**
 * @brief Run DPU Task for ResNet50
 *
 * [url=home.php?mod=space&uid=3142012]@param[/url] taskResnet50 - pointer to ResNet50 Task
 *
 * [url=home.php?mod=space&uid=1141835]@Return[/url] none
 */
void runResnet50(vart::Runner* runner) {
 /* Mean value for ResNet50 specified in Caffe prototxt */
 vector kinds, images;


 /* Load all image names.*/
 ListImages(baseImagePath, images);
 if (images.size() == 0) {
  cerr << "
Error: No images existing under " << baseImagePath << endl;
 ? ?return;
 ?}


 ?/* Load all kinds words.*/
 ?LoadWords(wordsPath + "words.txt", kinds);
 ?if (kinds.size() == 0) {
 ? ?cerr << "
Error: No words exist in file words.txt." << endl;
 ? ?return;
 ?}
 ?float mean[3] = {104, 107, 123};


 ?/* get in/out tensors and dims*/
 ?auto outputTensors = runner->get_output_tensors();
 auto inputTensors = runner->get_input_tensors();
 auto out_dims = outputTensors[0]->get_shape();
 auto in_dims = inputTensors[0]->get_shape();


 auto input_scale = get_input_scale(inputTensors[0]);
 auto output_scale = get_output_scale(outputTensors[0]);


 /*get shape info*/
 int outSize = shapes.outTensorList[0].size;
 int inSize = shapes.inTensorList[0].size;
 int inHeight = shapes.inTensorList[0].height;
 int inWidth = shapes.inTensorList[0].width;


 int batchSize = in_dims[0];


 std::vector> inputs, outputs;


 vector imageList;
 int8_t* imageInputs = new int8_t[inSize * batchSize];


 float* softmax = new float[outSize];
 int8_t* FCResult = new int8_t[batchSize * outSize];
 std::vector inputsPtr, outputsPtr;
 std::vector> batchTensors;
 /*run with batch*/
 for (unsigned int n = 0; n < images.size(); n += batchSize) {
 ? ?unsigned int runSize =
 ? ? ? ?(images.size() < (n + batchSize)) ? (images.size() - n) : batchSize;
 ? ?in_dims[0] = runSize;
 ? ?out_dims[0] = batchSize;
 ? ?for (unsigned int i = 0; i < runSize; i++) {
 ? ? ?Mat image = imread(baseImagePath + images[n + i]);


 ? ? ?/*image pre-process*/
 ? ? ?Mat image2; ?//= cv::Mat(inHeight, inWidth, CV_8SC3);
 ? ? ?resize(image, image2, Size(inHeight, inWidth), 0, 0);
 ? ? ?for (int h = 0; h < inHeight; h++) {
 ? ? ? ?for (int w = 0; w < inWidth; w++) {
 ? ? ? ? ?for (int c = 0; c < 3; c++) {
 ? ? ? ? ? ?imageInputs[i * inSize + h * inWidth * 3 + w * 3 + c] =
 ? ? ? ? ? ? ? ?(int8_t)((image2.at(h, w)[c] - mean[c]) * input_scale);
     }
    }
   }
   imageList.push_back(image);
  }


  /* in/out tensor refactory for batch inout/output */
  batchTensors.push_back(std::shared_ptr(
    xir::create(inputTensors[0]->get_name(), in_dims,
              xir::DataType{xir::XINT, 8u})));
  inputs.push_back(std::make_unique(
    imageInputs, batchTensors.back().get()));
  batchTensors.push_back(std::shared_ptr(
    xir::create(outputTensors[0]->get_name(), out_dims,
              xir::DataType{xir::XINT, 8u})));
  outputs.push_back(std::make_unique(
    FCResult, batchTensors.back().get()));


  /*tensor buffer input/output */
  inputsPtr.clear();
  outputsPtr.clear();
  inputsPtr.push_back(inputs[0].get());
  outputsPtr.push_back(outputs[0].get());


  /*run*/
  auto job_id = runner->execute_async(inputsPtr, outputsPtr);
  runner->wait(job_id.first, -1);
  for (unsigned int i = 0; i < runSize; i++) {
 ? ? ?cout << "
Image : " << images[n + i] << endl;
 ? ? ?/* Calculate softmax on CPU and display TOP-5 classification results */
 ? ? ?CPUCalcSoftmax(&FCResult[i * outSize], outSize, softmax, output_scale);
 ? ? ?TopK(softmax, outSize, 5, kinds);
 ? ? ?/* Display the impage */
 ? ? ?bool quiet = (getenv("QUIET_RUN") != nullptr);
 ? ? ?if (!quiet) {
 ? ? ? ?cv::imshow("Classification of ResNet50", imageList[i]);
 ? ? ? ?cv::waitKey(10000);
 ? ? ?}
 ? ?}
 ? ?imageList.clear();
 ? ?inputs.clear();
 ? ?outputs.clear();
 ?}
 ?delete[] FCResult;
 ?delete[] imageInputs;
 ?delete[] softmax;
}

(左右移動查看全部內容)

其中,關鍵代碼行如下:

ListImages(baseImagePath, images); 用于列出../images目錄中的圖片文件

LoadWords(wordsPath + "words.txt", kinds); 用于讀取words.txt中的分類標簽

Mat image = imread(baseImagePath + images[n + i]); 用于讀取圖片

resize(image, image2, Size(inHeight, inWidth), 0, 0); 用于將圖片縮放為模型需要的尺寸

auto job_id = runner->execute_async(inputsPtr, outputsPtr); 開始異步執行模型推理

runner->wait(job_id.first, -1); 等待異步執行完成

cv::imshow("Classification of ResNet50", imageList[i]); 顯示圖片

cv::waitKey(10000); 等待鍵盤按鍵10秒

好了本篇內容就到這里了,感謝閱讀,下次再會。

審核編輯:湯梓紅

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

    關注

    71

    文章

    2171

    瀏覽量

    122134
  • AI
    AI
    +關注

    關注

    87

    文章

    31513

    瀏覽量

    270333
  • 程序
    +關注

    關注

    117

    文章

    3795

    瀏覽量

    81411
  • 圖像分類
    +關注

    關注

    0

    文章

    93

    瀏覽量

    11956

原文標題:【試用報告】如何在KV260上快速體驗Vitsi AI圖像分類示例程序

文章出處:【微信號:gh_9b9470648b3c,微信公眾號:電子發燒友論壇】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    KV260視覺入門套件smartcamera體驗

    KV260視覺入門套件smartcamera體驗
    的頭像 發表于 09-11 13:04 ?3738次閱讀
    <b class='flag-5'>KV260</b>視覺入門套件smartcamera體驗

    [KV260視覺入門套件試用體驗]+KV260 開發套件使用初體驗

    KV260開發板,我們可以接攝像頭,在顯示器顯示攝像頭圖像,以及對攝像頭視頻數據做AI應用。 KV2
    發表于 07-31 01:26

    KV260視覺入門套件試用體驗】運行SmartCamera示例程序

    將會了解如何在KV260安裝最新版本Docker,以及如何在KV260運行Xilinx官方的
    發表于 08-20 23:38

    KV260視覺入門套件試用體驗】KV260 開發套件使用體驗(二、接通攝像頭)

    ) 在KV260開發板,我們可以接攝像頭,在顯示器顯示攝像頭圖像,以及對攝像頭視頻數據做AI應用。 2、
    發表于 09-03 11:41

    KV260視覺入門套件試用體驗】部署DPU鏡像并運行Vitis AI圖像分類示例程序

    對Vitis軟件平臺、Vitsi AI架構有初步認識,并知道如何在KV260快速體驗
    發表于 09-10 23:01

    KV260視覺入門套件試用體驗】KV260開發板初使用

    的硅器件、存儲器、引導和安全模塊。 Kria KV260 Vision AI是Xilinx公司推出的一款視覺AI入門套件,旨在為客戶提供一個平臺來評估他們的目標應用程序并最終設計他們
    發表于 09-18 14:56

    KV260視覺入門套件試用體驗】Vitis-AI加速的YOLOX視頻目標檢測示例體驗和原理解析

    示例體驗 參考此前的帖子:【KV260視覺入門套件試用體驗】部署DPU鏡像并運行Vitis AI圖像分類
    發表于 10-06 23:32

    KV260視覺入門套件試用體驗】+03.SmartCamera人臉識別示例程序(zmj)

    **【KV260視覺入門套件試用體驗】+03.SmartCamera人臉識別示例程序(zmj) ** 本篇主要介紹在KV260視覺入門套件使用Ubuntu-22.04-LTS系統鏡像實現
    發表于 10-15 23:47

    KV260視覺入門套件試用體驗】KV260開箱及鏡像燒寫

    是所有部件的照片 簡單介紹一下kv260吧,Kria? KV260 視覺 AI 入門套件是評估基于視覺 AI 的應用程序的開發平臺。 系統鏡
    發表于 10-16 03:31

    KV260視覺入門套件試用體驗】四、KV260 視覺入門套件和固件更新

    設備 Kria? KV260 Vision AI 入門套件具有主啟動設備和輔助啟動設備,可將特定于平臺的啟動固件,與運行時的操作系統和應用程序隔離。這使你能夠專注于開發和更新應用程序
    發表于 10-17 08:28

    Kria KV260的動態交通燈系統

    電子發燒友網站提供《Kria KV260的動態交通燈系統.zip》資料免費下載
    發表于 10-26 11:18 ?3次下載
    Kria <b class='flag-5'>KV260</b><b class='flag-5'>上</b>的動態交通燈系統

    使用Xilinx Kria KV260進行AI火災探測

    電子發燒友網站提供《使用Xilinx Kria KV260進行AI火災探測.zip》資料免費下載
    發表于 10-27 10:12 ?7次下載
    使用Xilinx Kria <b class='flag-5'>KV260</b>進行<b class='flag-5'>AI</b>火災探測

    Kria KV260 AI視覺套件入門

    電子發燒友網站提供《Kria KV260 AI視覺套件入門.zip》資料免費下載
    發表于 11-15 11:29 ?3次下載
    Kria <b class='flag-5'>KV260</b> <b class='flag-5'>AI</b>視覺套件入門

    Vitis ai 1.4 KV260鏡像開源

    電子發燒友網站提供《Vitis ai 1.4 KV260鏡像開源.zip》資料免費下載
    發表于 06-14 14:31 ?0次下載
    Vitis <b class='flag-5'>ai</b> 1.4 <b class='flag-5'>KV260</b>鏡像開源

    Kria KV260視覺AI入門套件用戶指南

    電子發燒友網站提供《Kria KV260視覺AI入門套件用戶指南.pdf》資料免費下載
    發表于 09-14 14:53 ?3次下載
    Kria <b class='flag-5'>KV260</b>視覺<b class='flag-5'>AI</b>入門套件用戶指南
    主站蜘蛛池模板: 亚洲一级毛片中文字幕 | 日本污全彩肉肉无遮挡彩色 | 午夜剧场刺激性爽免费视频 | 日本黄色片在线观看 | 毛片在线网站 | 手机在线电影你懂的 | 欧美女同在线观看 | 久久精品国产99精品国产2021 | 永久免费观看午夜视频在线 | www.色天使 | 中文字幕不卡免费高清视频 | 国产农村妇女毛片精品久久久 | 久久综合九色综合98一99久久99久 | 免费国产不卡午夜福在线观看 | 国产一区国产二区国产三区 | 国产精品国产三级在线高清观看 | 网站黄色在线观看 | 黄a毛片 | 午夜欧美电影 | 国产福利乳摇在线播放 | 亚洲色图激情 | 来啊mm影院亚洲mm影院 | 久久视频精品36线视频在线观看 | 国产高清一级视频在线观看 | 岛国午夜精品视频在线观看 | 日毛片| 欧美日日日 | 亚洲欧洲第一页 | 嫩草黄色影院 | 色妞色综合久久夜夜 | 四虎永久在线精品国产免费 | 国产日韩三级 | 美女黄页免费 | 6一10周岁毛片免费 717影院理论午夜伦不卡久久 | 超h高h文污肉 | 开心丁香婷婷深爱五月 | 久久本道综合色狠狠五月 | 中文字幕乱码人成乱码在线视频 | 午夜性爽视频男人的天堂在线 | 天天看片中文字幕 | 亚洲伊人久久综合影院2021 |