通过MediaPipe+MiDaS实现人脸单目测距

news2024/11/16 5:57:17

      MediaPipe:是Google开发的适用于直播和流媒体的开源、跨平台、可定制的机器学习解决方案。code地址:https://github.com/google/mediapipe ,最新发布版本v0.10.11,license为Apache-2.0。MediaPipe Solutions提供了一套库和工具,供你在应用程序中快速应用人工智能(AI)和机器学习(ML)技术,包括:目标检测、图像分类、图像分割、人脸检测等。

      MiDaS:开源的单目深度估计实现,地址:https://github.com/isl-org/MiDaS ,license为MIT。

      通过Anaconda搭建开发环境,依次执行如下命令:

conda create -n MediaPipe python=3.9
conda activate MediaPipe
pip install mediapipe
pip install requests
git clone https://github.com/fengbingchun/NN_Test
cd NN_Test/demo/Python

      以下为测试代码:

import sys
import os
import cv2
import requests
import mediapipe as mp

def download_onnx_model(url, model_name):
	if os.path.exists(model_name) and os.path.isfile(model_name):
		return

	response = requests.get(url, stream=True)
	if response.status_code == 200:
		print("Downloading ... ...")
		with open(model_name, "wb") as f:
			for chunk in response.iter_content(chunk_size=8192):  
				if chunk:  
					f.write(chunk)
		print("file downloaded successfully:", model_name)
	else:
		raise Exception("Error: unable to download file: {}".format(model_name))

def get_images(dir, img_suffix):
	#print("dir:{}, img suffix:{}".format(dir, img_suffix))
	imgs = []

	for img in os.listdir(dir):
		if img.endswith(img_suffix):
			imgs.append(dir+"/"+img)

	return imgs

def depth_to_distance(depth) -> float:
    return -1.5 * depth + 2

def calc_distance(imgs, model_name):
	for img in imgs:
		bgr = cv2.imread(img, 1)
		if bgr is None:
			print("Error: image {} can't be read".format(bgr))
			continue

		rgb = cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB)
		height, width, channels = rgb.shape

		# define mediapipe face detection model
		face_detection_model = mp.solutions.face_detection.FaceDetection(min_detection_confidence=0.5, model_selection=0)

		# load monocular depth estimation model
		mono_model = cv2.dnn.readNet(model_name)

		# detect faces
		face_results = face_detection_model.process(rgb)
		if face_results.detections:
			for face in face_results.detections:
				# draw bounding boxes around the detected faces
				mp.solutions.drawing_utils.draw_detection(rgb, face)
				# in 0-1 scale
				boundary_box = face.location_data.relative_bounding_box
				# scale up to the image size
				boundary_box_scaled = int(boundary_box.xmin * width), int(boundary_box.ymin * height), int(boundary_box.width * width), int(boundary_box.height * height)
				# display the face detection score
				cv2.putText(rgb, f'{int(face.score[0]*100)}%', (boundary_box_scaled[0], boundary_box_scaled[1] - 20), cv2.FONT_HERSHEY_SIMPLEX, 2, (0,255,0), 2)

				# interest point of depth in a face. The center will be measured.
				interest_point = (boundary_box_scaled[0] + boundary_box_scaled[2] / 2, boundary_box_scaled[1] + boundary_box_scaled[3] / 2)

			# MiDaS v2.1 Small (Scale: 1/255, Size: 256x256, Mean Subtraction: (123.675, 116.28, 103.53), Channels Order: RGB,swapRB=True, crop=False)
			blob = cv2.dnn.blobFromImage(rgb, 1/255., (256,256), (123.675, 116.28, 103.53), True, False)

			# set the input into the model
			mono_model.setInput(blob)

			# get depth map
			depth_map = mono_model.forward()

			# resize it to the real world
			depth_map = depth_map[0,:,:]
			depth_map = cv2.resize(depth_map, (width, height))
			depth_map = cv2.normalize(depth_map, None, 0, 1, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)

			# change colors to display it in OpenCV
			bgr = cv2.cvtColor(rgb, cv2.COLOR_RGB2BGR)

			# get the depth of the point of interest
			depth = depth_map[int(interest_point[0]), int(interest_point[1])]

			depth_distance = depth_to_distance(depth)
			cv2.putText(bgr, f"Depth to face: {str(round(depth_distance,2)*100)} cm", (40,600), cv2.FONT_HERSHEY_SIMPLEX, 2, (0,0,255), 2)
			cv2.imwrite("../../data/result_"+os.path.basename(img), bgr)

