点击上方“AI算法与图像处理”,选择加"星标"或“置顶”

重磅干货,第一时间送达

来源:CVPy

人脸检测历险记

可能跟我一样,人脸检测是很多人学习图像处理的第一个自驱动型的任务,OpenCV刚上手没几天可能就想先跑一跑人脸检测,然后一个坑接着一个坑的往里跳。我个人对人脸检测的大概历程应该是下面这样的:

找一个直接能执行的

OpenCV的人脸检测程序,直接执行看效果。虽然这貌似是最简单的一步,但是由于最初水平实在太低,所以这一步可能是耗时最长的。当时初学的时候还在用

C++,想要直接跑程序,首先你要先配置好环境!曾经因为环境问题尝试了不同版本

OpenCV未果、重装

VS未果、重装

Windows系统仍未果...当年的环境配置简直是不堪回首,说多了都是泪。而且根据我的经验,不论是因为版本还是还是系统问题,在网上找一个直接拿来就能跑的代码实在是太难了...

按照千辛万苦跑起来的程序,自己敲一遍。明明感觉没啥差别,为啥就是跑不起来呢...所有的坑都会自己跳进去,所有的低级错误都会犯不止一遍。

尝试找数据或者标注数据,尝试自己训练一个人脸检测模型,

OpenCV提供了用来训练的

exe,参数超多,一直感觉很难用...当时可谓是屡败屡战,屡战屡败。

找一个能直接执行的深度学习的人脸检测程序,直接执行看效果。(虽然这貌似是最简单的一步,但是由于最初水平实在太低,所以这一步可能是耗时最长的。当时初学的时候还在用

Caffe,想要直接跑程序,首先你要先配置好环境!

Caffe的环境配置...当年的环境配置简直是不堪回首,说多了都是泪。???好像在哪里听过?)

同2.

尝试找数据或者标注数据,尝试自己训练一个人脸检测模型。

Caffe...对,我当时用的是

TensorFlow Object Detection API(当时这个环境配置过程也很感人)。

找一个能直接能用的人脸检测模型,直接跑起来看看效果....如果不能跑,尝试改改,也许就该好了呢。

跑起来一个人脸检测模型,加点其他效果?

要不就先看看效果吧,毕竟看到效果才更有动力走下去。【视频有声提示!】

上面用的是深度学习模型的人脸检测,但是在此之前还是稍微回顾下OpenCV自带的人脸检测器。

OpenCV自带的人脸检测

OpenCV自带了基于级联分类器的人脸检测模型,只能检测正脸,在前深度学习时代,效果已经是很好的了。OpenCV中的使用方式是用级联分类器加载人脸检测模型,大家一般默认用haarcascade_frontalface_default.xml。这个文件在C++源码路径下很容易找到,大概在opencv/sources/data/haarcascades路径下,Python的话,我用的Anaconda,所以路径在/Anaconda3/Lib/site-packages/cv2/data/。不同版本想来差异不会太大。

然后用多尺度滑窗法去检测人脸,函数参数含义和代码示例如下:

直接【执行】看效果:【视频有声提示!】

基于深度学习的人脸检测

想要深入学习的小伙伴可以尝试自己训练一个人脸检测模型练手,这里直接在Github上找一个能跑的模型CenterFace。代码和模型都来自这里https://github.com/Star-Clouds/CenterFace。由于模型是ONNX格式的,所以用OpenCV的readNetFromONNX函数加载模型centerface.onnx。

摘取主体代码并注释如下:

class CenterFace(object):

def __init__(self):

# readNetFromONNX 加载模型

self.net = cv2.dnn.readNetFromONNX(os.path.join(model_path, 'centerface.onnx'))

self.img_h_new, self.img_w_new, self.scale_h, self.scale_w = 0, 0, 0, 0

def __call__(self, img, height, width, threshold=0.5, landmarks=True):

# 圆整图片大小为32的倍数

self.img_h_new, self.img_w_new, self.scale_h, self.scale_w = self.transform(height, width)

# 推理,即前向传播一次

return self.inference_opencv(img, threshold, landmarks)

def inference_opencv(self, img, threshold, landmarks=True):

# 图像预处理,这里主要是 Reisze 和 BGR2RGB

