IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> OpenCV DNN调用训练好的caffe 模型(目标检测) -> 正文阅读

[人工智能]OpenCV DNN调用训练好的caffe 模型(目标检测)

----回顾之前-----
需要准备的东西:

  • caffee 模型(已经训练好的官网):
    网盘
    password:dqvf
  • 在这里插入图片描述
  • opencv 环境

主要的代码片段:
所需的头文件添加:

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

开始读取模型:
其中 prototxt 为模型卷积层中的属性文档.可以打开看看

    string model = "/home/sms/AI/pyopencv/ssd_caffe/MobileNetSSD_deploy.caffemodel";
    string config = "/home/sms/AI/pyopencv/ssd_caffe/MobileNetSSD_deploy.prototxt";
    //Net net = readNet(model,config,"caffe");
    // 网络读取模型
    Net net = readNetFromCaffe(config,model);
    if (net.empty()) {
        cout << "caffe date error" << endl;
        return 0;
    }else {
        cout <<"finish" << endl;
    }

设置 DNN 加载的模式(兴趣点) OpenCV 和 处理方式

    net.setPreferableBackend(DNN_BACKEND_OPENCV);
    net.setPreferableTarget(DNN_TARGET_CPU);

编写函数读取类的个数和种类:

vector<string> readLabel(string label_path_) 
{
    vector<string> className;
    ifstream fp(label_path_);
    string name;
    while (!fp.eof())
    {
        getline(fp,name);
        if (name.length())
        {
            className.push_back(name);
        }
    }
    fp.close();
    return className;
}

并且执行推理部分:

    Mat result_img  = net.forward("detection_out"); // 获取制定曾的输出(默认最后一层)
    cout << "forwadimg:" << result_img.size[0] << " "<<  result_img.size[1] << " " <<  result_img.size[2]  << " "<<  result_img.size[3] << endl;
    Mat detetion(result_img.size[2],result_img.size[3],CV_32F,result_img.ptr<float>());

设置置信度的阈值和判断结果,并且打印到窗口上面:
因为读取的时候会检索自己的类文本,所有结果需要 index -1

    float conf_threshod = 0.2;
        for (int i = 0; i < detetion.rows; i++)
        {
            float confidents = detetion.at<float>(i,2);
            if (conf_threshod < confidents) {
                int index_ = detetion.at<float>(i,1);
                float tl_x = detetion.at<float>(i,3) * src_img.cols;
                float tl_y = detetion.at<float>(i,4) * src_img.rows;
                float bt_x = detetion.at<float>(i,5) * src_img.cols;
                float bt_y = detetion.at<float>(i,6) * src_img.rows;
                Rect rect_ (tl_x, tl_y,(bt_x  - tl_x),(bt_y - tl_y));
                rectangle(src_img,rect_,Scalar(0,255,0),3,LINE_AA);
                putText(src_img,format("conf:%f,class:%s",confidents,layname[index_-1].c_str()),rect_.tl(),FONT_HERSHEY_COMPLEX,0.7,Scalar(0,0,255),2,LINE_AA);
            }
        }

所有代码:
其中包含了视频读取和图像读取的部分,更改 USE_IMAGE 参数(1 图片读取,0 视频读取)即可得到不同的模式切换.

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

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


#ifndef USE_IAMGE 
#define USE_IAMGE 0
#endif

vector<string> readLabel(string label_path_) 
{
    vector<string> className;
    ifstream fp(label_path_);
    string name;
    while (!fp.eof())
    {
        getline(fp,name);
        if (name.length())
        {
            className.push_back(name);
        }
    }
    fp.close();
    return className;
}
int main() {
    // 加载模型
    // string module_path = "./ssd_caffe/MobileNetSSD_deploy.caffemodel";
    // string config_path  = " ./ssd_caffe/MobileNetSSD_deploy.prototxt";
    string model = "/home/sms/AI/pyopencv/ssd_caffe/MobileNetSSD_deploy.caffemodel";
    string config = "/home/sms/AI/pyopencv/ssd_caffe/MobileNetSSD_deploy.prototxt";
    //Net net = readNet(model,config,"caffe");
    // 网络读取模型
    Net net = readNetFromCaffe(config,model);
    if (net.empty()) {
        cout << "caffe date error" << endl;
        return 0;
    }else {
        cout <<"finish" << endl;
    }
    net.setPreferableBackend(DNN_BACKEND_OPENCV);
    net.setPreferableTarget(DNN_TARGET_CPU);

    vector<string> lay_name = net.getLayerNames();
    for (int i = 0; i < lay_name.size(); i++)
    {
        int id = net.getLayerId(lay_name[i]);
        Ptr<Layer> layer = net.getLayer(id);
        cout << "id = " << id  << " " << "type:" << layer->type.c_str() << " " << "name:" << layer->name.c_str() << endl;
    }

    
    // 构建输入
#if USE_IAMGE == 0
    VideoCapture capture("/home/sms/video/car.mp4");  
#endif

    while (true)
    {
        Mat src_img ;
        // src_img = imread("/home/sms/tu/ball1.jpeg")
#if USE_IAMGE == 1
        src_img = imread("/home/sms/tu/bycle.jpeg");
#else
        capture >> src_img;
#endif
        if (!src_img.empty()) 
        {
            Mat input_image  = blobFromImage(src_img,0.0383, Size(300,300),Scalar(50,50,50),false,false);
            net.setInput(input_image);
            cout << "image input finish" << endl;
        } else
        {
            return 0;
        }
    // 执行推理
    Mat result_img  = net.forward("detection_out"); // 获取制定曾的输出(默认最后一层)
    cout << "forwadimg:" << result_img.size[0] << " "<<  result_img.size[1] << " " <<  result_img.size[2]  << " "<<  result_img.size[3] << endl;
    Mat detetion(result_img.size[2],result_img.size[3],CV_32F,result_img.ptr<float>());

    vector<string> layname = readLabel("/home/sms/AI/pyopencv/ssd_caffe/object_detection_classes_pascal_voc.txt");
    float conf_threshod = 0.2;
        for (int i = 0; i < detetion.rows; i++)
        {
            float confidents = detetion.at<float>(i,2);
            if (conf_threshod < confidents) {
                int index_ = detetion.at<float>(i,1);
                float tl_x = detetion.at<float>(i,3) * src_img.cols;
                float tl_y = detetion.at<float>(i,4) * src_img.rows;
                float bt_x = detetion.at<float>(i,5) * src_img.cols;
                float bt_y = detetion.at<float>(i,6) * src_img.rows;
                Rect rect_ (tl_x, tl_y,(bt_x  - tl_x),(bt_y - tl_y));
                rectangle(src_img,rect_,Scalar(0,255,0),3,LINE_AA);
                putText(src_img,format("conf:%f,class:%s",confidents,layname[index_-1].c_str()),rect_.tl(),FONT_HERSHEY_COMPLEX,0.7,Scalar(0,0,255),2,LINE_AA);
            }
        }
        imshow("src_out_img",src_img);
#if USE_IAMGE == 1
            waitKey(0);
#else
            waitKey(1);
#endif
    }
    

    return 0;
}

直接使用调整的参数不多:
需要调整的地方有:
输入进去的图片缩放因子-0.0383,值越小可是别的物体越多,准确率也会相对下降.

  Mat input_image  = blobFromImage(src_img,0.0383, Size(300,300),Scalar(50,50,50),false,false);

在这里插入图片描述

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章           查看所有文章
加:2022-01-29 23:05:20  更:2022-01-29 23:08:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 2:50:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码