基于深度学习的中草药分类识别

2021-01-27 03:07张万义张千潘继波张浩宇孟宇翔相玖红
智慧健康 2020年35期
关键词:中草药蒲公英功效

张万义,张千,潘继波,张浩宇,孟宇翔,相玖红

(1.东营市胜利医院,山东 东营 257091;2.中国石油大学(华东)计算机科学与技术学院,山东 青岛 266580)

0 引言

中草药作为中医药材,是中华民族在与疾病长期斗争的过程中积累的宝贵财富。目前各地在救治新冠肺炎过程中,广泛运用中医药,显著提高了治愈率和成功率。国务院印发的《中医药发展战略规划纲要》中指出,在继承发扬中医药优势特色的基础上,充分利用现代科学技术,推动中药现代化和国际化,以满足时代发展和民众日益增长的医疗保健需求,是历史赋予我们的责任。

目前线上对中草药进行分类和介绍的软件还比较少,对于中草药分类的研究比较少,现有的研究只是对少数的植物进行分类。各个地域的中医对于不同中草药的需求也不一样。近几年来,深度学习技术发展迅速,在分类识别这方面已经取得了非常好的效果,所以我们采用深度学习的方法对收集到的中草药植物图像进行分类。针对黄河三角洲一带的中医大夫的需求,使用深度学习相关技术来制作一款实现线上智能识别的APP,为经验尚浅的大夫们辨识中草药提供方便,为中医的发展起到一定的帮助,为中医的线上发展提供新的思路。

1 中草药信息库的实现

目前,对于中草药图像并没有一个非常全面的数据库,所以我们首先收集并建立了包含数量较多的中草药图像数据集。本项目与山东省名中医药专家张万义博士团队合作,由医生团队提供中草药图像数据集。使用最近比较流行的python语言,在Django[3]框架上进行具体实现。将近300种中草药数据存放在MySql[7]数据库中。将所需要的图片文件放在Django项目之内方便快速读取,部分图片直接放在前端工程中方便快速加载。将工程部署在腾讯云[8]服务器上,保证项目可以随时无间断地运行。前端用CSS进行布局,用JavaScript进行函数编写[5],充分考虑用户的体验,设计了合理并且能充分展示所要显示的药品信息的界面。

查询功能主要分为三个模块:按名称关键字查询、按首字母查询和按照功效查询。在mysql数据库中,因为中草药的名称是可以唯一确定这种中草药对应的全部信息的,一条记录对应一种草药名称,所以数据库中只设置一个数据表,取名为herbalplant。表中包含的字段包括hid(自动生成的记录编号,主码)、name(中草药名,候选码),name_supply(别名)、family(科类)、genus(属类)、character(形状)、field(分布)、officinal_part(入药部位)、value(药用价值)、latin_name(拉丁语名,候选码)、english_name(英文名)、effect(功效分类)。用户在选择查看一种中草药的信息时,数据库中的这些信息能够全部反馈给用户。关键字查询利用了数据库的模糊查询机制,按首字母查询利用了数据库中的english_name字段,而按照功效查询则利用了effect字段。

此功能模块主要适用于已知中草药的全称或者全称的一部分,然后获得全称中包含输入内容的中草药。如图1所示,这是打开小程序后的首页,在上方的输入框中输入关键词,比如“白”。如图2所示,是搜索后的结果。因为利用的是数据库的模糊查询机制,关键字必须在名称中连续存在。

图1 小程序首页

图2 关键字“白”查询结果

2 中草药识别

针对黄河三角洲特有的十七种中草药进行深度学习识别。用tensorflow[2]和keras[6]等工具对图片进行处理,借助大量的训练集对机器进行训练,通过CNN算法让机器掌握每一种中草药的若干特征,从而让机器能够“认识”每一种中草药。在给出一张中草药的照片后,机器能够准确识别出中草药。

对其中17种中草药识别的过程是通过从相册选取或者拍照上传一张中草药的图片,系统会告诉用户这张图片最可能对应哪种中草药,并且提供识别结果中的中草药详情页的链接。需要识别的17种中草药包括:百合、薄荷、车前、枸杞、益母草、桔梗、酸枣、薏苡、蒲公英、决明子、艾叶、黄精、黄芩、罗布麻、马齿苋、茵陈、蛇床。

2.1 模型选取

因为本次研究没有现成的对应这17种中草药的优质数据集,从网上爬取的数据集首先需要人工剔除一些并不能展现对应中草药和重复了的图片。即便这样,由于爬取的原始图片的分辨率参差不齐,很多图片的分辨率较低也会成为限制,很难支撑太多的卷积层和池化层。而且常用的VGG-11、LeNet、AlexNet[4]等模型计算非常复杂,所以本次研究选取了通道数较少的VGG模型,并以其为基础,配合使用Relu激活函数和Adam[1]优化算法。

2.2 数据获取和处理

使用爬虫[9]在百度和必应搜索引擎上爬取每种中草药的图片。因为爬取的图片集总体质量不高,所以需要经过人工筛选的过程,保证最终的原始数据集中的图片都能正确反映对应的中草药。因为所获取的图片集的最小行/列分辨率为165,所以设计了三层卷积层+三层池化层的结构。考虑到池化层的输入应该为偶数,经过分析后得出处理后的数据集最大分辨率在这种结构下为160×160。

