C#开发学习人工智能的第一步

简介: 作为一个软件开发者,我们除了要学会复制,黏贴,还要学会调用API和优秀的开源类库。也许有人说C#做不了人工智能,如果你认可这种想法,那说明你的思想还是狭隘的。做不了人工智能的不是C#这种语言,而是你,我这种普通的程序员。

前言

作为一个软件开发者,我们除了要学会复制,黏贴,还要学会调用API和优秀的开源类库。

也许有人说C#做不了人工智能,如果你认可这种想法,那说明你的思想还是狭隘的。

做不了人工智能的不是C#这种语言,而是你,我这种普通的程序员。

做人工智能需要一定的学历背景,一定的数学基础和公司专项的资源供给;而这种机缘小之又小,你我既然是普通的程序员,就必然与此无缘。

但在人工智能如日中天的当下,接触深度学习是必然会发生的事情,所以我们要做的就是,学会调用相关的类库。

现在,让我们迈出C#学习人工智能的第一步,通过调用Affdex来锁定图片中人物的面部,然后将其截取出来。


准备工作

首先,我们需要先访问官网下载Affdex的Sdk。

在官网找中找到下载Affdex的Sdk的地方也是个挺困难的事。。。所以下载链接如下:

下载Affdex_Sdk网址:
https://knowledge.affectiva.com/docs/getting-started-with-the-emotion-sdk-for-windows#section-2-import-into-your-application

进入网页后,向下拉动滚动条,找到到下图所示位置,点击Download进行下载。

0.png


下载完成后得到Sdk,如下图:

1.png


下面,我们双击进行安装,不过安装SDK有一些限制,需要预先安装NET Framework4.0和C++ 2015。如果电脑里已经安装了,就不必担心了;如果安装的是C++2015-2017这类型的,则需要卸载了,重新安装C++2015的版本,否则Affdex的SDK将安装失败。

安装完成后,我们去安装目录找到Affdex.dll,affdex-native.dll,tensorflow.dll三个文件,如下图:

2.png


我们先将它们复制出来,等待使用。

简单的介绍一下,这三个类库中,Affdex.dll是可以被C#项目直接引用的,而另外两个文件是Affdex.dll的依赖文件;也就是说,affdex-native.dll,tensorflow.dll需要在生成时,输出到运行目录下。

有经验的朋友想必已经发现了,这里有个类库名叫tensorflow.dll,tensorflow是什么啊?稍微百度一下大家就会了解了,它是专门来做深度学习的。

也就是说Affdex是支持深度学习的。

----------------------------------------------------------------------------------------------------

现在我们来学习Affdex的使用。

首先我们新建一个WPF项目,然后引用Affdex.dll。

然后将项目的运行平台设置为64位,因为,这样处理图片的速度能快一点,如下图:

3.png

在Affdex中我们可以发现四个探头—VideoDetector,PhotoDetector,FrameDetector,CameraDetector。

在这里我们要处理的是图片,所以我们选择PhotoDetector,下面我们创建一个PhotoWindow.Xaml页面来使用PhotoDetector处理图片。


代码实现

首先,我们定义一个PhotoDetector的属性,用于处理图片。

然后我们在构造函数中对他进行实例化,代码如下:

private Affdex.PhotoDetector Detector { get; set; }
public PhotoWindow()
{
InitializeComponent();
uint maxNumFaces = 1;//最多识别图片中几张脸
Detector = new Affdex.PhotoDetector(maxNumFaces, Affdex.FaceDetectorMode.SMALL_FACES); 
Detector.setImageListener(this);
Detector.setProcessStatusListener(this);
Detector.start();
}

在上述代码中可以看到,除了初始化PhotoDetector,我们还做了一个图片监听设置setImageListener,那么图片监听是干什么的呢?

很简单,图片被PhotoDetector处理完,我们需要知道图片处理结果呀,而这个图片监听正是是用来返回图片处理结果的。

可以看到图片监听设置的入参是this,也就是说,需要把图片的处理结果返回给当前页面。

如果就这样写是会编译报错的,会提示setImageListener的入参错误。

我们查看setImageListener的入参,发现它的入参是一个ImageListener接口,即,setImageListener的入参是一个要实现了ImageListener接口的类。

到这里,我们就都明白了,现在我们让当前PhotoWindow.xaml窗体继承接口ImageListener,并实现接口ImageListener内的方法。

public partial class PhotoWindow : Window, Affdex.ImageListener
===========================================================================
public void onImageCapture(Affdex.Frame frame)
{
}
public void onImageResults(Dictionary<int, Face> faces, Affdex.Frame frame)
{
}

如上述代码所示,在我们实现的接口onImageResults里有两个参数:faces、frame。

其中faces是最重要的,这里包含Affdex分析图片的结果。

----------------------------------------------------------------------------------------------------

