日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

如何使用graphpad做柱形图_系列文章 如何使用PaddleDetection做一个完整项目(三)...

發布時間:2023/12/19 php 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何使用graphpad做柱形图_系列文章 如何使用PaddleDetection做一个完整项目(三)... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

系列文章 如何使用PaddleDetection做一個完整項目(三)

該文章是PaddleDetection的完結篇,請參考之前兩篇文章

https://zhuanlan.zhihu.com/p/106981555?zhuanlan.zhihu.comhttps://zhuanlan.zhihu.com/p/111807886?zhuanlan.zhihu.com

本文將針對如何使用PaddleDetection中C++預測庫的編譯,封裝,調用進行說明。

  • 如何進行C++預測的編譯(生成.sln解決方案);
  • 如何將C++預測代碼封裝成一個dll;
  • 如何使用python調用生成好的dll;
  • 如何使用C#調用生成好的dll;

如何進行C++預測代碼的編譯(生成.sln解決方案)

使用工具:Cmake vs2019社區版 Git(提前下載好git,不然在后期編譯過程中會不成功)

預測代碼來源:https://github.com/PaddlePaddle/PaddleDetection/tree/master (注意選擇master分支)

依賴庫:

Opencv:選擇3.4.6版本

https://sourceforge.net/projects/opencvlibrary/files/3.4.6/opencv-3.4.6-vc14_vc15.exe/download?sourceforge.net

Paddle預測庫:選擇win10下的cuda10版本。

安裝與編譯 Windows 預測庫?www.paddlepaddle.org.cn

一、首先將上述需要依賴的opencv和預測庫,PaddleDetection下載好,并保存在某個文件夾中。如下圖是作者存放的一個文件夾。

二、將opencv添加到環境變量里面,如下圖所示。

三、利用Cmake軟件進行編譯。源碼路徑為cpp文件所在目錄,應為里面有CMakeLists.txt文件,作者同時在該目錄下創建了新的文件夾/out用于生成編譯后的文件。

四、點擊config,選擇vs2019 X64選項后,點擊Generate

五、根據報錯進行修改,主要修改cuda_lib、opencv、paddle_dir路徑

六、再次點擊Generate

七、點擊open project,同時我們在out文件夾下發現了生成了解決方案。

八、針對“main”項目進行“重新生成”。同時一定要將模式配置成為Release

九、出現報錯

十、修改報錯---根據報錯,應該是編譯過程中,cudnn.lib尋找不正確。通過修改路徑實現。方式為點擊屬性--連接器--輸入--附加依賴項。

十一、改正上述錯誤后的正確的形式

十二、重新生成,如下圖是重新生成后的結果。

十二、運行該生成的main.exe文件。方式為打開out/release文件,會發現有一個main.exe文件。利用命令行打開后,運行即可。運行過程中需要添加模型的路徑以及預測圖像的路徑。

Ps#####此時此刻進行預測的模型是按照《系列文章 如何適用PaddleDetection實現一完整的項目(一)》中export.py文件形式導出“__model__”和“__params__”的形式,但是在后續paddle的升級過程中,export.py文件不僅僅會導出“__model__”和“__params__”,還會導出一個infer_cfg.yml的文件。作者在這個過程中,是使用PaddleDetection-release0.3版本進行導出的,因為作者之前安裝的paddle版本是1.7的,而目前的master分支是必須使用paddle2.0版本的。因此小伙伴們需要注意這個問題。

如下圖是所示的模型保存后的結果形式,作者依舊使用水果檢測的模型進行預測。

其中yml文件內容

十三、預測結果如下圖所示,我們看到輸出的結果中有檢測框的坐標、置信度、類別信息。

如下是在out文件夾生成的命名為“output.jpeg”的檢測后圖像

十四、對代碼進行一下小修改。之前我們需要在命令行中輸入圖像和模型的路徑,作者在代碼中添加圖像和模型的路徑,查看預測情況。修改如下:

十五、修改上述兩處代碼后,設置“設為啟動項目”,并點擊“本地windows調試器”

,直接查看輸出的結果。

至此,完成了第一步以及第一步的所有測試。

