利用caffe识别水杯

版权声明:坚持原创,禁止转载。 https://blog.csdn.net/SLAM_masterFei/article/details/80437374

由于项目需求,需要识别水杯,于是我想能不能只放杯子数据,然后将输出变为1,就可以训练了,实际上,根本行不通,因为你的数据对应你的标签无论怎么变换都是只有那个唯一标签对应,根本找不到其他的,这样的结果直接导致你的模型无论是杯子还是其他,都是1.0正确率的。看下面这图片就应该懂了

无需多言,根本不存在所谓的单标签,那么应该怎么办,既然只让我识别杯子,我想能否用others和cup两类,但是我发现这样的模型也不是很靠谱,主要在于对others的数据源不好掌握,所以就决定对杯子进行分类。具体结果我们下次再讲。。。我决定实验一波

当我做了简单的二分类,发现由于杯子种类的繁多,很难以一个模型来给出,当我将各种杯子放一起进行训练,并且其他类是一个其他种类时,迭代结果如下:

loss一直居高不下,且accuracy很低,我们推测数据有问题,那么我们尝试给杯子归归类,来看一下迭代结果

我将杯子归为五类,但是迭代很吃力,没有gpu真的很慢而且loss居高不下,我想,这应该不是分类的问题了,而是数据源的问题,可能是图片的质量导致的,所以我将图片resize乘50*50来看看结果。。。

这里遇到一个错误:Check failed: datum_height >= crop_size (50 vs. 227)  我选用网络是alexnet,原因在于该网络默认图片格式位227*227,而我在resize 是50,所以该网络中的crop——size数据即可。

博主在对图片进行裁剪之后再来分类,主要为了让目标尽可能的占据图片,但是做分类时出现如下错误

Cannot copy param 0 weights from layer 'fc6'; shape mismatch.  Source param shape is 4096 256 (1048576); target param shape is 4096 9216 (37748736). To learn this layer's parameters from scratch rather than copying from a saved net, rename the layer.
*** Check failure stack trace: ***

shape不匹配啊,查看deploy文件,修该shape,我们将图片大小改为转二进制的大小,成功。。。

当我分类结束测试的时候,发现效果还是很不理想,请看结果,我测试的都是杯子,但会有如下:

出现了大量的误匹配以及低命中率,我把学习率一次调低依旧没有解决,。。。一时间不知咋办

网上看到一般可以通过data augment来增加数据从而减少过拟合,我用的网络是alexnet,也许对于二分类太复杂了,所以试着采用数据增强来看看结果。主要有一下几类:

  • 旋转 | 反射变换(Rotation/reflection): 随机旋转图像一定角度; 改变图像内容的朝向;
  • 翻转变换(flip): 沿着水平或者垂直方向翻转图像;
  • 缩放变换(zoom): 按照一定的比例放大或者缩小图像;
  • 平移变换(shift): 在图像平面上对图像以一定方式进行平移; 
    可以采用随机或人为定义的方式指定平移范围和平移步长, 沿水平或竖直方向进行平移. 改变图像内容的位置;
  • 尺度变换(scale): 对图像按照指定的尺度因子, 进行放大或缩小; 或者参照SIFT特征提取思想, 利用指定的尺度因子对图像滤波构造尺度空间. 改变图像内容的大小或模糊程度;
  • 对比度变换(contrast): 在图像的HSV颜色空间,改变饱和度S和V亮度分量,保持色调H不变. 对每个像素的S和V分量进行指数运算(指数因子在0.25到4之间), 增加光照变化;
  • 噪声扰动(noise): 对图像的每个像素RGB进行随机扰动, 常用的噪声模式是椒盐噪声和高斯噪声;
  • 颜色变换(color): 在训练集像素值的RGB颜色空间进行PCA, 得到RGB空间的3个主方向向量,3个特征值, p1, p2, p3, λ1, λ2, λ3. 对每幅图像的每个像素

这是参见网上的一些大佬的结果,决定试着做噪声和对比度变换来增加数据。具体测试结果以后见。。。

我对数据分别添加了椒盐噪声和高斯噪声,还对进行旋转变换,总共增加了4倍的数据量,结果还是很喜人了,在迭代600次,accuracy是0.9还是比较不错的,过拟合的问题得到了比较好的解决,虽然最后1000次迭代降到了0.84,初步推测是学习率的问题,整个迭代都是0.01,下次调一下看看会怎样。测试结果如下

可以看到有些杯子识别率还是不错的,但是同样有误识别,这有待我进一步学习深度学习后进行探究和改正,目前对此问题有的想法是调参和增加数据量。。。

怎么说呢,经过这次尝试,还是对深度学习有了一些体会的,也对下一步的打算有了比较好的认识,同样,本文依旧没有结束,对于后期项目的完善我也会第一时间的进行更新,也谢谢读我博客的朋友。

对于后期的处理,我调整了weight——decay参数,我改成了0.0002,我是考虑模型不够复杂时,降低权值来得到比较好的效果,那么迭代结果也是比较好的,1000次迭代成功率0.9还是比较好的。

猜你喜欢

转载自blog.csdn.net/SLAM_masterFei/article/details/80437374
今日推荐