深度学习attention原理_深度学习Anchor Boxes原理与实战技术

深度学习Anchor Boxes原理与实战技术

目标检测算法通常对输入图像中的大量区域进行采样,判断这些区域是否包含感兴趣的目标,并调整这些区域的边缘,以便更准确地预测目标的地面真实边界框。不同的模型可能使用不同的区域采样方法。在这里,我们介绍一种这样的方法:它生成多个大小和纵横比不同的边框,同时以每个像素为中心。这些边界框称为锚框。我们将在下面几节中练习基于锚盒的对象检测。

首先,导入本文所需的包或模块。在这里,我们修改了NumPy的打印精度。因为打印张量实际上调用了NumPy的print函数,所以本文打印的张量中的浮点数更简洁。

%matplotlib inline

from d2l import mxnet as d2l

from mxnet import gluon, image, np, npx

np.set_printoptions(2)

npx.set_np()

1. Generating Multiple Anchor Boxes

假设输入图像的高度为(h),宽度为(w)。我们生成以图像的每个像素为中心的不同形状的锚框。假设大小为(sin (0, 1]),纵横比为(r>0),锚框的宽度和高度分别为(wssqrt{r})和(hs/sqrt{r})。当中心位置给定时,确定一个已知宽度和高度的锚箱。

下面我们设置了一组大小(s_1,ldots,su n)和一组纵横比(ru 1,ldots,ru m)。如果我们使用以每个像素为中心的所有尺寸和纵横比的组合,输入图像将有总共(whnm)个锚框。虽然这些锚盒可以覆盖所有的地面真实边界盒,但计算复杂度往往过高。因此,我们通常只对包含(s_1) 或 (r_1)大小和纵横比的组合感兴趣,即:

[(s_1, r_1), (s_1, r_2), ldots, (s_1, r_m), (s_2, r_1), (s_3, r_1), ldots, (s_n, r_1).]

也就是说,以同一像素为中心的锚框数量为(n+m-1)。对于整个输入图像,我们将生成总共(wh(n+m-1))个锚框。

上述锚箱生成方法已在multibox_prior函数中实现。我们指定输入、一组大小和一组纵横比,此函数将返回输入的所有锚框。

img = image.imread('../img/catdog.jpg').asnumpy()

h, w = img.shape[0:2]

print(h, w)

X = np.random.uniform(size=(1, 3, h, w)) # Construct input data

Y = npx.multibox_prior(X, sizes=[0.75, 0.5, 0.25], ratios=[1, 2, 0.5])

Y.shape

561 728

(1, 2042040, 4)

我们可以看到返回的锚框变量y的形状是(批大小,锚框数量,4)。将锚框变量y的形状更改为(图像高度、图像宽度、以同一像素为中心的锚框数量,4)后,我们可以获得所有以指定像素位置为中心的锚定框。在下面的示例中,我们访问位于(250,250)中心的第一个锚定框。它有四个元素:锚框左上角的(x,y)轴坐标和右下角的(x,y)轴坐标。(x)和(y)轴的坐标值分别除以图像的宽度和高度,因此值范围在0和1之间。

boxes = Y.reshape(h, w, 5, 4)

boxes[250, 250, 0, :]

array([0.06, 0.07, 0.63, 0.82])

为了描述图像中所有以一个像素为中心的锚框,我们首先定义show_bboxes函数来绘制图像上的多个边界框。

#@save

def show_bboxes(axes, bboxes, labels=None, colors=None):

"""Show bounding boxes."""

def _make_list(obj, default_values=None):

if obj is None:

obj = default_values

elif not isinstance(obj, (list, tuple)):

obj = [obj]

return obj

labels = _make_list(labels)

colors = _make_list(colors, ['b', 'g', 'r', 'm', 'c'])

for i, bbox in enumerate(bboxes):

color = colors[i % len(colors)]

rect = d2l.bbox_to_rect(bbox.asnumpy(), color)

axes.add_patch(rect)

if labels and len(labels) > i:

text_color = 'k' if color == 'w' else 'w'

axes.text(rect.xy[0], rect.xy[1], labels[i],

va='center', ha='center', fontsize=9, color=text_color,

bbox=dict(facecolor=color, lw=0))

