当前位置: 首页 > news >正文

深度学习训练中关于数据处理方式--原始样本采集以及数据增广

         好久没有写博客,一直想重新调整自己的博客,想尽可能写的前后连贯一点,同时希望自己写的更通熟易懂些,可是迟迟没有动笔修改曾经的博文,哎,还是慢慢跟着自己的理解再修改之前的文章吧,今儿就写写关于深度学习训练中最关键的一步,数据问题,也就是样本库的建立!来记录一下自己的心得以及思考!

绪言

        为啥要写数据,又说数据是深度学习中最关键的一步呢?算法是重要,但是呢,真正实际工程中,业务需求 > 数据  > 算法!根据业务需求来选择适合的数据,我们对数据的处理也是来源业务的需求!而数据选择何种增广方式也需要根据实际做的项目来确定的,举个例子!比如:做车型识别,大家可以想象到,车型识别是干嘛的?嗯,“型”是什么?就是形状有所差别吧!很多人可能已经想到了,对,处理数据是,我们就先从几何形状来增广数据!那么如果是车身颜色呢?又有小伙伴会想到是不是先从颜色来入手来增广数据呢?对了嘛,就是的呢!不过,你不能排除其他的影响,你可以先从你可以想到的角度入手,也要测试一下其他的变化方式!比如说,车型对形状敏感,做完形状之后,你来改变一下亮度或者对比度的变化等等!
        本文代码实现是用的Matlab!

一, 原始样本的采集制作

      训练的第一步就是采集数据制作样本!这个我觉得还是挺关键的,我看了很多视频课以及一些博客什么的,很多没有在这里写一些东西,来告知我们一些注意的问题,就是尽可能能保持现实生活中真实的模样,那么是增广的数据也需要注意模拟现实生活中数据模样,通熟一点就是,贴近现实生活场景!
举例子:
        我们需要从图a中截取出Bus,扣出来的图片,当我们送去训练的时候,还需要将所有样本调整到一样的大小!假定我们调整的到128*128大小,如果我们不做任何补缺部分,我们就会出现图b中的左边的图,这个图是发生改变的,也就是说形状发生了改变与真实数据有了偏差!但是我们在确实部分有0来补缺,就会像图b中的左图!如果你来选择你会选择哪一张图呢?毋庸置疑,图b中的左图作为训练数据,同时这个数据还模拟了现实生活中那些被遮挡的数据,你说是不是呢?从这里你有没有得到一个启发,就是如果这是一个完整的车,你可不可以通过将部分置黑来起到数据增广的作用呢?

    
                                                                                                                                        图 a 
     
图 b



二, 数据增广

       在不改变图像类别的情况下,增加数据量,能提高模型的泛化能力!自然图像的数据增广方式包括很多!从几何角度来看,常用的有:水平翻转(也就通差说的是镜像), 一定程度的位移,裁剪,旋转等!从像素变换来看,常用的有:颜色抖动(color jittering),增加噪声,例如椒盐噪声,高斯噪声等。此外还可以尝试多种操作的组合, 例如同时做旋转和随机尺度变换,此外还可以把每个patch中所有像素在HSV颜色空间中的饱和度和明度提升0.25-4次幂方,乘以0.7-1.4之间的一个因子,再加一个-0.1-0.1之间的值。同样你可以在色调通道(H)对每张图片或patch的所有像素增加一个-0.1-0.1之间的值。

1. 几何变换

    (1)翻转
            例如:水平翻转,竖直翻转!其实翻转也不是随意翻转的,要根据实际情况来翻转,比如,关于人脸,你上下翻转了就变成倒的人脸了,这个就没有了实际意义,如果是左右翻转了,也没有太大的实际意义,因为人脸是对称的,你翻转之后还是一样的!但是对于那些没有对称结构的物体图片,你做翻转还是挺有作用的,就相当于有两条数据了啊!不过你,你做测试的时候,可以看看对这个翻转数据敏感不敏感,如果敏感,你就把那些检测错误的数据添加到样本库,或者以低于某个概率的样本增加到样本库!这就起到它的作用了!
matlab代码实现:
bmp = imread(filname);
I = fliplr(bmp);
filename是图片的文件名路径;镜像操作之后的图片如下图所示:
      (2)平移
               这个位置的移动,模拟了现实生活中的那些图片不居中的情况,发生位置的扰动!
