使用MFC编写一个paddleclas预测软件

目录

写作目的

环境准备

下载编译环境

解压预编译库

准备训练文件

模型文件

图像文件

路径整理

准备预测代码

创建预测应用

新建mfc应用

拷贝文档

配置环境

界面布局

添加回cpp文件

修改函数

报错1解决

报错2未解决

修改infer代码

修改MFCPaddleClasDlg.cpp代码

依赖文件纵览

依赖环境

运行结果


写作目的

为了更方便的进行图像预测。

项目源码下载:MFC-PaddleClas图像分类+带界面C++实现+项目源码资源-CSDN文库

环境准备

参考文档:PaddlePaddle/FastDeploy

下载编译环境

FastDeploy提供各平台预编译库,供开发者直接下载安装使用。当然FastDeploy编译也非常容易,开发者也可根据自身需求编译FastDeploy。

本文,我们直接下载cpu+windows版本的预编译库。链接为:cpu_windows_预编译库

解压预编译库

下载后,解压文档,就会看到如下几个文件夹。

准备训练文件

主要是模型文件和图像。

模型文件

自己使用paddleclas训练好的文件,包含以下3个文件。

图像文件

为了方便演示,我们这里只准备了两个图片。

路径整理

我们将模型和图像分别放到这两个文件夹中:

准备预测代码

这里,我们直接下载官方给我们写好的cpp文件。

地址为:下载infer.cc文件

创建预测应用

新建mfc应用

拷贝文档

将上面整理好的文档,全部拷贝到sln所在文件夹。其中1代表:编译环境;2代表训练文件;3代表预测代码【注意,需要将cc后缀修改为cpp】。

将cpp文件,添加到资源管理器的“源文件”中。

配置环境

在VC++目录中,配置包含目录:fastdeploy和opencv。

在VC++目录中,配置库目录:fastdeploy和opencv。

从如下目录拷贝opencv的opencv_world3416.lib。

添加到:链接器-输入-附加依赖项中。

界面布局

资源视图中,找到:IDD_MFCPADDLECLAS_DIALOG。开始添加各种按钮和文本编辑框。

从左侧的对话框编辑器中,添加组件。

添加完成后的截图如下:

在MFCPaddleClasDlg.h中,增加组件变量:

private:// 控件变量CButton m_btnSelectFolder_Model;//模型选择按钮CButton m_btnSelectFolder_Img; //图像路径选择按钮CButton m_btnImgPredict; //图像预测按钮CEdit m_editDirectory_Model; //模型路径编辑框	CEdit m_editDirectory_Img; //图像路径编辑框// 选定模型和图像文件夹路径CString m_selectedFolderPath_Model;CString m_selectedFolderPath_Img;

增加按钮点击后的事件处理函数:

public:afx_msg void OnBnClickedButtonFolder_Model();afx_msg void OnBnClickedButtonFolder_Img();afx_msg void OnBnClickedButtonImgPredict();

接下来,需要在实现文件MFCPaddleClasDlg.cpp中实现这些新增的函数和逻辑,以及将相应的功能,添加到对话框的事件处理函数中。

比如,增加如下代码:

void CMFCPaddleClasDlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);DDX_Control(pDX, IDC_BUTTON_model, m_btnSelectFolder_Model);DDX_Control(pDX, IDC_BUTTON_img, m_btnSelectFolder_Img);DDX_Control(pDX, IDC_EDIT_model, m_editDirectory_Model);DDX_Control(pDX, IDC_EDIT_img, m_editDirectory_Img);
}

在BEGIN_MESSAGE_MAP增加如下代码:

