2017-09-22 20:31:32 iversongzy 阅读数 1938
  • 深度学习项目实战-关键点定位视频课程

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 深度学习项目实战-关键点定位课程以人脸关键点检测为背景,选择多阶段检测的网络架构,对于回归以及多label标签问题选择hdf5作为网络的输入数据源,实例演示如何制作多标签数据源并对原始数据进行数据增强。整个网络架构采用三个阶段的模式,从全局检测到单点校准,基于caffe深度学习框架实现一个既准确又的人脸关键点检测模型。对于每一阶段,详解代码中每一行的意义,带领大家一步步完成整个网络模型。

    5783 人正在学习 去看看 唐宇迪
一、偏差/方差:
深度学习很少谈论偏差,方差权衡问题,一般都是分开讨论:

high bias(underfitting):在训练集上表现的不好
high variance(overfitting):在测试集表现的不好
如下图所示,可以通过training error and dev error 来判断拟合程度:

二、机器学习基础:
在机器学习中通常会考虑方差、偏差均衡问题,需要设计算法使减低任何一方的同时很少影响另一方,而在深度学习中我们不太需要考虑这一点。
通常解决办法: (training data performance)high bias-->1、增加网络的深度或增加隐含层节点数(主要);2、优化算法;3、考虑神经网络架构问题(不常需要考虑)
(dev data performance)high variance-->1、增大数据量(主要);2、正则化;3、考虑神经网络框架
四三、正则化:
1、Logistic Regression:
L1正则化、L2正则化:公式入下图所示:使用L1正则化会使权重稀疏化
其中λ被称作regularization parameter,它可以通过交叉验证寻得最优值。

Neural Network:
Frobenius norm (weight decay)不称作L2 Regularizaion

如果λ设置的很大,权重矩阵W会被设置为接近0的数,调整λ会使权重的影响发生变化(变小),不容易发生过拟合
so如果正则化参数变得很大,参数W会变小,Z也会相对变小,这使得激活函数逼近线性,整个神经网络会计算离线性函数近的值,所以不会过拟合

