深度学习训练中关于数据处理方式--原始样本采集以及数据增广
2017-12-02 18:37
357 查看
好久没有写博客,一直想重新调整自己的博客,想尽可能写的前后连贯一点,同时希望自己写的更通熟易懂些,可是迟迟没有动笔修改曾经的博文,哎,还是慢慢跟着自己的理解再修改之前的文章吧,今儿就写写关于深度学习训练中最关键的一步,数据问题,也就是样本库的建立!来记录一下自己的心得以及思考!
本文代码实现是用的Matlab!
一, 原始样本的采集制作
训练的第一步就是采集数据制作样本!这个我觉得还是挺关键的,我看了很多视频课以及一些博客什么的,很多没有在这里写一些东西,来告知我们一些注意的问题,就是尽可能能保持现实生活中真实的模样,那么是增广的数据也需要注意模拟现实生活中数据模样,通熟一点就是,贴近现实生活场景!
举例子:
我们需要从图a中截取出Bus,扣出来的图片,当我们送去训练的时候,还需要将所有样本调整到一样的大小!假定我们调整的到128*128大小,如果我们不做任何补缺部分,我们就会出现图b中的左边的图,这个图是发生改变的,也就是说形状发生了改变与真实数据有了偏差!但是我们在确实部分有0来补缺,就会像图b中的左图!如果你来选择你会选择哪一张图呢?毋庸置疑,图b中的左图作为训练数据,同时这个数据还模拟了现实生活中那些被遮挡的数据,你说是不是呢?从这里你有没有得到一个启发,就是如果这是一个完整的车,你可不可以通过将部分置黑来起到数据增广的作用呢?
![](https://img-blog.csdn.net/20171202161422500?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvU01GMDUwNA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
图 a
![](https://img-blog.csdn.net/20171202163159489?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvU01GMDUwNA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
[align=center]图 b[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left] 例如:水平翻转,竖直翻转!其实翻转也不是随意翻转的,要根据实际情况来翻转,比如,关于人脸,你上下翻转了就变成倒的人脸了,这个就没有了实际意义,如果是左右翻转了,也没有太大的实际意义,因为人脸是对称的,你翻转之后还是一样的!但是对于那些没有对称结构的物体图片,你做翻转还是挺有作用的,就相当于有两条数据了啊!不过你,你做测试的时候,可以看看对这个翻转数据敏感不敏感,如果敏感,你就把那些检测错误的数据添加到样本库,或者以低于某个概率的样本增加到样本库!这就起到它的作用了![/align]
[align=left]matlab代码实现:[/align]
[align=left]filename是图片的文件名路径;镜像操作之后的图片如下图所示:[/align]
![](https://img-blog.csdn.net/20171202171914277?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvU01GMDUwNA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
[align=left] (2)平移[/align]
[align=left] 这个位置的移动,模拟了现实生活中的那些图片不居中的情况,发生位置的扰动![/align]
[align=left]matlab代码实现:[/align]
[align=left]strel用来创建形态学结构元素;[/align]
[align=left]translate(se, [y, x])在原结构元素se上进行上下偏移,以及左右偏移,y>0 是向下移动,y<0是向上移动;x>0是向左,x<0是向右;[/align]
[align=left]imdilate是形态学膨胀。[/align]
[align=left]平移之后的图片,最左边是原图,中间是向下以及向左平移,最右边的是向上以及向左平移的结果![/align]
![](https://img-blog.csdn.net/20171202173842985?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvU01GMDUwNA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
[align=left] (3)部分置黑[/align]
[align=left] 这个数据模拟了那些被部分遮挡的数据样本[/align]
[align=left]matlab代码实现:[/align]
![](https://img-blog.csdn.net/20171202174918015?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvU01GMDUwNA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
[align=left]
[/align]
[align=left] (4)旋转[/align]
[align=left] matlab代码实现:[/align]
[align=left]这里10只是一个数值,可以改为你想旋转的度数。正数向右,负数向左![/align]
[align=left]这个比较简单,如图所示:[/align]
![](https://img-blog.csdn.net/20171202185924277?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvU01GMDUwNA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
[align=left] (5)截切[/align]
[align=left]matlab代码实现:[/align]
[align=left]注意,剪切的时候,在原始的数据上剪切!其实,我觉得这个功能有类似于平移的功能!发生一些位置的偏移![/align]
[align=left] (6)缩放(scale)[/align]
[align=left]这个其实就是现实图片放大或者缩小功能!这里的缩放不同于训练前数据统一调整到一样大小的缩放!这只是在原始中稍微改动一些截取的区域,也就是增加或者较少背景的调整,最终还是需要将这些数据调整到你规定的训练数据大小的![/align]
[align=left]
[/align]
[align=left] 几何变换暂时先写这么多,后续再进行补充![/align]
[align=left]
[/align]
[align=left]matlab代码实现:[/align]
[align=left]噪声的方式也比较多,比如椒盐噪声,高斯噪声,中值滤波等等![/align]
[align=left] [/align]
[align=left] (2)变换通道[/align]
[align=left] 就是调整RBG三个通道的顺序[/align]
[align=left]matlab代码实现:[/align]
[align=left] [/align]
[align=left] (3)调整对比度和亮度[/align]
[align=left] 这个模拟了不同光照的影响!这个暂时先不讲了,百度太多了,再写就是重复工作(不过,不排除之后还是补充写一下,哈哈)[/align]
[align=left]
[/align]
[align=left]其实关于数据像素除了的也还有,就如我刚刚在开头写的都已经帮大家列出来了![/align]
[align=left] [/align]
[/align]
[align=left]
[/align]
绪言
为啥要写数据,又说数据是深度学习中最关键的一步呢?算法是重要,但是呢,真正实际工程中,业务需求 > 数据 > 算法!根据业务需求来选择适合的数据,我们对数据的处理也是来源业务的需求!而数据选择何种增广方式也需要根据实际做的项目来确定的,举个例子!比如:做车型识别,大家可以想象到,车型识别是干嘛的?嗯,“型”是什么?就是形状有所差别吧!很多人可能已经想到了,对,处理数据是,我们就先从几何形状来增广数据!那么如果是车身颜色呢?又有小伙伴会想到是不是先从颜色来入手来增广数据呢?对了嘛,就是的呢!不过,你不能排除其他的影响,你可以先从你可以想到的角度入手,也要测试一下其他的变化方式!比如说,车型对形状敏感,做完形状之后,你来改变一下亮度或者对比度的变化等等!本文代码实现是用的Matlab!
一, 原始样本的采集制作
训练的第一步就是采集数据制作样本!这个我觉得还是挺关键的,我看了很多视频课以及一些博客什么的,很多没有在这里写一些东西,来告知我们一些注意的问题,就是尽可能能保持现实生活中真实的模样,那么是增广的数据也需要注意模拟现实生活中数据模样,通熟一点就是,贴近现实生活场景!举例子:
我们需要从图a中截取出Bus,扣出来的图片,当我们送去训练的时候,还需要将所有样本调整到一样的大小!假定我们调整的到128*128大小,如果我们不做任何补缺部分,我们就会出现图b中的左边的图,这个图是发生改变的,也就是说形状发生了改变与真实数据有了偏差!但是我们在确实部分有0来补缺,就会像图b中的左图!如果你来选择你会选择哪一张图呢?毋庸置疑,图b中的左图作为训练数据,同时这个数据还模拟了现实生活中那些被遮挡的数据,你说是不是呢?从这里你有没有得到一个启发,就是如果这是一个完整的车,你可不可以通过将部分置黑来起到数据增广的作用呢?
图 a
[align=center]图 b[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
二, 数据增广
[align=left] 在不改变图像类别的情况下,增加数据量,能提高模型的泛化能力!自然图像的数据增广方式包括很多!从几何角度来看,常用的有:水平翻转(也就通差说的是镜像), 一定程度的位移,裁剪,旋转等!从像素变换来看,常用的有:颜色抖动(color jittering),增加噪声,例如椒盐噪声,高斯噪声等。此外还可以尝试多种操作的组合, 例如同时做旋转和随机尺度变换,此外还可以把每个patch中所有像素在HSV颜色空间中的饱和度和明度提升0.25-4次幂方,乘以0.7-1.4之间的一个因子,再加一个-0.1-0.1之间的值。同样你可以在色调通道(H)对每张图片或patch的所有像素增加一个-0.1-0.1之间的值。[/align]1. 几何变换
[align=left] (1)翻转[/align][align=left] 例如:水平翻转,竖直翻转!其实翻转也不是随意翻转的,要根据实际情况来翻转,比如,关于人脸,你上下翻转了就变成倒的人脸了,这个就没有了实际意义,如果是左右翻转了,也没有太大的实际意义,因为人脸是对称的,你翻转之后还是一样的!但是对于那些没有对称结构的物体图片,你做翻转还是挺有作用的,就相当于有两条数据了啊!不过你,你做测试的时候,可以看看对这个翻转数据敏感不敏感,如果敏感,你就把那些检测错误的数据添加到样本库,或者以低于某个概率的样本增加到样本库!这就起到它的作用了![/align]
[align=left]matlab代码实现:[/align]
bmp = imread(filname); I = fliplr(bmp);
[align=left]filename是图片的文件名路径;镜像操作之后的图片如下图所示:[/align]
[align=left] (2)平移[/align]
[align=left] 这个位置的移动,模拟了现实生活中的那些图片不居中的情况,发生位置的扰动![/align]
[align=left]matlab代码实现:[/align]
bmp = imread(filename); %读入图片 se= translate(strel(1), [y, x]); Img = imdilate(bmp, se);
[align=left]strel用来创建形态学结构元素;[/align]
[align=left]translate(se, [y, x])在原结构元素se上进行上下偏移,以及左右偏移,y>0 是向下移动,y<0是向上移动;x>0是向左,x<0是向右;[/align]
[align=left]imdilate是形态学膨胀。[/align]
[align=left]平移之后的图片,最左边是原图,中间是向下以及向左平移,最右边的是向上以及向左平移的结果![/align]
[align=left] (3)部分置黑[/align]
[align=left] 这个数据模拟了那些被部分遮挡的数据样本[/align]
[align=left]matlab代码实现:[/align]
I = imread(filename); Img = I; Img(1:up, left:right,:) = 0; Img(down:row, left:right,:) = 0; Img(up:down, 1:left,:) = 0; Img(up:down, right:col,:) = 0;
[align=left]
[/align]
[align=left] (4)旋转[/align]
[align=left] matlab代码实现:[/align]
bmp = imread(filename); I = imrotate(bmp, 10, 'bilinear', 'crop');
[align=left]这里10只是一个数值,可以改为你想旋转的度数。正数向右,负数向左![/align]
[align=left]这个比较简单,如图所示:[/align]
[align=left] (5)截切[/align]
[align=left]matlab代码实现:[/align]
RGB=imread('1,jpg'); RGB1=imcrop(RGB,[60,255,400,425]);
[align=left]注意,剪切的时候,在原始的数据上剪切!其实,我觉得这个功能有类似于平移的功能!发生一些位置的偏移![/align]
[align=left] (6)缩放(scale)[/align]
[align=left]这个其实就是现实图片放大或者缩小功能!这里的缩放不同于训练前数据统一调整到一样大小的缩放!这只是在原始中稍微改动一些截取的区域,也就是增加或者较少背景的调整,最终还是需要将这些数据调整到你规定的训练数据大小的![/align]
[align=left]
[/align]
[align=left] 几何变换暂时先写这么多,后续再进行补充![/align]
2,像素变换
[align=left] (1)增加噪声和滤波[/align][align=left]
[/align]
[align=left]matlab代码实现:[/align]
bmp = imread(filename); I1 = imnoise(bmp, 'salt & pepper'); %椒盐噪声 w = [1 2 1; 2 4 2; 1 2 1]; I2 = imfilter(bmp, w, 'corr', 'replicate'); %高斯噪声 w = [1 1 1; 1 1 1; 1 1 1] / 9; I3 = imfilter(bmp, w, 'corr', 'replicate'); %平均平滑 I4 = medfilt2(bmp, [3, 3]); %中值滤波
[align=left]噪声的方式也比较多,比如椒盐噪声,高斯噪声,中值滤波等等![/align]
[align=left] [/align]
[align=left] (2)变换通道[/align]
[align=left] 就是调整RBG三个通道的顺序[/align]
[align=left]matlab代码实现:[/align]
bmp = imread(filename); I1 = cat(3, bmp(:,:,3), bmp(:,:,2), bmp(:,:,1)); I2 = cat(3, bmp(:,:,1), bmp(:,:,3), bmp(:,:,2));
[align=left] [/align]
[align=left] (3)调整对比度和亮度[/align]
[align=left] 这个模拟了不同光照的影响!这个暂时先不讲了,百度太多了,再写就是重复工作(不过,不排除之后还是补充写一下,哈哈)[/align]
[align=left]
[/align]
[align=left]其实关于数据像素除了的也还有,就如我刚刚在开头写的都已经帮大家列出来了![/align]
[align=left] [/align]
结束语
[align=left] 写这篇文章的目的其实为了梳理一下,在数据处理方便的方法有哪些,如果大家还有一些好的方法,希望大家可以指点我一下!知识在于分享,你知道一个给我一个,我知道一个分享一个给你,那么我们就有两个知识![/align]
[align=left]
[/align]
相关文章推荐
- 百度DMLC分布式深度机器学习开源项目(简称“深盟”)上线了如xgboost(速度快效果好的Boosting模型)、CXXNET(极致的C++深度学习库)、Minerva(高效灵活的并行深度学习引擎)以及Parameter Server(一小时训练600T数据)等产品,在语音识别、OCR识别、人脸识别以及计算效率提升上发布了多个成熟产品。
- 百度DMLC分布式深度机器学习开源项目(简称“深盟”)上线了如xgboost(速度快效果好的Boosting模型)、CXXNET(极致的C++深度学习库)、Minerva(高效灵活的并行深度学习引擎)以及Parameter Server(一小时训练600T数据)等产品,在语音识别、OCR识别、人脸识别以及计算效率提升上发布了多个成熟产品。
- 数据采集-关于post生成ticket传递参数给另一个页面用get方式验证登录
- java学习总结(06,05.16)计算机对数据的储存方式以及原码反码补码的概念
- 深度学习(十三)caffe之训练数据格式
- 深度学习(十三)caffe之训练数据格式
- C++学习之旅——结构体和联合体的区别,以及数据对齐方式影响内存大小
- 关于机器学习、深度学习以及模式识别
- 深度学习文章5:使用caffe对自己的图像数据进行训练并测试
- 【神经网络与深度学习】如何将别人训练好的model用到自己的数据上
- 16 利用scipy.misc等库对jpg以及png等图像数据预处理(用于深度学习喂数据)
- C++中关于原始数据类型指针变量的new操作以及delete操作
- 深度学习常见算法之训练自己的数据
- 【深度学习】笔记6:使用caffe中的CIFAR10网络模型和自己的图片数据训练自己的模型(步骤详解)
- C++学习之旅——结构体和联合体的区别,以及数据对齐方式影响内存大小
- 个人练习数据结构之--------------关于线性数据的有序数组以及之上的二分法查找、不同排序方法的学习
- C++学习之旅——结构体和联合体的区别,以及数据对齐方式影响内存大小
- Tensorflow深度学习入门——采用卷积和池化优化训练MNIST数据——代码+注释
- 数据采集-关于密码使用js脚本进行rsa方式加密的解决方法
- salesforce 零基础学习(三十三)通过REST方式访问外部数据以及JAVA通过rest方式访问salesforce