BEGIN_MESSAGE_MAP(CMFCPaddleClasDlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()// 增加ON_BN_CLICKED(IDC_BUTTON_model, &CMFCPaddleClasDlg::OnBnClickedButtonFolder_Model)ON_BN_CLICKED(IDC_BUTTON_img, &CMFCPaddleClasDlg::OnBnClickedButtonFolder_Img)ON_BN_CLICKED(IDC_BUTTON_predict, &CMFCPaddleClasDlg::OnBnClickedButtonImgPredict)
END_MESSAGE_MAP()

实现函数OnBnClickedButtonFolder_Model,OnBnClickedButtonFolder_Img。具体如下:

void CMFCPaddleClasDlg::OnBnClickedButtonFolder_Model()
{CFolderPickerDialog folderDlg;if (folderDlg.DoModal() == IDOK){m_selectedFolderPath_Model = folderDlg.GetPathName();m_editDirectory_Model.SetWindowText(m_selectedFolderPath_Model);}
}void CMFCPaddleClasDlg::OnBnClickedButtonFolder_Img()
{CFolderPickerDialog folderDlg;if (folderDlg.DoModal() == IDOK){m_selectedFolderPath_Img = folderDlg.GetPathName();m_editDirectory_Img.SetWindowText(m_selectedFolderPath_Img);}
}

以及OnBnClickedButtonImgPredict,代码如下:

void CMFCPaddleClasDlg::OnBnClickedButtonImgPredict()
{// 检查模型和图片路径是否已经选择if (m_selectedFolderPath_Model.IsEmpty() || m_selectedFolderPath_Img.IsEmpty()){AfxMessageBox(_T("请先选择模型和图片的文件夹路径。"), MB_ICONWARNING);return;}// 执行预测,这里假设有一个函数ExecutePrediction,它接受图片路径并返回预测结果CString predictionResult = ExecutePrediction(m_selectedFolderPath_Img);if (predictionResult.IsEmpty()){AfxMessageBox(_T("图片预测失败。"), MB_ICONERROR);return;}// 显示预测结果AfxMessageBox(_T("预测结果: ") + predictionResult);
}// 以下是ExecutePrediction的示例实现,需要根据实际情况进行修改
CString CMFCPaddleClasDlg::ExecutePrediction(const CString& imagePath)
{// 执行预测的逻辑// 返回预测结果return _T("预测结果"); // 示例代码,实际应根据预测结果返回
}

由于我们又额外定义了1个函数,因此,需要在.h文件里面进行函数声明。如下:

由于我们还没有用到infer.cpp文件,所以暂时,先将其移除。

当我们点击运行后,就会看到如下界面:

然后,当我们如果不输入任何路径,直接点击”图像预测按钮“,就会出来如下提示:

添加回cpp文件

将infer.cpp文件加回来,并且修改代码:

#原来的代码
// Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved.
#include "fastdeploy/vision.h"
#ifdef WIN32
const char sep = '\\';
#else
const char sep = '/';
#endifvoid InitAndInfer(const std::string &model_dir, const std::string &image_file,const fastdeploy::RuntimeOption &option) {auto model_file = model_dir + sep + "inference.pdmodel";auto params_file = model_dir + sep + "inference.pdiparams";auto config_file = model_dir + sep + "inference_cls.yaml";auto model = fastdeploy::vision::classification::PaddleClasModel(model_file, params_file, config_file, option);if (!model.Initialized()) {std::cerr << "Failed to initialize." << std::endl;return;}auto im = cv::imread(image_file);fastdeploy::vision::ClassifyResult res;if (!model.Predict(im, &res)) {std::cerr << "Failed to predict." << std::endl;return;}// print resstd::cout << res.Str() << std::endl;
}int main(int argc, char *argv[]) {if (argc < 4) {std::cout << "Usage: infer_demo path/to/model path/to/image run_option, ""e.g ./infer_demo ./ResNet50_vd ./test.jpeg 0"<< std::endl;return -1;}fastdeploy::RuntimeOption option;int flag = std::atoi(argv[3]);if (flag == 0) {option.UseCpu();option.UsePaddleBackend();  // Paddle Inference} else if (flag == 1) {option.UseCpu();option.UseOpenVINOBackend();  // OpenVINO} else if (flag == 2) {option.UseCpu();option.UseOrtBackend();  // ONNX Runtime} else if (flag == 3) {option.UseCpu();option.UseLiteBackend();  // Paddle Lite} else if (flag == 4) {option.UseGpu();option.UsePaddleBackend();  // Paddle Inference} else if (flag == 5) {option.UseGpu();option.UsePaddleInferBackend();option.paddle_infer_option.enable_trt = true;} else if (flag == 6) {option.UseGpu();option.UseOrtBackend();  // ONNX Runtime} else if (flag == 7) {option.UseGpu();option.UseTrtBackend();  // TensorRT}std::string model_dir = argv[1];std::string image_dir = argv[2];InitAndInfer(model_dir, image_dir, option);
}

修改原来的代码为如下【去除命令行传参,而是使用参数传递】:

#include "fastdeploy/vision.h"
#ifdef WIN32
const char sep = '\\';
#else
const char sep = '/';
#endifvoid InitAndInfer(const std::string &model_dir, const std::string &image_file,const fastdeploy::RuntimeOption &option) {auto model_file = model_dir + sep + "inference.pdmodel";auto params_file = model_dir + sep + "inference.pdiparams";auto config_file = model_dir + sep + "inference_cls.yaml";auto model = fastdeploy::vision::classification::PaddleClasModel(model_file, params_file, config_file, option);if (!model.Initialized()) {std::cerr << "Failed to initialize." << std::endl;return;}auto im = cv::imread(image_file);fastdeploy::vision::ClassifyResult res;if (!model.Predict(im, &res)) {std::cerr << "Failed to predict." << std::endl;return;}// print resstd::cout << res.Str() << std::endl;
}int main() {// 直接指定模型目录和图片文件路径std::string model_dir = "./ResNet50_vd";std::string image_file = "./test.jpeg";// 设置运行选项fastdeploy::RuntimeOption option;// 根据需要选择CPU或GPUoption.UseCpu(); // 或者 option.UseGpu(); 来使用GPUoption.UsePaddleBackend();  // Paddle Inference// 调用InitAndInfer函数InitAndInfer(model_dir, image_file, option);return 0;
}

