Intro
人脸识别很多,狗脸如何做识别?
人脸识别原理
要做狗脸识别,现看一下类似的人脸识别如何做。人脸识别研究的历史比较长了,如今主要是用深度学习算法进行人脸识别。主要分为如下的步骤。
人脸检测
搭建人脸识别系统的第一步是人脸检测,也就是在图片中找到人脸的位置。在这个过程中,系统的输入是一张可能含有人脸的图片,输出是人脸位置的矩形框。并将人脸部分的图像切割出来,给下一步使用。
人脸对齐(Face Alignment)
获得包含人脸的矩形框后,第二步要做的就是人脸对齐(Face Alignment)。原始图片中人脸的姿态、位置可能较大的区别,为了之后统一处理,要把人脸“摆正”。为此,需要检测人脸中的关键点(Landmark),如眼睛的位置、鼻子的位置、嘴巴的位置、脸的轮廓点等。根据这些关键点可以使用仿射变换将人脸统一校准,以尽量消除姿势不同带来的误差,人脸对齐的过程如下图所示
人脸编码
训练一个神经网络,将输入的脸部图像生成为高维值比如(128维)。
训练的大致过程为:将同一人的两张不同照片和另一人的照片一起喂入神经网络,不断迭代训练,使同一人的两张照片输出的接近,不同人的照片输出距离远。也就是减小类内距离,增大类间距离。
距离可以是欧式距离,cos距离等等
超高维向量,可能不容易直观理解。我举个直观的例子,假如输出的是三维向量。
狗脸识别
狗脸识别比人脸识别要难。不同人种的人类面部特征区别不大,但是犬种之间区别相当大。犬的毛发,过长的鼻子,也给摄像对焦带来困难。
图片收集
专门做了拍照手机小程序收集犬面部图片。一只狗需要拍上下左右不同角度的图片。拍摄的照片会直接存储到服务器。
标注
需要标注脸,鼻子,脸部关键点。
训练调优
模型综合和狗脸对比,狗鼻纹对比,犬种对比。最终确定两张图是否为同一只狗。
骨干模型是resnet,loss选用arcface。
用pytorch框架,训练和调优过程和普通的cv模型训练差别不大。
工程化和部署
模型训练好了之后,就可以进行工程化部署了。
后端主要用pytorch 和 Python flask。flask是我用的最多的框架,小巧,可扩展性强,非常pyhonic。
模型推理(把输入图片给训练好的模型,模型输出结果的过程叫模型推理),一般是放到GPU中运行的。GPU具有并发计算能力。拿下图为例,假设这个模型一个batch是8,也就是说可以同时输入给模型八个图片,模型会并行计算出八个结果。
batch一般来说越大越好,但是batch的大小受限于GPU的显存大小和计算能力。
并发优化
如果在这台服务器中模型一个batch=8,那么输入给它1个图片和输入给它8个图片,所需的计算时间几乎是一样的。
举个例子,如果推理需要1s,那么8个图片输入一个等待结果,然后再输入第二个等待结果,最后需要8s完成推理。如果一次性输入8个图片,只需要1s就可以计算出结果。
所以要最大化利用GPU服务器的性能,就要一次性把尽量多的图片输入给模型。但是服务器请求是随机来的,如何解决这个问题?
- 设置一个图片池,请求图片进来了,先缓存到图片池
- 如果达到一个batch,且上次计算已经结束,那么立刻送去模型进行推理
- 设置一个timeout,比如500ms,即使没有凑满一个batch,当timeout且上次计算已经结束,也把池子中的图片送去推理
- 图片池,要设置一个大小,也要设置一个timeout,如果请求过多,后面的请求长期得不到响应,只能放弃。
可以类比于公交车,公交车从a到b用时10分钟。无论拉一个人还是满载(例子中是4人)都是10分钟。如何让公交车运营的最好?
- 设置一个发车间隔,比如5分钟一趟,无论是否满载,都发车。因为不能让车上的乘客等的太久。
- 如果在发车间隔之内已经满载了,那么无论是否到5分钟,都立刻发车。
测试使用
使用场景大致可以分为两种
- 1:1比对
可以类比于支付宝刷脸支付。支付宝首次使用需要先录入我们的脸。之后支付的时候拍照,和我们之前数据库中的照片做对比,返回相似概率。如果概率高于阈值,则认为是同一人。
录入接口 POST/recognition/record response { "status": 0, "contents": { "uid": "fdasjou23r2hdahfkdsajiop43fdsfdsaljkl" } } ------------------------------------------------------------------- 1比1鉴别接口 POST/recognition/verify response { "status": 0, "contents": { "identity": false /*不是同一只狗*/ } } 或者 { "status": 0, "contents": { "identity": true, "confidence": 0.959 /* 是同一只狗的可能性 */ } }
- 1:N 检索
拍摄一张狗的图片,和数据库中每个录入的狗做对比。返回相似度最高的n个狗的id和信息。
类比于演唱会抓逃犯系统。演唱会摄像头拍摄人的照片,和数据库中每个逃犯的照片做对比 ,如果相似度大于阈值,则返回结果。
实际应用场景
- 保险 宠物保险领域可以利用狗脸识别进行录入,识别,进行理赔。
- 信息检索 宠物医院,宠物店等需要宠物录入的场景,可以快速办理业务。
- 城市管理 城管可以用来办理狗证,录入狗的照片。在执法时,识别路上的狗是否是注册犬
- 宠物防丢 如果在网站注册且录入了狗脸,之后发生了宠物丢失。如果其他网友路遇小狗,可以进行拍照识别检索,有助于找到走失小狗。
- 智能家居 狗笼狗门识别,自动开门等。
结尾
还上了一次小时候最看不懂的电视节目《经济半小时》