March
1st,
2018
项目介绍
- 项目一:利用深度学习的方法,检测并识别快递单上的手写体电话号码。
- 第一部分定位,在caffe框架下,利用检测算法faster-rcnn,定位电话号码的位置。解决小物体检测、样本不均衡、定位框不准确的问题。
- 第二部分识别,在pytorch框架下,基于概率模型设计CNN,识别电话号码。解决样本不均衡、过拟合的问题。
- 碰到两个网络不兼容的问题,检测网络的误差会在识别网络中放大,造成结果很差。最后通过在识别网络中主动引入背景噪声,加强其抗噪能力。
- 项目二:利用深度学习,处理双目视觉的视差估计
- 简介:传统的视差估计包含动态规划,无法有效并行运算,速度慢。利用深度学习能达到实时效果。
- 利用torch框架设计端到端的全卷积网络。
- 训练中碰到网络过深,难以训练的问题。通过引入多尺度信息、BN层、加入多个中间loss层解决。
- Kaggle比赛:Mercedes-Benz
- 简介:给定汽车的一系列数据,进行回归任务,预测车的安全指数。
- 利用Python scikit-learn分析数据,清洗数据。
- 用xgboost、gbdt、线性回归等基学习器学习;尝试bagging,stacking集成。
项目一:2D人脸年龄变换
目的:
同一个人不同年龄的人脸,脸上皱纹、头发颜色。
主体方法:
GAN(失败)
网络结构:
- CGAN,训练时输入人脸与年龄(标签),测试时根据年龄,得到不同年龄的人;
- encoder-decoder,保持是同一个人。
缺点
- 分辨率不够高,提升分辨率训练难度增加,时间变长;
- 存在畸变。
风格迁移(成功)
思路:青年人作为内容图,老年人作为风格图,将老年人的风格迁移过来,使人脸变老。 难点:产生明显的扭曲、锯齿(通常用风格迁移改变自然环境,因为环境对扭曲、锯齿的容忍度更大)。
网络结构:
- 人脸(不变颜色,变纹理)
- 颜色:建立风格库,选中颜色最接近的,改变色度,使颜色统一。
- 纹理:MRFCNN,基于块的匹配(此处省略具体步骤),锯齿状不明显。
- 问题:锯齿状噪声(gram&匹配);错误匹配(多分辨率,阈值)
- 头发(变颜色,不变纹理,deep photo transfer)
- mask,对应区域转换
- Matting Laplacian:将输入的RGB图片经过局部仿射变换得到灰度抠图,可以理解为得到了纹理信息。这种纹理信息在风格迁移过程中不应该变化,所以将它作为惩罚项加入损失函数。
- 问题:头发形状扭曲(加mask)
- 其他:
- 人脸与头发分割网络,人脸分割后用dlib landmark纠正。
- 人脸对齐:德劳内三角化(任意点不在其他三角形的外接圆中);维诺图(相邻点的中垂线切割整个图,连接所有相邻点得到德劳内三角)
- 人脸融合:泊松融合,在梯度上进行融合。(融合时避免肤色的变化)
项目二:快递单上手写体电话号码的识别
1. 简介
对于一张完整的快递单的扫描件,检测并识别上面的手写体电话号码。项目分为两个步骤:1、检测号码位置;2、识别一串号码(序列识别)。由于数据来源于快递单复印件的扫描件,背景比较模糊,基于点线的传统方法鲁棒性不强,因此采用深度学习的方法。
2. 背景及意义
快递公司中转站需要检查快递单上发件人、收件人的号码,检验其是否在黑名单中。原来这一部分工作是由人工完成,现在可以自动化完成。
难点:
- 数据来源于快递单复印件的扫描件,背景比较模糊,干扰项较多
- 对号码的快速检测
- 序列识别
3. 方法介绍
- 检测网络faster-rcnn
- 号码属于小物体(roipooling 整除带来误差),需要减少中间的pooling次数。为了不损失精度,加深网络。调整anchor参数。
- ohem在线难例搜索,为什么?1、负样本过多,2、干扰项很严重,如其他号码
- 识别网络
- 根据条件概率设计。假设号码最长是12位,网络的结构是:输入一张图片,输出13位(前12位得到识别的数字结果,最后1位是号码长度)。
- 过拟合,(不需要dropout、bn,只需要生成短号码)
- 网络连接
- 定位框不是非常准确,影响后续识别结果(尤其是加入复杂背景)。
- 样本框扩大,加入扰动。
4. 额外思考
最重要的一点:两个模型的结合
- 问题:定位不准的时候,后面的识别网络也无法正常工作(再加上背景干扰)
- 开始:提升定位精度,有限
- 后来:1、干脆识别网络中引入噪声,提升它的鲁棒性(类似random-crop,增大样本,过拟合);2、定位网络中也放大框,进行训练;3、测试时定位的输出进行扰动,产生多个候选,进行识别,投票。
缺陷:
- 不均匀的号码
- 数字位移(图片中第一位是5,结果中第二位是5)
- 时间:定位0.073s,识别0.025s,定位可以采用更快速的网络。
为何不使用LSTM识别号码:
- 背景干扰严重:使用标准数据有结果(??),使用快递单不收敛。
- 增加长度,收敛变慢(??)
如何使用LSTM设计:
- 关键点:如何将图片转换成序列?将图片沿着Y方向切割,形成切片,经过双向LSTM,最后用CTCloss识别。
- 巧妙之处:一个数字可能被切成多片,双向LSTM会考虑到前后的联系,最近的影响大,最远的影响小,有效的识别出数字。
- CTCloss:应用在语音识别领域,用于处理输入长度大于输出的loss。
项目三:基于深度学习的视差估计(毕业设计)
- 概要:传统方法中包含动态规划,比较耗时。利用深度学习,设计端到端的网络,输入左右两张图,输出视差图。
- 数据集:弗莱堡大学driving数据集,用3D软件仿真得到的街景数据,包括视差、光流、语义分割等等。
- 网络结构:输入两张图,各自经过若干卷积层,拼接,反卷积至原来的分辨率。反卷积的过程中加入正向卷积的信息。(看到一篇文章做光流,参考其结构)
- 错误率4.50%(另一篇论文2.61%),速度960*640的图片0.06s(另一篇论文0.78s),TitanX。
一些细节:
- 不收敛,像是梯度消失:设置多个loss,依次训练。
- 多尺度feat的叠加
第一篇论文相关,为了加速一篇论文中的算法:
- 加速,半全局匹配: 能量函数是关于位置、视差的函数,对相邻像素视差超过1的点进行惩罚。在2D范围内求解最小值是NP难的,因此沿着某个方向进行动态规划。比较耗时(0.34+0.44=0.78s)
- 网络结构:左右图中各选取一个patch,通过网络计算cost。网络存在重复计算。
一个kaggle竞赛题
题目
benz,一个回归任务,评价标准r2。只给了数据,没有数据的具体意义。
方法
- 预处理:多分类特征独热码(否则1-3距离大于1-2距离);5折交叉验证,产生数据集。并没有对数据做额外处理(350类,每个都是二值,信息少,含有冗余特征,需要降维)。
- 训练基训练器:xgboost,rm,svr,kmeans(观察数据得到)。看了相关blog,学习高效的手动调参;为了集成,hyperopt自动调参,生成一系列学习器及其准确率、特征;
- 尝试两种集成,先是采用bagging,效果不佳。(设计考虑因素:bagging在复杂模型的基础上构建效果更佳,偏差方差角度,类似RF树很深,因此内部需要查找最佳)内部类似特征选择的包装法,选择的对象是学习器:1、随机选取一部分学习器,取其中准确率最大的k(5)个,将预测特征求平均,并得到结果best-score;2、遍历一遍学习器,将特征与之前的平均特征加权(weight自动调参),得到更好的best-score,记录学习器与权重;3、重复步骤2,直到找不到更大的best-score;4、得到每一次应该选择的学习器与对应权重参数。
- 发现一些特点:1、xgboost的max_depth不大,原因是数据信息量不大,或是数据特征存在冗余,需要进行特征选择(PCA,RF),同时升维;2、集成没有明显效果,原理上没问题,但是不停地贪心加入学习器,会出现过拟合,类似于树太深(限制学习器个数,集成费时间,放弃了)。
- stacking和求平均。1、xgboost训练(XGB效果不错,单独放在一支);2、GBRT+线性回归,stacking叠加(设计考虑因素:基学习器差异大准确高(不同参数,特征),次学习器为避免过拟合选择LR;k-fold,测试集的输出作为新的输入)。二者加权取平均,权重由尝试得来,交叉验证。
总结:
- 如何选特征(删除冗余特征)?
- Forward Selection(贪婪搜索)。抽样部分特征,每个特征有权重,随机森林(不容易过拟合)训练,得到结果。结果超过平均(至少30轮),相应特征的权重增加,不超过平均就减少。当某个权重超过阈值时,加入top_feats。最终的特征由top_feats构成。!!容易过拟合。选择多种模型与抽样参数(每次抽样个数),总的top_feats在它们的基础上平均
- PCA,svd
- 收获:1、特征选择很重要;2、这个比赛对模型融合的要求不高,按照理论操作;3、代码层次,方便加入新学习器;4、逛讨论区,接触新的思路
other
- 机器学习or深度学习:1、调参。机器学习理论性更强;深度学习靠经验,先有成果后写原因。应用层面,个人层面(思维能力、成就感)。