现在,Affdex的配置代码已经写完了,我们可以把图片读取出来调用Affdex处理了。

public PhotoWindow()
{
    InitializeComponent();
    uint maxNumFaces = 1;//最多识别图片中几张脸
    Detector = new Affdex.PhotoDetector(maxNumFaces, Affdex.FaceDetectorMode.SMALL_FACES);  
    Detector.setImageListener(this);
    Detector.start();
    byte[] bytes = FileHelper.FileToBytes(System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "timg.jpg"));
    BitmapSource bitmapSource = ImageHelper.BytesToBitmapImage(bytes);
    var w = bitmapSource.Width;
    var h = bitmapSource.Height;
    var stride = bitmapSource.Format.BitsPerPixel * (int)w / 8; //计算Stride 
    byte[] byteList = new byte[(int)h * stride];
    bitmapSource.CopyPixels(byteList, stride, 0);  
    Affdex.Frame frame = new Affdex.Frame((int)w, (int)h, byteList, Affdex.Frame.COLOR_FORMAT.BGRA); 
    Detector.process(frame);
}

如上述代码所示,我们在启动了Detector后,读取了一个人物图片,然后把人物图片的像素数组解析出来,生成一个Frame;这个Frame是Affdex的类,用于保存图像数据信息。

最后,我们把生成的Frame对象,扔给Detecotor的Process方法处理。

Detecotor处理完成后,会触发onImageResults方法。

在onImageResults方法里,入参faces包含了处理结果。

现在我们使用faces里的内容,来定位图片中人物面部的位置。

public void onImageResults(Dictionary<int, Face> faces, Affdex.Frame frame)
{
    Face face = null;
    if (faces != null && faces.Values != null && faces.Values.Count() > 0)
    {
        face = faces.Values.First();//因为我们的Detector只识别了一个脸,所以这里最多只有一个数据
    }
    int top = (int)face.FeaturePoints.Min(r => r.X);
    int left = (int)face.FeaturePoints.Min(r => r.Y);
    int bottom = (int)face.FeaturePoints.Max(r => r.X);
    int right = (int)face.FeaturePoints.Max(r => r.Y);
    ImageHelper.cutPicture(System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "timg.jpg"),
     left, top, right , bottom - top);
}

如上述代码所示,我们在onImageResults里做了【最简单】人物面部坐标定位,并进行了剪切。

处理结果如下图所示:

4.png


结语

事实上,上面介绍的只是Affdex最基础调用,而且,这里并没有使用到深度学习的内容,只是简单的扫描和分析。

想要使用深度学习的内容还需要进一步学习该开源控件,不过,万事开头难,我们现在已经迈出了第一步。

----------------------------------------------------------------------------------------------------

到此C#开发学习人工智能的第一步就完成了。

代码已经传到Github上了,欢迎大家下载。

Github地址:https://github.com/kiba518/WpfAffdex

本文作者:kiba518,全栈.Net软件工程师

声明:本文为 脚本之家专栏作者 投稿,未经允许请勿转载。

