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进阶-YOLO对象检测的代码解读 -> 正文阅读

[人工智能]opencv进阶-YOLO对象检测的代码解读

一、打印输出层

YOLO有多个输出层,打印所有的输出层:

vector <string>outNames=net.getUnconnectedOut;
for (int k= 0;k<outnames.size();k++)
{
printf("output layer name:%s/n",outNames[k].c_str())
}

c_str()函数返回是字符串的一个临时指针

在这里插入图片描述

二、推理输出

由于yolo有多个输出层,因此前项推理的时候跟SSD等模型不同,forward的第二个参数需要填入所有层,结果就会有多张输出的图像,即Mat类,代码如下表示:

vector outs;
net.forward(outs, outNames);

forward推理的所有输出结果都保存在outs数组中,即outputbob,其性质为Mat类。
补充:SSD等检测模型只有一个输出层,因此前向推理时只需要一行代码即可,即:

net.forward()

三、解析输出

在二中说道输出所有的信息都存放在了outs数组中,因此下面要对它进行解析,显示我们想要的数据,有矩形边框、类别名称、置信度,
我们用如下的数组进行表示和保存。

重点:输出的结构为:
【center_x, center_y, width, heigth,confidence,】

vector<int> classIds;
vector<float> confidences;
vector<Rect> boxes;

利用for循环解析输出(outputblob):

//获取输出的数据,并存放在data中,类型为float
	for (size_t i = 0; i < outs.size(); ++i)
		{
			float* data = (float*)outs[i].data;
//循环打印输出
			for (int j = 0; j < outs[i].rows; ++j, data += outs[i].cols)
			{
				Mat scores = outs[i].row(j).colRange(5, outs[i].cols);
				Point classIdPoint;
				double confidence;
				minMaxLoc(scores, 0, &confidence, 0, &classIdPoint);//从scores中输出置信度以及类别最大值

minMaxLoc用法参考:opencv学习-模板匹配

根据是否满足置信度输出classIds、confidences、boxes

if (confidence > 0.5)
				{//得到矩形边框的左上角坐标以及宽高
					int centerX = (int)(data[0] * frame.cols);
					int centerY = (int)(data[1] * frame.rows);
					int width = (int)(data[2] * frame.cols);
					int height = (int)(data[3] * frame.rows);
					int left = centerX - width / 2;
					int top = centerY - height / 2;
					
					//得到类别名,置信度,边框
					classIds.push_back(classIdPoint.x);
					confidences.push_back((float)confidence);
					boxes.push_back(Rect(left, top, width, height));
				}
			}
		}

四、NMS

YOLO有多个输出层,因此一个对象可以在多个层上被检测到,即三中输出的结果是对物体多次边框,所以需要去掉重复的box,这时我们需要用到NMS(非最大抑制

vector<int> indices;
		NMSBoxes(boxes, confidences, 0.5, 0.2, indices);

API-NMSBoxes解读
函数原型:NMSBoxes(bboxes, scores, score_threshold, nms_threshold, eta=None, top_k=None)
各个参数含义:

bboxes:a set of bounding boxes to apply NMS.输入所有的box
scores:a set of corresponding confidences. 输入所有的置信度
score_threshold:a threshold used to filter boxes by score. 过滤掉置信度低于该阈值的box
nms_threshold:a threshold used in non maximum suppression.
indices:the kept indices of bboxes after NMS. 输出进过NMS后的结果,并保存在indices中
以下参数不怎么使用
eta:a coefficient in adaptive threshold formula:
nms_thresholdi+1=eta?nms_thresholdi.
top_k:if >0, keep at most top_k picked indices.

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-08-15 15:32:20  更:2021-08-15 15:32:28 
 
开发: 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年11日历 -2024/11/27 20:35:14-

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