目标检测:单发多框检测(SSD)——(mxnet学习笔记)

前期准备

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)
  1. %matplotlib inline:这是一个魔术命令,用于Jupyter Notebook环境中,使得matplotlib生成的图像可以直接显示在代码单元格下面,而不是新开一个窗口。

  2. import d2lzh as d2l:导入名为d2lzh的模块,并将其重命名为d2l

  3. from mxnet import contrib, gluon, image, nd:从mxnet库中导入contribgluonimagend四个模块。mxnet是一个开源的深度学习框架,contrib包含一些额外的功能,gluon是用于构建神经网络的高级API,image提供了图像处理的功能,ndndarray的缩写,用于高效的多维数组操作。

  4. import numpy as np:导入numpy库,并将其重命名为npnumpy是Python中用于科学计算的基础包,提供了大量的数学函数库,对数组的支持让处理大型矩阵变得方便。

  5. 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, :]
  1. img = image.imread('../img/catdog.jpg').asnumpy():使用MXNet的image模块中的imread函数读取位于../img/catdog.jpg路径的图像文件,并将其转换为NumPy数组。这个数组将包含图像的像素值。

  2. h, w = img.shape[0:2]:从图像数组img中获取高度(h)和宽度(w)。img.shape返回一个包含数组维度的元组,[0:2]表示取前两个维度,即高度和宽度。

  3. print(h, w):打印出图像的高度和宽度。

  4. X = nd.random.uniform(shape=(1, 3, h, w)):使用MXNet的nd模块生成一个随机数数组X,形状为(1, 3, h, w)。这里1表示批量大小(batch size)为1,3表示颜色通道数(RGB),hw分别是图像的高度和宽度。这个数组模拟了一个批量中的一个图像的输入数据。

  5. 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参数定义了锚框的宽高比。这里定义了三组不同的尺寸和比例,用于生成不同大小和形状的锚框。

  6. Y.shape:获取生成的多尺度锚框Y的形状。这个形状将告诉我们生成的锚框的数量和维度。由于Y是一个四维数组,其形状将包含批量大小、锚框数量、锚框的维度(通常是4,表示x1, y1, x2, y2即图像中边框里左上角右下角的xy坐标,是除h、w后的结果)。

  7. 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))

这个函数的目的是将边界框绘制在图像上,并可选地添加标签。它通过循环遍历每个边界框,将其转换为矩形对象,并将其添加到图像的轴对象上。如果提供了标签和颜色,它还会在每个边界框旁边添加文本。

  1. def show_bboxes(axes, bboxes, labels=None, colors=None)::定义一个函数show_bboxes,它接受四个参数:axes(图像的轴对象),bboxes(边界框的坐标),labels(可选的边界框标签),colors(可选的边界框颜色)。

  2. def _make_list(obj, default_values=None)::定义一个内部函数_make_list,它将任何对象转换为列表。如果对象是None,则使用default_values作为默认值;如果对象不是列表或元组,则将其转换为包含该对象的列表。

  3. if obj is None::检查对象是否为None

  4. obj = default_values:如果是None,则将对象设置为默认值。

  5. elif not isinstance(obj, (list, tuple))::如果对象不是列表或元组。

  6. obj = [obj]:将对象转换为包含该对象的列表。

  7. return obj:返回转换后的列表。

  8. labels = _make_list(labels):使用_make_list函数确保labels是列表。

  9. colors = _make_list(colors, ['b', 'g', 'r', 'm', 'c']):使用_make_list函数确保colors是列表,并提供一个默认颜色列表(蓝色、绿色、红色、洋红色、青色)。

  10. for i, bbox in enumerate(bboxes)::遍历边界框列表bboxes,并使用enumerate函数获取每个边界框的索引i和值bbox

  11. color = colors[i % len(colors)]:从颜色列表中循环选择颜色。

  12. rect = d2l.bbox_to_rect(bbox.asnumpy(), color):使用d2l包中的bbox_to_rect函数将边界框坐标转换为矩形对象,并指定颜色。

  13. axes.add_patch(rect):将矩形对象添加到图像的轴对象上。

  14. if labels and len(labels) > i::如果提供了标签列表,并且标签的数量大于当前的索引。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值