if __name__ == "__main__":
	if len(sys.argv) != 3:
		raise Exception("Usage: requires two parameters, for example: python {} directory_name image_suffix_name".format(sys.argv[0]))

	model_name = "model-small.onnx"
	download_onnx_model("https://github.com/isl-org/MiDaS/releases/download/v2_1/model-small.onnx", model_name)

	imgs = get_images(sys.argv[1], sys.argv[2])
	#print("imgs:", imgs)
 
	calc_distance(imgs, model_name)

	print("test finish")

      说明

      1.测试代码参考:https://levelup.gitconnected.com

      2.mp.solutions.face_detection.FaceDetection函数中,model_selection默认为0;距离相机2米以内的脸部检测模型设置为0,即short_range;距离相机5米以内的脸部检测模型设置为1,即full_range。

      3.model-small.onnx为预训练的单目深度估计模型,从https://github.com/isl-org/MiDaS/releases/tag/v2_1 下载;如果有cuda,也可以使用更大的模型获得更真实的结果。

      4.depth_to_distance函数用于将深度图值转换为以厘米为单位的真实世界的距离,此转换的公式根据你的网络摄像头配置而有所不同。注:还不清楚此公式怎么来的

      5.测试代码接收2个参数,第一个参数指定存放图像的路径,第二个参数指定图像后缀名;首次运行会自动下载onnx模型。

      运行结果如下图所示:

      测试图像执行结果如下图所示:原始图像来自于网络

      GitHub:https://github.com/fengbingchun/NN_Test

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1656518.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

rk3588局域网推流

最近无意间看见在网上有使用MediaMtx插件配合ffmpeg在Windows来进行推流,然后在使用其他软件进行拉流显示数据图像的,既然windows都可以使用 ,我想linux应该也可以,正好手上也有一块RK3588的开发板,就测试了一下&#…

班级综合测评|基于Springboot+vue的班级综合测评管理系统(源码+数据库+文档)

目录 基于Springbootvue的“智慧食堂”系统 一、前言 二、系统设计 三、系统功能设计 1 管理员功能模块 2学生功能模块 3教师功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大…

创建一个react项目(router,store,axios,antd)最后有项目地址

第一步:使用cra脚手架 创建项目 文档地址:Create React App 中文文档 npx create-react-app 你的项目名称 第二步:整理项目结构和删除多余代码 目标效果图: 在src目录下分别新建apis,assets,components,pages,router,store,ut…

英文文本标点恢复

文章目录 一、安装 rpunct二、使用三、下载模型时报错1、报错详情2、报错原因3、解决方案 四、程序运行时报错1、报错详情2、报错原因3、解决方案 五、修改默认缓存路径 一、安装 rpunct pip install rpunct 相关依赖包信息: langdetect1.0.9 pandas1.2.4 simpletr…

记录一下Hql遇到的零碎问题

