当前位置: 首页 > news >正文

[C#]OpenCvSharp结合yolov8-face实现L2CS-Net眼睛注视方向估计或者人脸朝向估计

源码地址:

github地址:https://github.com/Ahmednull/L2CS-Net

L2CS-Net介绍:

眼睛注视(eye gaze) 是在各种应用中使用的基本线索之一。
它表示用户在人机交互和开放对话系统中的参与程度。此外,它还被用于增强现实,用于预测用户的注意力,从而提高设备的感知能力,降低功耗。
因此,研究人员开发了多种方法和技术来准确估计人类的凝视。这些方法分为两类: 基于模型的方法和基于外观的方法。
基于模型的方法通常需要专用硬件,这使得它们难以在不受约束的环境(unconstrained environment)中使用。
基于外观的方法将人类的视线直接从廉价的现成相机拍摄的图像中还原出来,使它们很容易在不受约束的设置下在不同的位置生成。
目前,基于CNN的方法是基于外观的方法是最常用的凝视估计方法,因为它提供了更好的凝视性能。
大部分的相关工作专注于开发新颖的基于CNN的网络,主要由流行的骨干(如VGG, ResNet-18 , ResNet-50等) 组成,来提取凝视特征,最终输出凝视方向。
这些网络的输入可以是单个流 (例如:如面部或眼睛图像)或多个流(如面部和眼睛图像)。
用于注视估计任务的最常见的损失函数是均方损失或L2损失。
尽管基于CNN的方法提高了注视精度,但它们缺乏鲁棒性和泛化性,特别是在无约束环境下。
本文介绍了一种新的估计方法来在RGB图像中估计3D凝视角度,使用一种 multi-loss 的方法。
我们建议使用两个全连接层独立回归每个凝视角度(偏航,俯仰),以提高每个角度的预测精度。
此外,我们对每个凝视角度使用两个单独的损失函数。每一种损失都由注视二值分类和回归组成。
最后,这两种损失通过网络反向传播,精确微调网络权重,提高网络泛化。
我们通过使用softmax层和交叉熵损失(cross-entropy loss)来执行gaze bin分类,以便网络以鲁棒的方式估计注视角的邻域。
基于所提出的损失函数和softmax层 (L2 loss+ cross-entropy loss+ softmax层),我们提出了一种新的网络(L2CS-Net)来预测无约束设置下的3D凝视向量。
最后,我们在两个流行的数据集MPIIGaze和Gaze360上评估了我们的网络的鲁棒性。L2CS-Net在MPIIGaze和Gaze360数据集上实现了SOAT的性能。

测试环境:

VS2019

.net framework 4.7.2

OpenCvSharp 4.8.0

Microsoft.ML.OnnxRuntime 1.16.3

效果:

实现部分代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using OpenCvSharp;namespace FIRC
{public partial class Form1 : Form{Mat src = new Mat();FaceDetector fd = new FaceDetector();public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){OpenFileDialog openFileDialog = new OpenFileDialog();openFileDialog.Filter = "图文件(*.*)|*.jpg;*.png;*.jpeg;*.bmp";openFileDialog.RestoreDirectory = true;openFileDialog.Multiselect = false;if (openFileDialog.ShowDialog() == DialogResult.OK){src = Cv2.ImRead(openFileDialog.FileName);pictureBox1.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(src);}}private void button2_Click(object sender, EventArgs e){if(pictureBox1.Image==null){return;}var results = fd.Inference(src);var resultMat = fd.DrawImage(src,results);pictureBox2.Image= OpenCvSharp.Extensions.BitmapConverter.ToBitmap(resultMat); //Mat转Bitmap}private void Form1_Load(object sender, EventArgs e){fd.LoadWeights(Application.StartupPath+"\\weights\\yolov8n-face.onnx", Application.StartupPath + "\\weights\\l2cs_net_1x3x448x448.onnx");}private void btn_video_Click(object sender, EventArgs e){}}
}

视频演示:

bilibili.com/video/BV19t4y1f7rN/

源码地址:

参考文献:

1.https://blog.csdn.net/gaoqing_dream163/article/details/132149150

相关文章:

  • CentOS7部署Kafka
  • nodejs和vuejs的区别
  • 大语言模型(LLM)框架及微调 (Fine Tuning)
  • excel统计分析——两因素无重复方差分析
  • VSCODE : SSH远程配置+免密登录
  • 模型 KANO卡诺模型
  • PCL 切片法实现点云模型的体积测量、面积测量(二)
  • 信息学奥赛一本通2067详解+代码
  • GRU算法
  • 介绍一下 MVC MVVM
  • 人工智能_机器学习092_使用三维瑞士卷数据_利用分层聚类算法进行瑞士卷数据三维聚类---人工智能工作笔记0132
  • 冰箱温度预测 C语言xdoj47
  • RLHF几大常用框架实践对比(trlx、deepspeedchat、colossalaichat)
  • SpringBoot灵活集成多数据源(定制版)
  • 【以题代复习】计算机网络 第三章
  • 分享的文章《人生如棋》
  • __proto__ 和 prototype的关系
  • 「面试题」如何实现一个圣杯布局?
  • Angular2开发踩坑系列-生产环境编译
  • express + mock 让前后台并行开发
  • Joomla 2.x, 3.x useful code cheatsheet
  • magento 货币换算
  • Python_网络编程
  • vue自定义指令实现v-tap插件
  • 彻底搞懂浏览器Event-loop
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 从零开始学习部署
  • 聊聊flink的BlobWriter
  • 深度解析利用ES6进行Promise封装总结
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • MPAndroidChart 教程:Y轴 YAxis
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • # Panda3d 碰撞检测系统介绍
  • #单片机(TB6600驱动42步进电机)
  • (二)Eureka服务搭建,服务注册,服务发现
  • (分布式缓存)Redis哨兵
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (离散数学)逻辑连接词
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (南京观海微电子)——COF介绍
  • (算法)Game
  • (转)C#调用WebService 基础
  • ... 是什么 ?... 有什么用处?
  • .NET Core引入性能分析引导优化
  • .NET 命令行参数包含应用程序路径吗?
  • .NET 依赖注入和配置系统
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .net遍历html中全部的中文,ASP.NET中遍历页面的所有button控件
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • @Conditional注解详解
  • @ConfigurationProperties注解对数据的自动封装
  • @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节