mediapipe face_mesh测试

2023-11-09

目录

onnx测试

tensorflow预测tflite代码:


onnx测试

   img_path=r'D:\data\val_result\1212\test\1\2\02370_1.jpg'
    img_path=r'D:\data\face\1212\test\1\2\02674_1.jpg'
    img=cv2.imread(img_path)

    img_o = cv2.resize(img, (192, 192))
    # img=cv2.cvtColor(img_o,cv2.COLOR_BGR2RGB)
    img = img_o.astype(np.float32)
    # img=img-127.5
    img/=255.0

    # dummy_input = np.ones([1, 192, 192, 3], dtype=np.float32)
    dummy_input = np.array([img])
    model_path = r'E:\project\angle_net\xuanzhuan_detect\ncnn-20220420-windows-vs2017\x64\bin/model_float32.onnx'
    # model_path = r'C:\Users\Administrator\Pictures\mm\resources.tar\resources\face_landmark_with_attention_192x192/model_float32.onnx'
    model_file_name = model_path.split(".")[0]
    session_option = onnxruntime.SessionOptions()
    session_option.optimized_model_filepath = f"{model_file_name}_cudaopt.onnx"
    session_option.graph_optimization_level = onnxruntime.GraphOptimizationLevel.ORT_ENABLE_EXTENDED
    session = onnxruntime.InferenceSession(
        model_path,
        session_option,
        providers=['CUDAExecutionProvider']
    )

    input_name = session.get_inputs()[0].name
    output_names = [o.name for o in session.get_outputs()]
    input_shape = session.get_inputs()[0].shape
    # Warmup
    output = session.run(
        output_names,
        {input_name: dummy_input.transpose((0,3,1,2))}
    )
    # Inference

    for i in range(5):
        start = time.time()
        output = session.run(output_names,{input_name: dummy_input.transpose((0,3,1,2))})

        for i in [1,2,3,4,5,6]:
            points=output[i][0][0]

            if len(points[0])==1404:
                data_len = len(points[0]) // 3
                # print(data_len)
                for index in range(data_len):
                    cv2.circle(img_o, (int(points[0][index * 3]), int(points[0][index * 3 + 1])), 1, (0, 0, 213),
                               -1)  # x,y,r,color
            else:
                data_len = len(points[0]) // 2
                # print(data_len)
                for index in range(data_len):
                    cv2.circle(img_o, (int(points[0][index * 2]), int(points[0][index * 2 + 1])), 1, (0, 0, 213),
                               -1)  # x,y,r,color


        cv2.imshow("result",img_o)
        cv2.waitKey(0)
        print(f'elapsed_time : {(time.time()-start)*1000} ms')

tensorflow预测tflite代码:

import os

import cv2
import tensorflow as tf
import numpy as np
from tensorflow.lite.python.interpreter import Interpreter

