【5G科普】華為碼chine姐姐聊5G 第6期:NSA&SA是個(gè)啥
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
。。。
。。。
這回好像真的生成了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
在取到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)容。