修改函数

当用户点击按钮预测,运行OnBnClickedButtonImgPredict函数,这个函数要调用infer.cpp函数的代码。如何修改代码呢?

首先,在头文件夹中,新建一个infer.h文件。写入如下代码:

// infer.h
#pragma once#include "fastdeploy/vision.h"
#include <string>std::string InitAndInfer(const std::string& model_dir, const std::string& image_file,const fastdeploy::RuntimeOption& option);

在MFCPaddleClasDlg.cpp代码中增加如下头文件:

#include"infer.h"// 包含infer.cpp的头文件

修改infer.cpp文件如下:【需要注意】#include "pch.h"一定不要忘记添加,否则运行会出错。

严重性	代码	说明	项目	文件	行	禁止显示状态
错误	C1010	在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "pch.h"”?	MFCPaddleClas	C:\Users\source\repos\MFCPaddleClas\infer.cpp	43	

// infer.cpp
#include "pch.h"
#include "infer.h"
#include "fastdeploy/vision.h"
#include <opencv2/opencv.hpp>
#include <string>
#include <iostream>#ifdef WIN32
const char sep = '\\';
#else
const char sep = '/';
#endifstd::string InitAndInfer(const std::string& model_dir, const std::string& image_file,const fastdeploy::RuntimeOption& option) {auto model_file = model_dir + sep + "inference.pdmodel";auto params_file = model_dir + sep + "inference.pdiparams";auto config_file = model_dir + sep + "inference_cls.yaml";auto model = fastdeploy::vision::classification::PaddleClasModel(model_file, params_file, config_file, option);if (!model.Initialized()) {std::cerr << "模型初始化失败." << std::endl;return "模型初始化失败";}auto im = cv::imread(image_file);if (im.empty()) {std::cerr << "读取图像失败." << std::endl;return "Failed to read image";}fastdeploy::vision::ClassifyResult res;if (!model.Predict(im, &res)) {std::cerr << "预测失败." << std::endl;return "预测失败";}// Return the result as a stringreturn res.Str();
}

修改CMFCPaddleClasDlg::ExecutePrediction函数如下:

CString CMFCPaddleClasDlg::ExecutePrediction(const CString& imagePath)
{// 将CString转换为std::stringCT2CA pszModelPath(m_selectedFolderPath_Model);std::string strModelPath(pszModelPath);CT2CA pszImagePath(imagePath);std::string strImagePath(pszImagePath);// 调用infer.cpp中的InitAndInfer函数fastdeploy::RuntimeOption option;option.UseCpu();option.UsePaddleBackend();std::string result = InitAndInfer(strModelPath, strImagePath, option);// 将结果转换回CStringCString cstrResult(result.c_str());return cstrResult;
}

报错1解决

现在运行程序,会出现如下错误:

严重性	代码	说明	项目	文件	行	禁止显示状态
错误	LNK2001	无法解析的外部符号 "__declspec(dllimport) public: __cdecl fastdeploy::vision::classification::PaddleClasModel::PaddleClasModel(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,struct fastdeploy::RuntimeOption const &,enum fastdeploy::ModelFormat const &)" (__imp_??0PaddleClasModel@classification@vision@fastdeploy@@QEAA@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@00AEBURuntimeOption@3@AEBW4ModelFormat@3@@Z)	MFCPaddleClas	C:\Users\source\repos\MFCPaddleClas\infer.obj	1	

这个原因的因为附加依赖项中,缺少fastdeploy.dll文件,我们添加进来就好了。如下:

这时,再次运行程序,就会出现:

这说明,程序运行时需要的动态库dll没有放到exe所在目录,我们加进去,一共有几个呢?如下几个文件夹中,各自的dll文件,都要复制过去,外加:fastdeploy.dll,tbb.dll,mkldnn.dll,icuuc70.dll,icudt70.dll【已经验证,的确如此!】。

tbb.dll:是 英特尔线程构建块库中的一个关键组件,它提供了一组线程并行编程工具,对于运行某些依赖于此库的软件或游戏至关重要。 位于:fastdeploy-win-x64-1.0.7\third_libs\install\openvino\runtime\3rdparty\tbb\bin;
mkldnn.dll:是  Intel MKL-DNN(Math Kernel Library for Deep Neural Networks)的动态链接库文件。 MKL-DNN 是由 Intel 开发的一个开源库,专门针对在 CPU 上运行的深度学习应用进行了优化,以提高性能。 这个库提供了一套 API,用于深度学习中的各种操作,比如卷积、池化等,并且能够利用 Intel 处理器的 SIMD 指令集(如 AVX2)来加速这些操作。 在使用 MKL-DNN 时, mkldnn.dll 文件作为动态库被应用程序在运行时调用,以实现对深度学习模型的加速。 位于:fastdeploy\third_libs\install\paddle_inference\third_party\install\mkldnn\lib
icuuc70.dll:属于  International Components for Unicode (ICU) 项目的一部分。 ICU 是一个成熟、广泛使用的开源软件库,提供 Unicode 和全球化支持。 这个库包含了多个组件,用于支持各种软件开发中的字符串处理、日期/时间格式化、数字格式化等国际化功能。位于:fastdeploy\third_libs\install\fast_tokenizer\third_party\lib
icudt70.dll: International Components for Unicode (ICU) 项目的一部分,这是一个提供 Unicode 和全球化支持的成熟、广泛使用的开源软件库。ICU 包含了多个组件,用于支持软件开发中的字符串处理、日期/时间格式化、数字格式化等国际化功能。位于:fastdeploy\third_libs\install\fast_tokenizer\third_party\lib

再次运行报错如下[未加载kernelbase.pdb]

后来,查阅资料,是因为缺少一些东西:

  1. openvino相关库
  2. plugins.xml文件

因此,补充这两个文件后,不报这个错了:[未加载kernelbase.pdb]。但是,又出来了其他错误:

未处理的异常:auto model = fastdeploy::vision::classification::PaddleClasModel

报错2未解决

这个报错,实在是找不到解决方案。【搞了很久,头要炸了!!!】