class MeshDetector(object):

    def __init__(self, model_path):
        """Initialization"""
        self.target_image = None

        self.interpreter =Interpreter(model_path=model_path)

        # Set model input
        self.interpreter.allocate_tensors()
        self.input_details = self.interpreter.get_input_details()
        self.output_details = self.interpreter.get_output_details()

    def _preprocess(self, image_bgr):

        image_resized = cv2.resize(image_bgr, (192, 192))
        image_rgb = cv2.cvtColor(image_resized, cv2.COLOR_BGR2RGB)
        image_norm = (image_rgb-127.5)/127.5
        return image_norm

    def get_mesh(self, image):

        # Preprocess the image before sending to the network.
        image = self._preprocess(image)
        image = tf.image.convert_image_dtype(image, tf.float32)
        image = image[tf.newaxis, :]

        # The actual detection.
        self.interpreter.set_tensor(self.input_details[0]["index"], image)
        self.interpreter.invoke()

        # Save the results.
        mesh = self.interpreter.get_tensor(self.output_details[3]["index"])[0].reshape(468, 3) / 192
        score = self.interpreter.get_tensor(self.output_details[1]["index"])[0]

        return mesh, score

    def draw_mesh(self, image, mesh, mark_size=2, line_width=1):
        """Draw the mesh on an image"""
        # The mesh are normalized which means we need to convert it back to fit
        # the image size.
        image_size = image.shape[0]
        mesh = mesh * image_size
        for point in mesh:
            cv2.circle(image, (int(point[0]), int(point[1])),mark_size, (0, 255, 128), -1)

        # Draw the contours.
        # Eyes
        left_eye_contour = np.array([mesh[33][0:2],
                                     mesh[7][0:2],
                                     mesh[163][0:2],
                                     mesh[144][0:2],
                                     mesh[145][0:2],
                                     mesh[153][0:2],
                                     mesh[154][0:2],
                                     mesh[155][0:2],
                                     mesh[133][0:2],
                                     mesh[173][0:2],
                                     mesh[157][0:2],
                                     mesh[158][0:2],
                                     mesh[159][0:2],
                                     mesh[160][0:2],
                                     mesh[161][0:2],
                                     mesh[246][0:2], ]).astype(np.int32)
        right_eye_contour = np.array([mesh[263][0:2],
                                      mesh[249][0:2],
                                      mesh[390][0:2],
                                      mesh[373][0:2],
                                      mesh[374][0:2],
                                      mesh[380][0:2],
                                      mesh[381][0:2],
                                      mesh[382][0:2],
                                      mesh[362][0:2],
                                      mesh[398][0:2],
                                      mesh[384][0:2],
                                      mesh[385][0:2],
                                      mesh[386][0:2],
                                      mesh[387][0:2],
                                      mesh[388][0:2],
                                      mesh[466][0:2]]).astype(np.int32)
        # Lips
        cv2.polylines(image, [left_eye_contour, right_eye_contour], False,
                      (0, 0, 255), line_width, cv2.LINE_AA)


if __name__ == "__main__":
    os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
    os.environ['CUDA_VISIBLE_DEVICES'] = '0'
    
    mesh_detector= MeshDetector(r'model_float32.tflite')
    img_path = r'D:\data\face\1212\test\1\2\02674_1.jpg'
    img = cv2.imread(img_path)
    img = cv2.resize(img, (192, 192))
    face_mesh, score= mesh_detector.get_mesh(img)
    mesh_detector.draw_mesh(img, face_mesh, mark_size=1)
    # cv2.imshow("Mesh", cv2.resize(img, (512, 512)))
    cv2.imshow("Mesh",img)
    cv2.waitKey()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mediapipe face_mesh测试 的相关文章