正如我们看到的,在x轴和y轴的值除以坐标。在绘制图像时,我们需要恢复锚定框的原始坐标值,从而定义变量bbox_scale。现在,我们可以在图像中以(250,250)为中心绘制所有的锚框。如您所见,蓝色锚框大小为0.75,纵横比为1,很好地覆盖了图像中的狗。

d2l.set_figsize((3.5, 2.5))

bbox_scale = np.array((w, h, w, h))

fig = d2l.plt.imshow(img)

show_bboxes(fig.axes, boxes[250, 250, :, :] * bbox_scale,

['s=0.75, r=1', 's=0.5, r=1', 's=0.25, r=1', 's=0.75, r=2',

's=0.75, r=0.5'])

7ee3efb49c15c2a61952cd680bc296c8.png

2. Intersection over Union

我们刚刚提到了锚盒很好地覆盖了图像中的狗。如果已知目标的地面真实边界框,这里的“井”如何量化?一种直观的方法是测量锚盒与地面真实边界盒之间的相似度。我们知道Jaccard索引可以度量两个集合之间的相似性。给定集合(mathcal{A})和(mathcal{B}),它们的Jaccard索引是它们的交集大小除以它们的并集大小:

[J(mathcal{A},mathcal{B}) = frac{left|mathcal{A} cap mathcal{B}right|}{left| mathcal{A} cup mathcal{B}right|}.]

实际上,我们可以将边界框的像素区域视为像素集合。这样,我们就可以通过像素集的Jaccard索引来度量两个边界框的相似度。当我们测量两个边界框的相似性时,我们通常将Jaccard索引称为intersection over union(IoU),即两个边界框的相交面积与并集面积的比值,如图13.4.1所示。IoU的值范围在0到1之间:0表示两个边界框之间没有重叠的像素,而1表示两个边界框相等。

395c87b5835b106438a3c7db4d1d52ff.png

Fig. 1. IoU is the ratio of the intersecting area to the union area of two bounding boxes.

将使用IoU来测量锚定框和地面真实边界框之间以及不同锚定框之间的相似性。

3. Labeling Training Set Anchor Boxes

在训练集中,我们将每个锚盒视为一个训练示例。为了训练目标检测模型,我们需要为每个锚框标记两种类型的标签:第一种是锚框中包含的目标的类别(类别),第二种是地面真相边界框相对于锚定框的偏移量(offset)。在目标检测中,首先生成多个锚框,预测每个锚框的类别和偏移量,根据预测的偏移量调整锚定框的位置,得到用于预测的边界框,最后过滤出需要输出的预测边界框。

我们知道,在目标检测训练集中,每幅图像都标有地面真实边界框的位置和所包含目标的类别。锚盒生成后,我们主要根据与锚盒相似的地面真实边界框的位置和类别信息对锚盒进行标记。那么,我们如何将地面真实边界框指定给与它们类似的锚框呢?

24619103ed79374aefebd83de3112362.png

Fig 2. Assign ground-truth bounding boxes to anchor boxes.

ground_truth = np.array([[0, 0.1, 0.08, 0.52, 0.92],

[1, 0.55, 0.2, 0.9, 0.88]])

anchors = np.array([[0, 0.1, 0.2, 0.3], [0.15, 0.2, 0.4, 0.4],

[0.63, 0.05, 0.88, 0.98], [0.66, 0.45, 0.8, 0.8],

[0.57, 0.3, 0.92, 0.9]])

fig = d2l.plt.imshow(img)

show_bboxes(fig.axes, ground_truth[:, 1:] * bbox_scale, ['dog', 'cat'], 'k')

show_bboxes(fig.axes, anchors * bbox_scale, ['0', '1', '2', '3', '4']);

f3f36cd16a06f88ae5e8afab9f3ef4f3.png

我们可以使用multibox_target函数标记锚定框的类别和偏移量。此函数用于将背景类别设置为0,并将目标类别的整数索引从零递增1(1表示dog,2表示cat)。我们在锚定框和底真值边界框中添加实例维数,并使用expand_dims函数构造形状为(batch size批次大小、类别数包括背景、锚框数量)的随机预测结果。

labels = npx.multibox_target(np.expand_dims(anchors, axis=0),

np.expand_dims(ground_truth, axis=0),

np.zeros((1, 3, 5)))

