Cpp DenseNet OpenVino辅助函数

Cpp OpenVino DenseNet辅助函数

Python版本导引

CMake工程示例

测试性质的工程结构如下:

Project:

  • Network: 存放网络推理相关
    • DebugTools: 打印网络结构
    • DenseGradeWrapper: 推理主结构
    • NetworkTools: 部分CV辅助函数
  • Script: 存放前面博客中的导出以及验证Py文件
  • CMakeLists.txt: cmake工程文件
  • main.cpp: 简单的执行文件

DebugTools

此处简单的修改自官方示例源码,用于打印模型输入输出中的关键信息,由于我的权重由torch直接转换而来,所以输出输出的名字将会难以阅读,仅作为快速实现以及debug使用

#include "DebugTools.h"

void printInputAndOutputsInfo(const ov::Model& network){
    qDebug() << "Network inputs:" ;
    for (auto&& input : network.inputs()) {
        std::string in_name;
        std::string node_name;

        // Workaround for "tensor has no name" issue
        try {
            for (const auto& name : input.get_names()) {
                in_name += name + " , ";
            }
            in_name = in_name.substr(0, in_name.size() - 3);
        } catch (const ov::Exception&) {
        }

        try {
            node_name = input.get_node()->get_friendly_name();
        } catch (const ov::Exception&) {
        }

        if (in_name == "") {
            in_name = "***NO_NAME***";
        }
        if (node_name == "") {
            node_name = "***NO_NAME***";
        }

        qDebug() << "    " << in_name << " (node: " << node_name << ") : " << input.get_element_type().get_type_name() << " / "
                   << ov::layout::get_layout(input).to_string() << " / " << input.get_partial_shape().to_string() ;
    }

    qDebug() << "Network outputs:" ;
    for (auto&& output : network.outputs()) {
        std::string out_name;
        std::string node_name;

        // Workaround for "tensor has no name" issue
        try {
            for (const auto& name : output.get_names()) {
                out_name += name + " , ";
            }
            out_name = out_name.substr(0, out_name.size() - 3);
        } catch (const ov::Exception&) {
        }
        try {
            node_name = output.get_node()->get_input_node_ptr(0)->get_friendly_name();
        } catch (const ov::Exception&) {
        }

        if (out_name == "") {
            out_name = "***NO_NAME***";
        }
        if (node_name == "") {
            node_name = "***NO_NAME***";
        }

        qDebug() << "    " << out_name << " (node: " << node_name << ") : " << output.get_element_type().get_type_name() << " / "
                   << ov::layout::get_layout(output).to_string() << " / " << output.get_partial_shape().to_string() ;
    }
}

NetworkTools

此处为一些个人模型中的辅助函数,如果没有使用到的地方可以直接跳过,或者进行参考修改为自己的工具函数

#include "NetworkTools.h"

cv::Mat NetworkTool::ToolCropImageFromMask(QString imageSrc){
    // load
    cv::Mat image = cv::imread(imageSrc.toStdString());

    // binary
    cv::Mat grayImage, binaryImage;
    cv::cvtColor(image, grayImage, cv::COLOR_BGR2GRAY);
    cv::threshold(grayImage,  binaryImage, 7, 255, cv::THRESH_BINARY);

    // cal roi
    cv::Rect bound = cv::boundingRect(binaryImage);
    int x, y, centerW, centerH, radius;
    centerW = (int)(bound.width / 2);
    centerH = (int)(bound.height / 2);
    radius = MIN(centerW, centerH);
    y = bound.y + centerH - radius;
    x = bound.x + centerW - radius;

    // gen mask
    cv::Mat copyImage = cv::Mat(image, cv::Range(y, y + 2 * radius), cv::Range(x, x + 2 * radius));
    cv::Mat mask = cv::Mat::zeros(copyImage.size(), CV_8UC3);
    cv::circle(mask, cv::Point(radius, radius), radius, cv::Scalar(255, 255, 255), -1);

    // get ori
    cv::Mat maskImage;
    cv::bitwise_and(copyImage, mask, maskImage);
    return maskImage;
}

cv::Mat NetworkTool::ToolCropWithGaussian(cv::Mat inMat){
    cv::Mat resizeImage, gaussianImage;
    cv::resize(inMat, resizeImage, cv::Size(224, 224));
    cv::GaussianBlur(resizeImage, gaussianImage, cv::Size(11, 11), 10.0);

    cv::Mat exposure, rgbImage;
    cv::addWeighted(resizeImage, 4.0, gaussianImage, -4.0, 128.0, exposure);
    cv::cvtColor(exposure, rgbImage, cv::COLOR_BGR2RGB);
    return rgbImage;
}

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
OpenVINO是Intel开发的基于Intel设备的推理引擎,可以利用CPU发挥最好的性能,还能使用到新款CPU所提供的NN算力。下面是OpenVINO推理的一些步骤和方法: 1. 首先,需要将模型转换为OpenVINO支持的IR格式。可以使用OpenVINO提供的Model Optimizer工具进行转换。 2. 接下来,需要加载IR模型并创建推理引擎。可以使用Inference Engine API来完成这些操作。 3. 在创建推理引擎后,需要创建推理请求并设置输入数据。可以使用Inference Engine API中的InferRequest类来完成这些操作。 4. 推理请求创建完成后,可以使用InferRequest类的Infer()方法来执行推理操作。 下面是一个使用OpenVINO进行推理的C++代码示例: ```cpp #include <inference_engine.hpp> using namespace InferenceEngine; int main() { // 加载IR模型并创建推理引擎 Core core; CNNNetwork network = core.ReadNetwork("model.xml", "model.bin"); ExecutableNetwork executable_network = core.LoadNetwork(network, "CPU"); // 创建推理请求并设置输入数据 InferRequest infer_request = executable_network.CreateInferRequest(); Blob::Ptr input_blob = infer_request.GetBlob("input"); float* input_data = input_blob->buffer().as<float*>(); // 设置输入数据 // ... // 执行推理操作 infer_request.Infer(); // 获取输出数据 Blob::Ptr output_blob = infer_request.GetBlob("output"); float* output_data = output_blob->buffer().as<float*>(); // 处理输出数据 // ... return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tacom_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值