blob = cv2.dnn.blobFromImage(img, scalefactor=1.0, size=(self.img_w_new, self.img_h_new), mean=(0, 0, 0), swapRB=True, crop=False)

self.net.setInput(blob)

begin = time.time()

# 前向传播一次

heatmap, scale, offset, lms = self.net.forward(["537", "538", "539", '540'])

end = time.time()

print("dtime = ", end - begin)

# 后处理,主要是根据阈值 threshold 从输出获取人脸框和人脸关键点的位置

return self.postprocess(heatmap, lms, offset, scale, threshold, landmarks)

def transform(self, h, w):

# 圆整图片大小为32的倍数

img_h_new, img_w_new = int(np.ceil(h / 32) * 32), int(np.ceil(w / 32) * 32)

scale_h, scale_w = img_h_new / h, img_w_new / w

return img_h_new, img_w_new, scale_h, scale_w

这一步模型可以同时给出人脸框和人脸关键点的位置。【视频有声提示!】

人脸卡通化

仅仅是人脸检测,显得略微有些没意思,所以在人脸检测的基础上,加点其他的更有意思的东西,比如上次刚玩过的卡通化。这是国内大佬的一篇文章,开源了代码和模型,在这里:https://github.com/SystemErrorWang/White-box-Cartoonization/。代码细节可以到这个链接查看,这里只给出人脸检测之后和卡通化结合部分的代码:

def face_detect(self, image, landmarks: bool, cartoon: bool):

# 加载模型

centerface = CenterFace()

h, w = image.shape[:2]

# 人脸检测

dets, lms = centerface(image, h, w, threshold=0.5, landmarks=landmarks)

print("检测到的人脸:", dets)

if len(dets):

for det in dets:

boxes, score = det[:4], det[4]

x1, y1, x2, y2 = int(boxes[0]), int(boxes[1]), int(boxes[2]), int(boxes[3])

box_w, box_h = x2 - x1, y2 - y1

# 人脸框稍微往外扩一点,个人感觉这么会好一点

face_box = image[max(0, y1 - int(box_h * 0.1)): min(y2 + int(box_h * 0.1), h), max(

0, x1 - int(box_w * 0.1)):min(x2 + int(box_w * 0.1), w)]

if cartoon:

# 人脸卡通化之后

cartoonized_face = cartoonize(face_box)

# 贴回原图,覆盖原图人脸部分

image[max(0, y1 - int(box_h * 0.1)): min(y2 + int(box_h * 0.1), h), max(

0, x1 - int(box_w * 0.1)):min(x2 + int(box_w * 0.1), w)] = cartoonized_face

# 画出人脸框框

draw_box(image, [x1, y1, x2, y2], color=(0, 255, 255))

# cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 255), min(h, w) // 200)

if landmarks:

for lm in lms:

for i in range(0, 5):

