记录一个识别表情包的人工智障的诞生

关于咱之前学了不少 SwiftUI 的知识还没能拿出来溜溜这件事,我不太满意。于是今天便想着用这个借这个机会写一个 App 试一试。从 SwiftUI 发布至今已有将近两年或者说超过两年的时间,版本也从 v1 更新到了更好用的 v2,应该是一个半成熟的框架了吧。

项目的构想非常简单,就是从相册里面识别出表情包并提取到一个单独的相册里头,顺便和朋友们一起复习一下 SwiftUI 的各项技术。立项的第一件事情当然是画一个图标和设计稿啦,简简单单的用 Adobe XD 糊了一个示意图,开了一个代码框架,就让朋友去写第一稿的 UI 了。我这边开始准备训练模型。

当前的人工智能模型可以分类归属于这三类处理:图像处理,文字处理,音视频处理。图像处理包含有图像分类、内容识别、打标签、光学字符识别等。文字处理更多的包含语义识别、段落检测、智能回答等。音视频处理包含动作识别、滤镜、提取人声等。人工智能很大一部分的数据来源是多媒体信息。今天我们要使用的模型是图像处理中的图像分类,英文名 Image Classifier 这个。

天才第一步,搭建数据库!

CoreML 的输入数据可以从文件夹内自动提取,数据组织结构非常简单。训练一般分为三部分:训练,验证,测试。训练和测试的数据需要我们提供,验证的数据可以从训练中自动分离,非常方便。由于咱之前有整理过照片并手动分类过表情包,这一步还是非常简单的。

首先是表情包的数据。上面这张图展示了我自己的表情包照片图库,包含了我所有手机日常使用中保存的表情包,和一部分从聊天软件中批量提取的表情包。导出大小在 800MB 左右,对于精度不高的识别来说,用他们训练模型就足够了。但是由于这个模型不只是给我和将来的我使用的,所以咱还需要更多的数据。于是我写了个 Python 脚本去各种网上爬了一些表情包,大概有 900MB 左右。同时,我也发现了一个神奇的仓库 https://github.com/zhaoolee/ChineseBQB 这里面保存了非常多的表情包,正合适作为训练数据。比较重要的一点,是这里面有老年表情包。🌚

其次是非表情包的数据,一般分为两种。相机拍摄和艺术家的创作。对于艺术家的创作,恰好,我这里有非常多的纸片人还有各种素描的素材。之前想学画画上淘宝买过一些素描写真还有建筑设计图,这些也都要往训练数据里面丢进去。下面这张图片展示了我的纸片人图库,里面都是老婆。有趣的是,这个图库有少心爱的图片来自我朋友们的头像。我大概是抢不过他们。

接下来说一说胶卷相机的训练数据从哪里来。很显然作为一个肥仔,不喜欢自拍也没有小姐姐给我拍,自然相册里头不会有很多相机拍的照片。那么这些照片去哪里找呢?当然是近几年的 AI 训练比赛里头去找。上神奇的搜索引擎搜索 Dataset Torrent 便能找到不少数据。当然不想用种子的小伙伴看这里 https://www.kaggle.com/datasets 这个神奇的网站,什么数据都有。如果比较在意下载的可用性和速度,那谷歌的 Open Images Dataset https://storage.googleapis.com/openimages/web/index.html 也是不错的选择,人家的后台没记错的话是 AWS。本次训练最终选用的数据来自 Common Objects in Context https://cocodataset.org/ 在 2014 年发布的数据集,原因是大小比较合理,在 50GB 左右。在删减一些验证数据和测试数据以后,我们整理了大约 10w 张训练数据。

接下来需要做的事情,是准备训练用的目录。根据 CoreML 官方文档的指引,我们需要创建一个根文件夹,并在里面创建分类文件夹。如图所示放好文件便可以开始训练。每一个子文件夹代表一个分类,在这次训练的过程中,只需要两个文件夹便可以完成任务。使用超过两个分类可能会导致判断逻辑变复杂,因为他们三个分类的权重总和为 1,当他们的可信度接近时便难以判断。这里我推荐使用尽可能少的分类来解决问题。准备完成以后,便可以在 CoreML 中创建新的训练项目。

准备完成以后,便可以在 CoreML 中创建新的训练项目。

接下来,拖动我们刚才准备好的文件夹到 CoreML 内,便可以开始训练之旅。

在这个页面中还有一些选项可以开启或关闭,根据 CoreML 的文档来说,每一个选项会将当前照片复制并进行相应的处理,生成新的数据添加到训练的过程中。根据表情包的特点,我选择了开启随机燥点、裁剪、翻转、旋转。关于训练次数这件事,我填写了 128 次最大迭代。实测数据表明图像分类的算法模型在第 10 次左右便会达到最佳训练准确度,并不会真的训练迭代 128 次。

接下来便是漫长的等待过程。如果你的电脑内存不是特别充裕,建议每过一段时间暂停一下训练,来释放内存。暂停训练不会丢失当前进度。本次训练中途我暂停了一次,据观察,内存从 128G 降到了 40G,还是非常可观的。下面训练中的是几张图,一起来感受一下。

训练完成以后便可以在 Training 这里看到模型迭代带来的准确率变化。同时也可以在 Evaluation 这里看到看到评估数据。

当然最开心的事情莫过于在 Preview 栏目内添加几张照片来查看模型的准确度啦!

以上,是训练模型的全部过程。剩下的便是日常开发 App 的过程。由于本 App 开源,本文不再描写过多开发中的踩坑和细节,但是关于 App Store 上架的内容,还是提几点比较好。

以上,欢迎来玩!

https://apps.apple.com/us/app/表情包提取大师/id1562102110

2021年春


Revision #4
Created 13 April 2021 14:22:54 by Lakr233
Updated 13 April 2021 16:23:26 by Lakr233