点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

本文转自|OpenCV学堂

人脸3D点云提取网络

2019出现的一个可以在移动端实时运行的人脸3D表面提取模型-FaceMesh,被很多移动端AR应用作为底层算法实现人脸检测与人脸3D点云生成。相关的论文标题为:

《Real-time Facial Surface Geometry from Monocular Video on Mobile GPUs》

github有pytorch版本的实现地址如下:

https://github.com/thepowerfuldeez/facemesh.pytorch

已经提供了预训练模型文件pth,可以用Netron打开查看。它的输入与输出显示截图如下:

图-2

最终输出的点云数据是468个3D坐标人脸点云坐标,输入人脸的ROI区域,大小为192x192。使用Pytorch支持的脚本可以把该模型转换为ONNX格式模型,转换的脚本与代码如下:

from facemesh import FaceMesh
import torchnet = FaceMesh()
net.load_weights("facemesh.pth")
torch.onnx.export(net, torch.randn(1, 3, 192, 192, device='cpu'), "facemesh.onnx",input_names=("image", ), output_names=("preds", "confs"), opset_version=9
)

这样我们就得到了ONNX版本的模型文件。

OpenVINO调用facemesh模型

OpenVINO2020.x版本以后均支持直接读取ONNX格式模型文件,实现模型加载与推理调用。这里以OpenVINO2021.2版本为例。我们的基本思路是首先通过OpenVINO自带的人脸检测模型实现人脸检测,然后截取人脸ROI区域再送到facemesh模型中实现人脸3D表面点云468个点提取。人脸检测这里我们选择了OpenVINO自带的face-detection-0202模型文件,该模型是基于MobileNet SSDv版本,输入格式如下:

NCHW = 1x3x384x384

输出格式为:

1x1xNx7

通道的顺序是:BGR

从图-2得知人脸3D点云提取模型facemesh的输入格式为1x3x192x192,输出层有两个分别是preds与confs,其中preds是点云数据,confs表示置信度。preds的1404表示的是468个点每个点的三维坐标,总计468x3=1404。代码演示部分的步骤与运行结果详解说明与步骤。加载模型与获取输入与输出信息:

# 加载人脸检测模型
net = ie.read_network(model=model_xml, weights=model_bin)
input_blob = next(iter(net.input_info))
out_blob = next(iter(net.outputs))
# 人脸检测的输入格式
n, c, h, w = net.input_info[input_blob].input_data.shape
print(n, c, h, w)
exec_net = ie.load_network(network=net, device_name="CPU")# 加载人脸3D点云预测模型
face_mesh_onnx = "facemesh.onnx"
mesh_face_net = ie.read_network(model=face_mesh_onnx)
# 输入格式
em_input_blob = next(iter(mesh_face_net.input_info))
en, ec, eh, ew = mesh_face_net.input_info[em_input_blob].input_data.shape
print(en, ec, eh, ew)
em_exec_net = ie.load_network(network=mesh_face_net, device_name="CPU")

人脸检测与获取人脸ROI然后提取人脸3D点云数据,然后显示:

# 设置输入图像与人脸检测模型推理预测
image = cv.resize(frame, (w, h))
image = image.transpose(2, 0, 1)
inf_start = time.time()
res = exec_net.infer(inputs={input_blob: [image]})
ih, iw, ic = frame.shape
res = res[out_blob]
# 解析人脸检测,获取ROI
for obj in res[0][0]:if obj[2] > 0.75:xmin = int(obj[3] * iw)ymin = int(obj[4] * ih)xmax = int(obj[5] * iw)ymax = int(obj[6] * ih)if xmin < 0:xmin = 0if ymin < 0:ymin = 0if xmax >= iw:xmax = iw - 1if ymax >= ih:ymax = ih - 1# 截取人脸ROI,提取3D表面点云数据roi = frame[ymin:ymax, xmin:xmax, :]roi_img = cv.resize(roi, (ew, eh))roi_img = np.float32(roi_img) / 127.5roi_img = roi_img.transpose(2, 0, 1)em_res = em_exec_net.infer(inputs={em_input_blob: [roi_img]})# 转换为468个3D点云数据, 然后显示prob_mesh = em_res["preds"]prob_mesh= np.reshape(prob_mesh, (-1, 3))cv.rectangle(frame, (xmin, ymin), (xmax, ymax), (0, 255, 255), 2, 8)sx, sy= ew / roi.shape[1], eh / roi.shape[0]for i in range(prob_mesh.shape[0]):x, y = int(prob_mesh[i, 0] / sx), int(prob_mesh[i, 1] / sy)cv.circle(frame, (xmin + x, ymin + y), 1, (0, 0, 255), 1)# 计算帧率与显示点云结果
inf_end = time.time() - inf_start
cv.putText(frame, "infer time(ms): %.3f, FPS: %.2f" % (inf_end * 1000, 1 / inf_end), (10, 50),cv.FONT_HERSHEY_SIMPLEX, 1.0, (255, 0, 255), 2, 8)
cv.imshow("Face Detection + 3D mesh", frame)

运行显示结果如下:

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