相关文章
|
5天前
|
机器学习/深度学习 人工智能 监控
构建未来:AI在持续学习系统中的应用与挑战
【5月更文挑战第29天】 随着人工智能(AI)技术的飞速发展,机器学习模型正变得愈发复杂和高效。然而,传统的AI系统往往在面对新数据或环境时显得僵化,需要重新训练以适应变化。持续学习系统(Continuous Learning Systems, CLS)旨在解决这一问题,通过使AI模型具备在学习过程中不断适应和进化的能力,以实现长期的知识和技能积累。本文将探讨AI在持续学习系统中的应用,分析其面临的主要挑战,并提出可能的解决方案。我们将重点关注模型的可塑性、灾难性遗忘问题以及数据效率等方面,以期为构建能够自我进化的智能系统提供理论基础和技术指导。
|
4天前
|
机器学习/深度学习 存储 人工智能
构建未来:AI在持续学习系统中的进化
【5月更文挑战第30天】 随着人工智能(AI)技术的迅猛发展,其在多个领域的应用已经从理论走向了实践。特别是在机器学习领域内,AI系统的持续学习能力成为关键因素,它决定了一个模型能否适应不断变化的环境并持续提升性能。本文将深入探讨AI在持续学习系统中的关键技术,包括记忆增强、转移学习和元学习等,以及这些技术如何帮助AI系统更好地适应新环境,提高决策效率,从而推动AI技术向更加智能化和自适应化方向发展。
|
5天前
|
机器学习/深度学习 存储 人工智能
构建未来:人工智能在持续学习系统中的进化
【5月更文挑战第29天】 随着人工智能(AI)技术的蓬勃发展,机器学习模型正变得越来越复杂。然而,真正的智能不仅仅体现在完成任务的能力上,更在于不断学习和适应新环境的能力。本文将探讨如何通过创新的学习算法和系统设计,实现AI的持续学习,并分析这一进化对技术未来的意义。
|
6天前
|
机器学习/深度学习 数据采集 人工智能
构建未来:AI在持续学习系统中的进化之路
【5月更文挑战第28天】 随着人工智能(AI)技术的迅猛发展,机器学习模型正变得越来越复杂,对计算资源的需求也随之增长。本文将探讨AI技术在设计自我优化、资源高效的持续学习系统方面的最新进展。我们将重点讨论如何通过先进的算法优化、硬件加速和数据管理策略来提高模型的训练效率和准确性。此外,文中还将分析这些技术如何帮助AI系统适应动态环境,并实现长期的自主学习和决策能力。
|
6天前
|
机器学习/深度学习 人工智能 监控
构建未来:人工智能在持续学习系统中的进化
【5月更文挑战第28天】 随着机器学习技术的不断进步,人工智能(AI)已经从静态算法演变为具备自我更新能力的动态系统。本文探讨了AI在设计自适应学习机制方面的最新进展,重点分析了持续学习系统如何通过累积知识和优化策略来提升性能。我们审视了多个关键领域,包括神经网络架构的创新、数据效率的学习策略以及模型泛化能力的增强。此外,文章还提出了一系列挑战和未来的研究方向,旨在推动智能系统的自主学习和决策能力,以适应不断变化的环境。
|
6天前
|
开发框架 .NET C#
使用C#进行.NET框架开发:深入探索与实战
【5月更文挑战第28天】本文探讨了C#在.NET框架中的应用,展示了其作为强大编程语言的特性,如类型安全、面向对象编程。C#与.NET框架的结合,提供了一站式的开发环境,支持跨平台应用。文中介绍了C#的基础知识,如数据类型、控制结构和面向对象编程,以及.NET的关键技术,包括LINQ、ASP.NET和WPF。通过一个实战案例,展示了如何使用C#和ASP.NET开发Web应用,包括项目创建、数据库设计、模型和控制器编写,以及视图和路由配置。本文旨在揭示C#在.NET开发中的深度和广度,激发开发者探索更多可能性。
|
7天前
|
机器学习/深度学习 人工智能 算法
构建未来:AI在持续学习系统中的应用
【5月更文挑战第27天】 随着人工智能(AI)技术的迅猛发展,其在教育领域的应用日益广泛。特别是在构建能够模拟人类学习过程的持续学习系统中,AI技术展现出了巨大的潜力。本文旨在探讨AI如何通过自适应学习算法、深度学习网络和强化学习机制来优化学习体验,并分析这些技术如何帮助学习系统更好地理解学习者的需求,提供个性化的学习路径,以及在不断变化的环境中进行自我调整和更新。文章还讨论了实施这些系统时所面临的挑战,包括数据隐私问题、算法偏见和技术整合难题,并提出相应的解决策略。
|
7天前
|
机器学习/深度学习 存储 人工智能
构建未来:人工智能在持续学习系统中的进化基于人工智能的图像识别技术在自动驾驶中的应用
【5月更文挑战第27天】 在人工智能(AI)的浩瀚领域中,持续学习系统(Lifelong Learning Systems)代表着一种前沿探索,致力于模拟人类学习新任务的能力同时保留旧知识。本文深入探讨了这些系统的最新进展,包括它们如何通过深度学习、转移学习和元学习策略来优化知识存储与技能提炼。我们还将分析持续学习在现实世界应用中面临的挑战,并提出可能的解决方案,以期推动该领域的进一步发展。
|
8天前
|
机器学习/深度学习 人工智能 算法
构建未来:AI在持续学习系统中的进化
【5月更文挑战第26天】 随着人工智能(AI)技术的飞速发展,AI系统正变得越来越复杂,其学习能力也日益增强。本文深入探讨了AI在学习过程中的关键机制,包括深度学习、强化学习和迁移学习等,并分析了这些技术如何使AI系统能够不断适应新的数据和环境。此外,文章还讨论了持续学习对于AI未来的重大意义,以及它如何推动AI走向更加智能化和自主化的未来。
14 1
|
10天前
|
机器学习/深度学习 人工智能 算法
构建未来:人工智能在持续学习系统中的进化
【5月更文挑战第24天】 本文聚焦于人工智能(AI)技术中一个关键且迅速发展的分支——持续学习系统。不同于传统的静态机器学习模型,持续学习系统能够适应新数据的到来,不断更新知识库,实现长期的累积学习。文章首先概述了持续学习的理论基础及其在现代AI领域的重要性;随后,详细探讨了该领域的最新进展,包括算法创新、神经网络架构的优化以及数据处理策略;最后,分析了持续学习面临的挑战和未来的发展方向。本研究旨在为AI专业人士提供深入见解,并激发对AI持续学习能力提升的新思路。