返回的结果中有三项,都是张量格式。第三项由标记为锚定框的类别表示。

labels[2]

array([[0., 1., 2., 0., 2.]])

我们根据锚框和地面真实边界框在图像中的位置来分析这些标记类别。首先,在所有的“锚框-地面真实边界框”对中,锚框(A_4)到cat的地面真相边界框的IoU最大,因此锚框(A_4)的类别被标记为cat。

返回值的第二项是一个mask变量,其形状为(批大小,锚框数量的四倍)。mask变量中的元素与每个定位框的四个偏移值一一对应。因为我们不关心背景检测,所以负类的偏移量不应该影响目标函数。通过乘以元素,mask变量中的0可以在计算目标函数之前过滤掉负的类偏移量。

labels[1]

array([[0., 0., 0., 0., 1., 1., 1., 1., 1., 1., 1., 1., 0., 0., 0., 0.,

1., 1., 1., 1.]])

返回的第一项是为每个定位框标记的四个偏移量值,负类定位框的偏移量标记为0。

labels[0]

array([[ 0.00e+00, 0.00e+00, 0.00e+00, 0.00e+00, 1.40e+00, 1.00e+01,

2.59e+00, 7.18e+00, -1.20e+00, 2.69e-01, 1.68e+00, -1.57e+00,

0.00e+00, 0.00e+00, 0.00e+00, 0.00e+00, -5.71e-01, -1.00e+00,

-8.94e-07, 6.26e-01]])

4. Bounding Boxes for Prediction

在模型预测阶段,我们首先为图像生成多个锚框,然后逐个预测这些锚框的类别和偏移量。然后,基于锚定框及其预测偏移量得到预测边界框。当有多个锚盒时,同一个目标可以输出许多相似的预测边界框。为了简化结果,我们可以去掉类似的预测边界框。通常称为非最大值抑制(NMS)。

接下来,我们将看一个详细的例子。首先,建造四个锚箱。为了简单起见,我们假设预测的偏移量都为0。这意味着预测边界框是锚定框。最后,我们为每个类别构造一个预测概率。

anchors = np.array([[0.1, 0.08, 0.52, 0.92], [0.08, 0.2, 0.56, 0.95],

[0.15, 0.3, 0.62, 0.91], [0.55, 0.2, 0.9, 0.88]])

offset_preds = np.array([0] * anchors.size)

cls_probs = np.array([[0] * 4, # Predicted probability for background

[0.9, 0.8, 0.7, 0.1], # Predicted probability for dog

[0.1, 0.2, 0.3, 0.9]]) # Predicted probability for cat

在图像上打印预测边界框及其置信级别。

fig = d2l.plt.imshow(img)

show_bboxes(fig.axes, anchors * bbox_scale,

['dog=0.9', 'dog=0.8', 'dog=0.7', 'cat=0.9'])

94cf0a6bad8e241c228f700b1b000bb4.png

我们使用multibox_detection函数来执行NMS,并将阈值设置为0.5。这将向张量输入添加一个示例维度。我们可以看到返回结果的形状是(批量大小,锚框数量,6)。每行的6个元素表示同一预测边界框的输出信息。第一个元素是预测的类别索引,从0开始(0表示dog,1表示cat)。值-1表示NMS中的背景或删除。第二个元素是预测边界框的置信度。其余四个元素是预测边界框左上角的(x,y)轴坐标和右下角的(x,y)轴坐标(值范围在0到1之间)。

output = npx.multibox_detection(

np.expand_dims(cls_probs, axis=0),

np.expand_dims(offset_preds, axis=0),

np.expand_dims(anchors, axis=0),

nms_threshold=0.5)

output

array([[[ 0. , 0.9 , 0.1 , 0.08, 0.52, 0.92],

[ 1. , 0.9 , 0.55, 0.2 , 0.9 , 0.88],

[-1. , 0.8 , 0.08, 0.2 , 0.56, 0.95],

[-1. , 0.7 , 0.15, 0.3 , 0.62, 0.91]]])

我们移除了类别1的预测边界框,并将NMS保留的结果可视化。

fig = d2l.plt.imshow(img)