如何將C++預測代碼封裝成一個dll

  • 我們需要修改CMakeLists.txt文件,修改倒數第十三行
  • 將add_executable(main src/http://main.cc src/http://preprocess_op.cc src/http://object_detector.cc) 變成ADD_library(main SHARED src/http://main.cc src/http://preprocess_op.cc src/http://object_detector.cc)

  • 然后按照上文中繼續重新cmake一次。
  • 再次經歷之前的cudnn的路徑問題,同時需要在屬性—常規—配置類型中修改成.dll文件。
  • 修改完上述內容后,點擊“重新生成”,會發現out/release中出現了main.dll文件。
  • 看到dll后,我們仿佛看到了曙光,但是還是需要進行修改,因為這樣我們才能被調用,作者簡化了http://main.cc文件中的內容,并且配置了dll的接口,代碼如下。其中有兩個dll的接口,其中“add”是為了測試。
  • #include <glog/logging.h> #include <iostream> #include <string> #include <vector> #include "include/object_detector.h"extern "C" __declspec(dllexport) void Loadmodel(); extern "C" __declspec(dllexport) int add(int a, int b); void PredictImage(const std::string& image_path,PaddleDetection::ObjectDetector* det); int add(int a, int b) {return a + b; } void Loadmodel() {std::string model_dir = "D:0524testmodel";std::string image_path = "D:0524testorange_71.jpg";std::string video_path = "";std::string run_mode = "fluid";bool use_gpu = true;// Load model and create a object detectorPaddleDetection::ObjectDetector det(model_dir, use_gpu, run_mode);PredictImage(image_path, &det);}void PredictImage(const std::string& image_path,PaddleDetection::ObjectDetector* det) {// Open input image as an opencv cv::Mat objectcv::Mat im = cv::imread(image_path, 1);// Store all detected resultstd::vector<PaddleDetection::ObjectResult> result;det->Predict(im, &result);for (const auto& item : result) {printf("class=%d confidence=%.2f rect=[%d %d %d %d]n",item.class_id,item.confidence,item.rect[0],item.rect[1],item.rect[2],item.rect[3]);}// Visualization resultauto labels = det->GetLabelList();auto colormap = PaddleDetection::GenerateColorMap(labels.size());cv::Mat vis_img = PaddleDetection::VisualizeResult(im, result, labels, colormap);std::vector<int> compression_params;compression_params.push_back(CV_IMWRITE_JPEG_QUALITY);compression_params.push_back(95);cv::imwrite("output.jpeg", vis_img, compression_params);printf("Visualized output saved as output.jpegn"); }

    六、然后我們繼續點擊“重新生成”,重新生成的dll就是下述步驟中我們即將調用的dll。

    如何使用python調用生成好的dll;

    在上一章節我們說了如何生成dll,這一章節,我們需要進行測試,在這里我們使用python進行測試,利用python調用dll。在生成的dll的文件中創建一個叫mian.py的python文件。

    Python部分代碼如下:

    from ctypes import * dll=CDLL("main.dll") print(dll.add(1,2)) print(dll.Loadmodel())

    運行python代碼,可以看到最終輸出結果如下圖:

    至此說明利用python調用dll成功了。

    如何使用C#調用生成好的dll;

    在上一個章節中我們說了如何使用python調用dll,接著,我們嘗試使用C#調用一個dll,此方式為工業上經常使用的一種方式。

  • 首先創建一個C#的窗體應用程序。
  • 在改窗體應用程序中設置一個button事件。
  • 設置dll接口代碼以及設置button,相關代碼如下
  • using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Runtime.InteropServices;namespace WindowsFormsApp1 {public partial class Form1 : Form{int a = 3;int b = 2;public Form1(){InitializeComponent();}[DllImport("main.dll", EntryPoint = "Loadmodel", CharSet = CharSet.Ansi)]public static extern void Loadmodel();[DllImport("main.dll", EntryPoint = "add", CharSet = CharSet.Ansi)]public static extern int add(int a, int b);private void button1_Click(object sender, EventArgs e){int c = add(a, b);Loadmodel();}private void Form1_Load(object sender, EventArgs e){}} }

    一、將C++release路徑下生成的文件全部復制到C#項目運行目錄下,在C++的release文件中,有一些文件只有dll,沒有對應的lib文件,這個時候,我們需要搜索到這些dll對應的lib文件,全部放在C#的運行目錄下。(PS#這些對應的文件都在我們下載的paddle預測庫中可以找到)

    二、點擊“啟動按鈕”進行測試;

    三、我們在C#的運行目錄下發現了生成了一張output.jpeg圖片,證明我們調用成功

    至此,該系列文章基本上完成了從訓練到部署的所有流程,十分感謝在寫作過程中paddle同學的幫助,非常感謝高松鶴、梁鈺同學的大力幫助。后續會根據paddle針對C++預測的更新,繼續更新完善該文章。

    如有問題,歡迎溝通,作者微信yzl819819

    總結

    以上是生活随笔為你收集整理的如何使用graphpad做柱形图_系列文章 如何使用PaddleDetection做一个完整项目(三)...的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。