caffe 人脸关键点检测_全套 | 人脸检测 人脸关键点检测 人脸卡通化
点击上方“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 人脸关键点检测_全套 | 人脸检测 人脸关键点检测 人脸卡通化相关推荐
- python 活体检测_基于Python+Keras+OpenCV实现实时人脸活体检测 | 文末送书
你在互联网上找到的大多数人脸识别算法和研究论文都会遭受照片***.这些方法在检测和识别来自网络摄像头的图像.视频和视频流中的人脸方面是很是有效,可是他们没法区分现实生活中的面孔和照片上的面孔.这种没法 ...
- 跌倒检测_使用姿势估计的跌倒检测
跌倒检测 Fall detection has become an important stepping stone in the research of action recognition - w ...
- 加速度和陀螺仪 日常活动识别 跌倒检测_七台河房屋综合检测方法
,偶联剂的选择应考虑粘度,流动性,附着力,工件表面无腐蚀,易清洁,经济,结合上述因素选择糊剂作偶联剂..由于基底金属的厚度薄,因此检测方向在一侧和两侧进行.环境监测(空气质量检测): .构件及节点腐蚀 ...
- python 人脸检测_借助摄像头在Python中实现人脸检测
Python部落(www.freelycode.com)组织翻译, 禁止转载 本文作者是Shantnu Tiwari--曾多年在C/C++的魔爪中饱受折磨,直到他发现了Python--使用起来感觉如呼 ...
- python dlib opencv人脸识别准确度_基于dlib和opencv库的人脸识别
基于dlib和opencv库的人脸识别 需下载68个特征点的人脸检测模型: http://dlib.net/files/ 文件名为shape_predictor_68_face_landmarks.d ...
- python人脸识别库_基于Python的face_recognition库实现人脸识别
Python Python开发 Python语言 基于Python的face_recognition库实现人脸识别 一.face_recognition库简介 face_recognition是Pyt ...
- python 动画随人脸动作变化_用Python获取摄像头并实时控制人脸的实现示例
实现流程 从摄像头获取视频流,并转换为一帧一帧的图像,然后将图像信息传递给opencv这个工具库处理,返回灰度图像(就像你使用本地静态图片一样) 程序启动后,根据监听器信息,使用一个while循环,不 ...
- dlib疲劳检测_基于OpenCV的实时睡意检测系统
该系统可以检测一个人在开车时是否困倦,如果有的话,可以通过使用语音消息实时提醒他.该系统使用网络摄像头和电话摄像头进行实时数据传输. 研究目的 根据国家公路交通安全管理局的数据,每年均涉及疲劳驾驶事故 ...
- python产品缺陷检测_基于图像处理的工业产品缺陷检测,基本操作,实现
随着机器学习的发展,对于工业产品的缺陷检测,深度网络模型检测缺陷的准确率远远高于传统图像处理算法.现在一般的做法是将传统图像技术作为预处理,或者将传统提取特征与网络深度特征相结合进一步提高准确率. 今 ...
最新文章
- 单调队列多重背包时间复杂度O(vn)
- AIX查看端口被占用
- 动态链接库dll的两种加载方式
- mysql中 !40000 DROP DATABASE IF EXISTS `top_server` 这中注释有什么作用?
- Akka并发编程——第七节:Actor模型(六)
- c#中将HTML文件转换成PDF文件
- OnItemClickListener,OnScrollListener应用
- pythonsys标准_python 以标准输出(sys.stdout)为例,看python的标准输入、标准错误输出...
- 2017.9.10 连续攻击游戏 思考记录
- linux 切换pip路径_windows环境下面如何快速配置pip环境变量
- FKGE:合格的知识图谱嵌入已经学会保护隐私啦!
- 大数据分析平台的安全如何保障
- 《让人无法说 NO的攻心说话术》摘要
- Android常用组件
- CISCO 2811 路由器配置命令全集
- 知网文献最新下载技巧
- 免费且快速搭建个人www服务器的教程
- mongo从开始到安装以及遇到的问题
- linux 硬盘满了如何处理
- 为什么房价很难降下来?尤其是北京上海深圳这样的大城市,这个比喻很形象...
热门文章
- 两数组的交集(无重复)Intersection of Two Arrays
- 需要大规模配置头文件的解决方案《vc》[转]
- 自己写了个nginx启动脚本,shell
- oracle 执行计划
- 常见排序算法:希尔排序
- 绕过HR破门而入的求职智慧
- Javascript跳转页面和打开新窗口等方法
- WCF 第八章 安全 基于证书的加密
- 计算机信息处理技术知识点,计算机信息处理技术基础知识.doc
- python中csv文件通过什么表示字符_python – 如果行包含CSV文件中的字符串,则删除该行...