for i in output[0].asnumpy():

if i[0] == -1:

continue

label = ('dog=', 'cat=')[int(i[0])] + str(i[1])

show_bboxes(fig.axes, [np.array(i[2:]) * bbox_scale], label)

e6492030dde1b147956d56a838c33f43.png

在实际应用中,我们可以在执行NMS之前移除置信水平较低的预测边界框,从而减少NMS的计算量。我们还可以过滤NMS的输出,例如,只保留具有较高置信水平的结果作为最终输出。

5. Summary

我们以每个像素为中心,生成具有不同大小和纵横比的多个锚框。

IoU,也称为Jaccard索引,测量两个边界框的相似性。它是两个边界框的相交面积与并集面积之比。

在训练集中,我们为每个锚盒标记两种类型的标签:一种是锚盒中包含的目标类别,另一种是ground-truth真实边界框相对于锚盒的偏移量。

在预测时,我们可以使用非最大值抑制(NMS)去除相似的预测边界框,从而简化预测结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/547972.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux利用nginx-gridfs搭建部署Nginx和MongoDB文件服务器,支持用户密码验证!

nginx-gridfs是一个nginx的扩展模块,用于支持直接访问MongoDB的GridFS文件系统上的文件并提供 HTTP 访问 1,安装nginx,下载好安装包nginx和nginx-gridfs,此次安装采用nginx1.12.2. mkdir -p /data/soft/nginx-mongodb/ # 创建…

三行代码生成验证码并转换成base64

使用 Hutool 工具类 import cn.hutool.captcha.CaptchaUtil; import cn.hutool.captcha.LineCaptcha; import cn.hutool.core.io.FileUtil; import cn.hutool.core.lang.Console; import sun.misc.BASE64Encoder;import java.io.File; import java.io.FileInputStream; import…

docker 创建容器报: Error response from daemon: C: drive is not shared.

报错 C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error response from daemon: C: drive is not shared. Please share it in Docker for Windows Settings. See C:\Program Files\Docker\Docker\Resources\bin\docker.exe run --help.这时候我们需要绑定盘符…

CentOS 7 搭建swagger Api文档管理系统

1,系统环境 a,操作系统 CentOS Linux release 7.6.1810 (Core) 64位 b,安装Node.js的npm工具环境: # Node 官网已经把 linux 下载版本更改为已编译好的版本了,我们可以直接下载解压后使用: wget http…

宽带和流量是分开的吗_为什么现在的手机套餐与宽带越来越贵,只是因为建设5G吗?...

不知道你有没有这样一种感觉,手机的资费越来越高,并且宽带的资费也是开始上涨,随着5G时代的来到,我们现在的现在的的流量使用量也是越来越大,还记得2018的话费套餐最便宜的最低的只要8块钱,而29元能够办理包…

CentOS7 源码编译安装Redis shell脚本

1,系统环境 操作系统 CentOS Linux release 7.6.1810 (Core) 64位 2,执行以下命令完成安装 yum install -y gcc # 安装依赖包wget http://download.redis.io/releases/redis-5.0.5.tar.gz # 下载Redis安装包 tar -xzvf redis-5.0.5.tar.gzcd red…

SpringBoot 集成WebSocket

什么是WebSocket WebSocket 是一种网络通信协议,很多高级功能都需要它。 我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处? 因为 HTTP 协议有一个缺陷:通信只能由客户端发起。 如果我们想要服务器给…

大学电路题目怎么搜_长沙理工大学2020真题浅析

长沙理工大学2020年821电路,整体感觉难度还行,和邱版《电路》课后题的平均水平相当。整张卷子由9道填空题和七道大题目构成,填空一题5分,大题一题15分。先说说填空,1是一个等效电阻,当然上来先观察下平衡电…

CentOS 7 搭建RAP2r Api文档管理系统

1,系统环境 a,操作系统 CentOS Linux release 7.6.1810 (Core) 64位 2,安装npm环境: # Node 官网已经把 linux 下载版本更改为已编译好的版本了,我们可以直接下载解压后使用: wget https://nodejs.org…

转:VMware、微软等四种主要的网络IO虚拟化模型

