ubuntu clion从0开始搭建一个风格转换ONNX推理网络 opencv cuda::dnn::net

news2025/1/18 1:54:55

系统搭建

  • 系统搭建

OpenCV的安装

cmake

sudo apt-get install cmake

其他环境以来

sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff5.dev libswscale-dev libjasper-dev  
  • 不安装会报这个错误
OpenCV(4.6.0) /home/dell/下载/opencv-4.6.0/modules/highgui/src/window.cpp:1250: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvNamedWindow'

error

  • E: 无法定位软件包 libjasper-dev

解决(换源重新安装)

  • http://mirrors.ustc.edu.cn/help/ubuntu.html
sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt update
  • 由于没有公钥,无法验证下列签名: NO_PUBKEY 40976EAF437D05B5 NO_PUBKEY 3B4FE6AC
sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 40976EAF437D05B5 3B4FE6ACC0B21F32

下载源码

https://github.com/opencv/opencv/releases
增强模块 https://github.com/opencv/opencv_contrib/tags

安装

  • unzip opencv-4.6.0.zip
  • unzip opencv_contrib-4.6.0.zip
  • cd opencv-4.6.0/
  • sudo mkdir build
  • cd build
  • sudo cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local
    sudo cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH= **/opencv_contrib-4.6.0/modules/ ..
error
  • 如果报错 CMake Error: The source directory "/home/dell/下载/opencv-4.6.0/build" does not appear to contain CMakeLists.txt. 使用 sudo cmake /home/dell/下载/opencv-4.6.0/ -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local

在这里插入图片描述

  • sudo makesudo make -j4 j为变异是使用的核心数量,这一步非常满
  • sudo make install
-- Installing: /usr/local/share/opencv4/lbpcascades/lbpcascade_profileface.xml
-- Installing: /usr/local/share/opencv4/lbpcascades/lbpcascade_silverware.xml
-- Installing: /usr/local/bin/opencv_annotation
-- Set runtime path of "/usr/local/bin/opencv_annotation" to "/usr/local/lib"
-- Installing: /usr/local/bin/opencv_visualisation
-- Set runtime path of "/usr/local/bin/opencv_visualisation" to "/usr/local/lib"
-- Installing: /usr/local/bin/opencv_interactive-calibration
-- Set runtime path of "/usr/local/bin/opencv_interactive-calibration" to "/usr/local/lib"
-- Installing: /usr/local/bin/opencv_version
-- Set runtime path of "/usr/local/bin/opencv_version" to "/usr/local/lib"
-- Installing: /usr/local/bin/opencv_model_diagnostics
-- Set runtime path of "/usr/local/bin/opencv_model_diagnostics" to "/usr/local/lib"

环境变量

  • sudo vim /etc/ld.so.conf.d/opencv.conf i /usr/local/lib + esc + :wq + enter
    在这里插入图片描述
  • sudo ldconfig
  • sudo vim /etc/bash.bashrc
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig  
export PKG_CONFIG_PATH  
  • sudo updatedb
或者按照这种方式配置

测试

cmake_minimum_required(VERSION 3.15)
project(untitled)
set(CMAKE_CXX_STANDARD 14)

MESSAGE(STATUS "Project: untitled")               #打印相关消息消息
find_package(OpenCV REQUIRED)# 通过find_package引入非官方的库(该方式只对支持cmake编译安装的库有效)
set(SOURCE_FILES main.cpp)
include_directories(${OpenCV_INCLUDE_DIRS})

add_executable(untitled main.cpp)
target_link_libraries(untitled ${OpenCV_LIBS})
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;

int main() {
    string path = "/home/dell/下载/a.png";
    Mat src = imread(path);
    namedWindow("img");
    imshow("img",src);
    waitKey(0);
    return 0;
}

在这里插入图片描述

  • 重启一下就ok了

在这里插入图片描述

  • 结果

在这里插入图片描述

