【“协力抗疫,码力全开”线上公益黑马10号最强极客(best-geek)罩妖镜小程序】

更新于 2月9日  约 9 分钟

参赛感悟

大概是某一天的下午,突然看到腾讯开源公众号推送的关于抗击疫情线上公益黑马的文章。作为一个技术人员,当时就觉得这是一个很不错的为疫情做贡献的平台。于是就联系了几个关系比较好的同事、同学、朋友,凑了三个人计划一起搞点事情,之后又通过微信群结识了一个新同学。当时的想法是做一个用AI技术识别假口罩的应用程序。因为我自己在寻找各种渠道购买口罩,也通过新闻了解到有很多假冒伪劣的口罩,又恰好自己曾经研究过用php-ml实现手写文字识别,启发了我要做口罩识别的想法,也很幸运与别的小伙伴达成了共识。一开始担心AI模型最后会失败,也获得了小伙伴们的谅解和支持。经过三天紧张的设计、开发、测试、路演,完成了一个试用版本,很幸运地获得了二等奖的殊荣。比赛结束后,我们还会利用业余时间,投入到这个开源项目的后续迭代,继续利用这个创意为疫情和大众健康做贡献。

项目背景

随着新冠疫情的确诊人数不断增加,口罩也出现了全线脱销的现象。很多电商卖家上架了3M口罩,微商也纷纷展示了自己的货源。这些口罩不仅价格翻倍,而且还有很多假货、二手货。不仅欺骗了消费者,还有可能危害大众的身体健康。为此,我们团队希望借助这次云开发公益黑客马拉松这个平台,借助小程序、人工智能等技术,帮助普通消费者识别假冒伪劣的口罩,为抗击疫情做出我们的贡献。为了实现这个愿景,我们开发了一款名为“罩妖镜”的小程序,希望这款小程序能为大众的身体健康和生命安全保驾护航。

项目简介

罩妖镜暂时只能检测3M的口罩,使用的时候有两种检测方式,最直接的方式是图片检测。图片检测的流程是先根据自己的口罩类型选择是否带呼吸阀。再拍照或上传图片,编辑截图出呼吸阀上的字样,就可以知道是否通过检测的结果。还有个方式是问卷检测。问卷检测的流程是根据问题和图片提示,选择对应的选项,然后可以得出一个百分比的检测数据,相比图片检测,问卷检测的准确性更高。

o6pttegfl3.jpeg

3064fsqx8h.jpeg

qstnm599z2.jpeg

SVM简介

支持向量机(SVM)是一种监督类型的机器学习算法,能够对数据进行二元分类,在图像识别、文本分类等模式识别问题中得到广泛应用。该算法的基本原理是在样本数据的数学空间上找到能使正负样本间隔最大的超平面。算法的公式等细节太复杂,此处就不再展开论述。

我们做的工作

架构设计

我们的项目架构是前端UI和后端API,以及AI模型训练,目前暂时没有包含后台管理系统。前后端通过http json方式交互,前端UI通过微信小程序实现,后端API基于PHP的Laravel框架微服务版本(Lumen)实现,AI模型训练和预测基于PHP的php-ml类库和持久化的模型文件实现。除模型和训练样本以外的数据存储使用MySQL数据库实现。

bbndvq9xd5.png

UI的开发过程

这次的前端工作,我们团队选择以小程序作为前端载体,结合wux-weapp进行工程化开发。使用微信小程序作为主要载体是基于小程序的庞大用户市场,更有利于我们把公益项目更快进入到用户视野中和得到最大化的用户体验,同时我们基于小程序的十分完整的开发体系,开发文档和社区,有便于我们极速开发。wux-weapp是一套组件化、可复用、易扩展的微信小程序 UI 组件库,更方便前端的交互开发,测试和维护。本次UI设计采取更结合本次疫情主题的颜色:淡红和淡蓝色,蓝色主要体现罩妖镜的医疗性,红色更能体现公益性和人文关怀。UI排版及交互主要使用交互感更好的扁平化设计风格,提示和指引也十分简单易上手,方便不同的人群使用。

AI模型的训练过程

