本帖最后由 宇智波·佐助 于 2017-7-16 16:34 编辑
课程使用的程序、模型和代码下载和PPT下载:
4.classif_facerec.rar
4.classif_facerec.ppt
地址:https://share.weiyun.com/499c6512fa6ab2eb6fd3d978af6c8cd3
大纲总览
深度学习下的验证码识别教程 点我查看
这节课就不录视频了哈
图像识别、分类,是CNN最强有力的一个功能,也是比较有用的一种技术,能做很多扩展功能。这里我们讲关于分类识别的步骤和注意细节。
准确来说,验证码识别也是一种分类任务,不过是分类的一种特殊形式,多任务分类
多分类的样本不太好找,就找了麻将牌的图片来做演示
分类任务的第一步, 准备样本
我们样本的存放结构是,建立一个samples目录,目录下继续建立我们n个类别的类别文件夹,每个文件夹中再放我们每个类别的样本即可。
第二步,样本增广
由于样本量太少,不足以用来训练,我们可以通过将样本增广的手段扩充样本量。使得训练的模型更具鲁棒性,泛化能力更好。增广的方法,通常有缩放、旋转、镜像、平移、模糊、光照模拟等做法,尽可能的模拟我们识别任务中会遇到的场景来增广他,注意增广产生的背景需要给随即色(避免影响)
这里有提供一个简单的镜像旋转和缩放的增广程序:aug.py,如果你直接执行他,会看到目录下会多了这么些图片
第三步,创建label文件 这里我们使用分类专用的make-label.py生成label文件
第四步,就是选择合适的网络 这里我们选择的是 GoogLeNet网络,修改好分类的输出层为34,然后开始微调基于ImageNet的模型 googleNet有点特殊,因为他有3个loss、和精度,分别是代表三个阶段的分类情况,修改输出层类别为34时必须要3个都修改。 我们可以搜索,loss1、loss2、loss3,就能找到他 通过950次迭代,我们得到一个精度100%的模型。然后我们可以测试一下,程序在:人脸识别/麻将识别、图像识别.e
分类就这么愉快的结束了,主要目的是其过程,我们可以采用很多其他的模型,例如ResNet、VGG、NIN等等,他们都是非常优秀的模型。我们一定要掌握分类网络的训练方法,和注意事项,例如数据增广的问题。
我们基于分类的知识,还可以做到进一步,例如图像分级的任务,比如我们要对猪肉的照片做级别评判。这时候我们可以收集例如5级别的猪肉图片,然后作6类样本去训练,其中5类是猪肉的1-5级,而第六类我们会给其他图片,就是可能造成影响的图片,这类图片我们认为是0级,就是认为这图片不是猪肉的图片(这个设计的必要性根据任务确定就好了)。
其实,人脸识别,也是一种图像识别、分类技术的一个分支。
人脸识别
人脸识别,一直是一个比较高大上的技术,但现在其实也是很容易驾驭他的。而这个技术的主要方法,跟上面我们提到的分类技术,基本上是一样的。我们清楚了人脸识别的技术原理,也就能利用人脸识别的方法,进一步做到图像识别、检索等等。例如百度的以图搜图技术的实现等等
-------------------------------------------------------------------------------------------------------------------------
特征:
对一个图片的一种描述,比如128维特征,即该128个小数值表达了这一幅图,如果这个小数值表达能力足够的好,那么对我们而言,越相同的图片,他的这128个数值就越像。而越不同的,势必就越不像。
CNN有提取特征的能力,只要模型提取特征能力足够好,我们完全可以把图片特征提取出来,保存下来。对于任何一个新图片,我只需要提取他的特征,然后用这个特征在我们保存的库中全部比较一下,就能找到跟他最相似的一些图片,进而识别他。
这里说的模型提取能力足够好,是指在特定任务上,区分能力要足够的好,例如药盒识别,想要区分能力好,用ImageNet的模型是不行的,我们需要一定量的药盒图片做训练,他才能够细粒度的区分每个药盒是什么。
这里说的比较一下,就是把两个图的特征,计算一下夹角余弦距离,得到的值即为两个特征的相似度,就表达了比较的两个图的相似程度,通过这个程度,我们简单的给个阈值,即满足该阈值就是这个目标就好了。
-------------------------------------------------------------------------------------------------------------------------
网络的特征层?
对于一个分类的网络,通常最后我们接的都是softmaxWithLoss,softmaxWithLoss前面是一个n个输出的全连接层InnerProduct,例如如下关系:
Data Layer
...巴拉巴拉
Feat Layer(num output = k)
InnerProduct Layer(num output = n)
SoftmaxWIthLoss
Accuracy
这里我们主要表达的是特征层所在的位置,特征层在Caffe网络中,分类层的前一层,即是。例如上面的例子,我们的特征长度是k(如果不是全连接的话可能比k大),而我们的分类类别是n。
这时候我们可以用“提取特征”函数,来提取该层的特征,实现对输入图做特征提取。也正是利用这个特性,我们完成了人脸识别的核心功能。其他的图像识别也完全一样
-------------------------------------------------------------------------------------------------------------------------
关于人脸识别的细节:
1、第一个坑,不少模型,在lfw上表现精度为99.9%,但是实际使用却不行,是因为用的老外人头训练的,而不是中国人,放在国人上会下降很多直接不可用,例如VGG Face。除非你用很大量的(含有中国人的)库训练。
2、人脸识别的模型目前小老百姓用的,基本都是基于LFW(Labeled Faces in the Wild Home)这个标准评价精度的,而牛逼的公司,则是MegaFace这个百万人脸的库上比较精度。
3、人脸识别的训练,其实就是多分类网络一样的道理,不过需要选择一个非常好的网络、样本、loss和训练手法才能把这件事做好。目前声称厉害的Center Loss实验没啥效果也没深入看过,反正是发CVPR了。
4、开源模型,一般有resnet的、像这里案例给的lightCNN的,大家可以在网络上(github)找到已经开源的精度更好的模型,然后用同样的方法调用他就好了,一定要注意均值和缩放的问题
5、人脸识别的输入图片,需要人脸检测后的结果裁切下来,然后通过检测5个关键点,矫正,最后输入到网络中去,当然如果不对齐,精度其实相差不是特别大,如果你追毛球次可以了解这些。而人脸检测就用MTCNN或者seetaFace开源的算法就足够好了。而MTCNN的检测很好还带关键点。一定要搞清楚你使用的模型是怎么输入图片的,否则你的精度好不起来
6、阈值的选取,最简单的,就是一个一个的实验,哪个好就哪个,一般0.45-0.55(比较严格了)。你想研究的话,专业选手会画ROC曲线,然后选取最合适的阈值
7、绝大部分模型,对模糊的人脸应付都不是太好
https://github.com/CongWeilin/mtcnn-caffe
https://github.com/dlunion/mtcnn
https://github.com/AlfredXiangWu/face_verification_experiment
关于易里面的人脸检测和关键点等方面的,可以参考曾经发的帖子:
http://bbs.eyuyan.com/read.php?tid=396368
|