Dropout Regularization(随机失活):
遍历每一层——设置节点概率——消除一些节点——删除与节点有关的连接
keep_prob:表示保留某个隐藏单元的概率,消除一个隐藏单元的概率为1-keep_prob-->生成随机矩阵
inverted dropout(例:设层数为3):
d3 = np.randn.random(a3.shape[0], a3.shape[1]
a3 = np.multiply(a3, d3)<keep_prob
a3 = a3/keep_prob    #确保a3期望值不变

因为z4 = W4·a3+b4 a3有1-keep_prob的元素归零,为了不影响z4的期望值,/keep_prob将会修正或弥补1-keep_prob概率的那部分
在预测测试阶段不使用dropout,因为测试时候我们不希望输出的结果是随机的

如果担心神经网络的某些层容易发生过拟合,可以把这些层的keep_prob值设置的比其他层的更低
dropout在计算机视觉中应用的比较多,dropout是个正则化方法有助于预防过拟合,在其他领域用的很少
关闭dropout确保J函数单调递减,然后在打开它,这样不会引入bug

其他正则化的方法:
数据增广,data augmentation,或者early stopping

归一化输入(一个加速训练的方法):如果特征值处于相似范围,归一化不是很重要了就。
第一步:零归一化;第二步:归一化方差
如下图左边,必须使用很小的学习率多次迭代才能找到最小值,如果函数是一个更圆的球形轮廓,梯度下降法能更快找到最小值。

2015-06-11 21:28:55 cv_family_z 阅读数 2456
  • 深度学习项目实战-关键点定位视频课程

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 深度学习项目实战-关键点定位课程以人脸关键点检测为背景,选择多阶段检测的网络架构,对于回归以及多label标签问题选择hdf5作为网络的输入数据源,实例演示如何制作多标签数据源并对原始数据进行数据增强。整个网络架构采用三个阶段的模式,从全局检测到单点校准,基于caffe深度学习框架实现一个既准确又的人脸关键点检测模型。对于每一阶段,详解代码中每一行的意义,带领大家一步步完成整个网络模型。

    5783 人正在学习 去看看 唐宇迪

《nature》 机器学习各个分支(branch of machine learning) “深度学习”、“增强式学习”、“概率学习” 的最新的综述。等有空了 把他们翻译成中文

1.Deep learning,Yann LeCun, Yoshua Bengio & Geoffrey Hinton ,2 8 M AY 2 0 1 5 | VO L 5 2 1 | N AT U R E | 深度学习

   Abstract:Deep learning allows computational models that are composed of multiple processing layers to learn representations of data with multiple levels of abstraction. These methods have dramatically improved the state-of-the-art in speech recognition,visual object recognition, object detection and many other domains such as drug discovery and genomics. Deep learning discovers intricate structure in large data sets by using the backpropagation algorithm to indicate how a machine should change its internal parameters that are used to compute the representation in each layer from the representation in the previous layer. Deep convolutional nets have brought about breakthroughs in processing images, video, speech and audio, whereas recurrent nets have shone light on sequential data such as text and speech.

 2.Reinforcement learning improves behaviour from evaluative feedback. Michael L. Littman.2 8 M AY 2 0 1 5 | VO L 5 2 1 | N AT U R E | ,增强式学习

 Abstract:Reinforcement learning is a branch of machine learning concerned with using experience gained through interacting with the world and evaluative feedback to improve a system’s ability to make behavioural decisions. It has been called the artificial intelligence problem in a microcosm because learning algorithms must act autonomously to perform well and achieve their goals. Partly driven by the increasing availability of rich data, recent years have seen exciting advances in the theory and practice of reinforcement learning, including developments in fundamental technical areas such as generalization,planning, exploration and empirical methodology, leading to increasing applicability to real-life problems.

3.Probabilistic machine learning and artificial intelligence.Zoubin Ghahramani.2 8 M AY 2 0 1 5 | VO L 5 2 1 | N AT U R E ,“概率学习”

Abstract: How can a machine learn from experience? Probabilistic modelling provides a framework for understanding what learning is, and has therefore emerged as one of the principal theoretical and practical approaches for designing machines that learn from data acquired through experience. The probabilistic framework, which describes how to represent and manipulate uncertainty about models and predictions, has a central role in scientific data analysis, machine learning,robotics, cognitive science and artificial intelligence. This Review provides an introduction to this framework, and discusses some of the state-of-the-art advances in the field, namely, probabilistic programming, Bayesian optimization,data compression and automatic model discovery.


此外nature 上面也有一篇 “深度学习”结合“增强式学习”的paper-------human level control through deep reinforcement learning(DRL),DeepMind's Nature Paper and Earlier Related Work对该paper的前前后后发展介绍的网页:http://people.idsia.ch/~juergen/naturedeepmind.html

2017-09-21 14:33:43 qq_17448289 阅读数 663
  • 深度学习项目实战-关键点定位视频课程

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 深度学习项目实战-关键点定位课程以人脸关键点检测为背景,选择多阶段检测的网络架构,对于回归以及多label标签问题选择hdf5作为网络的输入数据源,实例演示如何制作多标签数据源并对原始数据进行数据增强。整个网络架构采用三个阶段的模式,从全局检测到单点校准,基于caffe深度学习框架实现一个既准确又的人脸关键点检测模型。对于每一阶段,详解代码中每一行的意义,带领大家一步步完成整个网络模型。

    5783 人正在学习 去看看 唐宇迪

1、调参技巧

深度学习参数和架构设计技巧
Caffe 模型微调 的场景、问题、技巧以及解决方案
Must Know Tips/Tricks in Deep Neural Networks (by Xiu-Shen Wei)

2 数据增强(data augmentation )

在深度学习中,有的时候训练集不够多,或者某一类数据较少,或者为了防止过拟合,让模型更加鲁棒性,data augmentation是一个不错的选择。

常见方法:
Color Jittering:对颜色的数据增强:图像亮度、饱和度、对比度变化(此处对色彩抖动的理解不知是否得当);
PCA Jittering:首先按照RGB三个颜色通道计算均值和标准差,再在整个训练集上计算协方差矩阵,进行特征分解,得到特征向量和特征值,用来做PCA Jittering;
Random Scale:尺度变换;
Random Crop:采用随机图像差值方式,对图像进行裁剪、缩放;包括Scale Jittering方法(VGG及ResNet模型使用)或者尺度和长宽比增强变换;
Horizontal/Vertical Flip:水平/垂直翻转;
Shift:平移变换;
Rotation/Reflection:旋转/仿射变换;
Noise:高斯噪声、模糊处理;
Label shuffle:类别不平衡数据的增广,参见海康威视ILSVRC2016的report;另外,文中提出了一种Supervised Data Augmentation方法,有兴趣的朋友的可以动手实验下。

3、ResNet

论文: Deep Residual Learning for Image Recognition
翻译:
1、[译] Deep Residual Learning for Image Recognition (ResNet) (翻译的比较好,推荐!)
2、 获奖无数的深度残差学习,清华学霸的又一次No.1 | CVPR2016 最佳论文

4、 GoogLeNet

论文地址:

  1. Inception[V1]: Going Deeper with Convolutions
  2. Inception[V2]: Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
  3. Inception[V3]: Rethinking the Inception Architecture for Computer Vision
  4. Inception[V4]: Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning

相关资料整理:

1、 Inception[V1]: Going Deeper with Convolutions
论文翻译
解读材料:

2、Inception[V2]: Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
论文翻译 (不全)
解读材料:
《Batch Normalization Accelerating Deep Network Training by Reducing Internal Covariate Shift》阅读笔记与实现 (评价:自我感觉 这篇blog有点深奥,不是很容易懂。需要很好的数学功底和图像处理知识。)

Batch Normalization导读 (评价:这篇blog把BN的基础、本质讲的很到位。提及到了本质。)

论文笔记-Batch Normalization (评价:这篇blog是对BN全篇论文的总结,扣出了paper重点部分。)

3、Inception[V3]: Rethinking the Inception Architecture for Computer Vision

《Rethinking the Inception Architecture for Computer Vision》笔记 (评价:这篇blog是对V3论文的总结,扣出了paper重点部分,内容较全)

GoogLeNet系列解读 (评价:这篇blog是对V3论文的总结,扣出了paper部分重点。)

4、Inception[V4]:Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning
GoogLeNet:Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning论文笔记 (评价: 总结的不错)

5、其他资料
Deep Learning-TensorFlow (13) CNN卷积神经网络_ GoogLeNet 之 Inception(V1-V4)

5、 通过网络结构估算caffemodel文件的大小

6、通过pre-trianed caffemodel文件大小推出自己任务训练得到的caffemodel文件大小

这里写图片描述这里写图片描述
Netscope 中画出这个网络的网络结构图,一般我们主要更改的是最后一个全连接层的分类类别数目,此网络分类类别数目是21841个类别,global_pool层输出1024个特征,而官方给的fint-tune模型是134.9M大,假设我们做二分类任务,则最终我们根据二分类任务训练得到的caffemodel大小为:134.9M-(1024*21841×4/1024/1024)+(1024*2×4/1024/1024)≈49.6M

7、深度学习中的损失函数总结以及Center Loss函数笔记

文章内总结如下:
1、一种新的loss函数,看起来效果不错,而且也更加符合认知,生成的模型鲁棒性可能更好.
2、本质是度量学习,经常应用在分类领域,原理简单,计算复杂度不大,经常能提升效果.
3、有点使用空间换取时间的意思.
4、属于一个trick.不一定适合所有场景.一般来说,如果同一类样本很类似如mnist手写数字,人脸数据,那么centerloss往往能够带来效果提升.而如果本身同一类样本就差异很大,如cifar100,那么则不一定.也可以理解成一个人的一堆脸取平均值仍然是他的脸,而一堆不同的狗取平均值则可能难以认出是什么.
5、参数设置:a一般取0.5,lambda则0.1-0.0001之间不等,需要实验调参.

8、VGG

论文翻译: VGG:VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION译文

9、DL需要Finetune的原因

摘自知乎:
AlexNetNetwork in NetworkVGGGoogLeNetResnet等CNN网络都是图片分类网络, 都是在imagenet上1.2 million数据训练出来的。由于从这些pretrained网络抽出来的deep feature有良好的generalization的能力,可以应用到其他不同的CV问题,而且比传统的hand-craft feature如SIFT,bag of word要好一大截,所以得到广泛应用。目前大部分的high-level vision相关的问题,都是利用基于CNN的方法了。花点时间去了解这几个核心分类网络的结构和发展,是挺有必要的。一般来说,某CNN网络在imagenet上面的分类结果越好,其deep feature的generalization能力越强。最近出现蛮多论文,里面在benchmark上面的比较是自己方法的核心网络换成resnet,然后去比别人基于vgg或者alexnet的方法,自然要好不少。所以对于某个CV的问题,选一个优秀的核心网络作为基础,然后fine-tune, 已经是套路,这点从ResNet那篇论文的citation的增长就可以看出来。
所以,fine-tune的原因一是训练AlexNet等网络需要imagenet, places等million级别的数据,一般的CV任务都没有这么多数据。二是因为pre-trained model本身的feature已经足够generalizable,可以立刻应用到另外一个CV任务。

10、caffe中的iteration,batch_size, epochs理解

深度学习中经常看到epoch、 iteration和batchsize,下面按自己的理解说说这三个的区别:
(1)batchsize:批大小。在深度学习中,一般采用SGD训练,即每次训练在训练集中取batchsize个样本训练;
(2)iteration:1个iteration等于使用batchsize个样本训练一次;
(3)epoch:1个epoch等于使用训练集中的全部样本训练一次;
举个例子,训练集有1000个样本,batchsize=10,那么:训练完整个样本集需要:100次iteration,1次epoch。

深度机器学习中的batch的大小对学习效果有何影响?

就像lecun里说的一样,随机梯度下降不能像full batch那样明显的保证收敛。一般而言,根据你的GPU显存,设置为最大,而且一般要求是8的倍数(比如32,128),这样,GPU内部的并行运算效率最高

基于SGD的训练batch size不能取过大。过大的batchsize的结果是网络很容易收敛到一些不好的局部最优点。。同样太小的batch也存在一些问题,比如训练速度很慢,训练不容易收敛等。。具体的batch size的选取和训练集的样本数目相关。。举个例子,比如在3小时的语音识别库(大约108万个样本)训练DNN,通常batch 取128..而在300小时的库上会取1024..

batch_size设的大一些,收敛得快,也就是需要训练的次数少,准确率上升得也很稳定,但是实际使用起来精度不高。
batch_size设的小一些,收敛得慢,而且可能准确率来回震荡,所以还要把基础学习速率降低一些;但是实际使用起来精度较高。

接触到pooling主要是在用于图像处理的卷积神经网络中,但随着深层神经网络的发展,pooling相关技术在其他领域,其他结构的神经网络中也越来越受关注。
这个图是一个典型的卷积神经网络结构图,其中的卷积层是对图像的一个邻域进行卷积得到图像的邻域特征,亚采样层就是使用pooling技术将小邻域内的特征点整合得到新的特征。
pooling的结果是使得特征减少,参数减少,但pooling的目的并不仅在于此。pooling目的是为了保持某种不变性(旋转、平移、伸缩等),常用的有mean-pooling,max-pooling和Stochastic-pooling三种。

11、pooling层

mean-pooling,即对邻域内特征点只求平均,max-pooling,即对邻域内特征点取最大。根据相关理论,特征提取的误差主要来自两个方面:(1)邻域大小受限造成的估计值方差增大;(2)卷积层参数误差造成估计均值的偏移。
一般来说,mean-pooling能减小第一种误差,更多的保留图像的背景信息,max-pooling能减小第二种误差,更多的保留纹理信息。Stochastic-pooling则介于两者之间,通过对像素点按照数值大小赋予概率,再按照概率进行亚采样,在平均意义上,与mean-pooling近似,在局部意义上,则服从max-pooling的准则。
LeCun的“Learning Mid-Level Features For Recognition”对前两种pooling方法有比较详细的分析对比,如果有需要可以看下这篇论文。
A Theoretical Analysis of Feature Pooling in Visual Recognition
Learning Mid-Level Features For Recognition
Learning Mid-Level Features For Recognition

pooling原因一是仿照人的视觉系统进行降维(降采样),用更高层的抽象表示图像特征,这一部分内容从Hubel&wiesel视觉神经研究到Fukushima提出,再到LeCun的LeNet5首次采用并使用BP进行求解,是一条线上的内容,原始推动力其实就是仿生,仿照真正的神经网络构建人工网络。二LeCun在98年的文章中对这种降采样其实有一些回答,就是当我们在第一层卷积得到一些特征时,这些特征的组合是我们判断原始图像是什么的关键,因此特征的绝对位置已经不那么重要,其相对位置更重要,举个栗子:字符‘7’,手写的时候提取的特征可能是左上方一条横线特征,右上方一个弯曲特征,然后下方有个稍向左下偏的竖线特征,注意我们判断的时候用的左右,上下这些不精确的相对位置,而不是相差多少个像素这种绝对位置。使用相对位置的好处是对一些平移,卷曲,旋转更鲁棒,否则你的正确接受率可能很高,但错误拒绝率会同样高。

12、R-CNN系列

2014-RCNN-Rich feature hierarchies for accurate object detection and semantic segmentation 翻译
HOG特征
HOG特征
链接中,利用任意一种梯度算子,例如:sobel,laplacian等,对该patch进行卷积,计算得到每个像素点处的梯度方向和幅值。具体公式如下:
这里写图片描述
具体算法为:
这里写图片描述

13、nvidia

Ubuntu下有关显存的命令
nvidia-smi命令
nvidia-smi命令解读
nvidia-smi: Control Your GPUs
这里写图片描述
(图片来源:【Caffe实战与小数据深度学习】CNN的近期进展与实用技巧(下)
Caffe当中目前支持单机多卡的分布式训练,但是基于同步模式,每一轮迭代都要进行梯度的交换。因此在多GPU服务器上就可能存在GPU之间的通讯瓶颈,如果GPU之间不支持P2P方式连接而采用socket连接,会极大影响GPU并行的加速比。Linux下可以采用nvidia-smi topo –m命令查看,如果两块显卡之间的桥接方式为SOC也就是socket连接,那么不推荐使用这两块显卡进行分布式训练。注意显卡的桥接方式由主板硬件决定,无法通过软件修改设置。

14、AlexNet

论文地址: ImageNet Classification with Deep Convolutional Neural Networks
论文翻译:AlexNet论文翻译与解读

15、Xavier

来自这篇论文《Understanding the difficulty of training deep feedforward neural networks》
这里写图片描述
这里写图片描述
具体内容请参考
CNN数值——xavier(上)
CNN数值——xavier(下)

论文大致翻译:Understanding the difficulty of training deep feedforward neural networks

2019-12-18 20:22:46 weixin_44222014 阅读数 288
  • 深度学习项目实战-关键点定位视频课程

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 深度学习项目实战-关键点定位课程以人脸关键点检测为背景,选择多阶段检测的网络架构,对于回归以及多label标签问题选择hdf5作为网络的输入数据源,实例演示如何制作多标签数据源并对原始数据进行数据增强。整个网络架构采用三个阶段的模式,从全局检测到单点校准,基于caffe深度学习框架实现一个既准确又的人脸关键点检测模型。对于每一阶段,详解代码中每一行的意义,带领大家一步步完成整个网络模型。

    5783 人正在学习 去看看 唐宇迪

1. 引言

在深度学习中,为了丰富图像数据的训练集,更好的提取图像特征,泛化模型(防止模型过拟合),一般都会对图像数据进行数据增强(Data Augmentation)。

2. 数据增强

在深度学习中,为了避免出现过拟合(Overfitting),通常我们需要输入充足的数据量。若数据量比较小,可以对原有的图像数据进行几何变换,改变图像像素的位置并保证特征不变。

数据增强,一般常用的方式有旋转图像,剪切图像,改变图像色差,扭曲图像特征,改变图像尺寸大小,增强图像噪音(一般使用高斯噪音,椒盐噪音)等。但是需要注意,尽量不要加入其他图像轮廓的噪音。

  • 旋转 | 反射变换(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.

3. 数据增强方法代码示例

# -*- coding:utf-8 -*-
"""数据增强
   1. 翻转变换 flip
   2. 随机修剪 random crop
   3. 色彩抖动 color jittering
   4. 平移变换 shift
   5. 尺度变换 scale
   6. 对比度变换 contrast
   7. 噪声扰动 noise
   8. 旋转变换/反射变换 Rotation/reflection
   author: XiJun.Gong
   date:2016-11-29
"""
 
from PIL import Image, ImageEnhance, ImageOps, ImageFile
import numpy as np
import random
import threading, os, time
import logging
import cv2
logger = logging.getLogger(__name__)
ImageFile.LOAD_TRUNCATED_IMAGES = True
 
 
class DataAugmentation:
    """
    包含数据增强的八种方式
    """
 
 
    def __init__(self):
        pass
 
    @staticmethod
    def openImage(image):
        return Image.open(image, mode="r")
 
    @staticmethod
    def randomRotation(image, mode=Image.BICUBIC):
        """
         对图像进行随机任意角度(0~360度)旋转
        :param mode 邻近插值,双线性插值,双三次B样条插值(default)
        :param image PIL的图像image
        :return: 旋转转之后的图像
        """
        random_angle = np.random.randint(1, 360)
        return image.rotate(random_angle, mode)
        #return image.rotate(180, mode)
 
    @staticmethod
    def randomFlip(image):
        #图像翻转(类似于镜像,镜子中的自己)
        #FLIP_LEFT_RIGHT,左右翻转
        #FLIP_TOP_BOTTOM,上下翻转
        #ROTATE_90, ROTATE_180, or ROTATE_270.按照角度进行旋转,与randomRotate()功能类似
        return image.transpose(Image.FLIP_LEFT_RIGHT)
   
    @staticmethod
    def Tranform(image):
        #t图像变换
        #im.transform(size, method, data) ⇒ image
 
        #im.transform(size, method, data, filter) ⇒ image
        #1:image.transform((300,300), Image.EXTENT, (0, 0, 300, 300)) 
        #   变量data为指定输入图像中两个坐标点的4元组(x0,y0,x1,y1)。
        #   输出图像为这两个坐标点之间像素的采样结果。
        #   例如,如果输入图像的(x0,y0)为输出图像的(0,0)点,(x1,y1)则与变量size一样。
        #   这个方法可以用于在当前图像中裁剪,放大,缩小或者镜像一个任意的长方形。
        #   它比方法crop()稍慢,但是与resize操作一样快。
        #2:image.transform((300,300), Image.AFFINE, (1, 2,3, 2, 1,4))
        #   变量data是一个6元组(a,b,c,d,e,f),包含一个仿射变换矩阵的第一个两行。
        #   输出图像中的每一个像素(x,y),新值由输入图像的位置(ax+by+c, dx+ey+f)的像素产生,
        #   使用最接近的像素进行近似。这个方法用于原始图像的缩放、转换、旋转和裁剪。
        #3: image.transform((300,300), Image.QUAD, (0,0,0,500,600,500,600,0))
        #   变量data是一个8元组(x0,y0,x1,y1,x2,y2,x3,y3),它包括源四边形的左上,左下,右下和右上四个角。
        #4: image.transform((300,300), Image.MESH, ())
        #   与QUAD类似,但是变量data是目标长方形和对应源四边形的list。
        #5: image.transform((300,300), Image.PERSPECTIVE, (1,2,3,2,1,6,1,2))
        #   变量data是一个8元组(a,b,c,d,e,f,g,h),包括一个透视变换的系数。
        #   对于输出图像中的每个像素点,新的值来自于输入图像的位置的(a x + b y + c)/(g x + h y + 1),
        #   (d x+ e y + f)/(g x + h y + 1)像素,使用最接近的像素进行近似。
        #   这个方法用于原始图像的2D透视。
        return image.transform((300,300), Image.EXTENT, (0, 0, 300, 300))
 
    @staticmethod
    def randomCrop(image):
        """
        对图像随意剪切,考虑到图像大小范围(68,68),使用一个一个大于(36*36)的窗口进行截图
        :param image: PIL的图像image
        :return: 剪切之后的图像
        """
        image_width = image.size[0]
        image_height = image.size[1]
        crop_win_size = np.random.randint(40, 68)
        random_region = (
            (image_width - crop_win_size) >> 1, (image_height - crop_win_size) >> 1, (image_width + crop_win_size) >> 1,
            (image_height + crop_win_size) >> 1)
        return image.crop(random_region)
 
    @staticmethod
    def randomColor(image):
        """
        对图像进行颜色抖动
        :param image: PIL的图像image
        :return: 有颜色色差的图像image
        """
        random_factor = np.random.randint(0, 31) / 10.  # 随机因子
        color_image = ImageEnhance.Color(image).enhance(random_factor)  # 调整图像的饱和度
        random_factor = np.random.randint(10, 21) / 10.  # 随机因子
        brightness_image = ImageEnhance.Brightness(color_image).enhance(random_factor)  # 调整图像的亮度
        random_factor = np.random.randint(10, 21) / 10.  # 随机因1子
        contrast_image = ImageEnhance.Contrast(brightness_image).enhance(random_factor)  # 调整图像对比度
        random_factor = np.random.randint(0, 31) / 10.  # 随机因子
        return ImageEnhance.Sharpness(contrast_image).enhance(random_factor)  # 调整图像锐度
 
    @staticmethod
    def randomGaussian(image, mean=0.2, sigma=0.3):
        """
         对图像进行高斯噪声处理
        :param image:
        :return:
        """
 
        def gaussianNoisy(im, mean=0.2, sigma=0.3):
            """
            对图像做高斯噪音处理
            :param im: 单通道图像
            :param mean: 偏移量
            :param sigma: 标准差
            :return:
            """
            for _i in range(len(im)):
                im[_i] += random.gauss(mean, sigma)
            return im
 
        # 将图像转化成数组
        img = np.asarray(image)
        img.flags.writeable = True  # 将数组改为读写模式
        width, height = img.shape[:2]
        img_r = gaussianNoisy(img[:, :, 0].flatten(), mean, sigma)
        img_g = gaussianNoisy(img[:, :, 1].flatten(), mean, sigma)
        img_b = gaussianNoisy(img[:, :, 2].flatten(), mean, sigma)
        img[:, :, 0] = img_r.reshape([width, height])
        img[:, :, 1] = img_g.reshape([width, height])
        img[:, :, 2] = img_b.reshape([width, height])
        return Image.fromarray(np.uint8(img))
 
    @staticmethod
    def saveImage(image, path):
        image.save(path)
 
 
def makeDir(path):
    try:
        if not os.path.exists(path):
            if not os.path.isfile(path):
                # os.mkdir(path)
                os.makedirs(path)
            return 0
        else:
            return 1
    except Exception, e:
        print str(e)
        return -2
 
 
def imageOps(func_name, image, des_path, file_name, times=5):
    #funcMap = {"randomRotation": DataAugmentation.randomRotation,
    #           "randomCrop": DataAugmentation.randomCrop,
    #           "randomColor": DataAugmentation.randomColor,
    #           "randomGaussian": DataAugmentation.randomGaussian
    #           "randomFlip":DataAugmentation.randomFlip,
    #           }
    funcMap = {
               "Tranform":DataAugmentation.Tranform
               }
    if funcMap.get(func_name) is None:
        logger.error("%s is not exist", func_name)
        return -1
 
    for _i in range(0, times, 1):
        new_image = funcMap[func_name](image)
        DataAugmentation.saveImage(new_image, os.path.join(des_path, func_name + str(_i) + file_name))
 
 
#opsList = {"randomFlip","randomRotation", "randomCrop", "randomColor", "randomGaussian"}
opsList = { "Tranform"}
 
def threadOPS(path, new_path):
    """
    多线程处理事务
    :param src_path: 资源文件
    :param des_path: 目的地文件
    :return:
    """
    if os.path.isdir(path):
        img_names = os.listdir(path)
    else:
        img_names = [path]
    for img_name in img_names:
        print img_name
        tmp_img_name = os.path.join(path, img_name)
        if os.path.isdir(tmp_img_name):
            if makeDir(os.path.join(new_path, img_name)) != -1:
                threadOPS(tmp_img_name, os.path.join(new_path, img_name))
            else:
                print 'create new dir failure'
                return -1
                # os.removedirs(tmp_img_name)
        elif tmp_img_name.split('.')[1] != "DS_Store":
            # 读取文件并进行操作
            image = DataAugmentation.openImage(tmp_img_name)
            threadImage = [0] * 5
            _index = 0
            for ops_name in opsList:
                threadImage[_index] = threading.Thread(target=imageOps,
                                                       args=(ops_name, image, new_path, img_name,))
                threadImage[_index].start()
                _index += 1
                time.sleep(0.2)
 
 
if __name__ == '__main__':
    threadOPS("D:\datasets\dataArgument\JPEGImages",
              "D:\datasets\dataArgument\Dealed_JPEGImages")
没有更多推荐了,返回首页