因此,我用了自己之前编译好的fastdeploy【点击链接下载:【Windows-x64-gpu或者cpu预测】编译好的FastDeploy环境资源-CSDN文库】,就解决了这个问题!!!

修改infer代码

// infer.cpp
#include "pch.h" // 确保pch.h在包含其他头文件之前
#include "fastdeploy/vision.h"
#include <string>
#include <iostream>
#include <opencv2/opencv.hpp> // 包含OpenCV的头文件
#include <filesystem> // C++17文件系统库,用于遍历文件夹#ifdef WIN32
const char sep = '\\';
#else
const char sep = '/';
#endifnamespace fs = std::filesystem; // 文件系统命名空间别名std::vector<std::string> InitAndInfer(const std::string& model_dir, const std::string& image_folder, const fastdeploy::RuntimeOption& option) {std::vector<std::string> results;  // 存储每个图像的预测结果// 构建模型文件路径auto model_file = model_dir + sep + "inference.pdmodel";auto params_file = model_dir + sep + "inference.pdiparams";auto config_file = model_dir + sep + "inference_cls.yaml";// 加载模型auto model = fastdeploy::vision::classification::PaddleClasModel(model_file, params_file, config_file, option);if (!model.Initialized()) {std::cerr << "Failed to initialize." << std::endl;return results;  // 如果初始化失败,返回空结果}// 遍历文件夹中的所有图像for (const auto& entry : fs::directory_iterator(image_folder)) {if (entry.is_regular_file()) {auto image_file = entry.path().string();auto im = cv::imread(image_file);if (im.empty()) {std::cerr << "Failed to read image: " << image_file << std::endl;continue; // 如果读取图像失败,则跳过当前图像}fastdeploy::vision::ClassifyResult res;int topk = 20;if (!model.Predict(&im, &res, topk)) {std::cerr << "Failed to predict for image: " << image_file << std::endl;continue; // 如果预测失败,则跳过当前图像}// 将结果添加到返回的容器中results.push_back("Image: " + image_file + " - " + res.Str());}}return results;  // 返回结果
}

修改MFCPaddleClasDlg.cpp代码

