如何使用 opencv 加载 darknet yolo 预训练模型?
如何使用 opencv 加载 darknet yolo 预训练模型?
opencv 版本 > 3.4 以上
constexpr const char *image_path = "darknet.jpg";//待检测图片
constexpr const char *darknet_cfg = "darknet.cfg";//网络文件
constexpr const char *darknet_weights = "darknet.weights";//训练模型
const std::vector<std::string> class_labels = {"darknet","yolo"};//类标签
void darknetDetection(const std::string &path,const std::string &darknet_cfg,const std::string &darknet_weights,std::vector<std::string> class_labels,float confidenceThreshold)
{
// 加载模型
cv::dnn::Net net = cv::dnn::readNetFromDarknet(darknet_cfg,darknet_weights);
// 加载标签集
std::vector<std::string> classLabels = class_labels;
// 读取待检测图片
cv::Mat img = cv::imread(path);
cv::Mat blob = cv::dnn::blobFromImage(img,1.0/255.0,{416,416},0.00392,true);
net.setInput(blob,"data");
// 检测
cv::Mat detectionMat = net.forward("detection_out");// 6 845 1 W x H x C
// 获取网络每层的用时并获取总用时
std::vector<double> layersTimings;
double freq = cv::getTickFrequency() / 1000;
double time = net.getPerfProfile(layersTimings) / freq;
std::ostringstream ss;
ss << "detection time: " << time << " ms";
// 绘制总用时至原始图片
cv::putText(img, ss.str(), cv::Point(20, 20), 0, 0.5, cv::Scalar(0, 0, 255));
// 遍历所有结果集
for(int i = 0;i < detectionMat.rows;++i){
const int probability_index = 5;
const int probability_size = detectionMat.cols - probability_index;
float *prob_array_ptr = &detectionMat.at<float>(i, probability_index);
size_t objectClass = std::max_element(prob_array_ptr, prob_array_ptr + probability_size) - prob_array_ptr;
float confidence = detectionMat.at<float>(i, (int)objectClass + probability_index);
// 比较置信度并绘制满足条件的置信度
if (confidence > confidenceThreshold)
{
float x = detectionMat.at<float>(i, 0);
float y = detectionMat.at<float>(i, 1);
float width = detectionMat.at<float>(i, 2);
float height = detectionMat.at<float>(i, 3);
int xLeftBottom = static_cast<int>((x - width / 2) * img.cols);
int yLeftBottom = static_cast<int>((y - height / 2) * img.rows);
int xRightTop = static_cast<int>((x + width / 2) * img.cols);
int yRightTop = static_cast<int>((y + height / 2) * img.rows);
cv::Rect object(xLeftBottom, yLeftBottom,xRightTop - xLeftBottom,yRightTop - yLeftBottom);//x y w h
cv::rectangle(img, object, cv::Scalar(0, 0, 255), 2, 8);
// 判断类id是否符合标签范围并绘制该标签,也就是矩阵的下标索引
if (objectClass < classLabels.size())
{
cv::String label = cv::String(classLabels[objectClass]) + ": " + std::to_string(confidence);
int baseLine = 0;
cv::Size labelSize = cv::getTextSize(label,cv::FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine);
cv::rectangle(img, cv::Rect(cv::Point(xLeftBottom, yLeftBottom),cv::Size(labelSize.width, labelSize.height + baseLine)),cv::Scalar(255, 255, 255), cv::FILLED);
cv::putText(img, label, cv::Point(xLeftBottom, yLeftBottom + labelSize.height),cv::FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(0, 0, 0));
}
}
}
// 显示图片
cv::imshow("Darknet",img);
cv::waitKey(0);
}
如何使用 opencv 加载 darknet yolo 预训练模型?的更多相关文章
- PyTorch保存模型与加载模型+Finetune预训练模型使用
Pytorch 保存模型与加载模型 PyTorch之保存加载模型 参数初始化参 数的初始化其实就是对参数赋值.而我们需要学习的参数其实都是Variable,它其实是对Tensor的封装,同时提供了da ...
- qt: 打不开png图像以及opencv加载中文路径问题;
经过亲测, QT(版本: 5.9.4)提供的QImageReader或者函数load在加载本地png图像时,均会提示失败, 按照网上的方法,将Qt plugins下的imageformats 拷贝到e ...
- 预加载与智能预加载(iOS)
来源:Draveness(@Draveness) 链接:http://www.jianshu.com/p/1519a5302141 前两次的分享分别介绍了 ASDK 对于渲染的优化以及 ASDK 中使 ...
- Opencv加载网络图片
opencv加载网络图片 #include <iostream> #include <opencv2/opencv.hpp> using namespace std; usin ...
- 【原生JS】图片预加载之无序预加载
图片预加载之无序预加载 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset= ...
- 文字检测模型EAST应用详解 ckpt pb的tf加载,opencv加载
参考链接:https://github.com/argman/EAST (项目来源) https://github.com/opencv/opencv/issues/12491 (遇到的问题) ...
- OpenCV加载图像并显示
从文件中读取一直一张图片,并加载出来 代码: #include "stdafx.h" #include "iostream" using namespace s ...
- 图片预加载 js css预加载
图片预加载, 效果非常明显, 特别是有多个图, 方法很简单 , 体验提升了不少 <div class="hidden"> <script type= ...
- opencv 加载 修改 保存 图像
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; /* 1 加载图像 cv::imre ...
随机推荐
- Struts2的拦截器是如何使用AOP工作的
拦截器(interceptor)是Struts2最强大的特性之一,也可以说是struts2的核心,拦截器可以让你在Action和result被执行之前或之后进行一些处理.同时,拦截器也可以让你将通用的 ...
- 浅谈Spring(一)
Spring 框架是一个分层架构,由 7 个定义良好的模块组成.Spring 模块构建在核心容器之上,核心容器定义了创建.配置和管理 bean 的方式. watermark/2/text/aHR0cD ...
- 注解-->Spring配置
有必要对JDK 5.0新增的注解(Annotation)技术进行简单的学习,因为Spring 支持@AspectJ,而@AspectJ本身就是基于JDK 5.0的注解技术.所以学习JDK 5.0的注解 ...
- freemarker3
结束标签 可以在结束标签中忽略user_def_dir_exp 也就是说可以写</@>来代替</@anything> 循环变量 <@myRepeatMacro count ...
- C++关键字之explicit(显式)
C++ Code 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 ...
- CSDN日报20170411 ——《怎样给自己的私活项目标价》
[程序人生]怎样给自己的私活项目标价 作者:瞬息之间 非常早之前讲过我们"怎么接私活的心得技巧".相信非常多同学听了心里痒痒的.据我认识的(无论是现实生活还是网上接触的)朋友来看. ...
- 剑指 offer set 28 实现 Singleton 模式
singleton 模式又称单例模式, 它能够保证只有一个实例. 在多线程环境中, 需要小心设计, 防止两个线程同时创建两个实例. 解法 1. 能在多线程中工作但效率不高 public sealed ...
- jQuery插件手把手教会(一)
jQuery插件开发教程 ——让你的jQuery水平提升一个台阶 要说jQuery 最成功的地方,我认为是它的可扩展性吸引了众多开发者为其开发插件,从而建立起了一个生态系统.这好比大公司们争相做平台 ...
- Qt计算两个时间差
QTime startTime = QTime::currentTime(); QThread::msleep(SLEEP_TIME_MILL); QTime stopTime = QTime::cu ...
- Linux命令之乐--time
time用于统计命令执行花费的总时间 例一: [root@Director usr]# time ls bin etc games include java lib lib64 libexec loc ...