深度学习图像识别、分类、人脸识别

图像识别、分类,是CNN最强有力的一个功能,也是比较有用的一种技术,能做很多扩展功能。这里我们讲关于分类识别的步骤和注意细节。
准确来说,验证码识别也是一种分类任务,不过是分类的一种特殊形式,多任务分类

多分类的样本不太好找,就找了麻将牌的图片来做演示

shenduxuexi14

shenduxuexi15

分类任务的第一步, 准备样本

我们样本的存放结构是,建立一个samples目录,目录下继续建立我们n个类别的类别文件夹,每个文件夹中再放我们每个类别的样本即可。

shenduxuexi16

第二步,样本增广

由于样本量太少,不足以用来训练,我们可以通过将样本增广的手段扩充样本量。使得训练的模型更具鲁棒性,泛化能力更好。增广的方法,通常有缩放、旋转、镜像、平移、模糊、光照模拟等做法,尽可能的模拟我们识别任务中会遇到的场景来增广他,注意增广产生的背景需要给随即色(避免影响)

这里有提供一个简单的镜像旋转和缩放的增广程序:aug.py,如果你直接执行他,会看到目录下会多了这么些图片

shenduxuexi17

第三步,创建label文件

这里我们使用分类专用的make-label.py生成label文件

shenduxuexi23shenduxuexi18

第四步,就是选择合适的网络

这里我们选择的是 GoogLeNet网络,修改好分类的输出层为34,然后开始微调基于ImageNet的模型
googleNet有点特殊,因为他有3个loss、和精度,分别是代表三个阶段的分类情况,修改输出层类别为34时必须要3个都修改。

我们可以搜索,loss1、loss2、loss3,就能找到他

通过950次迭代,我们得到一个精度100%的模型。然后我们可以测试一下,程序在:人脸识别/麻将识别、图像识别.e

shenduxuexi19shenduxuexi20

 

分类就这么愉快的结束了,主要目的是其过程,我们可以采用很多其他的模型,例如ResNet、VGG、NIN等等,他们都是非常优秀的模型。我们一定要掌握分类网络的训练方法,和注意事项,例如数据增广的问题。

我们基于分类的知识,还可以做到进一步,例如图像分级的任务,比如我们要对猪肉的照片做级别评判。这时候我们可以收集例如5级别的猪肉图片,然后作6类样本去训练,其中5类是猪肉的1-5级,而第六类我们会给其他图片,就是可能造成影响的图片,这类图片我们认为是0级,就是认为这图片不是猪肉的图片(这个设计的必要性根据任务确定就好了)。

其实,人脸识别,也是一种图像识别、分类技术的一个分支。

人脸识别

shenduxuexi21

人脸识别,一直是一个比较高大上的技术,但现在其实也是很容易驾驭他的。而这个技术的主要方法,跟上面我们提到的分类技术,基本上是一样的。我们清楚了人脸识别的技术原理,也就能利用人脸识别的方法,进一步做到图像识别、检索等等。例如百度的以图搜图技术的实现等等

——————————————————————————————————————

特征

对一个图片的一种描述,比如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。

这时候我们可以用“提取特征”函数,来提取该层的特征,实现对输入图做特征提取。也正是利用这个特性,我们完成了人脸识别的核心功能。其他的图像识别也完全一样

shenduxuexi22

——————————————————————————————————————

关于人脸识别的细节:

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/AlfredXiangWu/face_verification_experiment

1.本文部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责。
2.若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。
3.如果本站有侵犯、不妥之处的资源,请在网站最下方联系我们。将会第一时间解决!
4.本站所有内容均由互联网收集整理、网友上传,仅供大家参考、学习,不存在任何商业目的与商业用途。
5.本站提供的所有资源仅供参考学习使用,版权归原著所有,禁止下载本站资源参与商业和非法行为,请在24小时之内自行删除!
孤单博客 » 深度学习图像识别、分类、人脸识别
  • 22会员总数(位)
  • 286资源总数(个)
  • 1本周发布(个)
  • 0 今日发布(个)
  • 239稳定运行(天)

提供最优质的资源集合

加入海王 加入Q群
开通海王 享更多特权,建议使用 QQ 登录