OpenVINO实时人脸表面3D点云提取相关推荐

  1. PCL中3D点云特征描述与提取(三)

    PCL中3D点云特征描述与提取(三) 1 如何从一个深度图像中提取NARF特征 2 RoPs特征 2.1 理论基础 2.1.1 生物视觉认知学启示 2.1.2 局部参考坐标框架构建 2.1.3 RoP ...

  2. 3D点云基础知识(二)-bilibili视频资源整理(二)鞋点胶点云轮廓提取

    资料来源:超人视觉免费启蒙三维课程入门(第六节)3D鞋点胶的点云边界(轮廓)提取 相似案例:Halcon三维测量(3):鞋底涂胶+边缘提取 Halcon学习方法强调:从案例当中学习:最重要是思路和算子 ...

  3. 交通数字孪生高速公路规划设计市政道路BIM正向改扩建设计利用实景三维无人机机载LiDAR倾斜摄影车载地面三维激光扫描仪LiDAR点云数据提取自动驾驶高精地图三维矢量车道标线3d点云标注

    实景三维数据价值挖掘实操系列1-道路车道标线高效自动化三维提 本系列视频的第一部分 标线提取 这段路大概有1.5km的长度 我们来看一下标线提取的效果如何 首先我们通过反射强度 将道路标线的点云数据单 ...

  4. A-LOAM/LOAM/Lego-LOAM/SC_Lego_LOAM实时构建3d点云地图与2d栅格地图(octomap)

    本篇文章旨在快速让读者实现运行LOAM系列3D激光SLAM算法并实时构建3d点云地图与2d栅格地图.废话不多说,直接开始~ 首先说明我们要用到的3D点云地图转2D栅格地图的工具是octomap,附上高 ...

  5. PCL提取3D点云模型特征(3.0 FPFH快速点特征直方图)附完整代码

    一.概述 上一篇博客解释了PFH是什么以及如何利用PFH来提取点云的特征,那么讲了PFH(PCL提取3D点云模型特征(2.0 PFH点特征直方图 )附完整代码)之后肯定是要接着说FPFH的.本来想着把 ...

  6. A-LOAM构建3d点云地图并实时转存二维栅格地图

    文章参考 A-LOAM/LOAM/Lego-LOAM/SC_Lego_LOAM实时构建3d点云地图与2d栅格地图(octomap) 1 安装 octomap 可以从 apt 安装或者以功能包的形式安装 ...

  7. 3D点云补全算法汇总及最新进展

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 Part 1  前言 在探讨3D 点云补全专题前,先介绍三个概念: 概念一:partial obser ...

  8. 深度学习在计算机视觉领域(包括图像,视频,3-D点云,深度图)的应用一览

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 来源 | 黄浴 原文 |  https://zhuanlan.zhihu.com/p/55747295 ...

  9. 3D点云论文相关论文资料总结

    论文及资料收集 斯坦福学者首次提出直接处理三维点云的深度学习模型 VoxelNet: 基于点云的三维空间信息逐层次学习网络 激光雷达点云特征表达研究进展 Volumetric and Multi-Vi ...

最新文章

  1. 可以多次使用同一个hbitmap吗_一个部位可以多次吸脂吗?
  2. 5G RRC——为NAS层提供连接管理,消息传递等服务; 对接入网的底层协议实体提供参数配置的功能; 负责UE移动性管理相关的测量、控制等功能...
  3. [YTU]_2911 ( 我想放假)
  4. 【机器学习】总结机器学习3个时代的算力规律:大模型的出现改变了什么?
  5. 【easyui】easyui datagrid加载成功之后选定并获取首行数据
  6. MFC绘图的几种方法
  7. 对话机器人---智能客服
  8. 位居中国机器学习公有云市场份额第一,华为云 ModelArts 的进阶之路
  9. Java 实现线程的两种方式
  10. python爬虫总结之xpath元素定位
  11. UCGUI窗体管理及消息处理机制分析
  12. ESP32超详细学习记录:获取B站粉丝数
  13. 关于延拓定理的一点注解
  14. 【问题记录】怎么用python读取CIFAR10数据集?
  15. samba 本地设备名已在使用中 此连接尚未恢复
  16. 腿麻脚软警告,体虚者勿入!
  17. R语言包(package)以及相关命令语句
  18. 6种提高客户满意度的方法
  19. 点云数据按高程赋色渲染
  20. 乐迪AT9S开机无反应、拆解过程

热门文章

  1. 5G+AI重新定义生老病死?
  2. 腾讯开源分布式NoSQL存储系统DCache | 技术头条
  3. 开源 | IBM、哈佛共同研发:Seq2Seq模型可视化工具
  4. AI一分钟 | 特斯拉再融46亿;腾讯AI Lab宣布开源多标签图像数据集
  5. 陆奇“入驻” YC,开启新征程
  6. 资源 | 10x Python开发者必读:本月Python文章TOP 10
  7. 免费公开课 | 数据科学家,从入门到精进!【今晚福利】
  8. 美团实习面试:熟悉红黑树是吧?能不能写一下?
  9. 自从上线了 Prometheus 监控告警,真香!
  10. 面试题:如何理解 Linux 的零拷贝技术?