前期准备
1、锚框的理解
目标检测算法通常会在输入图像中采样大量的区域,然后判断这些区域中是否包含我们感兴趣的目标,并调整区域边缘从而更准确地预测目标的真实边界框(ground-truth bounding box)。以下代码均来自开源mxnet学习模型,本文详细注释作为笔记。
%matplotlib inline
import d2lzh as d2l
from mxnet import contrib, gluon, image, nd
import numpy as np
np.set_printoptions(2)
-
%matplotlib inline:这是一个魔术命令,用于Jupyter Notebook环境中,使得matplotlib生成的图像可以直接显示在代码单元格下面,而不是新开一个窗口。 -
import d2lzh as d2l:导入名为d2lzh的模块,并将其重命名为d2l。 -
from mxnet import contrib, gluon, image, nd:从mxnet库中导入contrib、gluon、image和nd四个模块。mxnet是一个开源的深度学习框架,contrib包含一些额外的功能,gluon是用于构建神经网络的高级API,image提供了图像处理的功能,nd是ndarray的缩写,用于高效的多维数组操作。 -
import numpy as np:导入numpy库,并将其重命名为np。numpy是Python中用于科学计算的基础包,提供了大量的数学函数库,对数组的支持让处理大型矩阵变得方便。 -
np.set_printoptions(2):设置numpy的打印选项,使得打印出的数组每个元素保留两位小数。这对于控制输出的格式非常有用,尤其是在调试或者展示结果时。
img = image.imread('G:\d2lzh/img/catdog.jpg').asnumpy()
h, w = img.shape[0:2]
print(h, w)
X = nd.random.uniform(shape=(1, 3, h, w)) # 构造输入数据
Y = contrib.nd.MultiBoxPrior(X, sizes=[0.75, 0.5, 0.25], ratios=[1, 2, 0.5])
Y.shape
boxes = Y.reshape((h, w, 5, 4))
boxes[250, 250, 0, :]
-
img = image.imread('../img/catdog.jpg').asnumpy():使用MXNet的image模块中的imread函数读取位于../img/catdog.jpg路径的图像文件,并将其转换为NumPy数组。这个数组将包含图像的像素值。 -
h, w = img.shape[0:2]:从图像数组img中获取高度(h)和宽度(w)。img.shape返回一个包含数组维度的元组,[0:2]表示取前两个维度,即高度和宽度。 -
print(h, w):打印出图像的高度和宽度。 -
X = nd.random.uniform(shape=(1, 3, h, w)):使用MXNet的nd模块生成一个随机数数组X,形状为(1, 3, h, w)。这里1表示批量大小(batch size)为1,3表示颜色通道数(RGB),h和w分别是图像的高度和宽度。这个数组模拟了一个批量中的一个图像的输入数据。 -
Y = contrib.nd.MultiBoxPrior(X, sizes=[0.75, 0.5, 0.25], ratios=[1, 2, 0.5]):使用MXNet的contrib.nd模块中的MultiBoxPrior函数生成多尺度锚框(MultiBox Prior)。这个函数接受输入数据X和锚框的尺寸(sizes)以及比例(ratios)。sizes参数定义了锚框的面积相对于基础锚框的面积的比例,而ratios参数定义了锚框的宽高比。这里定义了三组不同的尺寸和比例,用于生成不同大小和形状的锚框。 -
Y.shape:获取生成的多尺度锚框Y的形状。这个形状将告诉我们生成的锚框的数量和维度。由于Y是一个四维数组,其形状将包含批量大小、锚框数量、锚框的维度(通常是4,表示x1, y1, x2, y2即图像中边框里左上角右下角的xy坐标,是除h、w后的结果)。 -
boxes将锚框变量
y的形状变为(图像高,图像宽,以相同像素为中心的锚框个数,4)
# 用于在图像上显示边界框(bounding boxes)的函数
def show_bboxes(axes, bboxes, labels=None, colors=None):
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))
这个函数的目的是将边界框绘制在图像上,并可选地添加标签。它通过循环遍历每个边界框,将其转换为矩形对象,并将其添加到图像的轴对象上。如果提供了标签和颜色,它还会在每个边界框旁边添加文本。
-
def show_bboxes(axes, bboxes, labels=None, colors=None)::定义一个函数show_bboxes,它接受四个参数:axes(图像的轴对象),bboxes(边界框的坐标),labels(可选的边界框标签),colors(可选的边界框颜色)。 -
def _make_list(obj, default_values=None)::定义一个内部函数_make_list,它将任何对象转换为列表。如果对象是None,则使用default_values作为默认值;如果对象不是列表或元组,则将其转换为包含该对象的列表。 -
if obj is None::检查对象是否为None。 -
obj = default_values:如果是None,则将对象设置为默认值。 -
elif not isinstance(obj, (list, tuple))::如果对象不是列表或元组。 -
obj = [obj]:将对象转换为包含该对象的列表。 -
return obj:返回转换后的列表。 -
labels = _make_list(labels):使用_make_list函数确保labels是列表。 -
colors = _make_list(colors, ['b', 'g', 'r', 'm', 'c']):使用_make_list函数确保colors是列表,并提供一个默认颜色列表(蓝色、绿色、红色、洋红色、青色)。 -
for i, bbox in enumerate(bboxes)::遍历边界框列表bboxes,并使用enumerate函数获取每个边界框的索引i和值bbox。 -
color = colors[i % len(colors)]:从颜色列表中循环选择颜色。 -
rect = d2l.bbox_to_rect(bbox.asnumpy(), color):使用d2l包中的bbox_to_rect函数将边界框坐标转换为矩形对象,并指定颜色。 -
axes.add_patch(rect):将矩形对象添加到图像的轴对象上。 -
if labels and len(labels) > i::如果提供了标签列表,并且标签的数量大于当前的索引。

最低0.47元/天 解锁文章
1375

被折叠的 条评论
为什么被折叠?