首先是选择机器学习算法框架,目前市面上比较流行的框架有Spark、Tensorflow、PyTorch、百度飞桨等,使用的开发语言为python或者scala。但是我们并没有选择这些比较成熟完善的框架,主要原因是出于对项目时间、团队成员的技术栈、学习成本的考量。因此,我们最终选择了更简单易上手的PHP机器学习类库php-ml,恰好php-ml也支持SVM算法,完全符合我们的需求,很适合用于验证我们的算法思路。

选择完算法框架,就要开始准备样本数据和特征处理了。

虽然我们用手机拍摄了一些3M口罩的特征照片,并且在网络上收集了一些假3M口罩的照片,但是样本的数据还是偏少,特别是不同角度的照片样本较少。因此,我们用Imagick图像处理库对原始图片进行了旋转,增加了样本的数量,提高了模型的准确度。

21fs7a2xp0.jpeg
jq3e3hagkd.jpeg
s1eqqgdqes.jpeg

由于php的语言特性,不支持并行计算,同时考虑到我们的服务器资源有限,减少特征数量和算法的计算量是很有必要的。我们要求用户只上传包含3M字样的图片,尽量裁减掉不必要的图像细节。我们对用户上传的图片进行了缩放,保证每张图片都有28 * 28个像素,且保留必要的图像细节。另外我们对每张图片的像素进行了统计,计算出了平均像素值,把小于等于平均像素值的像素修改成了白色,使得图片上的特征更加明显,减少了需要的样本数量和算法的计算量。最后我们把计算完的像素输出到csv文件中,便于算法框架训练模型。样本数据分成了训练数据和测试数据,分别用于模型的训练和误差评估。

n66fmbir2x.jpeg

获取了每张的图片的像素数据后,我们用php-ml提供的API训练了模型,并且持久化为文件,供后端API调用。

php train.php 2

Collecting samples...
Finished at: 0.1430971622467s
Processing samples...
Finished at: 0.20800399780273s
Network init...
Finished at: 0.21489810943604s
Training...
Finished at: 0.88525605201721s
Evaluating...
Score: 0.75
Finished at: 0.92413902282715s
Saving model...
Finished at: 1.1274020671844s

后端API的开发过程

本项目后端使用的编程语言为PHP,并使用Lumen框架来搭建项目,以restful方式为前端提供接口。

本项目数据存储使用的是mysql;主要设计了3张数据表 attachment(附件信息)、question(问卷信息)、recognition(识别的信息及结果)

本项目缓存使用的是 redis,主要缓存不经常变动的一些信息,如:问卷信息

以下为3个接口的详细介绍:

  1. 题目的查询功能:我们将可以判断口罩真伪的一些题目录入到数据库中,该接口提供题目和选项给用户选择
  2. 图片识别功能:用户在前端选择选择手机中的照片或者拍照,上传到后端,后端将保存图片到云存储中,以便以后分析AI的识别能力;图片保存好以后,将图片交给AI识别,AI识别完成以后将识别的结果返回;再由接口返回到前端
  3. 问卷识别功能:由于很多用户对口罩的真伪的认知能力有限,我们还提供了问卷识别的功能;给出一些常见的辨别口罩的问题,根据用户的回答来判断口罩的真伪程度

总结与展望

经过几天紧张的开发和调试,目前已经实现了基本的口罩鉴别功能,包含基于图像的鉴别,和更准确的基于问卷评分的鉴别。受限于我们目前的知识储备和研发时间的限制,图片识别的准确率只有60%左右,鲁棒性还有待提高,还需要我们继续努力改进。

以下是我们团队对于这款小程序未来的几点展望:

  1. 支持更多类型的口罩,包括但不限于非3M品牌的N95口罩、医用外科口罩等。
  2. 支持用户补充假口罩图片样本、问卷问题的功能。
  3. 接入第三方机器学习API,与机器学习方面的专家合作,提高图片识别的能力。
  4. 增加管理后台,便于审核用户反馈的图片样本和问卷问题。
  5. 提高代码质量,重构优化代码结构,增加单元测试,使项目更稳定且易于扩展。

欢迎体验我们的试运行版本

sbro5u2wf1.jpeg

阅读 203更新于 2月9日

推荐阅读
目录