卷积神经网络CNN-目标分类

来源:互联网 发布:放弃后的心疼网络歌曲 编辑:程序博客网 时间:2024/06/15 02:04

卷积神经网络CNN-目标分类

1. 目标分类基本框架

数据准备

1.数据来源
现有数据集的子集、网络采集、现有数据人工标注。
现有数据:http://deeplearning.net/datasets

2.数据扩充
原始数据切割、噪声颜色等像素变化、旋转平移等姿态变化。
图像效果算子:

  • 高斯:更模糊
  • unsharp:更清楚
  • motion:动作模糊

效果卷积核:

F1 = fspecial('disk',1);F2 = fspecial('average',4);F3 = fspecial('gaussian',3);F4 = fspecial('gaussian',4);F5 = fspecial('unsharp');F6 = fspecial('motion',7,0.75*pi);F7 = fspecial('motion',5,0);F8 = fspecial('motion',5,pi/2);F9 = fspecial('motion',6,pi);F10 = [0 0 0; 0 1 0; 0 0 0];vfilter = {F1, F3, F5, F6, F9, F10};

旋转平移R,T

这里写图片描述

vTrans = {};t1 = maketform('affine',[1 0 2*f; 0 1 2*f; 0 0 1]');t2 = maketform('affine',[0.96 0.1 0; -0.1 0.96 0; 0 0 1]');t3 = maketform('affine',[-1 0 0; 0 1 0; w1 0 1]');t4 = maketform('affine',[0.97 -0.02 0; 0.02 0.97 0; 0 0 1]');t5 = maketform('affine',[1 0 0; 0 1 0; 0 0 1]');t6 = maketform('affine',[1.04 -0.1 0; 0.1 1.04 0; 0 0 1]');t7 = maketform('affine',[1.03 0.02 0; -0.02 1.03 0; 0 0 1]');vTrans = {t1, t2, t3, t5, t6};

3.数据规范
均值处理、归一化、大小调整。

模型设计

任务类型

  • 分类:表情分类、种类分类、人群分类…
  • 分类+回归:表情+程度、种类+信心、什么人+人数…
  • 多目标分类:面部行为、群体行为、车流预测…

训练细节

1.GPU-Batch size ,是否并行
GPU内存-Batch Size关系,Batch Size在实验的过程中,如果设置不合理,就可能会报错。

2.数据循环方式/平衡性考虑

  • 数量较少的类别,数据是否需要补偿;
  • 从到头尾多次循环;
  • 每次随机选取部分数据。

3.网络深度宽度确定
深度与卷积核关系:第i层卷积核关注范围?

这里写图片描述

**问题:**2个3×3的卷积核和1个5×5的卷积核哪种更好?
**Answer:**2个3×3的卷积核更好。

  • 多加一层,可以更加深度的学习;
  • 参数个数上来说,两个3×3的卷积核的参数有18个,一个5×5的卷积核参数有25个,参数更少,层数变多,参数变少。

4.损失函数设计
Softmax、直接拟合

5.学习率变化方式,模型各层学习率是否一致

6.评价方式:准确率,F1 score
F1 score

2Recall×PrecisionRecall+Precison

其中,Recall:TPTP+FN,也就是:正确的1识别/真值所有1的个数;
Precision:TPTP+FP,也就是:正确的1识别/所有认为是1的个数。

2. 迁移学习

迁移学习可以从现有的数据中迁移知识,用来帮助将来的学习。迁移学习(Transfer Learning)的目标是将从一个环境中学到的知识用来帮助新环境中的学习任务。

问题: ImageNet上亿参数,数据量百万,是不是参数多的模型都需要大量数据?
Answer: 并不一定,需要看所需训练模型的大小,是否是训练模型的一部分参数,还是需要训练全部的参数。

1.不同数据处理

这里写图片描述

  • 少量数据的情况下,如果数据是与原来模型训练数据是类似的数据,则可以仅FC层做更新;但如果是不同的数据,则不能确定效果;
  • 大量数据的情况下,如果数据是与原来模型训练数据是类似的数据,则需要对中高层更新;如果是不同的数据,则需要更新更多层。

2.学习率的处理

  • 最底的卷积层基本不变,不进行update;
  • 中间的卷积层视情况而定;
  • 最后全连接层,结构参数均需进行变化。

3. 如何设计神经网络

研究问题:如何进行面部识别

识别面部微小的表情变换。

已有的方法:

DeepFace:需要对齐,用多个卷积核对不同的部位进行训练识别;对齐过程中会引入误差;
Face Alignment:把人脸分成很多小网格,每个小网格对应一个卷积核。

不足

  • 预处理:大量对准,对对准要求高,原始信息可能会丢失;
  • 卷积参数数量很大,模型收敛难度大,需要大量数据;
  • 模型可扩展性差,基本限于人脸计算。

改进的想法

  • 不需要预处理,自动进行局部探测;
  • 不要将所有的区域都进行处理,更多关注在有意义的区域;
  • 重要区域之间不会影响削弱学习的效果。
  • 设计为自适应的学习。

设计来源1—注意力网络

这里写图片描述

  • Dlib或原始数据集,找到人脸关键点;
  • 再由人脸关键点,找到行为单元中心;
  • 再由中心生成注意力图。

如何添加注意力网络:

这里写图片描述

借助ResNet的思想,在普通的网络结构中,加入注意力网络。
这里写图片描述

设计来源2—局部学习网络

针对不同的区域进行针对性学习,不同区域的学习不同,对区域的分布能够自动适应。

这里写图片描述

4. 基于VGG进行人脸表情识别

code:

原创粉丝点击