// MFCPaddleClasDlg.cpp: 实现文件
//#include "pch.h"
#include "framework.h"
#include "MFCPaddleClas.h"
#include "MFCPaddleClasDlg.h"
#include "afxdialogex.h"
#include "infer.h" // 包含infer.cpp的头文件
#include "fastdeploy/vision.h"#ifdef _DEBUG
#define new DEBUG_NEW
#endif// 用于应用程序“关于”菜单项的 CAboutDlg 对话框class CAboutDlg : public CDialogEx
{
public:CAboutDlg();// 对话框数据
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_ABOUTBOX };
#endifprotected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持// 实现
protected:DECLARE_MESSAGE_MAP()
};CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);
}BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()// CMFCPaddleClasDlg 对话框CMFCPaddleClasDlg::CMFCPaddleClasDlg(CWnd* pParent /*=nullptr*/): CDialogEx(IDD_MFCPADDLECLAS_DIALOG, pParent)
{m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}void CMFCPaddleClasDlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);DDX_Control(pDX, IDC_BUTTON_model, m_btnSelectFolder_Model);DDX_Control(pDX, IDC_BUTTON_img, m_btnSelectFolder_Img);DDX_Control(pDX, IDC_EDIT_model, m_editDirectory_Model);DDX_Control(pDX, IDC_EDIT_img, m_editDirectory_Img);
}BEGIN_MESSAGE_MAP(CMFCPaddleClasDlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()// 增加ON_BN_CLICKED(IDC_BUTTON_model, &CMFCPaddleClasDlg::OnBnClickedButtonFolder_Model)ON_BN_CLICKED(IDC_BUTTON_img, &CMFCPaddleClasDlg::OnBnClickedButtonFolder_Img)ON_BN_CLICKED(IDC_BUTTON_predict, &CMFCPaddleClasDlg::OnBnClickedButtonImgPredict)
END_MESSAGE_MAP()// CMFCPaddleClasDlg 消息处理程序BOOL CMFCPaddleClasDlg::OnInitDialog()
{CDialogEx::OnInitDialog();// 将“关于...”菜单项添加到系统菜单中。// IDM_ABOUTBOX 必须在系统命令范围内。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != nullptr){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动//  执行此操作SetIcon(m_hIcon, TRUE);			// 设置大图标SetIcon(m_hIcon, FALSE);		// 设置小图标// TODO: 在此添加额外的初始化代码return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}void CMFCPaddleClasDlg::OnSysCommand(UINT nID, LPARAM lParam)
{if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialogEx::OnSysCommand(nID, lParam);}
}// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。void CMFCPaddleClasDlg::OnPaint()
{if (IsIconic()){CPaintDC dc(this); // 用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使图标在工作区矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// 绘制图标dc.DrawIcon(x, y, m_hIcon);}else{CDialogEx::OnPaint();}
}//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CMFCPaddleClasDlg::OnQueryDragIcon()
{return static_cast<HCURSOR>(m_hIcon);
}void CMFCPaddleClasDlg::OnBnClickedButtonFolder_Model()
{CFolderPickerDialog folderDlg;if (folderDlg.DoModal() == IDOK){m_selectedFolderPath_Model = folderDlg.GetPathName();m_editDirectory_Model.SetWindowText(m_selectedFolderPath_Model);}
}void CMFCPaddleClasDlg::OnBnClickedButtonFolder_Img()
{CFolderPickerDialog folderDlg;if (folderDlg.DoModal() == IDOK){m_selectedFolderPath_Img = folderDlg.GetPathName();m_editDirectory_Img.SetWindowText(m_selectedFolderPath_Img);}
}void CMFCPaddleClasDlg::OnBnClickedButtonImgPredict()
{// 检查模型和图片路径是否已经选择if (m_selectedFolderPath_Model.IsEmpty() || m_selectedFolderPath_Img.IsEmpty()){AfxMessageBox(_T("请先选择模型和图片的文件夹路径。"), MB_ICONWARNING);return;}// 执行预测,这里假设有一个函数ExecutePrediction,它接受图片路径并返回预测结果CString predictionResult = ExecutePrediction(m_selectedFolderPath_Img);if (predictionResult.IsEmpty()){AfxMessageBox(_T("图片预测失败。"), MB_ICONERROR);return;}// 显示预测结果AfxMessageBox(_T("预测结果: ") + predictionResult);
}//CString CMFCPaddleClasDlg::ExecutePrediction(const CString& imagePath)
//{
//	// 执行预测的逻辑
//	// 返回预测结果
//	return _T("预测结果"); // 示例代码,实际应根据预测结果返回
//}
//CString CMFCPaddleClasDlg::ExecutePrediction(const CString& imagePath)
//{
//	// 将CString转换为std::string
//	std::string model_dir = std::string(CT2CA(m_selectedFolderPath_Model));
//	std::string image_file = std::string(CT2CA(imagePath));
//
//	// 设置运行选项
//	fastdeploy::RuntimeOption option;
//	// 根据需要选择CPU或GPU
//	option.UseCpu(); // 或者 option.UseGpu(); 来使用GPU
//	//option.UsePaddleBackend();  // Paddle Inference
//
//	// 调用InitAndInfer函数,获取预测结果
//	std::vector<std::string> results = InitAndInfer(model_dir, image_file, option);
//
//	// 输出结果
//	for (const auto& res : results) {
//		std::cout << res << std::endl;
//	}
//	return _T("预测结果"); // 示例代码,实际应根据预测结果返回
//}CString CMFCPaddleClasDlg::ExecutePrediction(const CString& imagePath)
{// 将CString转换为std::stringstd::string model_dir = std::string(CT2CA(m_selectedFolderPath_Model));std::string image_file = std::string(CT2CA(imagePath));// 设置运行选项fastdeploy::RuntimeOption option;//option.UseCpu();  // 或者 option.UseGpu(); 来使用GPUoption.UseGpu();// 调用InitAndInfer函数,获取预测结果std::vector<std::string> results = InitAndInfer(model_dir, image_file, option);// 拼接所有结果std::string concatenatedResults;for (const auto& res : results) {concatenatedResults += res + "\n";  // 使用换行符分隔每个结果}// 返回拼接后的字符串return CString(concatenatedResults.c_str());
}

依赖文件纵览

模型文件

图像文件

Release文件内容
Release文件内容

依赖环境

包含目录

库目录

依赖项

运行结果

运行软件,输入模型和图像路径,给出结果如下:

大功告成!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/498245.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL】搞懂mvcc、read view:MySQL事务原理深度剖析

前言&#xff1a;本节内容是事务里面最难的一部分&#xff0c; 就是理解mvcc快照读和read view。这两个部分需要了解隔离性里面的四种隔离级别。 博主之前讲过&#xff0c;但是担心友友们不了解&#xff0c; 所以这里开头进行了复习。 下面开始我们的学习吧&#xff01; ps&…

数据库概念(MySQL第一期)

p.s.这是萌新自己自学总结的笔记&#xff0c;如果想学习得更透彻的话还是请去看大佬的讲解 目录 数据库就是管理数据的仓库 数据库&#xff1a;DataBase(DB)&#xff0c;是存储数据的仓库&#xff0c;数据是有组织的进行存储 数据库管理系统&#xff1a;DataBase Management S…

python蓝桥杯刷题4

1.好数 题解&#xff1a;首先分析题目要求奇数位上的数字是奇数&#xff0c;偶数位上的数字是偶数。开始解题&#xff0c;定义一个count变量为0&#xff0c;输入一个数字&#xff0c;for循环从1开始遍历到n1&#xff0c;定义一个x作为一会的判断条件&#xff0c;将数字转换为字…

自动驾驶新纪元:城区NOA功能如何成为智能驾驶技术的分水岭

目录 一、NOA 的定义 二、NOA 的主要特点 导航集成 场景覆盖 智能决策 高级感知能力 驾驶员参与 三、NOA 的优势 四、NOA的衡量指标 定性评价指标 安全性评价指标定义 可靠性评价指标定义 舒适性评价指标定义 通行效率评价指标 定量评价指标 五、代表厂商的实测…

【技术实战】R语言统计分析与可视化从入门到精通

前言 随着大数据时代的到来&#xff0c;数据分析已经成为各行各业的重要技能。R语言作为一种强大的统计分析和数据可视化工具&#xff0c;广泛应用于科学研究、数据分析和商业决策支持。 本文将带领读者从入门到精通&#xff0c;掌握R语言在统计分析和数据可视化方面的核心技…

电脑中缺失的nvrtc64_90.dll文件如何修复?

一、文件丢失问题 案例&#xff1a;nvrtc64_90.dll文件缺失 问题分析&#xff1a; nvrtc64_90.dll是NVIDIA CUDA Runtime Compilation库的一部分&#xff0c;通常与NVIDIA的CUDA Toolkit或相关驱动程序一起安装。如果该文件丢失&#xff0c;可能会导致基于CUDA的应用程序&…

【交叉编译】sysstat 离线编译

1、下载源码 首先从下载&#xff1a; https://github.com/sysstat/sysstat/tags &#xff0c;我直接下载最新的 2、配置交叉编译链 快速的方法就是把整个编译包全部放在Linux &#xff0c;然后编辑~/.zshrc或者~/.bashrc,在最后加入&#xff1a; export PATH$PATH:/opt/arm-so…

如何利用无线路由器实现水泵房远程监测管理

水泵站广泛部署应用在工农业用水、防洪、排涝和抗旱减灾等方面&#xff0c;如果水泵站发生异常&#xff0c;往往会对生产生活造成诸多损失&#xff0c;甚至引发安全事故。因此&#xff0c;建立一套高效、可靠的泵站远程监测管理系统至关重要。 方案背景 目前&#xff0c;我国大…

教程:从pycharm基于anaconda构建机器学习环境并运行第一个 Python 文件

1. 安装 PyCharm 访问 PyCharm 官方网站&#xff1a;https://www.jetbrains.com/pycharm/。下载社区版&#xff08;免费&#xff09;或专业版&#xff08;收费&#xff0c;提供更多功能&#xff09;。按照操作系统的安装指导安装 PyCharm。安装后打开 PyCharm&#xff0c;并根…

2024.12.30(多点通信)

作业&#xff1a; 1、将广播发送和接收端实现一遍&#xff0c;完成一个发送端发送信息&#xff0c;对应多个接收端接收信息实验。 发送端 #include <myhead.h>#define PORT 8888 #define IP "192.168.124.255"int main(int argc, const char *argv[]) {//1、…

Python爬虫 - 豆瓣电影排行榜数据爬取、处理与存储

文章目录 前言一、使用版本二、需求分析1. 分析要爬取的内容1.1 分析要爬取的分类1.2 分析要爬取的单个电影的数据1.3 分析如何获取单个电影数据1.3.1 预览数据1.3.2 查看请求网址、方法及请求头信息1.3.3 查看请求参数 2. 数据用途2.1 统计分析2.2 探索性数据分析 (EDA)2.3 高…

爬虫后的数据处理与使用(处理篇)

紧接上文爬虫&#xff0c;我们获取到了一些数据&#xff0c;接下来就是使用和分析了~爬虫阶段式教学——从数据获取到格式化存储&#xff08;附代码与效果图&#xff09;_爬虫网页数据格式化-CSDN博客 为保证数据的正确性和有效性需要对数据进行筛选&#xff0c;保存有效信息&a…

模电面试——设计题及综合分析题0x01(含答案)

1、已知某温控系统的部分电路如下图&#xff08;EDP070252&#xff09;&#xff0c;晶体管VT导通时&#xff0c;继电器J吸合&#xff0c;压缩机M运转制冷&#xff0c;VT截止时&#xff0c;J释放&#xff0c;M停止运转。 &#xff08;1&#xff09;电源刚接通时&#xff0c;晶体…

基于FPGA的2ASK+帧同步系统verilog开发,包含testbench,高斯信道,误码统计,可设置SNR

目录 1.算法仿真效果 2.算法涉及理论知识概要 2.1 2ASK调制解调 2.2 帧同步 3.Verilog核心程序 4.完整算法代码文件获得 1.算法仿真效果 vivado2019.2仿真结果如下&#xff08;完整代码运行后无水印&#xff09;&#xff1a; 设置SNR8db 设置SNR20db 整体波形效果&…

学习笔记:使用 pandas 和 Seaborn 绘制柱状图

学习笔记&#xff1a;使用 pandas 和 Seaborn 绘制柱状图 前言 今天在使用 pandas 对数据进行处理并在 Python 中绘制可视化图表时&#xff0c;遇到了一些关于字体设置和 Seaborn 主题覆盖的小问题。这里将学习到的方法和注意事项做个总结&#xff0c;以便之后的项目中可以快…

【算法day27】动态规划:基础2

题目引用 不同路径不同路径II整数拆分不同的二叉搜索树 1. 不同路径 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Fin…

大数据技术-Hadoop(四)Yarn的介绍与使用

目录 一、Yarn 基本结构 1、Yarn基本结构 2、Yarn的工作机制 二、Yarn常用的命令 三、调度器 1、Capacity Scheduler&#xff08;容量调度器&#xff09; 1.1、特点 1.2、配置 1.2.1、yarn-site.xml 1.2.2、capacity-scheduler.xml 1.3、重启yarn、刷新队列 测试 向hi…

Vscode左大括号不另起一行、注释自动换行

参考大佬的博客VSCode 格式化 cpp 文件时配置左大括号不换行_vscode大括号不换行-CSDN博客 Clang_format_style {BasedOnStyle: Chromium, IndentWidth: 4}

12.30 Redis网络模型基础 IO NIO多路复用

图片引用自黑马程序员redis 网络模型 上图引用自java guide javaguide NIO

基于Qt事件机制中的定时器事件的闹钟设计

目标 代码 pro文件 QT core gui texttospeechgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # depend on …