百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

C#开发学习人工智能的第一步(c++人工智能程序)

bigegpt 2024-08-02 10:46 9 浏览

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

前言

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

也许,有人说C#做不了人工智能,如果你相信了,那只能说明你的思想还是狭隘的。

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

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

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

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

准备工作

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

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

下载Affdex_Sdk网址

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

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

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

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

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

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

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

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

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

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

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

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

在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里做了【最简单】人物面部坐标定位,并进行了剪切。

处理结果如下图所示:

结语

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

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

相关推荐

当Frida来“敲”门(frida是什么)

0x1渗透测试瓶颈目前,碰到越来越多的大客户都会将核心资产业务集中在统一的APP上,或者对自己比较重要的APP,如自己的主业务,办公APP进行加壳,流量加密,投入了很多精力在移动端的防护上。而现在挖...

服务端性能测试实战3-性能测试脚本开发

前言在前面的两篇文章中,我们分别介绍了性能测试的理论知识以及性能测试计划制定,本篇文章将重点介绍性能测试脚本开发。脚本开发将分为两个阶段:阶段一:了解各个接口的入参、出参,使用Python代码模拟前端...

Springboot整合Apache Ftpserver拓展功能及业务讲解(三)

今日分享每天分享技术实战干货,技术在于积累和收藏,希望可以帮助到您,同时也希望获得您的支持和关注。架构开源地址:https://gitee.com/msxyspringboot整合Ftpserver参...

Linux和Windows下:Python Crypto模块安装方式区别

一、Linux环境下:fromCrypto.SignatureimportPKCS1_v1_5如果导包报错:ImportError:Nomodulenamed'Crypt...

Python 3 加密简介(python des加密解密)

Python3的标准库中是没多少用来解决加密的,不过却有用于处理哈希的库。在这里我们会对其进行一个简单的介绍,但重点会放在两个第三方的软件包:PyCrypto和cryptography上,我...

怎样从零开始编译一个魔兽世界开源服务端Windows

第二章:编译和安装我是艾西,上期我们讲述到编译一个魔兽世界开源服务端环境准备,那么今天跟大家聊聊怎么编译和安装我们直接进入正题(上一章没有看到的小伙伴可以点我主页查看)编译服务端:在D盘新建一个文件夹...

附1-Conda部署安装及基本使用(conda安装教程)

Windows环境安装安装介质下载下载地址:https://www.anaconda.com/products/individual安装Anaconda安装时,选择自定义安装,选择自定义安装路径:配置...

如何配置全世界最小的 MySQL 服务器

配置全世界最小的MySQL服务器——如何在一块IntelEdison为控制板上安装一个MySQL服务器。介绍在我最近的一篇博文中,物联网,消息以及MySQL,我展示了如果Partic...

如何使用Github Action来自动化编译PolarDB-PG数据库

随着PolarDB在国产数据库领域荣膺桂冠并持续获得广泛认可,越来越多的学生和技术爱好者开始关注并涉足这款由阿里巴巴集团倾力打造且性能卓越的关系型云原生数据库。有很多同学想要上手尝试,却卡在了编译数据...

面向NDK开发者的Android 7.0变更(ndk android.mk)

订阅Google官方微信公众号:谷歌开发者。与谷歌一起创造未来!受Android平台其他改进的影响,为了方便加载本机代码,AndroidM和N中的动态链接器对编写整洁且跨平台兼容的本机...

信创改造--人大金仓(Kingbase)数据库安装、备份恢复的问题纪要

问题一:在安装KingbaseES时,安装用户对于安装路径需有“读”、“写”、“执行”的权限。在Linux系统中,需要以非root用户执行安装程序,且该用户要有标准的home目录,您可...

OpenSSH 安全漏洞,修补操作一手掌握

1.漏洞概述近日,国家信息安全漏洞库(CNNVD)收到关于OpenSSH安全漏洞(CNNVD-202407-017、CVE-2024-6387)情况的报送。攻击者可以利用该漏洞在无需认证的情况下,通...

Linux:lsof命令详解(linux lsof命令详解)

介绍欢迎来到这篇博客。在这篇博客中,我们将学习Unix/Linux系统上的lsof命令行工具。命令行工具是您使用CLI(命令行界面)而不是GUI(图形用户界面)运行的程序或工具。lsoflsof代表&...

幻隐说固态第一期:固态硬盘接口类别

前排声明所有信息来源于网络收集,如有错误请评论区指出更正。废话不多说,目前固态硬盘接口按速度由慢到快分有这几类:SATA、mSATA、SATAExpress、PCI-E、m.2、u.2。下面我们来...

新品轰炸 影驰SSD多款产品登Computex

分享泡泡网SSD固态硬盘频道6月6日台北电脑展作为全球第二、亚洲最大的3C/IT产业链专业展,吸引了众多IT厂商和全球各地媒体的热烈关注,全球存储新势力—影驰,也积极参与其中,为广大玩家朋友带来了...