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

  • 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
#endifvector<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 == 0VideoCapture capture("/home/sms/video/car.mp4");
#endifwhile (true){Mat src_img ;// src_img = imread("/home/sms/tu/ball1.jpeg")
#if USE_IAMGE == 1src_img = imread("/home/sms/tu/bycle.jpeg");
#elsecapture >> src_img;
#endifif (!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 == 1waitKey(0);
#elsewaitKey(1);
#endif}return 0;
}

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

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

OpenCV DNN调用训练好的caffe 模型(目标检测)相关推荐

  1. Windows下Caffe的学习与应用(三)——使用OpenCV3调用自己训练好的Caffe模型进行图像分类

    前言 前面的博文中,我试了如何使用caffe训练得到想要的模型与其如何使用别人成熟的模型微调优化自己训练的模型,那么得到训练好的模型之后如何在自己的项目中呢,我这里使用opencv的DNN模块调用ca ...

  2. python caffe 训练自己的模型_python接口调用已训练好的caffe模型测试分类方法

    训练好了model后,可以通过python调用caffe的模型,然后进行模型测试的输出. 本次测试主要依靠的模型是在caffe模型里面自带训练好的结构参数:~/caffe/models/bvlc_re ...

  3. DD3D:基于预训练的单目3D目标检测

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 来源丨CV研习社 作者丨元气满满的打工人 文章导读 导读:3D目标检测的主要应用场景就是自动驾驶,虽然 ...

  4. ssd目标检测训练自己的数据_目标检测Tensorflow object detection API之训练自己的数据集...

    构建自己的模型之前,推荐先跑一下Tensorflow object detection API的demo JustDoIT:目标检测Tensorflow object detection API​zh ...

  5. 基于MMRotate训练自定义数据集 做旋转目标检测 2022-3-30

    本文目录 简述 1.MMrotate下载 2.环境安装 3.自定义数据集制作 3.1 roLabelImg 打标签 3.2 生成DOTA数据集格式的标签 3.3 数据集裁剪(split) 4.修改配置 ...

  6. Windows下通过c++调用训练好的tf模型

    主要参考:Windows下用c++来调用tensorflow训练好的模型 过程与参考博客基本一致,这里主要记录一下我遇到的一些问题 问题1:测试模型的py文件 在pycharm中报错显示 Failed ...

  7. tensorflow: 调用训练好的pb模型实例

    (1)将保存的模型文件解析为GraphDef :graph_def.ParseFromString(gfile.FastGFile("model.pb",'rb').read()) ...

  8. 【Detectron2】使用 Detectron2 训练基于 coco 数据集的目标检测网络

    文章目录 一.安装 Detectron2 二.软连接 coco 数据集 三.训练 四.数据集相关参数 五.输出结果路径 六.COCO 数据集简介 七.模型相关参数 八.可视化结果 一.安装 Detec ...

  9. OpenCV笔记11:利用HSV颜色空间进行目标检测和目标跟踪

    HSV(hue saturation value) 色调(hue):对应于颜色成分(基础色素),因此,只需选择一个色调范围,就可以选择任何颜色.(0-360) 饱和度(saturation):颜色的数 ...

  10. YOLOF训练自己的数据集(目标检测,cvpods版本)

    训练准备: github repo地址:https://github.com/megvii-model/YOLOF github上有两个版本,一个是cvpods,一个是detectron2,第二个我每 ...

最新文章

  1. echarts数据变了不重新渲染,以及重新渲染了前后数据会重叠渲染的问题
  2. cookie和url参数获取的常规实用方法合集(ES6)
  3. LLVM系列文章1: Debian/Ubuntu 安装和使用 LLVM
  4. python帝国cms_Python的类
  5. Kubernetes网络方案Flannel的学习笔记
  6. Python使用数学形态学方法处理图像
  7. 大数据之-入门_大数据部门组织结构(重点)---大数据之hadoop工作笔记0007
  8. 阿里云ECS服务器CentOS7上用户管理操作
  9. 新加坡区块链公司Tribe Accelerator完成7000万美元融资
  10. 吴恩达《机器学习》第十四章:降维
  11. MySQL server has gone away报错原因分析
  12. CF Round #722 (Div. 2) C. Parsa‘s Humongous Tree(树形dp)
  13. 第1章-导言-知识点
  14. html5小说阅读器源码,文本源码阅读器(NexusTextView)
  15. 9008刷机工具_黔隆科技刷机教程OPPOR11忘记密码免刷机保资料解屏幕锁教程
  16. ApacheCN 活动汇总 2019.8.30
  17. 历届奥斯卡最佳影片奖(推荐经典电影)
  18. 1644年,紫禁城换了三任主人
  19. 分布式-分布式常见问题和解决方案
  20. 如何阻止某款软件访问网络

热门文章

  1. vb中如何连接mysql_vb怎么连接数据库
  2. 微软独特的数字化转型思想和方法论
  3. 下载IEEE 论文模板的方法
  4. Ai人工智能相面分销系统,看别人如何爆赚百万
  5. 微信小程序项目2(哔哩哔哩)
  6. 某中学校校园网络方案设计(课程设计)
  7. 微信小程序官方demo下载地址
  8. linux安装开发工具
  9. 腾讯IM : 如何替换String 表情库
  10. QT实现电子表digitalclock