cv2.circle(image, (int(lm[i * 2]), int(lm[i * 2 + 1])),

min(h, w) // 100, (0, 0, 255), -1)

else:

cv2.putText(image, "No Face?", (int(w * 0.1), int(h * 0.1)), cv2.FONT_HERSHEY_SIMPLEX, 1.5, (0, 0, 255), min(h, w) // 200)

return image

流程如下:

先加载

CenterFace的模型(参考上一节的

CenterFace的

__init__)

进行人脸检测,获取人脸框和人脸关键点的位置

稍微扩充下人脸框,进行卡通化操作

把卡通化后的人脸贴回原图中人脸的位置

完整效果

看一下完整的效果吧:【视频有声提示!】

caffe 人脸关键点检测_全套 | 人脸检测 人脸关键点检测 人脸卡通化相关推荐

  1. python 活体检测_基于Python+Keras+OpenCV实现实时人脸活体检测 | 文末送书

    你在互联网上找到的大多数人脸识别算法和研究论文都会遭受照片***.这些方法在检测和识别来自网络摄像头的图像.视频和视频流中的人脸方面是很是有效,可是他们没法区分现实生活中的面孔和照片上的面孔.这种没法 ...

  2. 跌倒检测_使用姿势估计的跌倒检测

    跌倒检测 Fall detection has become an important stepping stone in the research of action recognition - w ...

  3. 加速度和陀螺仪 日常活动识别 跌倒检测_七台河房屋综合检测方法

    ,偶联剂的选择应考虑粘度,流动性,附着力,工件表面无腐蚀,易清洁,经济,结合上述因素选择糊剂作偶联剂..由于基底金属的厚度薄,因此检测方向在一侧和两侧进行.环境监测(空气质量检测): .构件及节点腐蚀 ...

  4. python 人脸检测_借助摄像头在Python中实现人脸检测

    Python部落(www.freelycode.com)组织翻译, 禁止转载 本文作者是Shantnu Tiwari--曾多年在C/C++的魔爪中饱受折磨,直到他发现了Python--使用起来感觉如呼 ...

  5. python dlib opencv人脸识别准确度_基于dlib和opencv库的人脸识别

    基于dlib和opencv库的人脸识别 需下载68个特征点的人脸检测模型: http://dlib.net/files/ 文件名为shape_predictor_68_face_landmarks.d ...

  6. python人脸识别库_基于Python的face_recognition库实现人脸识别

    Python Python开发 Python语言 基于Python的face_recognition库实现人脸识别 一.face_recognition库简介 face_recognition是Pyt ...

  7. python 动画随人脸动作变化_用Python获取摄像头并实时控制人脸的实现示例

    实现流程 从摄像头获取视频流,并转换为一帧一帧的图像,然后将图像信息传递给opencv这个工具库处理,返回灰度图像(就像你使用本地静态图片一样) 程序启动后,根据监听器信息,使用一个while循环,不 ...

  8. dlib疲劳检测_基于OpenCV的实时睡意检测系统

    该系统可以检测一个人在开车时是否困倦,如果有的话,可以通过使用语音消息实时提醒他.该系统使用网络摄像头和电话摄像头进行实时数据传输. 研究目的 根据国家公路交通安全管理局的数据,每年均涉及疲劳驾驶事故 ...

  9. python产品缺陷检测_基于图像处理的工业产品缺陷检测,基本操作,实现

    随着机器学习的发展,对于工业产品的缺陷检测,深度网络模型检测缺陷的准确率远远高于传统图像处理算法.现在一般的做法是将传统图像技术作为预处理,或者将传统提取特征与网络深度特征相结合进一步提高准确率. 今 ...

最新文章

  1. 单调队列多重背包时间复杂度O(vn)
  2. AIX查看端口被占用
  3. 动态链接库dll的两种加载方式
  4. mysql中 !40000 DROP DATABASE IF EXISTS `top_server` 这中注释有什么作用?
  5. Akka并发编程——第七节:Actor模型(六)
  6. c#中将HTML文件转换成PDF文件
  7. OnItemClickListener,OnScrollListener应用
  8. pythonsys标准_python 以标准输出(sys.stdout)为例,看python的标准输入、标准错误输出...
  9. 2017.9.10 连续攻击游戏 思考记录
  10. linux 切换pip路径_windows环境下面如何快速配置pip环境变量
  11. FKGE:合格的知识图谱嵌入已经学会保护隐私啦!
  12. 大数据分析平台的安全如何保障
  13. 《让人无法说 NO的攻心说话术》摘要
  14. Android常用组件
  15. CISCO 2811 路由器配置命令全集
  16. 知网文献最新下载技巧
  17. 免费且快速搭建个人www服务器的教程
  18. mongo从开始到安装以及遇到的问题
  19. linux 硬盘满了如何处理
  20. 为什么房价很难降下来?尤其是北京上海深圳这样的大城市,这个比喻很形象...

热门文章

  1. 两数组的交集(无重复)Intersection of Two Arrays
  2. 需要大规模配置头文件的解决方案《vc》[转]
  3. 自己写了个nginx启动脚本,shell
  4. oracle 执行计划
  5. 常见排序算法:希尔排序
  6. 绕过HR破门而入的求职智慧
  7. Javascript跳转页面和打开新窗口等方法
  8. WCF 第八章 安全 基于证书的加密
  9. 计算机信息处理技术知识点,计算机信息处理技术基础知识.doc
  10. python中csv文件通过什么表示字符_python – 如果行包含CSV文件中的字符串,则删除该行...