将原始数据集拆分为训练集和测试集两组,训练集用于深度学习训练阶段,测试集用于检测训练的效果。将原始图片设置标签,因为目前识别的中草药一共十七种,所以打标签的时候,让一种中草药的训练集名字中的前两个数字一样,从而让系统实现区分这十七种中草药的训练集的效果。后来采用了python批量打标签的方法让这个过程变得更为高效。验证集与之同理,模型取得验证集对应的中草药种类,跟预测的结果进行比对,从而得到最终的准确率。如图3为对蒲公英的图片集批量打标签后的蒲公英数据集,可以看到其中的所有图片的标签中的前两位数字都是08,表示蒲公英是识别模型中的08号中草药。训练时用python中的正则表达式提取出标签中的前两位数字,转化为对应的整数,然后跟识别完成后得到的索引值做对比,如果相同说明识别的结果是准确的。

先统计每个文件中图片的个数,然后将所有原始数据经过灰度化并将大小调整为160×160,最后一层的输出为20×20,再继续增加层数的意义已经不大了。灰度化后的蒲公英数据集如图4所示,此时的数据集中图片的大小全部变为160×160。使用Keras在安装了Tensorflow的环境下进行训练。

图3 蒲公英数据集

图4 灰度化后的蒲公英数据集

2.3 结构设计

将上述中草药库的功能设置在同一个微信小程序[10]之中,作为其“中草药识别”功能模块。训练好了的模型文件提前放到服务器上,然后前端对后端发送请求并上传要识别的图片后,将上传的图片文件转化为二进制格式,如图5和图6所示。然后将模型文件调入,根据生成的二进制预测数组对上传的图片进行预测,预测值越大,说明图片显示的是该值对应的中草药的概率就越大。将预测的编号传到前端,前端将编号转化为对应的草药显示出来。

图5 原始图片

图6 上图转化成二进制的数组

2.4 结果分析

Batch(批尺寸)过小时,验证的准确度较低;而batch值达到了20之后,继续增加效果并不明显。Epoch(训练轮数)的值较小时,验证的准确度度较低;达到30轮后模型已经“熟悉”了训练集,继续增加轮数对准确度的增长效果较小。之前使用过处理之后为126*126的训练集和测试集,可以明显看出改用160*160的训练集和测试集后准确度也有所提升,因为分辨率较大意味着较多的有用数据,有利于更好地提取一种中草药的特征。合理设置这些参数,使对从训练集分离出来的验证集的平均识别率达到96%,图7展示了其中一次的验证结果。由此可以看出batch、epoch和分辨率等参数对于识别率的重要意义。

图7 对训练集中取出来的验证集的一次测试结果

2.5 识别结果选取

因为数据集较少,在有些图片中,识别的最佳答案和实际图片呈现的内容还是会出现一些偏差,所以采取最可能答案+备选答案的呈现模式。对一张图片进行识别后,会得到包含17个和为1的元素的numpy数组,选取两个最大的值的位置,将这两个位置对应的中草药作为前二可能的识别结果;第一个结果作为最佳答案,第二个结果作为备选答案。部分代码(运行在Pycharm中)如下所示:

赋值后m中为预测数组,num存放最可能的结果的编号,然后将该位置的值变为数字终端最小值。然后再找到此时值最大的值的索引,即原数组中值第二大的值的索引,存放在num1种。此时原数组中两个最大值的索引,将这两个索引合成一个五位数,前端即可在该五位数中的第2、3位找到num(最可能结果的编号)的值,第4、5位找到num1(第二可能结果的编号),然后即可在前端完成转化。

3 效果展示

图8为初始界面,即进入“黄河三角洲本草”小程序后点击下方的“中草药识别”进入的界面。图9为选择完本地图片或拍照后的效果,对应的图片已经显示在图片框中。图10和图11为选择好图片后点击“识别中草药”得到的结果,(如果未选择图片,点击识别按钮后会提示未选择图片,从而不能进入下一页)图中正确识别出了“益母草”,并且提供了另一个相对可能性大一些的答案“桔梗”。并且点击这两个按钮可以分别进入益母草和桔梗的详情页。

图8 中草药识别功能首页

图9 选择好图片后的界面

图10 识别结果(上)

图11 识别结果(下)

3.1 按功效查询中草药

如图12所示,在分类页面点击“按功效查询”,然后选择想查询的中草药的功效分类,如“理气药”。如图13所示,即得到数据库中对应该功效的全部中草药,图中所列的中草药均属于“理气药”。此功能一般用于查看某一种功效的中草药有哪些。

图12 按功效查询页

图13 “理气药”查询结果

3.2 查看中草药详细信息

如图14示,在首页或搜索页面点击某一项中草药,就会显示中草药的详细信息,包括简介、功效作用、性状三个部分,包含的内容包括名称、拼音、拉丁文、科、属、产地、功效作用、性状,这些内容均是来源于MySQL数据库中。

图14 白刺简介

4 结束语

总共对蒲公英、决明、车前、益母草、薄荷等17种中草药进行了识别,以VGGNet模型为基础,提前对图像进行批量标准化操作,缓解网络模型的过拟合操作。使用三层卷积层和三层池化层,激活函数选用relu函数来对数据进行修正。使用Adam优化器来解决梯度下降算法初始化。使训练集分离出来的验证集的平均识别准确率达到了96%。将卷积神经网络的中草药识别功能移植到微信小程序端,用户通过上传照片来实现对图片中的中草药植物的识别。后端对此图片进行匹配,将匹配到的结果送还前端,呈现给用户最后的匹配结果。

猜你喜欢
中草药蒲公英功效
蒲公英
益林中草药 初现规模化
红景天的神奇功效及作用
三味中草药 消炎效果好
被扔掉的葱须大有功效
蒲公英
中草药在口腔护理中的开发应用
如何让你的化妆品发挥更大的功效
脑筋急转弯
可以吃的蒲公英