目标检测数据集(皮卡丘)讨论区

http://zh.diveintodeeplearning.org/chapter_computer-vision/object-detection-dataset.html

上传中…

如何制作类似的pikachu数据集呢,用于物体检测的?
还有物体检测的数据扩充方法还有例子吗?
谢谢

下载数据集这里,是不是有一个小错误?
root_url = (‘https://apache-mxnet.s3-accelerate.amazonaws.com/
‘gluon/dataset/pikachu/’)
根部木直接引号括起来就可以吧?’ ‘gluon/dataset/pikachu/’,gluon这里前面的两个单引号是不是打多了?

两个字符串在不同行

想问一下如何制作数据集,标签是怎么加入其中的???

有个疑问:
标签形状为(批量,m,5),5的第一个元素代表类别,而文中提到-1代表填充非法边界框
而我在测试MultiBoxTarget是否会自动忽略这种非法边界框的时候报错:

Traceback (most recent call last):
  File "D:/PythonProject/test.py", line 67, in <module>
    print(labels[0], labels[1], labels[2])
  File "D:\Anaconda3\lib\site-packages\mxnet\ndarray\ndarray.py", line 194, in __repr__
    return '\n%s\n<%s %s @%s>' % (str(self.asnumpy()),
  File "D:\Anaconda3\lib\site-packages\mxnet\ndarray\ndarray.py", line 1996, in asnumpy
    ctypes.c_size_t(data.size)))
  File "D:\Anaconda3\lib\site-packages\mxnet\base.py", line 253, in check_call
    raise MXNetError(py_str(_LIB.MXGetLastError()))
mxnet.base.MXNetError: [15:51:31] C:\Jenkins\workspace\mxnet-tag\mxnet\src\operator\contrib\multibox_target.cc:97: Check failed: static_cast<float>(*(p_label + i * label_width + 1)) == -1.0f (0.35 vs. -1) : 

完整代码(之前那个标注边界框小改动的得到的):

from mxnet import image, contrib, gluon, nd
from matplotlib import pyplot as plt
import numpy as np
from IPython import display


# 矢量图显示
def user_svg_display():
    display.set_matplotlib_formats('svg')


# 设置图的尺寸
def set_figsize(figsize=(3.5, 2.5)):
    user_svg_display()
    plt.rcParams['figure.figsize'] = figsize


def bbox_to_rect(bbox, color):
    # 将边界框(左上x,左上y,右下x,右下y)格式转换成matplotlib
    # ((左上x,左上y), 宽,高)
    return plt.Rectangle(
        xy=(bbox[0], bbox[1]), width=bbox[2] - bbox[0], height=bbox[3] - bbox[1],
        fill=False, edgecolor=color, linewidth=2)


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


ground_truth = nd.array([[0, 0.1, 0.08, 0.52, 0.92],
                         [-1, 0.35, 0.4, 0.7, 0.78],
                         [1, 0.55, 0.2, 0.9, 0.88]])
anchors = nd.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]])
set_figsize()
img = image.imread('./img/catdog.jpg').asnumpy()
fig = plt.imshow(img)
np.set_printoptions(2)
h, w = img.shape[0:2]
bbox_scale = nd.array((w, h, w, h))
show_bboxes(fig.axes, ground_truth[:, 1:] * bbox_scale, ['dog', 'illegal', 'cat'], 'k')
show_bboxes(fig.axes, anchors * bbox_scale, ['0', '1', '2', '3', '4'])
plt.show()
labels = contrib.nd.MultiBoxTarget(anchors.expand_dims(axis=0),
                                   ground_truth.expand_dims(axis=0),
                                   nd.zeros((1, 4, 5)),
                                   ignore_label=-1)
print(labels[0], labels[1], labels[2])

所以想知道这里如何处理真实边框数组中的非法边界框

好奇,如果一个图片里面存在多个相同或者不同类别的目标物体,那么,类别预测层的输出是不是有问题?num_anchors*(num_classes+1) channels作为类别预测的话?

版主,课程的微信群如何进入呀

书本上这里写的 batchnorm的参数啥意思呀?之前都稀里糊涂的就是直接batchnorm,没有加任何参数,在这里这个batchnorm的函数的in_channels默认参数是0,这么写肯定在这个里面有啥意义对吧,这个是(动手学深度学习)书本的273面的物体检测的一个高宽减半的函数。 有没有大佬指导一下呀!!!,非常感谢啦!!!

# 高宽减半,输出的一个单元在原特征图的感受野大小为6*6,输出的channels为自己给定的num_channels
# 这里没有明白为啥batchnorm为要设置in_channels=num_channels 这个参数,以前都没的,而且这个参数默认是0
# 说明这里这个参数是有必要的,这是为啥呢?

def down_sample_blk(num_channels):
    blk = nn.Sequential()
    for _ in range(2):
        blk.add(
            nn.Conv2D(num_channels,kernel_size=3,padding=1),
            nn.BatchNorm(in_channels=num_channels),
            nn.Activation('relu')
        )
    blk.add(nn.MaxPool2D(2)) # 这里默认pool_size就是2,没必要写其实
    return blk

版主,你提到了目标检测没有什么小的数据集用于验证模型,所以提出了这个皮卡丘数据集。我想问一下,这个小数据集是不是也不能太小呢?我自己做了一个只有几张图的数据集想先overfit上去,但发现并不能converge(如果是image classification的话一般是可以),是不是因为batch norm存在的原因呢?

请问各位,在国内下载demo里的数据集速度太慢了,有没有什么好方法可以解决呢?谢谢。

同问,求回答

可以试试手动用迅雷下载好再用,或者搭个梯子。

两个问题,目前没想清楚,记下来,看看谁能帮着解释一下,或者等后学我自己学明白了再来填坑。

  1. m是超参吗?还是说数据集定了,这个m就是已知的。
  2. 小批量计算时,为啥要求每张图像含有相同数量(m)的边界框?

m应该是需求与实际数据来定。在计算MultiBoxTarget减少计算量

其实我想到另一个问题:能不能multi-scale也可以学习,这样不用操心大小问题?
另外,为什么执行show_images() 前将imgs/255 ?

填充方法很多,eg. -max float, 目前代码上filter out一下即可

想到ImageDetIter()有个参数max_attempts, 这样先裁切再判断占比是否效率不高?
依据比例来裁切是计算量比较大,我想可以稍加限制采用一个折衷方案RandomResizedCropWithRatio:

  1. 利用min_object_covered在原始image中计算scale, 生成cropped mask,
  2. 利用image size and mask size计算可行区域Y1, X2(each is range set),
  3. 利用这区域随机产生一cropped region(x1,y1,x2,y2)
    这样可以一步到位,不用try and error
    @astonzhang