Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >带你使用PaddleDetection玩转Windows下可视化部署

带你使用PaddleDetection玩转Windows下可视化部署

作者头像
用户1386409
发布于 2020-06-29 06:48:36
发布于 2020-06-29 06:48:36
2.8K00
代码可运行
举报
文章被收录于专栏:PaddlePaddlePaddlePaddle
运行总次数:0
代码可运行

【飞桨开发者说】:余志良,菲特(天津)智能科技有限公司项目经理,百度黄埔学院二期学员

今年3月、4月我分别发布了两篇文章:《如何用PaddleDetection做一个完整的目标检测项目》以及《飞桨与PyQt的碰撞,图形化目标检测So Easy》,为大家讲解了从模型训练到模型部署的全过程,其中模型部署基于Paddle预测库的Python接口。本篇将教大家通过PaddleDetection编译C++预测库,并将其封装成dll,实现PaddleDetection在Windows环境下的模型部署。

本文内容主要包括:

  • 如何进行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

Paddle预测库:选择win10下的cuda10版本。

https://www.paddlepaddle.org.cn/documentation/docs/zh/advanced_guide/inference_deployment/inference/windows_cpp_inference.html

一、首先将上述需要依赖的OpenCV和预测库,PaddleDetection下载好,并保存在某个文件夹中。如下图是我存放的一个文件夹。

二、将OpenCV添加到环境变量里面,如下图所示。

三、利用Cmake软件进行编译。源码路径为cpp文件所在目录,因为里面有CMakeLists.txt文件,同时在该目录下创建了新的文件夹/out用于生成编译后的文件。

四、点击Configure,选择vs2019 X64选项后,点击Generate。

五、根据报错进行修改,主要修改cuda_lib、OpenCV、paddle_dir路径。

六、再次点击Generate。

七、点击Open Project,同时我们在out文件夹下发现了生成了解决方案。

八、针对“main”项目进行“重新生成”。同时一定要将模式配置成为Release。

九、出现报错。

十、修改报错---根据报错,应该是编译过程中,cudnn.lib寻找不正确。通过修改路径实现。方式为点击属性--连接器--输入--附加依赖项。

十一、改正上述错误后的正确的形式。

十二、重新生成,如下图是重新生成后的结果。

十三、运行该生成的main.exe文件。方式为打开out/release文件,会发现有一个main.exe文件。利用命令行打开后,运行即可。运行过程中需要添加模型的路径以及预测图像的路径。

注意:此时此刻进行预测的模型是按照《如何使用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”的检测后图像

十五、对代码进行一下小修改。之前我们需要在命令行中输入图像和模型的路径,在代码中添加图像和模型的路径,查看预测情况。修改src/main.cpp这个文件如下:

十六、修改上述两处代码后,设置“设为启动项目”,并点击“本地windows调试器

,直接查看输出的结果。

至此,完成了第一步以及第一步的所有测试。

如何将C++预测代码

封装成一个dll

一、 我们需要修改CMakeLists.txt文件,修改倒数第十三行,将

add_executable(main src/main.cc src/preprocess_op.cc src/object_detector.cc) 变成

ADD_library(main SHARED src/main.cc src/preprocess_op.cc src/object_detector.cc)

二、按照上文继续重新cmake一次。

三、再次经历之前的cudnn的路径问题,同时需要在属性—常规—配置类型中修改成.dll文件。

四、修改完上述内容后,点击“重新生成”,会发现out/release中出现了main.dll文件。

五、看到dll后,我们仿佛看到了曙光,但是还是需要进行修改,因为这样我们才能被调用,我简化了main.cc文件中的内容,并且配置了dll的接口,代码如下。其中有两个dll的接口,其中“add”是为了测试。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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:\\0524\\test\\model";
    std::string image_path = "D:\\0524\\test\\orange_71.jpg";
    std::string video_path = "";
    std::string run_mode = "fluid";
    bool use_gpu = true;

    // Load model and create a object detector
    PaddleDetection::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 object
    cv::Mat im = cv::imread(image_path, 1);
    // Store all detected result
    std::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 result
    auto 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.jpeg\n");
}

六、继续点击“重新生成”,重新生成的dll就是下述步骤中我们即将调用的dll。

如何使用Python调用

生成好的dll

在上一章节我们说了如何生成dll,这一章节,我们需要进行测试,在这里我们使用Python进行测试,利用Python调用dll。在生成的dll的文件中创建一个叫mian.py的Python文件。Python部分代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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,相关代码如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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图片,证明我们调用成功