随机推荐

  • SQL Part 2 ---常用关键字

    SQL 关键字 常用关键字 Keywords ORDER BY DESC AS Like 星号符 DISTINCT Union INTERSECT EXCEPT 嵌套查询 Nested Query IN NOT IN 在WHERE中使用 I
  • sh ndk-build.cmd command not found

    sh中写ndk build 会报错 ndk build cmd command not found 或者报错 ndk build 未找到命令 解决方法 写ndk build的完整路径 比如 home jason android ndk r1
  • 任务8 使用Word2Vec进行推荐

    任务8 使用Word2Vec进行推荐 1 原理 我们有了用户的embedding很容易就可以利用这些embedding来计算用户的相似度 有了用户的相似度 我们接下来就可以使用前面任务4的一些函数来直接进行推荐 2 代码实现 导入相关的包
  • 关于编程设计模式的简介

    编程设计模式 一 创建模式 Creational Patterns 1 工厂模式 Factory Pattern 2 抽象工厂模式 Abstract Factory Pattern 3 单例模式 Singleton Pattern 4 建造
  • 2020年度总结

    眼看又要年底了 趁着这个双休 给即将过去的 2020 做个简单的总结 今年发生了很多事情 对我的影响很大 年初 2020年1月7日 我入职了上一家公司 在一个 Unity 项目组里做游戏开发 工资虽然不高 但是业务轻车熟路 也在组里涨了不少
  • 使用终端MobaXterm连接Centos

    1 下载MobaXterm 官网 https mobaxterm mobatek net download html 2 MobaXterm连接Linux 1 查看刚才安装的 Linux 的 IP 地址 2 连接 3 Linux自带了JRE
  • 【CUDA编程】线程ID与全局ID的映射关系

    blockDim 方向 指的是该方向上thread的总数 girdDim 方向 指的是该方向上block的总数 1 1D grid 1D block threadId blockIdx x blockDim x threadIdx x 2
  • 阿里巴巴Java开发手册 PDF

    泰山版 更新日期 2020 04 22 链接 https pan baidu com s 1qf252ZN1zMZ16KY ok8uNg 提取码 zxcp 嵩山版 更新日期 2020 08 03 链接 https pan baidu com
  • python与java的一些不同简录

    1 coding UTF 8 2 Python 中单行注释以 开头 多行注释采用三对单引号 或者三对双引号 将注释括起来 3 Python 最具特色的就是使用缩进来表示代码块 缩进的空格数是可变的 但是同一个代码块的语句必须包含相同的缩进空
  • 如何在IEEE的模板中引用Arxiv中的论文

    如何在IEEE的模板中引用Arxiv中的论文 本文章记录如何在IEEE Transactions的模板中 引用Arxiv中的论文 记录具体的论文格式信息 目录 如何在IEEE的模板中引用Arxiv中的论文 1 在IEEE的模板中引用Arxi
  • 匹配算法之 匈牙利算法详解

    参考 算法学习笔记 5 匈牙利算法 漫谈匈牙利算法 匈牙利算法 KM算法 匈牙利算法 二分图 通俗易懂小白入门 二分图最大匹配 匈牙利算法 多目标跟踪之数据关联 匈牙利匹配算法和KM算法 小白学习笔记 一 目标跟踪 匈牙利匹配 一 匈牙利算
  • jQuery Ajax 全解析

    本文地址 jQuery Ajax 全解析 本文作者 QLeelulu 转载请标明出处 jQuery确实是一个挺好的轻量级的JS框架 能帮助我们快速的开发JS应用 并在一定程度上改变了我们写JavaScript代码的习惯 废话少说 直接进入正
  • HBuilderX集成Git教程,需要安装TortoiseGit依赖

    1 HBuilder安装git插件 需要提前安装好git客户端 略过 点击 工具 插件安装 此时还是不能提交代码的 右键选中我们需要的项目 点击 外部命令 Git插件 然后随便选择一个操作 会提示需要安装TortoiseGit 然后跳转到T
  • 归并排序【图解及模板】

    全文目录 归并排序的思想 操作原理 归并排序演示图 代码模板 总结 归并排序的思想 归并排序是建立在归并操作上的一种有效 稳定的排序算法 该算法是采用分治法 Divide and Conquer 的一个非常典型的应用 将已有序的子序列合并
  • keil5改工程名称_Keil5建立stm32工程

    一 准备工作 1 首先在项目名称下建立一个文件夹 作为存放程序的地方 2 在总文件夹下 依次建立User Driver List Output三个文件夹 作为存放main函数 驱动函数 编译和输出文件的子文件夹 二 建立工程 1 打开kei
  • GO 依赖注入

    依赖注入是软件工程中经常使用到的一种技术 它提供了一种控制反转的机制 把控制权利交给了调用方 调用方来决定使用哪些参数 哪些对象来进行具体的业务逻辑 依赖注入的本质其实是为了将组件的创建与其依赖的创建分离 实现原理 通过反射读取对象的依赖
  • elementUi使用自定义表格时给表头自定义成el-input导致el-input失效的问题

    我们在使用elementUi的表格组件时往往需要自定义表格 很多还需要自定义表头 比如这种 我们再表格的头部插入el input组件 这时就会发现 你在表头的el input输入时不显示 解决方法就是给slot header 换成 head
  • 2023华为OD机试真题-对称字符串(JAVA、Python、C++)

    题目描述 对称就是最大的美学 现有一道关于对称字符串的美学 已知 第 1 个字符串 R 第 2 个字符串 BR 第 3 个字符串 RBBR 第 4 个字符串 BRRBRBBR 第 5 个字符串 RBBRBRRBBRRBRBBR 相信你已经发
  • Java中多线程,java栈和堆面试题

    public static void main String args 创建自定义线程对象 myThread mT new myThread 开启新线程 让新的线程执行程序 jvm调用线程中的run mT start 在main方法中执行
  • mediapipe face_mesh测试

    目录 onnx测试 tensorflow预测tflite代码 onnx测试 img path r D data val result 1212 test 1 2 02370 1 jpg img path r D data face 1212