本文主要为大家简要介绍VMware、Redhat、Citrix、Microsoft主要虚拟化厂商使用的4种主要的虚拟化IO模型(emulation、para-virtualization、pass-through、SR-IOV)。 本文主要为大家穿针引线,信息量比较大,组织排版有限,看官们将就点看着。 网…

CentOS7安装go开发环境

1,系统环境 操作系统 CentOS Linux release 7.6.1810 (Core) 64位 执行以下命令: wget https://dl.google.com/go/go1.12.5.linux-amd64.tar.gz tar -xzvf go1.12.5.linux-amd64.tar.gz -C /usr/local/ mkdir -p /home/gopath cat >> /etc/p…

非递归遍历二叉树

2019独角兽企业重金招聘Python工程师标准>>> http://hi.baidu.com/lcplj123/item/7875233769fd5522b2c0c582 转载于:https://my.oschina.net/u/939893/blog/126138

Vue.js使用矢量图

安装依赖 npm i svg-sprite-loader --save目录结构 创建 svg-icon 组件 <template><svg :class"svgClass" aria-hidden"true"><use :xlink:href"iconName"/></svg> </template><script> export default {…

aix oracle监听配置_Oracel:ORA-12518:监听程序无法分发客户机连接

一、【问题描述】最近&#xff0c;在系统高峰期的时候&#xff0c;会提示如上的错误&#xff0c;致使无法连接到服务器上的数据库。二、【分析过程】1、首先判断是否由于监听配置不正确的原因导致?系统在正常情况下都可以正常的使用&#xff0c;检查监听配置&#xff0c;完全正…

PowerShell巡检主机获取CPU占用、内存使用、硬盘情况的脚本

Windows底下用PowerShell写的获取CPU核数、占用率&#xff1b;内存可用内存大小&#xff08;GB&#xff09;、使用率&#xff1b;硬盘总空余大小&#xff08;GB&#xff09;&#xff0c;使用率 # 获取硬盘空余空间 function get_disk_free(){ $disk Get-WmiObject -Class win…

4 命名规则_赛普拉斯(Cypress)存储器芯片命名规则

1&#xff0c;前言 赛普拉斯(Cypress)公司是一家知名的电子芯片制造商。赛普拉斯在纽约股票交易所上市&#xff0c;在数据通信、消费类电子等广泛领域均提供芯片解决方案。 2020年4月16日赛普拉斯(Cypress)和英飞凌(infineon)同时对外发文宣布&#xff1a;infineon英飞凌已经完…

数据数据库学通MongoDB——第一天 基础入门

在本文中,我们主要介绍数据数据库的内容,自我感觉有个不错的建议和大家分享下 关于mongodb的利益&#xff0c;长处之类的这里就不说了&#xff0c;一唯要讲的一点就是mongodb中有三元素&#xff1a;数据库&#xff0c;合集&#xff0c;文档&#xff0c;其中“合集” 就是对应关…

win10雷电3接口驱动_技嘉推出B550 主板首发雷电3接口:40Gbps速率、Intel主控

下周AMD针对主流市场的B550芯片组就要上市了&#xff0c;千元级主板上也有PCIe 4.0了。技嘉今天又宣布了一款新型号主板——B550 Vison D&#xff0c;它竟然支持Intel独家的Thunderbolt 3&#xff08;俗称雷电3&#xff09;接口&#xff0c;这还是B550中首款&#xff0c;40Gbps…

eclipse--eclipse(JavaEE版本)部署Tomcat工程(转)

介绍如何在eclipse&#xff08;JavaEE版本&#xff09;中部署Tomcat工程&#xff0c; 转自“http://www.cnblogs.com/chenjunbiao/archive/2011/12/09/2281702.html” “http://www.iteye.com/topic/825394” Eclipse下Tomcat常用设置 1&#xff0c;Eclipse建立Tomcat服务 1.1 …

python工程师需要考什么证_考垃圾处理清运工程师证哪里颁发的今年的考试时间即将告知...

考垃圾处理清运工程师证哪里颁发的今年的考试时间即将告知二、中级会计师(会计师)资格考试。三、高级会计师资格考试。四、中级会计师资格考试。五、注册税务师职称。六、注册公司登记。七、注册会计师、法人和其他组织的税务师资格考试。八、注册税务师职称。而在报名的时候不…