建表相关 -- 地区维度表 drop table dim_province_full; create table dim_province_full( id string comment 编号, name string comment 省份名称, region_id string comment 大区id, area_code string comment 行政区位码, iso_code string comment 国际编码, iso_3166_2 s…

关于位操作符的实际应用<C语言>

前言 位操作符在C语言初学阶段相对其他操作符来说,是一种难度比较大的操作符,且运用较少的一类操作符,但是位操作符并不是“一无是处”,合理运用的位操作符,在某些场景下可以优化算法,提高代码的执行效率&a…

最新AI实景自动无人直播软件教你实现24小时不下播带货;智能化引领直播新时代

随着互联网的快速发展,直播行业已经成为商家品牌推广和商品销售的热门方式。而如今,一款令人惊叹的AI实景自动无人直播软件正在让直播变得更加智能化和便捷化,为商家带来全新的直播体验。 AI实景自动无人直播软件的一大优势是其智能讲解功能。…

远动通讯屏的作用

远动通讯屏的作用 远动通讯屏有时有称为调度数据网柜,远动通讯屏具体干啥作用?远动通讯屏是以计算机为基础的生产过程与调度自动化系统,可以对现场的运行设备进行监视和控制、以实现数据采集、设备测量、参数调节以及各类信号报警等各项功能。…

AI视频教程下载:学会用AI创作文本图片音频视频

在不断发展的科技领域,人工智能 (AI) 是毋庸置疑的冠军,它是一种不断创新的力量,在我们的生活中扮演着越来越重要的角色。随着 2023 年的到来,我们诚挚地欢迎您加入人工智能精通课程的大门。 这不仅仅是一个课程,它专为…

第08章 IP分类编址和无分类编址

8.1 本章目标 了解IP地址的用途和种类了解分类编址和无分类编址区别掌握IP地址、子网掩码、网关概念及使用掌握子网划分及超网划分方法掌握无分类编址的改变和使用 8.2 IP地址的用途和种类 分类编址:造成地址的浪费,以及地址不够用;无分类编…

泰迪科技2024中职大数据实训室方案解读

中职在大数据专业建设所遇到的困难 数据、信息安全、人工智能等新信息技术产业发展迅猛,人才极其匮乏,各个中职院校纷纷开设相应的专业方向。但是,绝大多数院校因为师资和积累问题,在专业建设规划、办学特色提炼、创新教学模…

男士内裤选什么牌子的比较好?男士内裤盘点测评

随着夏日的脚步逐渐临近,你是否已经开始为挑选一款舒适透气的男士内裤而犯愁?市场上男士内裤品牌琳琅满目,各种材质层出不穷,让你在选购时犹豫不决。别担心,我最近精心挑选了市面上热门的男士内裤品牌进行了一番细致测…

kubernetes中StorageClass动态存储资源

StorageClass动态存储资源:简称sc资源; 动态存储类,它自动创建pv;不再需要手动创建pv; 但是,我们的存储卷系统nfs本身不支持这个sc动态存储,所以,我们需要借助一个插件来实现nfs配合…

如何vscode中刷力扣

推荐你阅读 互联网大厂万字专题总结 Redis总结 JUC总结 操作系统总结 JVM总结 Mysql总结 微服务总结 互联网大厂常考知识点 什么是系统调用 CPU底层锁指令有哪些 AQS与ReentrantLock原理 旁路策略缓存一致性 Java通配符看这一篇就够 Java自限定泛型 技术分享 如何vscode中刷力扣…

java爬虫代理ip(java爬虫代码示例)

java爬虫代理ip 在编写java爬虫时,经常会遇到需要使用代理IP来访问目标网站的情况。这时候,我们就需要编写代码来实现代理IP的功能。接下来,我们将为大家介绍如何在java爬虫中使用代理IP,以及给出相应的代码示例。 首先&#xff…

【LLM第三篇】名词解释:RLHF——chatgpt的功臣

RLHF (Reinforcement Learning from Human Feedback) ,直译为:“来自人类反馈的强化学习”。RLHF是一种结合了强化学习和人类反馈的机器学习方法,主要用于训练大模型以执行复杂的任务,尤其是当这些任务难以通过传统的奖励函数来精…

系统权限控制插件封装-实现系统权限控制插件化

背景:按照传统的开发方式方式,每次新开发一个系统,就需要花费大量时间精力去搭建权限控制模块,如果我们把权限控制这一整个模块都抽离成一个独立的权限控制插件,支持单命令安装,全面暴露参数与方法&#xf…

Linux Ubuntu(玩客云) qBittorrent docker BT下载(qbittorrent 密码错误无法登录 ip地址被禁止登录等)

提示: 需要提前安装Docker 根据qBittorrent官网的更新日志https://www.qbittorrent.org/news ,4.6.1.0包含一个重大更新。可以看到自4.6.1.0开始,qBittorrent将弃用adminadmin默认密码,采用随机密码,将在终端控制台输出…

伦敦银软件下载完成后如何开始交易?

在伦敦金投资的整个流程中,进行伦敦银软件的下载可以说也是重要的一步。伦敦银软件是由交易平台提供的,也是交易服务的具体体现。没有平台,我们就不能下单,也不能入场。那么,伦敦银软件下载完成后如何开始交易呢&#…

找不到msvcr120.dll无法继续执行

windows(新安装的系统)安装mysql,报错MSVCR120.dll找不到 官方下载地址 https://www.microsoft.com/zh-CN/download/details.aspx?id40784&wd&eqid9eba4d380059694e00000004658ce260 安装上就好了