matlab代码实现:
bmp = imread(filename);  %读入图片
se= translate(strel(1), [y, x]);
Img = imdilate(bmp, se); 
strel用来创建形态学结构元素;
translate(se, [y, x])在原结构元素se上进行上下偏移,以及左右偏移,y>0 是向下移动,y<0是向上移动;x>0是向左,x<0是向右;
imdilate是形态学膨胀。
平移之后的图片,最左边是原图,中间是向下以及向左平移,最右边的是向上以及向左平移的结果!


     (3)部分置黑
             这个数据模拟了那些被部分遮挡的数据样本
matlab代码实现:
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;


     (4)旋转
  matlab代码实现:
bmp = imread(filename);
I = imrotate(bmp, 10, 'bilinear', 'crop'); 
这里10只是一个数值,可以改为你想旋转的度数。正数向右,负数向左!
这个比较简单,如图所示:
    (5)截切
matlab代码实现:
RGB=imread('1,jpg');
RGB1=imcrop(RGB,[60,255,400,425]);
注意,剪切的时候,在原始的数据上剪切!其实,我觉得这个功能有类似于平移的功能!发生一些位置的偏移!
     (6)缩放(scale)
这个其实就是现实图片放大或者缩小功能!这里的缩放不同于训练前数据统一调整到一样大小的缩放!这只是在原始中稍微改动一些截取的区域,也就是增加或者较少背景的调整,最终还是需要将这些数据调整到你规定的训练数据大小的!

      几何变换暂时先写这么多,后续再进行补充!

2,像素变换

    (1)增加噪声和滤波

matlab代码实现:
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]);  %中值滤波

噪声的方式也比较多,比如椒盐噪声,高斯噪声,中值滤波等等!
   
    (2)变换通道
            就是调整RBG三个通道的顺序
matlab代码实现:
bmp = imread(filename);
I1 = cat(3, bmp(:,:,3), bmp(:,:,2), bmp(:,:,1));
I2 = cat(3, bmp(:,:,1), bmp(:,:,3), bmp(:,:,2));
     
    (3)调整对比度和亮度
         这个模拟了不同光照的影响!这个暂时先不讲了,百度太多了,再写就是重复工作(不过,不排除之后还是补充写一下,哈哈)

其实关于数据像素除了的也还有,就如我刚刚在开头写的都已经帮大家列出来了!
  

结束语

       写这篇文章的目的其实为了梳理一下,在数据处理方便的方法有哪些,如果大家还有一些好的方法,希望大家可以指点我一下!知识在于分享,你知道一个给我一个,我知道一个分享一个给你,那么我们就有两个知识!


相关文章:

  • 【tensorflow实战笔记-分类篇】思路构思
  • 知乎上关于‘深度学习调参技巧’讨论
  • Matlab中@文件夹/+文件夹,类的点滴知识点
  • 入门GAN小示例tensorflow代码解析
  • Maltlab中函数 line()以及text()
  • 阅读MatconvNet中Fast Rcnn源码笔记(1)
  • 深度学习之对抗样本问题
  • 深度学习对抗样本的八个误解与事实
  • 阅读yolo_v1源码(tensorflow)笔记
  • 【Tensorflow1.0+】记录常用函数
  • 【零基础入门学习Python笔记017】GUI的最终选择:Tkinter
  • 用Yolov2模型训练VOC数据集的各文件理解
  • python 中easydict的简单使用
  • Numpy np.array 相关常用操作学习笔记
  • Matconvnet关于simplenn 转dagnn的一些小的总结
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 【347天】每日项目总结系列085(2018.01.18)
  • Android优雅地处理按钮重复点击
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • go append函数以及写入
  • go语言学习初探(一)
  • HTTP那些事
  • Java 内存分配及垃圾回收机制初探
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • Js基础——数据类型之Null和Undefined
  • JS专题之继承
  • SpingCloudBus整合RabbitMQ
  • Theano - 导数
  • vue--为什么data属性必须是一个函数
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 缓存与缓冲
  • 回顾2016
  • 蓝海存储开关机注意事项总结
  • 聊聊redis的数据结构的应用
  • 前端临床手札——文件上传
  • 使用common-codec进行md5加密
  • 通过git安装npm私有模块
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • Hibernate主键生成策略及选择
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (1)(1.9) MSP (version 4.2)
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (20050108)又读《平凡的世界》
  • (day 12)JavaScript学习笔记(数组3)
  • (附源码)springboot教学评价 毕业设计 641310
  • (六)软件测试分工
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (一)VirtualBox安装增强功能
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • .NET CORE Aws S3 使用
  • .net快速开发框架源码分享
  • /*在DataTable中更新、删除数据*/
  • @Resource和@Autowired的区别