onnx

效果风格转换

在这里插入图片描述

网络的论文和ONNX下载

在这里插入图片描述
在这里插入图片描述

  • 下载地址
    在这里插入图片描述

blobFromImages(blobFromImage) + imagesFromBlob

        处理图像到blob,[0, 255] ->[0, 1],大小,RGB->BGR和转换forward的blob到图像。

在这里插入图片描述

网络传播整体代码

cmake_minimum_required(VERSION 3.15)
project(untitled)
set(CMAKE_CXX_STANDARD 14)

MESSAGE(STATUS "Project: untitled")             
find_package(OpenCV REQUIRED)
set(SOURCE_FILES main.cpp)
include_directories(${OpenCV_INCLUDE_DIRS})

add_executable(untitled main.cpp)
target_link_libraries(untitled ${OpenCV_LIBS})
#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>
#include <iostream>
#include <fstream>

using namespace cv;
using namespace cv::dnn;
using namespace std;


// 图像处理  标准化处理
void PreProcess(const Mat& image, Mat& image_blob)
{
    Mat input;
    image.copyTo(input);


    //数据处理 标准化
    std::vector<Mat> channels, channel_p;
    split(input, channels);
    Mat R, G, B;
    B = channels.at(0);
    G = channels.at(1);
    R = channels.at(2);

    B = (B / 255. - 0.406) / 0.225;
    G = (G / 255. - 0.456) / 0.224;
    R = (R / 255. - 0.485) / 0.229;

    channel_p.push_back(R);
    channel_p.push_back(G);
    channel_p.push_back(B);

    Mat outt;
    merge(channel_p, outt);
    image_blob = outt;
}


String bin_model = "/home/dell/CLionProjects/untitled/mosaic-9.onnx";
int main(int argc, char** argv) {
    //数据处理
    Mat test = Mat::zeros(10,10, CV_64FC1 );
    Mat image1 = imread("/home/dell/下载/a.png");
    resize(image1, image1, Size(256, 256), INTER_AREA);
    image1.convertTo(image1, CV_32FC3);// convertTo()数据类型CV_32FC3
    PreProcess(image1, image1);

    vector<Mat> images;
    images.push_back(image1);images.push_back(image1);


    int w = 224;int h = 224;

    // 加载网络
    cv::dnn::Net net = cv::dnn::readNetFromONNX(bin_model);  // 加载训练好的识别模型  net = cv2.dnn.readNetFromONNX('**.onnx')
    net.setPreferableBackend(cv::dnn::DNN_BACKEND_OPENCV);
    net.setPreferableTarget(cv::dnn::DNN_TARGET_CPU);
    if (net.empty()) {
        printf("read onnx model data failure...\n");
        return -1;
    }

    Mat inputBlob = blobFromImages(images, 1.0, Size(w, h), Scalar(0, 0, 0), false, true);
    net.setInput(inputBlob);
    cv::Mat prob = net.forward();     // 推理出结果  cols,rows 矩阵的行数,列数【注意,在图像中行数对应的是高度,列数对应的是宽度】,当维数大于2时,均为-1;  
    std::vector<cv::Mat> predTmp;
    cv::dnn::imagesFromBlob(prob, predTmp);
    
    imshow("show Image", images[0]);
    cv::waitKey(0);
    imshow("Image mosaic", predTmp[0]);
    cv::waitKey(0);

    vector<double> times;
    double time = net.getPerfProfile(times);
    float ms = (time * 1000) / getTickFrequency();
    printf("current inference time : %.2f ms \n", ms);

    return 0;
}

CG

  • clion中debug不生效
    在这里插入图片描述

代码 onnx+ opdncv+vgg16

// https://blog.csdn.net/qq_44747572/article/details/121467657
// /home/dell/下载/opencv-4.6.0/samples/data/dnn/classification_classes_ILSVRC2012.txt

#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>
#include <iostream>
#include <fstream>

