szjuliet 发表于 2022-1-6 01:15:51

【AI2+AI】个人图像分类器:PICaboo(躲猫猫)

本帖最后由 szjuliet 于 2022-1-6 01:15 编辑


# 【AI2+AI】个人图像分类器:PICaboo(躲猫猫)

**难度:** 中级

**课程类型:** 教程

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

**年级:**

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

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

项目启动文件: [ Personal Image Classifier: PICaboo](http://ai2.appinventor.mit.edu/?locale=en&repo=http://appinventor.mit.edu/yrtoolkit/yr/aiaFiles/PICaboo/PICaboo_Starter.asc)教程地址: https://appinventor.mit.edu/explore/resources/ai/picaboo
机器如何了解世界?在某些方面,计算机就像非常年幼的小宝宝,总是吸收新的例子,并试图把它们感觉到的东西放进不同的桶里——狗、猫、熟悉的面孔、陌生人。

在这两部分的教程中,你将学习一种名为机器学习(ML)的人工智能(AI),探索一个名为“图像分类”的例子 ———— 一种计算机将它们看到的东西放入不同容器中的方法。你将创建一个app,它可以看到你做出的人类手势并智能响应!

## 1. 项目简介

本教程使用自己的个人图像分类(PIC)模型制作一个“躲猫猫”游戏。在游戏中,当你露出脸时,小宝宝会笑,你遮住脸时,小宝宝会哭。

![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/03/153243pxqxxgr64qnjvqrg.png)

### 什么是“躲猫猫”游戏?

小宝宝不太明白如何理解自己周围的视觉世界。他们缺乏一种理解,即物体在看不见的情况下仍然存在。这个概念被著名的儿童心理学家让·皮亚杰(Jean Piaget)描述为“客体永存性”(object permanence)。在美国,父母经常和他们年幼的宝宝玩一种叫“躲猫猫”的游戏。在游戏中,父母会用手或枕头等将自己的脸藏起来,在宝宝吃惊的时候脸“消失不见”。然后妈妈突然露出脸来说:“躲猫猫,我看见你了!”——这让宝宝非常高兴,他惊讶地看到父母突然“不知道从哪儿冒出来”。这里有一个躲猫猫的[视频](https://www.bilibili.com/video/BV1Am4y1D7vz/)。

机器学习理解视觉数据有点像小宝宝学习视觉线索。小宝宝和计算机都需要很多例子(大量的训练数据)。此外他们还需要示例的类别易于区分(在视觉上截然不同的数据类)。

**重要提示**:请注意不能使用模拟器来测试app。模拟器不能运行MIT App Inventor扩展,如![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/03/153240d0z5aooraxy7l7z2.png)**PersonalImageClassifier** (PIC)扩展。为了确保移动设备具备PIC所需的硬件能力,在AI2伴侣上运行LookTest.aia文件(可在附件中下载)进行测试。如果在手机屏幕顶部的状态显示“status: Ready!”,说明![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/03/153240d0z5aooraxy7l7z2.png) **PersonalImageClassifier** 扩展可在手机上正常工作。如果屏幕没有显示,手机将无法运行app及对应的扩展。如果扩展能够正常工作,请将设备指向一个对象并按下“分类”按钮,尝试对某些对象进行分类。

## 2. PICaboo 第1部分:训练模型

首先,需要训练一个图像分类模型。这个训练在App Inventor - [个人图像分类器](https://classifier.appinventor.mit.edu/)页面进行。按照PICaboo第1部分pdf文档(可在附件中下载)中的说明进行操作。在本步骤的最后导出model.MDL文件到你的计算机。在本教程的下一部分中,你需要将这个文件上传到App Inventor。

![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/03/153240yk1pe5n5k1kpknsh.png)

## 3. PICaboo 第2部分:设计和编写app

图形用户界面 (GUI) 的示例位于启动文件中(请在附件中下载)。 (如果你愿意,可以更改组件的属性以获得你想要的外观。但是不要重命名组件,因为本教程将参考说明中的给定名称。)

![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/03/153241lkkqbwh0778kt7kw.png)

## 4. 上传训练好的模型文件

单击“非可视组件”![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/03/153240d0z5aooraxy7l7z2.png) PersonalImageClassifier1。 该组件将根据你训练的模型对你的姿势进行分类。

通过单击“模型”属性并选择保存在电脑中的模型文件并上传。

![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/03/164334tjf0yudrpqzfqfdr.png)

## 5. 事件序列

下图显示了 PICaboo 中的事件序列。 用与正确事件对应的字母填写缺失的块。

![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/03/153241zv3sc2wmczcpui32.png)

(正确答案:从左至右为A, B, C)

## 6. 查看已有代码

现在切换到“逻辑设计”来为app编写行为。 首先查看启动文件中已经有的代码块。 这些代码块在app首次启动时设置 ![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/03/153240d0z5aooraxy7l7z2.png)**PersonalImageClassifier**。

如果 ![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/03/153240d0z5aooraxy7l7z2.png)**PersonalImageClassifier** 返回错误,![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/06/001331uocxz4mhwxfmc98m.png)事件块会在 **StatusLabel** 中显示错误。

![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/03/153242vzcy5cc2cfdas5m2.png)

当分类器准备好开始对图像进行分类时,将调用![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/06/000320dzi4qq62lww7cmiw.png) 块。 **StartButton** 和 **ToggleCameraButton** 已启用。 “Ready”显示在**StatusLabel**中。 **BarLabel1** 和 **BarLabel2** 被分配了模型标签的名称(“Me”和“NotMe”)。 这些是你在模型中训练的分类。

![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/03/153242pyxszzgt2cxhozta.png)

当按下 **ToggleCameraButton** 时,摄像头从前置摄像头切换到后置摄像头,反之亦然。

![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/06/000909wzgrs5gc5357z5cp.png)

**StartButton** 会停止或启动 **PersonalImageClassifier** 分类过程。 按钮文本从“Start”变为“Stop”,反之亦然。

![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/06/000909ouqtf5npqg7mmgif.png)

## 7. 图像分类结果(第 1 部分)

现在我们终于来到提供分类模型重要结果的代码块。在编码之前,让我们看看这个来自组件 ![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/03/153240d0z5aooraxy7l7z2.png)**PersonelImageClassifier** 的![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/05/234244j88i3w9i7ri9nryn.png)数据是如何接收和使用的。

当分类器为其所见生成分类时,将调用 ![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/05/234244jwqqgpnyk8pyn4pz.png)事件处理程序块。在本教程中,你的主要任务是完成此块中的代码。

![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/03/153242osmyzdzsxzdy2d4x.png)

![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/05/234244j88i3w9i7ri9nryn.png)以称为“字典”的数据结构的形式列出了分类。在计算机科学中,字典存储键/值对 ———— 很像现实世界的字典存储单词及其定义。但与现实世界的字典不同,字典数据结构可以保存与任意值关联的任意键。它们几乎可以是任何类型:字母、单词、多字串、数字以及所有这些的组合。下面是一个例子:

![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/03/153242kjfsbeexx06f0xxx.png)

在上面的键/值对示例中,键是“Name”,值是“Tel”。这个字典是一本普通的电话簿。

## 8. 图像分类结果(第 2 部分)

![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/03/153240d0z5aooraxy7l7z2.png)**PersonelImageClassifier** 返回的![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/05/234244j88i3w9i7ri9nryn.png)列出了两个类(“Me”和“NotMe”)的名称(键)及其置信度(值)。 下面的代码块代表了这个数据结构。 (注意:字典按置信度从高到低的顺序列出了结果中的键/值对。)

![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/03/153242o5t51z1inyvlw0vu.png)

在此示例中,![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/05/234244j88i3w9i7ri9nryn.png)由具有 0.925(即 92.5%)的高置信水平的分类“Me”和具有 0.075(即 7.5%)的低置信水平的分类“NotMe”组成。 这些置信水平由你在训练阶段创建的模型计算得出。 在这种情况下,PICaboo app中的婴儿会微笑,因为计算机确信它看到了你的脸。

![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/03/153242ybqfe4bqsz0czz4s.png)

## 9. 图像分类结果(第 3 部分)

要从![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/05/234244j88i3w9i7ri9nryn.png)中找出特定键的值,可以使用![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/05/234244nstotir0s22shfqh.png)代码块。 在下面的示例中,如果你在给定的字典中搜索关键字“Me”,会得到 0.925 ———— 其相关的置信度(值)。 如果没有匹配的键,返回的值是 0。

![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/03/153242j4nc4j4zycrj3eke.png)

## 10. 获得分类

![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/05/234244jwqqgpnyk8pyn4pz.png) 事件处理程序块通过初始化两个局部变量开始。 (局部变量只能在定义它们的代码块内使用。)

+ ![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/05/234244widz00pieeibt01f.png):是“Me”类(显示面部)的置信度。
+ ![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/05/234244p99is4zijd09shsj.png):是“NotMe”类(隐藏面部)的置信度。

![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/03/153242osmyzdzsxzdy2d4x.png)

你很快就会看到代码如何使用上面这些局部变量。

## 11. 初始化变量

将变量 ![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/05/234244widz00pieeibt01f.png) 和 ![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/05/234244p99is4zijd09shsj.png) 初始化为与每个类“Me”和“NotMe”相关的置信水平。 (请记住,这些置信水平是 ![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/05/234244j88i3w9i7ri9nryn.png) 返回的字典数据结构中的值。)

**提示**

如图所示初始化局部变量。 如果将鼠标悬停在参数![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/05/234244j88i3w9i7ri9nryn.png)上,会看到所需的块。 请务必用数学块中的“0”替换默认的“未找到”文本块。 这确保在分类器尚未返回结果的情况下分配 0% 的置信水平。

![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/03/153243inn5dfb7dh2ood3f.png)

**解决方案**

![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/03/153243v5qyk5tz0du4kq64.png)

## 12. 事件序列概括

当分类器得到分类时,你可以:
+ 正确设置**percent1**文本和**BarGraph1**宽度百分比。
+ 正确设置**percent2**文本和**BarGraph2**宽度百分比。
+ 如果置信度较高的分类是“Me”(意味着机器非常确信它看到了你的脸),那么就显示开心宝宝图像,隐藏难过宝宝图像,并将Screen1背景设置为浅绿色。
+ 否则,显示难过宝宝图像,隐藏开心宝宝图像,并使Screen1背景为浅粉色。

![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/03/153243pxqxxgr64qnjvqrg.png)

## 13. 设置Percentage和BarGraph

首先将 **Percentage1** 文本设置为“Me”类的置信度。 该值是 0 到 1 之间的小数,因此你需要将其转换为百分比(乘以 100)并添加“%”符号。 例如,如果置信水平为 0.75,则此适当百分比为 75%。

其次,请注意 **BarGraph1** 是一个彩色标签,通过其宽度显示“Me”类的置信度。 相应地设置其 **WidthPercent**。 你可以复制你编写的早期代码的一部分。

最后,对 **Percentage2** 和 **BarGraph2** 做类似的事情。 对于这些情况,请务必使用 ![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/05/234244p99is4zijd09shsj.png) 局部变量。

**提示**

![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/03/153243pxt5ooyoj0s5y9zn.png)
![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/06/003255jhpt3hjhzts9pc04.png)

**解决方案**

![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/03/153243a1hop8n728oggo2p.png)

## 14. 构建条件语句

现在构建 ![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/05/234244yr2t4b4gb1otw5ie.png)条件块,它测试具有更高置信度的类是否是“Me”分类。 这意味着计算机会以更高的置信度识别出你的面部。

**提示**

![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/03/153243psvftne34e6s46v3.png)

**解决方案**

![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/03/153244j19p2xjnk1v7mzmn.png)

## 15. 显示开心宝宝和难过宝宝

首先为![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/05/234244yr2t4b4gb1otw5ie.png) 的 **then** 部分构建代码:

+ 将 Screen1 背景颜色设置为浅绿色。 (使用模板中已有的浅绿色色块。)
+ 显示开心宝宝图像。
+ 隐藏难过宝宝图像。

现在,为 ![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/05/234244yr2t4b4gb1otw5ie.png)的 **else** 部分构建代码并将这些代码块对齐到它们所属的位置。 (使用模板中已有的浅粉色色块。)

**提示**

![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/03/153244omyfmhyn732do8uj.png)

**解决方案**

![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/03/153244zf0fz9ffeheonelf.png)

## 16. 完成代码

完成后整个代码应如下所示:

![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/03/153244vcscsh7wihozcsah.png)

## 17. 测试app

![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/03/153244qrlrpgrc2emglyrm.png)

你能和屏幕上的宝宝一起玩躲猫猫吗? 连接到 AI 伴侣来测试app。 记得在遮脸时将手指张开一个裂缝来观察宝宝的反映。 宝宝是不是你一露脸就笑,一遮脸就哭? 置信度水平会发生什么变化? 当你的手在你面前上下挥动会发生什么?置信度水平会发生什么变化?

恭喜你完成了! 你已经创建了一款人工智能app,它使用机器学习对图像进行分类并智能地响应你的操作。

## 拓展你的app

以下是扩展项目的一些想法。探索这些想法或想出你自己的拓展!

+ 重新训练你的模型,除了识别你露脸(“我”)和隐藏你的脸(“NotMe”)之外,它还可以识别第三种面部姿势,例如你做出傻乎乎的表情(“Silly”)。确保最后一个类在视觉上与前两个类不同(例如,明亮的颜色或其他显着特征可能会改进模型。)

    + 保存 PICaboo app原始代码的副本,然后将新代码添加到该副本中。
    + 上传一个新的和扩展的机器学习模型。然后更改代码,现在三个类的置信水平有三个条形图。
    + 更改代码以操纵三个宝宝图像来响应每种情况(开心宝宝、难过宝宝,以及看到傻乎乎的脸而大笑的宝宝)。

![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/06/004316lltadhzcxhxuahd3.png)

+ 一个宏大的分类项目可以是制作一个使用个人图像分类器 (PIC) 自动计算课堂出勤率app。

    + 在 PIC 训练器中,为教室中的每个学生(“Eva”、“Philip”、“Andrea”等)创建一个分类,并为每个分类(学生)从不同角度拍摄该学生的 25 张照片。
![](https://imagemc.dfrobot.com.cn/data/attachment/album/202201/06/004316ve2pufekpgpektwr.png)
   
    + 使用这些照片来训练分类器。 (分类器可能需要额外的时间来处理大量图像。)
    + 接下来测试你的模型,看看它是否能正确识别随机选择的学生。
    + 如果模型准确并且你构建了一个好的app,那么老师只需要让每个学生在上课开始时通过运行此app的移动设备即可。当学生被高度信任地认可时,该学生被标记为出席。
    + 明智的做法是先为一小部分人(例如五个人)制作此app的简化版本,以便你了解代码将如何更改。
    + 在此过程中,你可能会发现 PIC 程序的一些固有局限性。记下这些并让 MIT 团队知道。
+ 你有哪些奇妙的想法?

## 关于Youth Mobile Power

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

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

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

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

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

云天 发表于 2022-1-7 22:01:19

照着做了一遍,有些地方,需要自己改一下才行。又多了一项技能!!!

szjuliet 发表于 2022-1-10 18:55:28

云天 发表于 2022-1-7 22:01
照着做了一遍,有些地方,需要自己改一下才行。又多了一项技能!!!

谢谢云天老师的反馈~
页: [1]
查看完整版本: 【AI2+AI】个人图像分类器:PICaboo(躲猫猫)