至此,该系列文章基本上完成了从训练到部署的所有流程,十分感谢在写作过程中飞桨同学的帮助,非常感谢高松鹤、梁钰同学的大力帮助。后续会根据飞桨针对C++预测的更新,继续更新完善该文章。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PaddlePaddle 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
工业党福利:使用PaddleX高效实现指针型表计读取系列文章(2)
最近在做一个工业巡检的项目,主要涉及的内容是指针型表计的读取。本系列文章主要介绍实现表计读取的全流程开发(立个FLAG,想想真是肝...留下了不争气的眼泪),其中主要使用的工具为百度开发的PaddleX和Visual studio 2019。
用户7699929
2020/08/27
1.7K0
工业党福利:使用PaddleX高效实现指针型表计读取系列文章(2)
如何将PaddleDetection模型在树莓派4B上部署?
【飞桨开发者说】侯继旭,海南师范大学本三自动化专业在读,人工智能开发爱好者,曾获2019中国高校计算机大赛-人工智能创意赛海南省一等奖、2019年度海南省高等学校科学研究“人工智能”优秀成果奖
用户1386409
2020/06/01
1.1K0
如何将PaddleDetection模型在树莓派4B上部署?
基于PaddleDetection的锥桶检测并在Gazebo环境中实现部署
【飞桨开发者说】吴瀚,武汉理工大学本科在读,人工智能技术爱好者、飞桨开发者,希望能将AI技术更好地落地实践、服务生活。感兴趣的方向有:计算机视觉、迁移学习、推理部署。
用户1386409
2021/04/20
8810
手把手教你移动端AI应用开发(三)——部署环节关键代码最详解读
前几天给大家推送过如何快速在安卓上跑通OCR应用、如何将AI模型集成到安卓应用中,本章将对部署过程中的关键代码进行解读。
用户1386409
2020/08/28
2.8K0
手把手教你移动端AI应用开发(三)——部署环节关键代码最详解读
在 C++ 项目中,通过源码使用 PaddlePaddle 实现 OCR 功能
如何在 C++ 项目中,通过源码使用 PaddlePaddle 实现 OCR 功能。 本项目的所有源码:gitee: paddleocr
绿巨人
2024/03/01
1.3K0
如何用PaddleDetection做一个完整的目标检测项目
PaddleDetection 是百度飞桨推出的物体检测统一框架。支持现有的RCNN、SSD、YOLO等系列模型、支持 ResNet、ResNet-VD、ResNeXt、ResNeXt-VD、SENet、MobileNet、DarkNet等主干网络。针对不同的业务场景(性能、目标大小、准确率等)可以选择框架中的不同模块组合得到最适合的模型,实现任务。相比于tensorflow的Object_Detection,优势之一就是将YOLOv3这一目标检测的快速算法融合到了框架下。
用户1386409
2020/03/19
3.1K0
如何基于OpenVINO加速飞桨模型推理?
OpenVINO是英特尔基于自身现有的硬件平台开发的一种工具套件,主要用于快速开发高性能计算机视觉及深度学习视觉的应用程序和解决方案,从而实现人类视觉模拟、自动语音识别、自然语言处理和推荐系统任务。该工具套件基于最新一代的人工神经网络,包括卷积神经网络、递归网络和基于注意力的网络,可扩展跨英特尔硬件的计算机视觉和非视觉工作负载,从而最大限度地提高性能。基于OpenVINO,可提升应用程序在CPU计算设备上的推理速度。
用户1386409
2021/11/17
1.2K0
如何基于OpenVINO加速飞桨模型推理?
飞桨与PyQt的碰撞,图形化目标检测So Easy
还记得3月份的时候我给大家介绍了PaddleDetection的环境部署、训练及可视化、模型导出。但那只是一个算法程序,一个完整的项目需要在算法的基础上将可视化操作开发成型。今天我给大家带来如何利用Py-Qt编一个显示界面,并结合工业相机实时采集并进行目标检测。
用户1386409
2020/04/26
8120
飞桨与PyQt的碰撞,图形化目标检测So Easy
基于Paddle Lite在Android手机上实现图像分类
Paddle Lite是飞桨基于Paddle Mobile全新升级推出的端侧推理引擎,在多硬件、多平台以及硬件混合调度的支持上更加完备,为包括手机在内的端侧场景的AI应用提供高效轻量的推理能力,有效解决手机算力和内存限制等问题,致力于推动AI应用更广泛的落地。
夜雨飘零
2020/08/02
7990
基于Paddle Lite在Android手机上实现图像分类
PaddleOCR C++动态库编译及调用识别(一)
本篇就来看看如何把PaddleOCR的源码重新编译成动态库,供OpenCV的Demo调用。
Vaccae
2021/07/30
5K1
PaddleOCR C++动态库编译及调用识别(一)
飞桨PaddleOCR C++预测库布署
关于OCR这块以前《Android通过OpenCV和TesserartOCR实时进行识别》中用过TesserartOCR,原来用的模型库也挺大,最近也研究了下别的OCR,最终决定采用百度飞桨PaddleOCR,本篇就是基于百度飞桨的PaddleOCR在Window版下C++的布署。
Vaccae
2021/07/07
2.8K0
飞桨PaddleOCR C++预测库布署
使用OpenVINO运行PPTracking下FairMOT多目标跟踪模型
多对象追踪(Multi- Object Tracking, MOT) 在计算机视觉领域有着广泛且重要的应用。大到可以用在多目标导弹跟踪、市中心人流统计, 小到可以用在统计鱼池里的观赏鱼类等等。本篇文章将会带您了解百度飞桨目标检测套件PaddleDetection项目里的 FairMOT模型,并通过Intel的 OpenVINO将其转换成ONNX通用模型,最终在计算机上运行此AI模型实现行人检测项目。
用户1386409
2022/09/01
1.1K0
使用OpenVINO运行PPTracking下FairMOT多目标跟踪模型
YOLOv8对象检测 + ONNXRUNTIME 部署 C++ 源码演示!
ONNXRUNTIME是主流的深度学习部署框架之一,支持ONNX格式模型在CPU、GPU、ARM等不同硬件平台上加速推理,支持C++、Python、Java、C#、JS等不同语言SDK。C++版本安装包下载如下:
OpenCV学堂
2023/08/22
10.4K0
YOLOv8对象检测 + ONNXRUNTIME 部署 C++ 源码演示!
C#调用C++代码,以OpenCV为例
使用C#调用C++代码是一个很常见的需求,因此本文以知名的C++机器视觉库OpenCV为例,说明在C#中如何通过使用P/Invoke(平台调用)来调用C++代码。只是以OpenCV为例,实际上在C#中使用OpenCV可以使用OpenCVSharp这个项目,这是一个很优秀的项目,GitHub地址:https://github.com/shimat/opencvsharp。
郑子铭
2025/02/18
1520
C#调用C++代码,以OpenCV为例
如何基于Flutter和Paddle Lite实现实时目标检测
在端侧部署方面,Paddle Lite是飞桨产品栈中用于端侧高性能轻量化AI应用部署的推理引擎,给了移动端等场景更多可能。这款引擎允许我们在很多硬件平台上实现轻量化的高效预测,进行一次预测耗时较短,也不需要太多的计算资源。
用户1386409
2020/04/15
2.4K0
如何在Jetson nano上同时编译TensorRT与Paddle Lite框架
我从上学期开始逐渐接触飞桨深度学习框架,当时的飞桨逐步为广大开发者熟知。半年过去,生态不完善不再是扣在飞桨框架上的一顶帽子。如果你仍怀偏见,那么建议从现在开始深入地了解和使用它。
用户1386409
2020/08/04
1.6K0
如何在Jetson nano上同时编译TensorRT与Paddle Lite框架
手把手教你 封装DLL类 给客户端调用
创建DLL有几种不同的方式,最简单直接的的方式就是通过VS自带的动态链接库(DLL)项目,把相关的功能封装成一个类,然后导出几个接口方法,编译成功以后生成DLL文件,就可以在其他地方跟正常的第三方库配置之后一样调用了。
OpenCV学堂
2023/08/22
1.1K0
手把手教你 封装DLL类 给客户端调用
飞桨实战笔记:自编写模型如何在服务器和移动端部署
作为深度学习小白一枚,从一开始摸索如何使用深度学习框架,怎么让脚本跑起来,到现在开始逐步读懂论文,看懂模型的网络结构,按照飞桨官方文档进行各种模型训练和部署,整个过程遇到了无数问题。非常感谢飞桨开源社区的大力支持,并热情答复我遇到的各种问题,使得我可以快速上手。特整理本篇学习笔记,以此回馈网友们的无私付出。大家都共享一点点,一起为深度学习的推进添砖加瓦(哈哈,非常正能量,有木有!)
用户1386409
2020/05/29
8950
飞桨实战笔记:自编写模型如何在服务器和移动端部署
《PaddlePaddle从入门到炼丹》十五——把预测模型部署到Android手机上
现在越来越多的手机要使用到深度学习了,比如一些图像分类,目标检测,风格迁移等等,之前都是把数据提交给服务器完成的。但是提交给服务器有几点不好,首先是速度问题,图片上传到服务器需要时间,客户端接收结果也需要时间,这一来回就占用了一大半的时间,会使得整体的预测速度都变慢了,再且现在手机的性能不断提高,足以做深度学习的预测。其二是隐私问题,如果只是在本地预测,那么用户根本就不用上传图片,安全性也大大提高了。所以本章我们就来学如何包我们训练的PaddlePaddle预测模型部署到Android手机上。
夜雨飘零
2020/05/06
1.7K0
《PaddlePaddle从入门到炼丹》十五——把预测模型部署到Android手机上
基于PaddleX构建专属行车助手,为交通安全保驾护航
据有关数据显示,截止2021年,中国机动车保有量超过3.6亿,机动车驾驶人达到4.5亿,成为名副其实的汽车大国。但与此同时,全国每年有数万人丧生于交通事故,几乎平均每8分钟就有1人因车祸死亡。其中,驾驶员“三超一疲劳”也是造成事故的重要原因之一。
用户1386409
2022/03/31
3230
基于PaddleX构建专属行车助手,为交通安全保驾护航
推荐阅读
相关推荐
工业党福利:使用PaddleX高效实现指针型表计读取系列文章(2)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验