using namespace cv;
using namespace cv::dnn;
using namespace std;


// 图像处理  标准化处理
void PreProcess(const Mat& image, Mat& image_blob)
{
    Mat input;
    image.copyTo(input);


    //数据处理 标准化
    std::vector<Mat> channels, channel_p;
    split(input, channels);
    Mat R, G, B;
    B = channels.at(0);
    G = channels.at(1);
    R = channels.at(2);

    B = (B / 255. - 0.406) / 0.225;
    G = (G / 255. - 0.456) / 0.224;
    R = (R / 255. - 0.485) / 0.229;

    channel_p.push_back(R);
    channel_p.push_back(G);
    channel_p.push_back(B);

    Mat outt;
    merge(channel_p, outt);
    image_blob = outt;
}

std::vector<String> readClassNames(string labels_txt_file)
{
    std::vector<String> classNames;

    std::ifstream fp(labels_txt_file);
    if (!fp.is_open())
    {
        printf("could not open file...\n");
        exit(-1);
    }
    std::string name;
    while (!fp.eof())
    {
        std::getline(fp, name);
        if (name.length())
            classNames.push_back(name);
    }
    fp.close();
    return classNames;
}

String bin_model = "/home/dell/下载/vgg16.onnx";
String labels_txt_file = "/home/dell/下载/opencv-4.6.0/samples/data/dnn/classification_classes_ILSVRC2012.txt";
vector<String> readClassNames();                  // string对象作为vector对象
int main(int argc, char** argv) {
    Mat image1 = imread("/home/dell/下载/a.png");

    //用于显示
    vector<Mat>Showimages;
    Showimages.push_back(image1);
    //处理image1
    resize(image1, image1, Size(256, 256), INTER_AREA);
    image1.convertTo(image1, CV_32FC3);
    PreProcess(image1, image1);         //标准化处理

    //将image1和image2合并到images
    vector<Mat> images;
    images.push_back(image1);
    images.push_back(image1);
    vector<String> labels = readClassNames(labels_txt_file);

    int w = 224;
    int h = 224;

    // 加载网络
    cv::dnn::Net net = cv::dnn::readNetFromONNX(bin_model);  // 加载训练好的识别模型

    if (net.empty()) {
        printf("read onnx model data failure...\n");
        return -1;
    }
    Mat inputBlob = blobFromImages(images, 1.0, Size(w, h), Scalar(0, 0, 0), false, true);

    // 执行图像分类
    net.setInput(inputBlob);
    cv::Mat prob = net.forward();     // 推理出结果
    cout << prob.cols<< endl;
    vector<double> times;
    double time = net.getPerfProfile(times);
    float ms = (time * 1000) / getTickFrequency();
    printf("current inference time : %.2f ms \n", ms);
    // 得到最可能分类输出

    for (int n = 0; n < prob.rows; n++) {
        Point classNumber;
        double classProb;
        Mat probMat = prob(Rect(0, n, 1000, 1)).clone();
        Mat result = probMat.reshape(1, 1);
        minMaxLoc(result, NULL, &classProb, NULL, &classNumber);
        int classidx = classNumber.x;
        printf("\n current image classification : %s, possible : %.2f\n", labels.at(classidx).c_str(), classProb);

        // 显示文本
        putText(Showimages[n], labels.at(classidx), Point(10, 20), FONT_HERSHEY_SIMPLEX, 0.6, Scalar(0, 0, 255), 1, 1);
        imshow("Image Classification", Showimages[n]);
        waitKey(0);

    }
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode刷题系列 -- 48. 旋转图像

给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。示例 1&#xff1a;输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]]输出&#…

【MySQL Shell】8.8 InnoDB ClusterSet 的紧急故障切换

紧急故障切换会将选定的副本集群放入 InnoDB ClusterSet 部署的主 InnoDB 集群中。当当前主集群不工作或无法联系时&#xff0c;可以使用此过程。在紧急故障切换过程中&#xff0c;无法确保数据一致性&#xff0c;因此为了安全起见&#xff0c;在故障切换过程中将原始主集群标记…

openHarmony的UI开发

自适应布局 拉伸能力 ​ Blank在容器主轴方向上&#xff0c;空白填充组件具有自动填充容器空余部分的能力。仅当父组件为Row/Column时生效&#xff0c;即是线性布局。这样便可以在两个固定宽度或高度的组件中间添加一个Blank()&#xff0c;将剩余空间占满&#xff0c;从而实现…

通过python 调用OpenAI api_key提交问题解答

通过python 调用OpenAI api_key提交问题解答✨可以通过网页版的jupyter notebook调用&#xff0c;也可以通过spyder窗口等IDE窗口. &#x1f33c;通过python 调用OpenAI api_key接口&#xff0c;可以避免国内网页不能访问的问题。前提是需要自己已经注册了OpenAI帐号&#xff…

linux中crontab定时任务导致磁盘满和云监控未报警的的坑

一个后台开发者&#xff0c;兼职运维工作中&#xff0c;配置linux中crontab定时任务&#xff0c;导致磁盘满和云监控未报警的问题的坑。 1.磁盘满 使用命令 df -h2.问题排查 2.1排查日志 命令 cat /var/log/messages日志文件的默认路径是&#xff1a;/var/log 下面是几个…

外贸常用工具(建议顶置收藏)

领英精灵 推荐理由&#xff1a;可批量群发消息并单独显示&#xff0c;相当于20人的发送效率。 做外贸的人一定会在Linkedin平台开发客户&#xff0c;但Linkedin平台没有提供群发消息的功能&#xff0c;如果要快速发消息的话&#xff0c;只能一个一个发&#xff0c;这种发送效…

使用Lame库实现wav、pcm转mp3

文章目录 前言 一、Lame库是什么&#xff1f; 二、使用步骤 0.创建native项目 1.下载Lame库 2.pcm转MP3 3.wav转MP3 4、native方法如下 三、注意 总结 前言 因为使用android录音后生成的文件是wav或者pcm格式&#xff0c;项目要求最后的文件需要是mp3格式&#xff0c;于…

tomcat10部署报错WebStatFilter cannot be cast to jakarta.servlet.Filter

异常信息09-Feb-2023 23:08:49.946 严重 [main] org.apache.catalina.core.StandardContext.filterStart 启动过滤器异常[DruidWebStatFilter]java.lang.ClassCastException: com.alibaba.druid.support.http.WebStatFilter cannot be cast to jakarta.servlet.Filterat org.ap…

上科大最新工作!实时面捕天花板,微表情像素级一致,AI让你告别手Key|SIGGRAPH Asia 2022

驱动一个数字人往往被拆分为追踪 (Tracking) 与重定向 (Retargeting) 两个环节。 追踪由专业的面部捕捉设备及其辅助算法完成&#xff0c;负责记录演员的面部动作信息&#xff0c;重定向则是将捕捉到的动作信息迁移到新的角色。 在传统的流程中&#xff0c;这两个环节往往是分…

全价值链赋能,数字化助力营销价值全力释放 | 爱分析报告

报告编委 张扬 爱分析联合创始人&首席分析师 文鸿伟 爱分析高级分析师 王鹏 爱分析分析师 外部专家&#xff08;按姓氏拼音排序&#xff09; 黄洵 客易达 联合创始人 毛健 云徙科技 副总裁 & COO 特别鸣谢&#xff08;按拼音排序&#xff09; 报告摘要 在…

SpringSecurity前后端分离(一篇就够了)

SpringSecurity前后端分离 从上至下操作&#xff0c;直接上手SpringSecurity 文章目录SpringSecurity前后端分离1、项目环境maven依赖数据库表2、自定义UserService接口3、屏蔽Spring Security默认重定向登录页面以实现前后端分离功能1、实现登录成功/失败、登出处理逻辑1、表…

鉴源论坛 ·观擎丨民机机载软件的开发与验证

作者 | 蔡喁 上海控安可信软件创新研究院副院长 版块 | 鉴源论坛 观擎 01 机载软件过程保证的目的和背景 民机机载软件研制过程一直是行业内公认的要求最为严苛、开发验证难度最大的软件开发实例之一。由于其高安全以及严格的政府监管特性&#xff0c;使得传统其他领域的软件…

1. 用Qt开发的十大理由

用Qt的十大理由 原因最主要的是很多大公司都在用&#xff0c;有钱景。 先来看看各大公司的评价&#xff1a; 奔驰&#xff1a;们用 Qt 开发了绝大部分的UI体验和软件&#xff0c;包括屏幕动画&#xff0c;屏幕间的过渡和小组件。 FORMLABS&#xff1a;凭借Qt的快速迭代&…

记录一下slf4j2打印一直不成功

整理一个之前的老项目问题&#xff0c;发现日志一直打印不出来&#xff0c;本地启动发现了第一个问题日志如下&#xff1a;此处可发现&#xff0c;jar包冲突问题&#xff0c;去掉冲突的jar包即可&#xff0c;此处不做过多赘述。然后发现了重新启动项目&#xff0c;发现jar包冲突…

工业废水的种类及其处理工艺简析

随着工业的迅速发展&#xff0c;工业废水的种类和数量随之增加&#xff0c;对水体的污染也日趋严重&#xff0c;威胁人类的健康和正常生活。所以工业废水的处理对于环保至关重要。 保护生态环境、更好地做好工业废水的处理&#xff0c;了解工业废水及其种类与处理非常必要。 工…

国内chatgpt 在VRAR上的应用场景

人工智能不鸣则已&#xff0c;一鸣惊人! 近日OpenAI发布了聊天AI ChatGPT&#xff0c;短短几天&#xff0c;其用户量直冲百万级&#xff0c;甚至服务器一度被注册用户挤爆了。 这种被网友惊叹“超越谷歌搜索”的神器究竟是怎么做到的? ChatGPT 简而言之&#xff1a;ChatGPT是一…

三行按键扫描详细解析

三行按键扫描基础 核心算法&#xff1a; unsigned char trg; unsigned char cont; void KeyRead( void ) {unsigned char readDate P3^0xff; // 第一行trg readDate & (ReadData ^ cont); // 第二行cont readDate; // 第三行 }用定时器每隔10ms执行一次按键扫描读取函…

C++:类和对象(上)

文章目录1 面向过程与面向对象的初步认识2 类的引入3 类的定义4 类的访问限定符及封装4.1 访问限定符4.2 封装5 类的实例化6 类对象模型6.1 如何计算类的大小6.2 类对象的存储方式猜测7 this指针7.1 this指针的引出7.2 this指针的特性8 C语言和C栈&#xff08;Stack&#xff09…

J-Tech Talk|如何使用Grafana Cloud Alert进行实时监控

J-Tech Talk由 Jina AI 社区为大家带来的技术分享围绕 Python 的相关话题工程师们将深入细节地讲解具体的问题分享 Jina AI 在开发过程中所积累的经验在新一代基于云原生的微服务架构中&#xff0c;不管是业务还是基础设施&#xff0c;服务的可观测性 至关重要&#xff01;它涵…

git、gitee、github关系梳理及ssh不对称加密大白话解释

温馨提示&#xff1a;本文不会讲解如何下载、安装git&#xff0c;也不会讲解如何注册、使用gitee或GitHub&#xff0c;这些内容网上一大把&#xff0c;B站上的入门课程也很多&#xff0c;自己看看就好了。 本文仅对 git、gitee、github的关系梳理及ssh公钥私钥授权原理用白话讲…