基于caffe的CNN_训练+预测_思考记录(1)

训练与测试数据集的预处理与制作,对于CNN在训练时的loss值和预测时的准确度起着至关重要的作用,本节我来介绍如何对数据集进行预处理,并且制作相应的hdf5文件。


以我最近的一个项目为例进行介绍,项目的主要内容是对于输入图片进行回归,回归得到人群密度图。所以数据集便是含有人群的图像。在项目的前期,我选取的数据集是著名的UCSD人群密度数据集。


在分类或回归问题中,标签是与数据集相辅相成的第一要素,为数据集进行标定标签,又是一项极其繁琐的工作,需要耗费大量人力,所以选取附带有已经标定好标签的数据集会给整个项目提高效率。UCSD数据集在前4000张照片中给出了已标定好的标签,所以我暂时先使用前4000张照片作为此次项目的原始数据集。


关于标签,如果是分类问题则会很好理解,像imagenet这样的数据集,每一张图片都有它的类别,例如只要是汽车,不管什么颜色什么型号,最终都会被分类到汽车这样一个标签中去,所以对于imagenet来说,标签就是不同图片的类别名称。而我的项目并非分类问题,而是回归问题,所以标签的概念自然与分类问题不同。分类问题可能是很多图片对应一个标签,而标签本身也十分简单,可能是一个词也可能是一个数字。但是回归问题则不然,每一个不同的图片都对应一个独一无二的标签,并且标签本身也是十分抽象的,可能是一张图片,也可能是一个高维向量,其取决于最终要回归的目标。


就我的项目而言,自然是要将一副含有人群的图片回归到一副人群密度图,那么我的标签则应该是与不同图片分别相对应的人群密度图。在UCSD数据集中,所给出的标签仅仅是对于图像中人头进行标定的关于人头坐标的mat文件,从mat文件到人群密度图还需要一个转化的过程。另外补充一点,对于图片中人群密度的计算,关于人的标定,该领域内绝大部分都是对于人头进行标定,并且均取得了不错的效果,当然也有对身高肩宽等进行标定的,但是因为其复杂性以及非通用型,并没有得到很好的效果。


使用CNN训练数据集的目标便是提取数据集中的图片特征,而一副图片中的特征又有很多,仅仅依靠标签给出的要求很难精确地提取出想要的特征。如果将除感兴趣特征以外的其他大部分特征都是滤去,那么对于感兴趣特征提取的准确率就高多了。举个例子,A老师想要从操场上正在做广播体操的全校同学中找到B同学,但是他只记得B同学的面孔却不知道他的名字,此外他还知道B同学是男生,身高1米8,这可以算是三个特征。如果A老师从全校几千人中挨个寻找的话,很难在短时间准确地找到。所以此时就应该将其他不必要的特征除去,即将不符合以上三个特征的人除去,于是A老师在主席台上用扩音器喊道:“1米8左右的男生留下,其他人都回教室。”很快操场上便剩下很少一部分符合要求的人了,此时A老师再一个一个地找便很容易找得到。


对于数据集预处理也是同样的道理,对于一副图片,我们感兴趣的特征只是图片中的人,对于图片中的其他特征诸如树、草坪、石头我们都不感兴趣,如果能够将这些特征除去,则能缩短训练的时间,同时又能提高训练的准确率。UCSD数据集中的场景正好是一条行人通道,所以基本上所有的人都集中在此一条行人通道上,采取ROI的方法便可以只截取行人通道上的部分,而通道两边的花草树木则都被滤去。通过此一预处理的图片,则会大大提高训练与预测的准确度。具体方法可采用先标定边界点,然后将原始图像通过权值为1和0的蒙板计算得到处理后的图片。


由于有些图片因为人群距离摄像机的远近不同,而导致人体尺度不同,可以考虑对于图片进行透视矫正,对于UCSD数据集中我暂时并未进行透视矫正,可能会在后一阶段考虑加入。


当数据集前期预处理好之后,便要开始制作数据集,因为caffe是不支持直接将图片当作输入的。通常情况下数据集可制作成lmdb和hdf5两种形式,其中lmdb形式对应的是分类问题,在训练时会将分好类的图片和其相应的标签列表写入lmdb文件中,例如caffe自带的mnist手写数字识别模型,lmdb便是一种caffe能够识别的CNN网络输入形式。而对于回归问题,则通常要使用hdf5的形式输入CNN,我在项目中,将预处理后的图片和通过mat文件转后生成后的人群密度图文件一一对应分别写入hdf5文件中,每一个训练与测试图片都要生成一个hdf5文件,当作为数据集导入网络的时候,却是导入写有所有hdf5文件地址的txt文件。


在导入hdf5文件之前,还要对图片进行最后一次预处理,因为考虑到CNN的尺度大小,以及为了满足无论怎样大小的图片网络都可以识别,需要对原始图片进行切块,最好为正方形。在训练时,将图片切块输入网络,在预测时,将分块得到的密度图进行组合拼凑,最终变成原始图片大小。


以上便是我在项目中关于数据集预处理和制作时的一些思考记录。如果CNN是从github上clone下来的,此时预测结果出问题,多半的原因都在数据集的预处理和制作过程。

你可能感兴趣的:(人群密度)