【昇騰CANN訓(xùn)練營(yíng)第二期】【應(yīng)用營(yíng)】高玩賽作業(yè):使用MindStudio完成YoLoV5和ResNet50的推理開發(fā)

      網(wǎng)友投稿 728 2025-04-04

      CANN訓(xùn)練營(yíng)第二期? 應(yīng)用營(yíng) 高玩賽作業(yè)鏈接:

      https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=143438&extra=page=1

      實(shí)操作業(yè)為:

      學(xué)習(xí)路徑: 1、視頻課程:MindX應(yīng)用使能組件介紹 https://www.hiascend.com/zh/activities/cloud2021/live/8120 2、實(shí)驗(yàn)課程:使用MindX SDK開發(fā)智能質(zhì)檢應(yīng)用 https://lab.huaweicloud.com/testdetail_531 3、實(shí)驗(yàn)課程:MindX SDK + Pytorch yolov5 應(yīng)用案例詳解 https://bbs.huaweicloud.com/forum/thread-118598-1-1.html 課程作業(yè): 在MindStudio中創(chuàng)建MindX SDK模板工程,并完成檢測(cè)(yolov5)+分類(resnet50,從生昇騰社區(qū)ModelZoo獲取,TensorFlow和Pytorch的均可)。 MindX SDK模板工程可以放到gitee上,參考附件。 評(píng)分規(guī)則: 在MindStudio中創(chuàng)建MindX SDK模板工程:10分 并完成檢測(cè):30分 分類:15分 推理應(yīng)用開發(fā):15分

      解題思路分析:

      作業(yè)中“學(xué)習(xí)路徑”中的第二個(gè)鏈接的實(shí)驗(yàn),張小白以前就做過了:

      https://bbs.huaweicloud.com/forum/thread-137435-1-1.html

      第一個(gè)鏈接的直播,好像講的也是 MindX,并且也含了第二個(gè)鏈接的實(shí)驗(yàn):

      https://www.hiascend.com/zh/activities/cloud2021/live/8120

      第三個(gè)鏈接,好像就可以指導(dǎo)作業(yè)了:

      https://bbs.huaweicloud.com/forum/thread-118598-1-1.html

      所以打開第三個(gè)鏈接,咱們就開始做作業(yè)吧!

      聽這次的 高玩賽 老師? @Fate丶SSS 的介紹,高玩賽的鏡像跟 新手營(yíng)的鏡像一樣,都是image-for-MindX。那么簡(jiǎn)單了,只需要將 新手營(yíng)沒有刪除的 AI1S服務(wù)器開機(jī),就可以開始做作業(yè)了。

      如果你不小心刪了,也不要緊請(qǐng)移駕 https://bbs.huaweicloud.com/blogs/285668 完成服務(wù)器購(gòu)買等操作:

      并根據(jù) https://bbs.huaweicloud.com/blogs/285675 步驟,完成ResNet50網(wǎng)絡(luò)的離線模型生成:

      下面的操作是基于上述步驟執(zhí)行完畢的情況下進(jìn)行。

      MindStudio的啟動(dòng)、創(chuàng)建工程和MindStudio配置:

      開機(jī)-》啟動(dòng) MindStudio

      New Project

      Next,選擇 ?選擇Sample(detection and classfication)(下圖中的箭頭請(qǐng)忽略,以文字為準(zhǔn))

      點(diǎn)擊Finish:

      當(dāng)點(diǎn)擊工程中pipeline目錄下的Sample.pipeline時(shí),系統(tǒng)會(huì)提示,“There is no activated MindX SDK”,因此要配置下MindX SDK的位置:

      在MindStudio菜單欄依次點(diǎn)擊"Ascend"->"MindX SDK Manager"

      在彈出的窗口點(diǎn)擊 Install SDK

      選擇 SDK的路徑:

      選擇online試試:(這是一個(gè)坑。。。)

      它居然在裝aarch64的版本,估計(jì)是對(duì)自己是X86的身份存在懷疑:

      點(diǎn)擊Finish

      明顯X86的SDK是不能用的。

      還是通過local模式裝SDK吧:

      檢查mindxsdk安裝盤的位置:/home/HwHiAiUser/MindX

      選擇該目錄下的run文件:

      Next:

      Next:

      耐心等待安裝完畢,點(diǎn)擊Finish:

      點(diǎn)擊OK,這回pipeline的圖形化界面終于出現(xiàn)了:

      仔細(xì)查看pipleline的圖形,以及對(duì)應(yīng)的源碼(Text):

      這個(gè)sample。前面是YoLoV3,后面是 ResNet50.

      而我們的高玩題目呢?要求前面是YoLoV5,后面是 ResNet50。

      所以解題思路很簡(jiǎn)單:

      1.要么一個(gè)一個(gè)做,比如先只做YoLoV5, 再開個(gè)MindX SDK項(xiàng)目只做ResNet50

      2.或者把現(xiàn)在的pipeline改一下,前面改為YoLoV5。后面應(yīng)該不用改了。

      跑通YoLoV3+ResNet50:

      先把現(xiàn)在的代碼編譯一下:

      菜單欄點(diǎn)擊”Build“->"Edit Build Configuration..."

      點(diǎn)擊build,會(huì)生成out目錄下的main可執(zhí)行代碼:

      運(yùn)行下試試:選擇local Run,按以下內(nèi)容填寫:

      點(diǎn)擊Run:會(huì)告訴你om模型不存在:

      需要把 第三周作業(yè)( https://bbs.huaweicloud.com/blogs/285675 )轉(zhuǎn)換好的ResNet50的離線模型 resnet50_aipp_tf.om 拷貝過來:

      找到本項(xiàng)目所在的目錄:

      cd ~/AscendProjects/Resnet50

      cd models/resnet50

      cp /home/HwHiAiUser/MindX/resnet50/model/resnet50_aipp_tf.om .

      順便也把第二周作業(yè)( https://bbs.huaweicloud.com/blogs/285668 )生成的YoLoV3離線模型也拷過來:

      cd ../yolov3

      cp /home/HwHiAiUser/MindX/yolov3/yolov3_tf_bs1_fp16.om .

      再重新運(yùn)行:

      運(yùn)行結(jié)果如下:

      具體內(nèi)容看不清,貼出來一下:

      2021-07-31 18:40:38 - [INFO] Resnet50 start running... 2021-07-31 18:40:38 - [INFO] Execute command on local: export LD_LIBRARY_PATH=/usr/local/Ascend/mindx_sdk/mxVision_2.0.1/linux-x86_64/mxVision-2.0.1/lib:/usr/local/Ascend/mindx_sdk/mxVision_2.0.1/linux-x86_64/mxVision-2.0.1/lib/plugins:/usr/local/Ascend/mindx_sdk/mxVision_2.0.1/linux-x86_64/mxVision-2.0.1/opensource/lib:/usr/local/Ascend/mindx_sdk/mxVision_2.0.1/linux-x86_64/mxVision-2.0.1/opensource/lib64:/root/AscendProjects/Resnet50/lib:/root/AscendProjects/Resnet50/lib/plugins:${LD_LIBRARY_PATH} && export GST_PLUGIN_SCANNER=/usr/local/Ascend/mindx_sdk/mxVision_2.0.1/linux-x86_64/mxVision-2.0.1/opensource/libexec/gstreamer-1.0/gst-plugin-scanner && export GST_PLUGIN_PATH=/usr/local/Ascend/mindx_sdk/mxVision_2.0.1/linux-x86_64/mxVision-2.0.1/opensource/lib/gstreamer-1.0:/usr/local/Ascend/mindx_sdk/mxVision_2.0.1/linux-x86_64/mxVision-2.0.1/lib/plugins:/root/AscendProjects/Resnet50/lib/plugins && export MX_SDK_HOME=/usr/local/Ascend/mindx_sdk/mxVision_2.0.1/linux-x86_64/mxVision-2.0.1 && cd /root/AscendProjects/Resnet50/out && ./main Begin to initialize Log. The output directory(./logs) of logs file exist. Save logs information to specified directory(./logs). W0731 18:40:40.195328 5423 main.cpp:130] Results:{"MxpiObject":[{"MxpiClass":[{"classId":163,"className":"beagle","confidence":0.87109375}],"classVec":[{"classId":16,"className":"dog","confidence":0.99641436299999997,"headerVec":[]}],"x0":125.63256800000001,"x1":918.29089399999998,"y0":116.434044,"y1":597.21276899999998}]} 2021-07-31 18:40:41 - [INFO] Run finished, exit status: 0

      JSON格式化后的結(jié)果如下:

      { "MxpiObject": [{ "MxpiClass": [{ "classId": 163, "className": "beagle", "confidence": 0.87109375 }], "classVec": [{ "classId": 16, "className": "dog", "confidence": 0.99641436299999997, "headerVec": [] }], "x0": 125.63256800000001, "x1": 918.29089399999998, "y0": 116.434044, "y1": 597.21276899999998 }] }

      結(jié)果分析:

      先進(jìn)行了 YoLoV3的檢測(cè)(檢測(cè)結(jié)果放入ClassVec和x0,y0、x1、y1的坐標(biāo)),然后進(jìn)行了ResNet50的分類(分類結(jié)果放入MxpiClass)。

      檢測(cè)結(jié)果是:

      在 "x0":125.63256800000001,"x1":918.29089399999998,"y0":116.434044,"y1":597.21276899999998}

      這個(gè)框內(nèi),YoLoV3認(rèn)為它是dog,ResNet認(rèn)為它屬于beagle(獵兔犬)。

      當(dāng)然,Sample代碼并沒有畫出結(jié)果。

      所以增加以下代碼,畫個(gè)結(jié)果的框吧。

      參考 https://bbs.huaweicloud.com/forum/thread-137435-1-1.html ?的內(nèi)容增加OpenCV2的代碼。

      CMakeLists.txt:

      Header path include_directories( ${MX_SDK_HOME}/include/ ${MX_SDK_HOME}/opensource/include/ ${MX_SDK_HOME}/opensource/include/opencv4/ ) # add host lib path link_directories( ${MX_SDK_HOME}/lib/ ${MX_SDK_HOME}/opensource/lib/ ${MX_SDK_HOME}/opensource/lib64/ ${MX_SDK_HOME}/opensource/include/opencv4/ ) add_executable(main main.cpp) target_link_libraries(main glog mxbase streammanager cpprest mindxsdk_protobuf opencv_world)

      main.cpp

      #include "opencv4/opencv2/opencv.hpp"

      還有:

      web::json::value jsonText = web::json::value::parse(result); if (jsonText.is_object()) { web::json::object textObject = jsonText.as_object(); auto itInferObject = textObject.find("MxpiObject"); if (itInferObject == textObject.end() || (!itInferObject->second.is_array())) { return 0; } auto iter = itInferObject->second.as_array().begin(); cv::Mat src = cv::imread("../data/test.jpg"); for (; iter != itInferObject->second.as_array().end(); iter++) { if (iter->is_object()) { auto modelInferObject = iter->as_object(); float x0 = 0; float x1 = 0; float y0 = 0; float y1 = 0; auto it = modelInferObject.find("x0"); if (it != modelInferObject.end()) { x0 = float(it->second.as_double()); } it = modelInferObject.find("x1"); if (it != modelInferObject.end()) { x1 = float(it->second.as_double()); } it = modelInferObject.find("y0"); if (it != modelInferObject.end()) { y0 = float(it->second.as_double()); } it = modelInferObject.find("y1"); if (it != modelInferObject.end()) { y1 = float(it->second.as_double()); } cv::Rect rect(x0, y0, x1 - x0, y1 - y0); cv::rectangle(src, rect, cv::Scalar(0, 255, 0),5, cv::LINE_8,0); } } cv::imwrite("./result_test.jpg", src); std::cout << "result_test.jpg produced in the directory:/home/user/AscendProjects/MyApp/out." << std::endl; }

      重新編譯:

      重新執(zhí)行:

      上圖綠色的就是YoLoV3標(biāo)記出來的框。

      PipeLine:YoLoV3替換為YoLoV5:

      既然 YoLoV3和ResNet50都跑通了。那么把 YoLoV5替換掉 YoLoV3就可以。

      參考 https://bbs.huaweicloud.com/forum/thread-118598-1-1.html

      類似 YoLoV3 的編排,對(duì)比鏈接中 YoLoV5的pipeline。我們做個(gè)修改:

      可以先把 ?YoLoV3 的pipeline備份下

      檢視一下,

      YoLoV3有aippconfig、coco.names、yolov3_tf_bs1_fp16.cfg還有一個(gè)om,另外還有一個(gè)libMpYOLOv3PostProcessor.so

      看看對(duì)應(yīng)的yolov5是否齊全:

      aipp_yolov5.cfg

      那就先生成YoLoV5的離線模型。

      YoLoV5的離線模型的生成:

      mkdir /root/yolov5s_convert

      cd /root/yolov5s_convert

      wget https://github.com/ultralytics/yolov5/archive/v2.0.tar.gz --no-check-certificate

      tar -xzf v2.0.tar.gz

      vi yolov5-2.0/models/export.py

      修改第48行opset_version為11

      下載權(quán)重文件 yolov5s.pt

      cd yolov5-2.0

      wget https://github.com/ultralytics/yolov5/releases/download/v2.0/yolov5s.pt --no-check-certificate

      python models/export.py --weights ./yolov5s.pt --img 640 --batch 1

      好像還得裝個(gè)pytorch。

      去PyPorch官網(wǎng)下載 Pytorch 1.8.1:

      pip3 install torch==1.8.1+cpu torchvision==0.9.1+cpu torchaudio==0.8.1 -f https://download.pytorch.org/whl/lts/1.8/torch_lts.html

      重新執(zhí)行:

      python models/export.py --weights ./yolov5s.pt --img 640 --batch 1

      報(bào)缺_lzma模塊:

      查資料找解決方案:https://blog.csdn.net/moxiao1995071310/article/details/97399809/

      照此辦理:

      apt-get install libbz2-dev

      apt-get install lzma

      apt-get install liblzma-dev

      重新編譯python3.7.5:

      cd /root/Python-3.7.5

      ./configure --prefix=/usr/local/python3.7.5 --enable-optimizations --enable-shared

      ...

      make

      ...

      需要耐心等待416個(gè)test走完。。這是一個(gè)漫長(zhǎng)的過程:

      make install

      ...

      驗(yàn)證下:

      下面反復(fù)執(zhí)行:

      python models/export.py --weights ./yolov5s.pt --img 640 --batch 1

      系統(tǒng)會(huì)報(bào)缺什么模塊,然后我們就按照要求裝什么模塊:

      pip install pyyaml

      pip install tqdm

      pip install onnx

      pip install coremltools -i https://pypi.tuna.tsinghua.edu.cn/simple/

      這次再執(zhí)行:

      python models/export.py --weights ./yolov5s.pt --img 640 --batch 1

      這到底是成功了還是失敗了?

      檢查了一下,并沒有生成onnx文件。應(yīng)該還是有問題的:

      度娘搜索:'google.protobuf.descriptor' has no attribute '_internal_create_key'

      https://blog.csdn.net/lemon4869/article/details/107299879

      照此辦理:

      pip install --upgrade protobuf -i https://pypi.tuna.tsinghua.edu.cn/simple/

      再來:

      python models/export.py --weights ./yolov5s.pt --img 640 --batch 1

      。。。

      。。。

      【昇騰CANN訓(xùn)練營(yíng)第二期】【應(yīng)用營(yíng)】高玩賽作業(yè):使用MindStudio完成YoLoV5和ResNet50的推理開發(fā)

      這回好像真的生成了onnx文件。

      這個(gè)onnx文件終于生成了。先撒個(gè)小花。。。。

      然后繼續(xù):

      python3.7 -m onnxsim --skip-optimization yolov5s.onnx yolov5s_sim.onnx

      pip install --upgrade pip

      pip install onnx-simplifier

      對(duì)onnx圖使用onnx-simplifer進(jìn)行簡(jiǎn)化:

      python3.7 -m onnxsim --skip-optimization yolov5s.onnx yolov5s_sim.onnx

      下載 https://bbs.huaweicloud.com/forum/thread-118598-1-1.html

      帖子的mxManufacture_yolov5_example.zip 附件,解壓,

      上傳slicy腳本:modify_yolov5s_slice.py

      修改模型Slice算子

      python3.7 modify_yolov5s_slice.py yolov5s_sim.onnx

      生成 yolov5s_sim_t.onnx

      在當(dāng)前目錄下編輯2個(gè)文件:

      編輯 aipp_yolov5.cfg

      編輯trans_onnx2om.sh

      聽 @Fate丶SSS?老師說, 目前的image-for-mindx鏡像已經(jīng)不需要升級(jí) tranpose_d.patch補(bǔ)丁了。

      下面開始做ATC模型轉(zhuǎn)換:

      bash trans_onnx2om.sh

      轉(zhuǎn)換成功,OM離線模型文件已成功生成。

      將與yolov5s_sim_t.om相適應(yīng)的配置文件yolov5.cfg和標(biāo)簽文件coco.names上傳到同一目錄:

      下面正式把sample.pipelin的YoLoV3的目標(biāo)檢測(cè)部分修改為YoLoV5的目標(biāo)檢測(cè)部分了!

      打開MindStudio,在Models目錄下創(chuàng)建一個(gè)yolov5的目錄,再到終端將前面準(zhǔn)備好的文件都復(fù)制到這個(gè)目錄下:

      /root/AscendProjects/Resnet50/models/yolov5

      cp /root/yolov5s_convert/yolov5-2.0/aipp_yolov5.cfg .

      cp /root/yolov5s_convert/yolov5-2.0/coco.names .

      cp /root/yolov5s_convert/yolov5-2.0/yolov5s_sim_t.om .

      cp /root/yolov5s_convert/yolov5-2.0/yolov5.cfg .

      修改 resize部分,改為640X640且等比縮放

      "mxpi_imageresize0": { "props": { "parentName": "mxpi_imagedecoder0", "resizeHeight": "640", "resizeWidth": "640", "resizeType": "Resizer_KeepAspectRatio_Fit" }, "factory": "mxpi_imageresize", "next": "mxpi_modelinfer0" },

      修改infer推理部分,將YoLoV3改為YoLoV5:

      "mxpi_modelinfer0": { "props": { "modelPath": "../models/yolov5/yolov5s_sim_t.om", "postProcessConfigPath": "../models/yolov5/yolov5.cfg", "labelPath": "../models/yolov5/coco.names", "postProcessLibPath": "libMpYOLOv5PostProcessor.so" }, "factory": "mxpi_modelinfer", "next": "mxpi_imagecrop0" },

      為了表示這次處理的是yolov5的結(jié)果,我們將main.cpp輸出的代碼做個(gè)修改:

      并刪除out下的jpg文件:

      重新編譯:

      重新運(yùn)行:

      可以看出,result_test-yolov5文件已生成。

      輸出結(jié)果如下:

      2021-08-01 00:45:11 - [INFO] Resnet50 start running... 2021-08-01 00:45:11 - [INFO] Execute command on local: export LD_LIBRARY_PATH=/usr/local/Ascend/mindx_sdk/mxVision_2.0.1/linux-x86_64/mxVision-2.0.1/lib:/usr/local/Ascend/mindx_sdk/mxVision_2.0.1/linux-x86_64/mxVision-2.0.1/lib/plugins:/usr/local/Ascend/mindx_sdk/mxVision_2.0.1/linux-x86_64/mxVision-2.0.1/opensource/lib:/usr/local/Ascend/mindx_sdk/mxVision_2.0.1/linux-x86_64/mxVision-2.0.1/opensource/lib64:/root/AscendProjects/Resnet50/lib:/root/AscendProjects/Resnet50/lib/plugins:${LD_LIBRARY_PATH} && export GST_PLUGIN_SCANNER=/usr/local/Ascend/mindx_sdk/mxVision_2.0.1/linux-x86_64/mxVision-2.0.1/opensource/libexec/gstreamer-1.0/gst-plugin-scanner && export GST_PLUGIN_PATH=/usr/local/Ascend/mindx_sdk/mxVision_2.0.1/linux-x86_64/mxVision-2.0.1/opensource/lib/gstreamer-1.0:/usr/local/Ascend/mindx_sdk/mxVision_2.0.1/linux-x86_64/mxVision-2.0.1/lib/plugins:/root/AscendProjects/Resnet50/lib/plugins && export MX_SDK_HOME=/usr/local/Ascend/mindx_sdk/mxVision_2.0.1/linux-x86_64/mxVision-2.0.1 && cd /root/AscendProjects/Resnet50/out && ./main Begin to initialize Log. The output directory(./logs) of logs file exist. Save logs information to specified directory(./logs). W0801 00:45:12.691449 21204 main.cpp:131] Results:{"MxpiObject":[{"MxpiClass":[{"classId":163,"className":"beagle","confidence":0.837890625}],"classVec":[{"classId":16,"className":"dog","confidence":0.672381699,"headerVec":[]}],"x0":73.496948200000006,"x1":939.73120100000006,"y0":132.934708,"y1":603.36547900000005}]} result_test-yolov5.jpg produced in the directory:/root/AscendProjects/Resnet50/out. 2021-08-01 00:45:13 - [INFO] Run finished, exit status: 0

      格式化結(jié)果:

      { "MxpiObject": [{ "MxpiClass": [{ "classId": 163, "className": "beagle", "confidence": 0.837890625 }], "classVec": [{ "classId": 16, "className": "dog", "confidence": 0.672381699, "headerVec": [] }], "x0": 73.496948200000006, "x1": 939.73120100000006, "y0": 132.934708, "y1": 603.36547900000005 }] }

      貌似 confidence要比前面YoLoV3的低一點(diǎn)。

      前面YoLoV3+ResNet50的結(jié)果如下:(前面貼過了,再重貼一遍,便于比較)

      { "MxpiObject": [{ "MxpiClass": [{ "classId": 163, "className": "beagle", "confidence": 0.87109375 }], "classVec": [{ "classId": 16, "className": "dog", "confidence": 0.99641436299999997, "headerVec": [] }], "x0": 125.63256800000001, "x1": 918.29089399999998, "y0": 116.434044, "y1": 597.21276899999998 }

      下面考慮在圖片中疊加 YoLoV5檢測(cè)和ResNet50分類的className結(jié)果:

      需要解析出

      MxpiObject/MxpiClass/className

      MxpiObject/classVec/className

      RapidJSON的安裝與使用

      由于代碼中的json神操作張小白不是很明白,所以自行下載了RapidJSON:http://rapidjson.org/zh-cn/index.html

      RapidJSON 是只有頭文件的 C++ 庫(kù)。

      github比較慢,換成在 gitee上的鏡像

      切換到 項(xiàng)目的目錄,將include目錄復(fù)制到項(xiàng)目下:

      將 取json報(bào)文的和圖片疊加文字部分加上去:

      #include "rapidjson/document.h" #include "rapidjson/prettywriter.h" #include "rapidjson/stringbuffer.h" #include using namespace rapidjson; using namespace cv;

      在取到result之后,保存YoLoV5的className和ResNet50的className:

      std::string myClassName1 , myClassName2; rapidjson::Document dom; unsigned int i,j; if(!dom.Parse(result.c_str()).HasParseError()) { if(dom.HasMember("MxpiObject") && dom["MxpiObject"].IsArray()){ const rapidjson::Value& arr= dom["MxpiObject"]; for (i = 0; i < arr.Size(); ++i) { const rapidjson::Value& obj = arr; if(obj.HasMember("MxpiClass") && obj["MxpiClass"].IsArray()){ const rapidjson::Value& arr2= obj["MxpiClass"]; for (j = 0; j < arr2.Size(); ++j) { const rapidjson::Value& obj2 = arr2[j]; if(obj2.HasMember("className") && obj2["className"].IsString()){ myClassName1 = obj2["className"].GetString(); std::cout << "className:" << myClassName1 << std::endl; } else{ } }//end of for j } if(obj.HasMember("classVec") && obj["classVec"].IsArray()){ const rapidjson::Value& arr2= obj["classVec"]; for (j = 0; j < arr2.Size(); ++j) { const rapidjson::Value& obj2 = arr2[j]; if(obj2.HasMember("className") && obj2["className"].IsString()){ myClassName2 = obj2["className"].GetString(); std::cout << "className:" << myClassName2 << std::endl; } else{ } }//end of for j } } //end of for i } else{ } } else{ std::cout << "Parse Result Json string error" << std::endl; }

      并在最后 畫框的時(shí)候加上 文字部分:

      cv::Rect rect(x0, y0, x1 - x0, y1 - y0); cv::rectangle(src, rect, cv::Scalar(0, 255, 0),5, cv::LINE_8,0); cv::putText(src,myClassName1,cv::Point(x0+50,y0+50),FONT_HERSHEY_SIMPLEX,1,cv::Scalar(255,255,0)); cv::putText(src,myClassName2,cv::Point(x0+50,y0+100),FONT_HERSHEY_SIMPLEX,1,cv::Scalar(255,255,0));

      為了可以靈活地切換圖片,我們將輸入的圖片和輸出的圖片都設(shè)置個(gè)變量

      // read image file and build stream input // std::string picFileName = "../data/test.jpg"; // std::string picFileName_result = "../out/test_result.jpg"; std::string picFileName = "../data/test_tiger.jpg"; std::string picFileName_result = "../out/test_tiger_result.jpg"; // std::string picFileName = "../data/test_rabbit2.jpg"; // std::string picFileName_result = "../out/test_rabbit2_result.jpg";

      為了可以切換pipeline,我們將pipeline文件也隨時(shí)做調(diào)整

      // std::string pipelineConfigPath = "../pipeline/Sample.pipeline"; // std::string pipelineConfigPath = "../pipeline/YoloV5.pipeline"; // std::string pipelineConfigPath = "../pipeline/yoloV3.pipeline"; std::string pipelineConfigPath = "../pipeline/yoloV3-resnet50.pipeline";

      重新編譯,運(yùn)行:

      YoloV3+ResNet50認(rèn)為它是 dog和 beagle(獵兔犬)

      從上圖可見,類別也在圖片中疊加上去了!!

      張小白另找了老虎的照片做了如下的試驗(yàn):

      編譯:

      運(yùn)行:

      YoLoV3認(rèn)為它是個(gè)斑馬:zebra

      而YoLoV5認(rèn)為它啥也不是:

      而YoLoV3+ResNet50就這樣認(rèn)為:

      ResNet50分類倒是對(duì)的。確實(shí)是老虎。

      Fate老師解釋說,本來YoLoV3和YoLoV5里面就沒有老虎這個(gè)選項(xiàng),所以看不出來反而是對(duì)的。如果將其看成是斑馬,那反而說明YoloV5比YoloV3的精度要高。。。

      額,,,不知道童鞋們Get到?jīng)]有。。

      其實(shí)這樣高玩賽的作業(yè)應(yīng)該算是做完了吧。

      希望同學(xué)們能夠通過這次CANN訓(xùn)練營(yíng)應(yīng)用營(yíng)的深度學(xué)習(xí)訓(xùn)練,能夠成功使用MindX SDK和MindStudio進(jìn)行高階推理。(掌握技能很重要的,也許有個(gè)母老虎還需要你去目標(biāo)檢測(cè)和分類一下呢。。。)

      (全文完,謝謝閱讀)

      CANN訓(xùn)練營(yíng)第二期 高玩賽已經(jīng)開啟,請(qǐng)點(diǎn)擊:https://bbs.huaweicloud.com/forum/thread-129524-1-1.html

      添加下方工作人員微信,添加備注:CANN訓(xùn)練營(yíng)~ 邀請(qǐng)進(jìn)群~

      C++ pytorch 昇騰 深度學(xué)習(xí) 神經(jīng)網(wǎng)絡(luò)

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:怎么查詢表格里內(nèi)容(如何查找表格里的內(nèi)容)
      下一篇:【云端大事件】--“共享、開放、融合——大數(shù)據(jù)開啟智慧政務(wù)新時(shí)代”研討會(huì)在沈陽隆重召開
      相關(guān)文章
      亚洲2022国产成人精品无码区| 亚洲性久久久影院| 亚洲精品国产精品乱码视色| 亚洲精品无码永久在线观看| 亚洲一区二区三区写真| 亚洲a级成人片在线观看| 亚洲免费观看网站| 亚洲制服丝袜一区二区三区| 亚洲天堂福利视频| www.亚洲成在线| 亚洲中文字幕乱码一区| 亚洲精品无AMM毛片| 亚洲国产成人AV网站| 亚洲国产精品狼友中文久久久 | 亚洲AV成人精品网站在线播放| 亚洲日本va在线视频观看| 久久亚洲国产欧洲精品一| 亚洲va在线va天堂va888www| 亚洲永久永久永久永久永久精品| 久久久久亚洲精品日久生情| 亚洲性猛交xx乱| 在线aⅴ亚洲中文字幕| jizzjizz亚洲日本少妇| 亚洲一级片内射网站在线观看| 自拍偷自拍亚洲精品第1页| 亚洲中文字幕无码一区| 亚洲AV本道一区二区三区四区| 亚洲精品影院久久久久久| 久久久久se色偷偷亚洲精品av| 亚洲日韩一区二区三区| 在线观看亚洲免费视频| 亚洲国产香蕉人人爽成AV片久久 | 亚洲伊人成无码综合网 | 亚洲狠狠婷婷综合久久| 亚洲成AⅤ人影院在线观看| 国产亚洲一区二区三区在线不卡| 日本亚洲视频在线| 亚洲黄色免费网址| 亚洲中文字幕乱码AV波多JI| 亚洲?V无码乱码国产精品| 亚洲精品国产精品乱码视色|