在第一季度中,按照计划开展样本图像的采集、增强与标注。在深度学习项目中,寻找数据需要花费相当多的时间。但为了要保证完美地完成项目,这两件事情必须做好:一是,寻找更多的数据;二是,对数据进行增强。
在数据采集前期,由于小组人员有限,有限次、有限时段进入食堂取样开展缓慢,对图像采集进度不利。为了快速推进数据采集的完成进度,我们与京元餐厅经理联系自荐,但未最终双方未取得认知的一致,合作失败。后期通过同学联络,请求多位同学帮忙拍摄图像,取得进度上的更快推动。在6月底基本完成对图像的采集,获得图片数量超过一万张。
在采集过程中,我们采用了动态采集与静态采集两种采集方式。动态采集即使用摄像方式获取图像,后期抽帧获得大量样本;静态采集即使用静止拍摄方式获取图像。虽然动态采集为我们的数据集提供了大量样本,但在标注过程中发现动态采集的样本由于拍摄抖动、自动对焦过曝等原因,成像效果过差,手动标注已过于困难,考虑此类样本属于识别上的极端数据,故在后期只是少部分采用。
由于弃用大部分动态采集获得的样本,我们的样本量一定程度减少。为了弥补这个损失,同时也是项目原有计划的一部分,我们需要对数据进行增强。
数据增强即是通过空间、颜色变换等方法,让有限的数据产生更多的等价数据。例如,10张图像是通过对原图做了一些随机的裁剪、旋转操作得来。增强图像的每张图对于网络来说都是不同的输入,这样就将数据扩充到10倍。假如输入网络的图片的分辨率大小是256*256,若采用随机裁剪成224*224的方式,那么一张图最多可以产生32*32张图,数据量扩充将近1000倍。但因许多图相似度太高,实际的效果并不等价。但如果再辅助其他的数据增强方法,将获得更多的数据集,这就是数据增强的本质。
在数据增强过程中,我们使用的主要增强方法为图像翻转、多次随机剪裁、图像旋转、缩放变形、仿射变换、透视变换、噪声叠加、图像模糊、随机擦除、图像锐化等。最终,输出图像样本约3500张。
为了使计算机能够“理解”我们的识别对象,首先需要给它一个“标准答案”,也就是我们的数据集。图像数据要转化为数据集仍然需要进一步标注。由于计划采用Yolo3作为深度学习算法,所以我们首先需要制作VOC格式的xml文件,再将VOC格式的xml文件转换成Yolo格式的txt文件。
制作VOC格式的xml文件过程,我们使用了比较经典的LabelImg,这一工具我们组员在大二暑假均已接触过,使用起来也较为熟悉。这项标注任务较少实质技术内容,但由于样本数量较多,耗时较长。最终获得数据集中有共31类食物,每类食物100张训练样本,这些食物是竹笋炖猪肚、黑木耳、红烧扣肉、卷心菜炒肉、胡萝卜炖排骨、鸡心、鸡块、韭黃、凉拌豆皮、玉米排骨汤、鱼丸汤、鱼肉、炸豆子、荷包蛋、薯条、木耳炒山药、铁板豆腐、宫保鸡丁、狮子头、丝瓜、蘑菇炒笋、马铃薯炒肉、酱肘子、洋葱炒蛋、马铃薯炒蛋、蒸蛋、豆腐块、西红柿炒鸡蛋、冬瓜、红烧肉、红烧茄子。
在第二季度中,按照计划开展搭建yolo模型训练数据集。基于第一季度的项目成果——菜品数据集,训练我们的yolo3模型,将经过增强的样本图片及标注文件输入神经网络,我们初步采用了yolo3官方文档建议的配置参数配置yolo-voc.cfg中的batch、subdivisions、learning_rate、max_batches等参数,计算公式的类别数filter = num × (classes + coords + 1)= 5 ×(1+4+1)= 30),class = 31。
在首次训练中,我们的数据一直未能收敛,各项都是nan。于是我们调小了subdivisions,增大batch,并逐步减小learning_rate,迭代5000次后逐渐收敛。
根据交流得知,初始学习率learning_rate不能过小,太小可能会进入局部最优解,最后无法收敛,在训练过程中,如果训练发散或学习遇到瓶颈loss不变,可以尝试降低learning_rate。增大每一次迭代送到网络的图片数量batch可以让网络在较少的迭代次数内完成一个epoch。在固定最大迭代次数的前提下,增加batch会延长训练时间,但会更好的寻找到梯度下降的方向。batch过小的话会让训练不够收敛,过大会陷入局部最优。同时需要注意,由于资源有限,subdivisions过小、batch过大会导致资源占用高,迭代困难。
最终获得31类菜品的mAP(mean average precision,即平均准确率)分别为Bamboo stewed pork belly(0.8985)、Black Fungus(0.9)、Braised
pork(0.9)、Cabbage fried meat(0.9)、Carrot stewed pork ribs(0.9)、Chicken heart(0.9)、Chicken nuggets(0.9)、Chives(0.9)、Cold soy
skin(0.9)、Corn ribs soup(0.9)、Fish ball soup(0.9)、Fish meat(0.9)、Fried
beans(0.9)、Fried egg(0.9)、Fried potato chips(0.9)、Fungus fried yam(0.9)、Iron plate tofu(0.9)、Kung Pao Chicken(0.83548)、Lion head(0.89832)、Loofah(0.89981)、Mushroom
fried bamboo shoots(0.9)、Potato
crispy meat(0.9)、Sauce ribs(0.9)、Scrambled eggs with onions(0.9)、Scrambled eggs with tomatoe(0.89975)s、Steamed
egg(0.9)、Tofu block(0.9)、Tomato omelette(0.9)、Winter melon(0.89479)、bouilli(0.9)、braised
eggplant(0.89991)。最终平均mAP达到0.8976。
mAP数据略低于预期,后期需要继续增加训练样本、优化网络参数,以提高准确率。
|