大概是某一天的下午,忽然看到腾讯开源公众号推送的关于抗击疫情线上公益黑马的文章。做为一个技术人员,当时就以为这是一个很不错的为疫情作贡献的平台。因而就联系了几个关系比较好的同事、同窗、朋友,凑了三我的计划一块儿搞点事情,以后又经过微信群结识了一个新同窗。当时的想法是作一个用AI技术识别假口罩的应用程序。由于我本身在寻找各类渠道购买口罩,也经过新闻了解到有不少假冒伪劣的口罩,又刚好本身曾经研究过用php-ml实现手写文字识别,启发了我要作口罩识别的想法,也很幸运与别的小伙伴达成了共识。一开始担忧AI模型最后会失败,也得到了小伙伴们的谅解和支持。通过三天紧张的设计、开发、测试、路演,完成了一个试用版本,很幸运地得到了二等奖的殊荣。比赛结束后,咱们还会利用业余时间,投入到这个开源项目的后续迭代,继续利用这个创意为疫情和大众健康作贡献。php
随着新冠疫情的确诊人数不断增长,口罩也出现了全线脱销的现象。不少电商卖家上架了3M口罩,微商也纷纷展现了本身的货源。这些口罩不只价格翻倍,并且还有不少假货、二手货。不只欺骗了消费者,还有可能危害大众的身体健康。为此,咱们团队但愿借助此次云开发公益黑客马拉松这个平台,借助小程序、人工智能等技术,帮助普通消费者识别假冒伪劣的口罩,为抗击疫情作出咱们的贡献。为了实现这个愿景,咱们开发了一款名为“罩妖镜”的小程序,但愿这款小程序能为大众的身体健康和生命安全保驾护航。前端
罩妖镜暂时只能检测3M的口罩,使用的时候有两种检测方式,最直接的方式是图片检测。图片检测的流程是先根据本身的口罩类型选择是否带呼吸阀。再拍照或上传图片,编辑截图出呼吸阀上的字样,就能够知道是否经过检测的结果。还有个方式是问卷检测。问卷检测的流程是根据问题和图片提示,选择对应的选项,而后能够得出一个百分比的检测数据,相比图片检测,问卷检测的准确性更高。python
支持向量机(SVM)是一种监督类型的机器学习算法,可以对数据进行二元分类,在图像识别、文本分类等模式识别问题中获得普遍应用。该算法的基本原理是在样本数据的数学空间上找到能使正负样本间隔最大的超平面。算法的公式等细节太复杂,此处就再也不展开论述。mysql
咱们的项目架构是前端UI和后端API,以及AI模型训练,目前暂时没有包含后台管理系统。先后端经过http json方式交互,前端UI经过微信小程序实现,后端API基于PHP的Laravel框架微服务版本(Lumen)实现,AI模型训练和预测基于PHP的php-ml类库和持久化的模型文件实现。除模型和训练样本之外的数据存储使用MySQL数据库实现。redis
此次的前端工做,咱们团队选择以小程序做为前端载体,结合wux-weapp进行工程化开发。使用微信小程序做为主要载体是基于小程序的庞大用户市场,更有利于咱们把公益项目更快进入到用户视野中和获得最大化的用户体验,同时咱们基于小程序的十分完整的开发体系,开发文档和社区,有便于咱们极速开发。wux-weapp是一套组件化、可复用、易扩展的微信小程序 UI 组件库,更方便前端的交互开发,测试和维护。本次UI设计采起更结合本次疫情主题的颜色:淡红和淡蓝色,蓝色主要体现罩妖镜的医疗性,红色更能体现公益性和人文关怀。UI排版及交互主要使用交互感更好的扁平化设计风格,提示和指引也十分简单易上手,方便不一样的人群使用。算法
首先是选择机器学习算法框架,目前市面上比较流行的框架有Spark、Tensorflow、PyTorch、百度飞桨等,使用的开发语言为python或者scala。可是咱们并无选择这些比较成熟完善的框架,主要缘由是出于对项目时间、团队成员的技术栈、学习成本的考量。所以,咱们最终选择了更简单易上手的PHP机器学习类库php-ml,刚好php-ml也支持SVM算法,彻底符合咱们的需求,很适合用于验证咱们的算法思路。sql
选择完算法框架,就要开始准备样本数据和特征处理了。数据库
虽然咱们用手机拍摄了一些3M口罩的特征照片,而且在网络上收集了一些假3M口罩的照片,可是样本的数据仍是偏少,特别是不一样角度的照片样本较少。所以,咱们用Imagick图像处理库对原始图片进行了旋转,增长了样本的数量,提升了模型的准确度。编程
因为php的语言特性,不支持并行计算,同时考虑到咱们的服务器资源有限,减小特征数量和算法的计算量是颇有必要的。咱们要求用户只上传包含3M字样的图片,尽可能裁减掉没必要要的图像细节。咱们对用户上传的图片进行了缩放,保证每张图片都有28 * 28个像素,且保留必要的图像细节。另外咱们对每张图片的像素进行了统计,计算出了平均像素值,把小于等于平均像素值的像素修改为了白色,使得图片上的特征更加明显,减小了须要的样本数量和算法的计算量。最后咱们把计算完的像素输出到csv文件中,便于算法框架训练模型。样本数据分红了训练数据和测试数据,分别用于模型的训练和偏差评估。json
获取了每张的图片的像素数据后,咱们用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
本项目后端使用的编程语言为PHP,并使用Lumen框架来搭建项目,以restful方式为前端提供接口。
本项目数据存储使用的是mysql;主要设计了3张数据表 attachment(附件信息)、question(问卷信息)、recognition(识别的信息及结果)
本项目缓存使用的是 redis,主要缓存不常常变更的一些信息,如:问卷信息
如下为3个接口的详细介绍:
通过几天紧张的开发和调试,目前已经实现了基本的口罩鉴别功能,包含基于图像的鉴别,和更准确的基于问卷评分的鉴别。受限于咱们目前的知识储备和研发时间的限制,图片识别的准确率只有60%左右,鲁棒性还有待提升,还须要咱们继续努力改进。
如下是咱们团队对于这款小程序将来的几点展望: