szjuliet 发表于 2021-5-26 01:36:35

【AI2+AI】人工智能面部滤镜APP

本帖最后由 szjuliet 于 2021-6-18 07:38 编辑

      
# 人工智能面部滤镜APP

**难度:** 中级

**课程类型:** 教程

**学科:** 计算机科学

**年级水平:**

- 6~8年级
- 9~12年级

**本教程由Youth Mobile Power提供**

教程地址: (http://ai2.appinventor.mit.edu/?locale=en&repo=http://appinventor.mit.edu/yrtoolkit/yr/aiaFiles/facemesh/Facemesh_StarterProject.asc)

本教程中,我们使用一种类似但不同的技术 -- 面部标志检测。你面临的挑战是创建一个基于人工智能的滤镜相机。你有两种选择:一种是下面这张动图里可爱的猫,另一种是凶猛的狮子。


![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234657ew9vwwjnhvge8jzg.gif)

## 1. 项目简介

你用面部滤镜拍过照片吗? Instagram和Snapchat面部滤镜席卷网络,你知道这些过滤器如何工作吗?你想制作自己的面部滤镜吗? YR Media的小伙伴们有一篇出色的关于面部识别的互动文章。 在本教程中,我们将使用类似但不同的技术-面部标志检测。你面临的挑战是使用一种名为Facemesh的新AI技术来创建一个滤镜相机。

![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234652mnwkwutfmd4d2wm7.png)

这个项目中,我们将学习如何使用称为Facemesh的一种新的人工智能技术,它是由谷歌训练的一种可供公众使用的模型。

**什么是模型**

模型是计算机如何思考的数学表现。它可以被认为是计算机的“大脑”。例如,当看到一张脸时,你的大脑会迅速确定眼睛在哪里。类似地,Facemesh模型会拍摄一张人脸的照片,然后判断眼睛在哪里。人类大脑的决策过程属于认知科学领域;计算机的决策过程属于人工智能领域。

模型非常复杂,涉及到大量的数学运算。你需要理解的过程的数学难度是大学水平,别担心!你无需完全了解整个过程,就可以从这个项目中受益!

## 2. Facemesh模型

Facemesh模型会给你的脸部拍照,并给出许多不同的面部特征的具体位置,如鼻子、额头、嘴的X和Y坐标。使用这些信息你可以创建面部滤镜;这些滤镜其实本质上是跟随你脸上特定点的图像。

我们使用![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234651ymjcrayysmmamkat.png)**FaceExtension**来访问Facemesh模型,这是App Inventor的一个工具,就像桥梁一样让你能够在app中使用模型。项目完成后你会有自己的滤镜相机!你可以用这个app拍摄有创意的照片并与朋友分享。

![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234651vqr1yh21sarqxq4r.png)

**重要提示**:注意,这个项目不能使用模拟器来测试app,因为模拟器不能运行MIT app Inventor扩展,如![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234651ymjcrayysmmamkat.png)**FaceExtension**。可以使用文末的附件来测试你的移动设备是否具备Facemesh所需的硬件功能。

## 3. 图形用户界面(GUI)

在启动文件中已经您创建了可用的GUI。请不要重命名组件,因为本教程将参考指南中给定的名字。

![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234651e6r99n67ls3lss46.png)

**TakePhotoButton**按钮让用户拍照。它连接到![](https://mc.dfrobot.com.cn/data/attachment/album/202105/25/212245cnphbpos8148f88q.png)**TextToSpeech文本转语音**组件,该组件会在拍摄照片时通知用户。 **SharePhotoButton**按钮允许用户使用设备上安装的任何照片分享app来分享最近拍摄的照片。

![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234651ymjcrayysmmamkat.png)**FaceExtension**是用于跟踪面部关键点的AI技术,它提供创建面部滤镜所需的信息。该扩展组件需要运行Web浏览器,因此我们将其链接为![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234652irbtrm89bmbbmaax.png)**WebViewer**组件。由于我们使用![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234651ihfqnq3xygzq26yp.png)**Canvas**作为查看器,因此需要将![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234652irbtrm89bmbbmaax.png)**Webviewer**的可见性关闭。 ![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234651ihfqnq3xygzq26yp.png)**Canvas**组件将显示实时摄像机视图背景以及猫/狮子面部滤镜。

![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234652irbtrm89bmbbmaax.png)**WebViewer**组件,![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234651ihfqnq3xygzq26yp.png)**Canvas**组件和![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234651ymjcrayysmmamkat.png)**FaceExtension**的尺寸必须匹配,以便于面部跟踪。如果修改三个组件中任何一个的高度和宽度值,请确保对所有三个组件进行相同的修改。

最后,![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234652rw2229odt9dtmmk9.png)**Sharing**共享组件是一个社交组件,允许通过电话上的另一个app(如Email和Messenger)共享照片文件。

## 4. Facemesh关键点

Facemesh跟踪的人脸关键点是:

+      前额
+      下巴
+      左脸颊left cheek
+      左眼下部
+      左眼内侧
+      左眼上部
+      左眉
+      左前额
+      左鼻
+      嘴巴上部
+      嘴巴下部
+      鼻子底部
+      右脸颊
+      右眼下部
+      右眼内侧
+      右眼上部
+      右眉
+      右前额
+      右鼻

![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234652jozxquyq3ckibixt.png)

## 5. 面点关键点格式

每个关键点返回的是一个列表,列表包括两个元素:该点的x坐标和y坐标。

例如,关键点“forehead前额”是2个元素的列表:

([前额x坐标,前额y坐标])

![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234652h7k4deeemjifmikl.png)

如果Facemesh无法跟踪整个脸部,会返回一个空列表导致滤镜无法工作;请确保面部在相机框架内!

## 6. 选择猫还是狮子(1)

开始做项目吧!现在画布看起来像是空的。 这是因为我们还没有为**leftEar**,**rightEar**和**whiskers**设置*Picture图片*属性。

首先选择猫或狮子滤镜过滤器。滤镜确定后,查看Media多媒体栏,该栏目里有多张图片。

![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234653a3zsytf3zs3kf3s3.png)

在组件栏中单击“whiskers”,在组件属性中会看到它的各种的属性。如果选择的是狮子滤镜,请将**whiskers**的图片属性设置为LION_whiskers.png。 如果选择的是猫滤镜,则将**whiskers**的图片属性设置为CAT_whiskers.png。

![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234653qvgz34uv7heek3he.png)

## 7. 选择猫还是狮子(2)

如果将**whiskers**的图片属性设置为LION_whiskers.png,则应该在组件设计窗口看到以下更改。

![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234653qqzqilyhe6bbbz6l.png)

对**leftEar**和**rightEar**图片重复此过程,为选择的动物滤镜选择图片。

狮子:

+ 将**leftEar**的*Picture*属性设置为LION_leftEar.png,将**rightEar**的*Picture*属性设置为LION_rightEar.png。

猫:

+ 将**leftEar**的*Picture*属性设置为CAT_leftEar.png,将**rightEar**的Picture属性设置为CAT_rightEar.png。

## 8. 选择猫还是狮子(3)

在为**leftEar**,**rightEar**和**whiskers**三个组件设置完Picture属性之后,画布应类似于以下两个图像之一。

![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234653pecfpc2pqlyydc5i.png)

## 9. 初步的GUI代码

初始文件中已经有一些使按钮按预期工作的代码。检查代码块,大致了解它们的作用。

![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234653n75jhks7z8s751f5.png)

这里有两个变量:*photoCount*计算已拍摄的照片数量,*mostRecentPhoto*存储最近拍摄的照片的文件名。

![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234653tgkaow9aakda3a2p.png)

单击**TakePhotoButton**时,*mostRecentPhoto*文件名更新为当前图像,*photoCount*增加1。拍摄的第一张照片被命名为“characterCamera1.jpg”,第二张照片被命名为“characterCamera2.jpg”,依此类推。这些文件都保存到你的手机中。无论文件保存在哪里,在你的手机中都可以找到照片。例如,在Google Pixel上,照片将保存到“文件”app中。

跟踪*photoCount*并将其加1的原因是让每个图片文件都有一个唯一的名称。如果加1,则拍摄的照片都会重复写入同一个文件名。跟踪*mostRecentPhoto*的原因是为了可以使用**SharePhotoButton**分享这张照片。

![](https://mc.dfrobot.com.cn/data/attachment/album/202105/25/212245cnphbpos8148f88q.png)TextToSpeech可以在拍照时让机器人说“已捕获照片!”

![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234653fdmmxp3mxphqp44j.png)

单击**SharePhotoButton**按钮时,可以分享最新照片!使用设备上安装的共享图像的任何应用(例如Google云端硬盘,Dropbox等)分享它。

## 10. 辅助功能

现在编写一些代码将三个ImageSprite(leftEar,rightEar和whiskers)放在面部相应的点上。

第一个编码任务是填充名为placeImage的帮助函数。

![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234653k1mhf91zo1lppshd.png)

placeImage过程将img的中心 - **ImageSprite**放置在facePoint(由Facemesh跟踪的关键点)上。

## 11. 放置耳朵和胡须

通过调用ImageSprite.MoveTo(x,y)将ImageSprite的**左上角**移动到(x,y)。

但是,如果希望将img的**中心**放置在facePoint(x<sub>f</sub>,y<sub>f</sub>)上,则必须做一些简单的数学运算以获取其左上角的坐标,我们将其称为(x<sub>c</sub>,y<sub>c</sub>)。

注意,在**画布Canvas**的x-y坐标系中,(0,0)是左上角。 与正常的直角坐标系的区别在于y向下增加。

![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234653atfl83rf1suio5s8.png)

在上述情况下,如果想将左耳放置在Facemesh返回的左额头facePoint(x<sub>f</sub>,y<sub>f</sub>)的中心。

+ 获得调整后的水平位置
    + **x<sub>c</sub> = x<sub>f</sub>-0.5*图像宽度**

+ 获得调整后的垂直位置
    + **y<sub>c</sub> = y<sub>f</sub>-0.5*图像高度**

当我们调用ImageSprite.MoveTo(x<sub>c</sub>,y<sub>c</sub>)时,图像以facePoint的坐标(x<sub>f</sub>,y<sub>f</sub>)为中心。

## 12. 将过程填充完整

在placeImage过程中,需要完成的任务是:

+ 填写ImageSprite.MoveTo代码块的x参数为**x<sub>f</sub>-0.5*图像宽度**。这是从facePoint的x坐标减去ImageSprite宽度的一半后得到的结果。

+ 填写ImageSprite.MoveTo代码块的y参数为**y<sub>f</sub>-0.5*图像宽度**。这是从facePoint的y坐标减去ImageSprite高度的一半的结果。

如果感觉有点棘手,不要担心。下面会有如何完成过程的更多帮助。

1. 如何获得img的高度/宽度?

要获取图像的高度/宽度,请使用以下代码块。

![](https://mc.dfrobot.com.cn/data/attachment/album/202105/25/232400ts87irmbsssh1dqh.png)

![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234653rw7ol4woydl2w7vd.png)

要访问上面显示的这些ImageSprite代码块,在“Blocks模块”菜单中单击“任意组件”。这会打开下拉菜单显示以下内容。然后单击“任意ImageSprite”,会在其中找到上述代码块。

![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234653d2pg2kvpnpl0qlql.png)

2. 我如何获得数字0.5?

单击“Blocks模块”中的“数学”选项,找到数字0。将数字拖到工作面板中,然后双击0以清除旧值并插入新值。

![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234654i34ok044tukj1c14.png)

3. 如何获取facePoint和img?

将鼠标悬停在placeImage过程中的“img”上大约一秒钟,会弹出以下内容,这时就可以拖动“get img”了。

![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234654yyvjpcyvzaovp50v.png)

将鼠标悬停在placeImage过程中的“facePoint”上大约一秒钟,弹出以下内容。这时就可以拖动“get facePoint”了。

![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234654naya0rpyageeplqr.png)

4. 如何获取facePoint的x,y坐标?

如前所述,每个facePoint是2个元素的列表。 x坐标位于索引1,y坐标位于索引2。

+ 要获取x<sub>f</sub>,请使用以下块从facePoint列表中获取索引为1的项目。

![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234654fdpht1hiyfzfhzz1.png)

+ 要获取y<sub>f</sub>,请使用以下代码块从facePoint列表中获取索引为2的项目。

![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234654pqt5nqn5y9x2219x.png)

提示

![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234654h82twwpxz27480w9.png)

解决方案

![](https://mc.dfrobot.com.cn/data/attachment/album/202105/25/233626prz219x4rg62pxu5.png)

## 13. 脸部更新 过程

当**FaceExtension**检测到人脸时,会触发以下FaceExtension1.FaceUpdated事件。 此事件处理程序的代码也已创建并提供了调整大小resizing过程的代码,但是移动moving过程的代码不完整,你马上就会创建。

![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234654q4p3l5oeeeq44g89.png)

## 14. 移动 过程

滤镜的基本工作方式包括两部分。

1. 移动:当脸部移动时,图像会与脸部一起移动。
2. 调整大小:当脸部变大或变小时,图像将相应调整大小。

下面是第一个过程:移动Moving

![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234654geyfajy616otii5i.png)

要完成这段代码块,需要

+ 调用placeImage将**leftEar**移动到前额的左侧(FaceExtension.LeftForehead)。

+ 调用placeImage将**rightEar**移动到前额的右侧(FaceExtension.RightForehead)。

+ 调用placeImage将**whiskers**移到嘴巴的上部(FaceExtension.MouthTop)。

记住,placeImage有两个参数:

1. **ImageSprite**对象
2. **FaceExtension**检测到的脸部关键点。


如何获得一个图像精灵ImageSprite?

![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234654uyq5r8p2fzgafpp3.png)

在“Blocks模块”中,找到Canvas1,会看到三个ImageSprites:leftEar, rightEar和whiskers。

如果要获取leftEar对象,单击leftEar,选项抽屉会显示在右侧。滚动到底部找到leftEar对象。可以将其拖动到工作面板中作为placeImage的参数。

请遵循类似的步骤以获取正确的耳朵和胡须。


提示

![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234654ywk3d3m232kkki3x.png)

解决方案

![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234654lyu7rgzi5rfffr7c.png)

## 15. 调整大小

接下来是第二个步骤:调整大小。

![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234654snhszay68ypebbyz.png)

+ 定义图像的宽度或高度时,我们定义的是图像边界框的宽度或高度(以红色突出显示)。

+ 所有宽度和高度都可以根据我们的期望任意选择并修改。

![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234655jmwu1mm91lfxnm5k.png)

胡须:

+ 宽度设置为脸部的宽度。
+ 高度是眼睛和嘴巴之间的距离。

耳朵:

+ 宽度设置为脸颊与鼻子之间的距离。
+ 耳朵是正方形的边界框,我们可以将宽度和高度设为相同。

## 16. 测试应用

现在使用AI Companion来检查app是否正常运行。 注意不能用模拟器测试app,因为它不支持FaceExtension之类的MIT App Inventor扩展。

检查app是否可以跟踪人脸,并能够将耳朵和胡须正确放置在人脸上。 为了获得FaceExtension的最佳效果,请确保脸部光线充足并且直接面对相机。

## 17. 拍张照片发给自己的老友!

现在用全新的猫或狮子造型摆姿势,然后单击“拍照”按钮。 接下来,单击“共享最新图像”和自己的老友分享照片!

在下面的演示中,用户拍摄照片,单击“共享最新图像”,然后使用Google Hangouts与她的朋友分享照片。可用的app取决于你自己的手机。

![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234657xzzzs2383iqcf827.gif)

太棒了! 你已经完成了人物相机app! 你经构建了一个基于AI的应用程序,该应用程序可以跟踪面部的运动。

## 拓展你的app

1. FaceExtension ShowMesh

![](https://mc.dfrobot.com.cn/data/attachment/album/202105/26/000948vvy0qyrjrlg9m89m.png)

在工作面板中单击![](https://mc.dfrobot.com.cn/data/attachment/album/202104/15/234651ymjcrayysmmamkat.png)**FaceExtension1**组件,会显示则其属性。 你可以操作其中一些属性。

可以将ShowMesh打开来试着检查一下。 这会显示Facemesh在你脸上识别的所有点的实时地图。

![](https://mc.dfrobot.com.cn/data/attachment/album/202105/26/000948s3zf6h6pw8mwmn3l.png)

2. 使用FaceExtension之AllPoints

可以通过FaceExtension代码使用486个可用的点。

向下滚动到[此Facemesh网页](https://github.com/tensorflow/tfjs-models/tree/master/facemesh)的最底部,可以查看所有可访问点的Facemesh地图。 可以单击它来放大。

![](https://mc.dfrobot.com.cn/data/attachment/album/202105/26/002100lyx33mu3mf0x33m3.gif)

例如,如果想要嘴唇上的特定点,可在地图上找到编号,假设为数字14,可以通过下面的代码块访问facePoint:

![](https://mc.dfrobot.com.cn/data/attachment/album/202105/26/000947o06imetinvit2opq.png)

现在可以将该块用作placeImage的facePoint参数。

3. FaceExtension之UseCamera

![](https://mc.dfrobot.com.cn/data/attachment/album/202105/26/000947j77mymvkxxl17hm7.png)

默认情况下,UseCamera设置为“Front”以拍照。 将其切换为“Back”,这样可以为朋友拍照。 还可以添加一个按钮来切换相机镜头钮。 注意,如果在代码块中更改UseCamera,则必须将其设置为文本(“Back”或“Front”)。

![](https://mc.dfrobot.com.cn/data/attachment/album/202105/26/000947b3d3zwql3lzp3qh3.png)

![](https://mc.dfrobot.com.cn/data/attachment/album/202105/26/000947qtxabzawtgu009m0.png)

注意:本app不需要摄像头组件,因为FaceExtension组件可以访问设备的摄像头。

4. 选择自己的角色!

你可以:

+ 在线获取自己的图像或查看[此图像库](https://github.com/mit-cml/yrtoolkit/tree/master/yr/images/facemesh/imageLibrary)
+ 转到网站(https://remove.bg/)去除背景
+ 制作自己的ImageSprites。
+ 视需要更新高度和宽度尺寸
+ 视需要将图像放置在相应的面部点上

让大脑放飞,让创意的果汁流淌!

这里有一些想法可以帮助你入门:

![](https://mc.dfrobot.com.cn/data/attachment/album/202105/26/000946m4hff1pj1t4e38zs.png)

5. 允许切换滤镜

可以添加两个或多个按钮在不同的滤镜之间切换。

单击按钮时需要添加一些代码来更改ImageSprites的Picture属性。 这是按钮的一些代码示例。

![](https://mc.dfrobot.com.cn/data/attachment/album/202105/26/000946cej8woeeb0xg3sif.png)

![](https://mc.dfrobot.com.cn/data/attachment/album/202105/26/000946ybcwb2g9qfbxqg6u.png)

6. 创建一个照片库

在相册中查看所有拍摄的照片会不会很开心?

可以添加第二个屏幕,保存到目前为止拍摄的照片名称,并将其显示为图库。 你可能需要使用TinyDB保存照片。 下面是图库外观的一些点子。

![](https://mc.dfrobot.com.cn/data/attachment/album/202105/26/000946qv3vl72vqg7zaxly.png)

7. 增加互动

使用不同的关键点,通过跟踪两个facePoint之间的差异来识别脸部的运动。

这是一个表情符号与面部表情匹配的app演示。

![](https://mc.dfrobot.com.cn/data/attachment/album/202105/26/000949e1fuyyxkfiq9bmyb.gif)

要在app中获得这种额外的交互性,需要:

+ 两个Imageprites,一个用于张嘴,另一个用于闭嘴
+ 跟踪嘴巴的y坐标之间的差异
+ 相应地更改不同表情符号Imagesprites的Visible属性。

## 关于Youth Mobile Power

我们很多人整天都在手机上度过,痴迷各种app。尽管我们知道手机会对我们的注意力、隐私甚至安全构成威胁,但我们还是继续打字和刷手机。但“口袋里的电脑”也为年轻人创造了未开发的机会,让他们学习、联系并改变我们的社区。

这就是为什么麻省理工学院和YR媒体联手推出了青年移动动力系列。YR青少年制作故事,突出年轻人如何以令人惊讶和强大的方式使用手机。与此同时,麻省理工学院的团队正在不断改进MIT App Inventor,让像你这样的用户能够创建像YR报道中提到的那样的APP。

回归初心:从故事中获得灵感,开始制作你自己的应用程序吧!

![](https://mc.dfrobot.com.cn/data/attachment/album/202102/13/225122vhts3elzg3kelvez.png)

![](https://mc.dfrobot.com.cn/data/attachment/album/202102/13/225202c28gpg6em8mgpn9z.jpg)

![](https://mc.dfrobot.com.cn/data/attachment/album/202102/13/225202ul44cgigez4s8qsz.png)


YR和麻省理工学院的合作部分得到了美国国家科学基金会的支持。本材料基于美国国家科学基金会在批准号下支持的工作。(1906895, 1906636)。本材料中所表达的任何意见、发现、结论或建议均为作者个人观点,并不一定反映美国国家科学基金会的观点。

点击[此处](https://yr.media/category/interactive/)查看更多由YR创建的应用程序和交互式新闻内容。

kingrever 发表于 2021-6-17 10:55:25

来得及时

大江东去 发表于 2021-10-7 20:27:08

"麻省理工学院的团队正在不断改进MIT App Inventor". 还在完善中?据说被收购停止更新了吧

szjuliet 发表于 2021-10-9 17:22:57

大江东去 发表于 2021-10-7 20:27
"麻省理工学院的团队正在不断改进MIT App Inventor". 还在完善中?据说被收购停止更新了吧 ...

是MIT官网哦,一直都在持续更新,每个月至少两次以上,连IOS的版本都在不断更新。
“收购停止更新”是??
页: [1]
查看完整版本: 【AI2+AI】人工智能面部滤镜APP