基于AlexNet深度学习模型的中草药植物图像分类研究与实现 | ![]() |
传统的中草药图像识别往往需要人工采集大量的原始样本, 再进行人工分析和研究, 需要研究者具有相当丰富的中医药知识储备和经验, 整个过程耗时耗力且识别率难以得到保证。随着信息技术的飞速发展, 人工智能早已在图像识别领域崭露头角, 将人工智能与祖国传统医药文化结合, 可以为推动中医药信息化提供技术支持。谢宝剑[1]利用动态生长模型结合主动样本学习方法;姚明胜[2]以AdaboostLDA为分类算法, 提取叶片几何特征;张帅[3]结合CNN和SVM加以训练;忽胜强[4]以植物叶片几何形状作为分类依据;李龙龙[5]将半监督算法应用到植物叶片识别中, 以上这些方法均取得85%以上的识别准确率。
本课题在研究中草药植物图像分类过程中, 借助人工智能算法的优势, 开展基于深度神经网络的图像分类实验。借助AlexNet模型, 在Mac Os环境下利用CPU进行训练。在收集数据集时发现样本较小, 训练的准确率较低, 为此我们对原始样本进行了数据增扩, 将样本容量提升4倍, 构建了新的数据集, 新数据集经迭代300次后分类准确率达到87.5%。
1 AlexNet模型AlexNet是由Krizhevsky等人[6]创造并夺得2012年ImageNet比赛的冠军, 将ImageNet的识别准确率提高了一倍多。模型由8层结构组成, 在图像分类上有自身较为出色的优势[7]。AlexNet的具体结构如图 1所示。
![]() |
图 1 AlexNet网络结构图 |
数据源输入格式为227×227×3, 227表示输入图像的宽和高, 3表示数据源为三通道RGB模式, 因此支持常用格式的彩色图片, 因此无需对采集的原始数据源进行额外的格式裁剪。本研究数据集均为JPG格式彩色图像。
前两层计算过程均为卷积(Conv)、ReLU、最大池化(max-pooling)及归一化(normal)。第二层输出的结果经过256个特征图进行卷积操作, 其中kernel_size为5、stride为1, 其余参数同第一层。第三、第四层只进行了卷积和ReLU操作。第五层同第一层的过程类似, 区别在于没经过归一化处理。将第五层结果转换为长向量, 输入到使用了三层全连接结构的传统神经网络中, 其中前两个全连接层的kernel分别为4 096。最后一层生成1 000个节点, 运用Softmax回归函数即可得到分类(label)值[8]。
2 数据集和预处理虽然当前基于深度学习的图像识别算法的准确率相当高了, 但都是在基于大量样本训练后才实现的。当训练样本较小时, 算法的学习效果将难以得到保证[9]。基于数据增扩的少量样本学习方法是解决此类问题的常用之举[10]。
本研究通过Python爬虫算法爬取百度图片(http://image.baidu.com/)中关键字为“苍耳”(xanthium sibiricum)、“金银花”(honeysuckle), “薄荷”(mint), “藿香”(patchouli), “白花蛇舌草”(hedyotis diffusa)共5类中药植物图片, 每类挑选其中600张, 共3 000张图片组成数据集, 将该数据集命名为HERB3K。采集的原始数据集图片(以薄荷为例)如图 2所示。
![]() |
图 2 原始数据集 |
为了解决数据集HERB3K样本数量较少可能影响训练的准确率问题, 拟采用以下3种方法对数据集HERB3K进行数据增扩。
2.1 水平镜像如下图所示, 若求原始点(x0, y0)的水平镜像点(x1, y1), 根据图 3所示坐标关系可得:
![]() |
图 3 水平镜像原理图 |
$ \left\{ {\begin{array}{*{20}{c}} {{x_1} = - {x_0} + w}\\ {{y_1} = {y_0}} \end{array}} \right. $ | (1) |
因此以矩阵形式表示为:
$ \left[ {\begin{array}{*{20}{c}} {{x_1}}\\ {{y_1}}\\ 1 \end{array}} \right] = \left[ {\begin{array}{*{20}{c}} { - 1}&0&w\\ 0&1&0\\ 0&0&1 \end{array}} \right]\left[ {\begin{array}{*{20}{c}} {{x_0}}\\ {{y_0}}\\ 1 \end{array}} \right] $ | (2) |
根据推导结果, 利用Python编写程序可实现如图 4所示的水平镜像图片。
![]() |
图 4 某一苍耳原始图片及经水平镜像处理后的图片 |
2.2 旋转
根据图 5原理, 若点A0(x0, y0)旋转θ到点A(x, y), 半径为r。
![]() |
图 5 旋转原理图 |
原始图像的点A0(x0, y0)的坐标为
$ \left\{ {\begin{array}{*{20}{c}} {{x_0} = r\cos \alpha }\\ {{y_0} = r\sin \alpha } \end{array}} \right. $ | (3) |
旋转到新位置A(x, y)的坐标为
$ \left\{ {\begin{array}{*{20}{c}} {x = {x_0}\cos \theta + {y_0}\sin \theta }\\ {y = - {x_0}\sin \theta + {y_0}\cos \theta } \end{array}} \right. $ | (4) |
用矩阵表示为:
$ \left[ {\begin{array}{*{20}{c}} x\\ y\\ 1 \end{array}} \right] = \left[ {\begin{array}{*{20}{c}} {\cos \theta }&{\sin \theta }&0\\ { - \sin \theta }&{\cos \theta }&0\\ 0&0&1 \end{array}} \right]\left[ {\begin{array}{*{20}{c}} {{x_0}}\\ {{y_0}}\\ 1 \end{array}} \right] $ | (5) |
此例为顺时针旋转θ, 若逆时针旋转只需将θ=-θ即可。图 6所示为利用经过逆时针旋转90°处理后的藿香图片。
![]() |
图 6 某一藿香原始图片及经逆时针旋转90°处理后的图片 |
2.3 添加噪点
关于图像增噪有许多算法可以实现, 本研究采用加性零均值高斯噪声方法为图像增加相应的噪点。增噪的方式是为图像上每个点的灰度值加上一个噪声值, 噪声值的产生方式是使用Box-Muller算法生成高斯噪声。Box-Muller算法是以两组独立的在(0, 1]区间均匀分布的随机数U和V来生成两组独立的标准常态分布随机变量X和Y:
$ \begin{array}{l} X = \sqrt { - 2\ln U} \cos \left( {2\pi V} \right)\\ Y = \sqrt { - 2\ln U} \sin \left( {2\pi V} \right) \end{array} $ | (6) |
图 7所示即为使用Box-Muller算法进行增噪处理后的薄荷图片。
![]() |
图 7 某一薄荷原始图片及经增噪处理后的图片 |
经过上述3种方法扩增后的数据集样本容量达到12 000张, 期中9 600张作为训练集, 1 200张作为验证集, 1 200张作为测试集, 各占总图像数量的80%, 10%, 10%, 将该数据集命名为HERB12K。
3 实验 3.1 环境部署本研究的实验基于Caffe平台搭建, Caffe是一款基于C++/CUDA, 支持命令行、Matlab和Python接口的深度学习框架, 该框架利用MKL、OpenBLAS、cuBLAS等矩阵运算库加速计算、同时支持GPU加速, 具有例程脚本丰富, 入门很快等特点。实验软硬件环境为Mac OS操作系统、Intel Core i5 1.6G CPU、8G内存。
3.2 数据集规范化Caffe的数据集支持来自于数据库的(LevelDB和LMDB)、内存、HDF5、图片及来自Windows的数据, 不同格式的数据集, 输入层的书写格式不同。本实验数据集来自普通JPEG格式图片, 在Caffe中规范化为如图 8所示格式。
![]() |
图 8 数据集规范化存储样式 |
将数据集置于Caffe根目录下data/train和data/val目录下, 其中train目录中按类别分别存放着训练集图片, val目录下散放着验证集图片。
train.txt/val.txt为训练/验证集表述文件, 格式为:路径+空格+label, 如图 9所示为Mac OS终端下查看train.txt文件的内容, 其中第一列为行号。
![]() |
图 9 训练集表述文件格式 |
label.txt文件中存放着类别, 通常格式为字母、数字或符号。其中:
label=类别对应的行号-1
如图 10所示, mint类别的行号是1, 所以在train.txt/val.txt中mint类的所有图片文件的label列为0。
![]() |
图 10 label文件格式 |
3.3 数据集转化为LMDB格式
为了使训练更高效, 本实验将数据集图片转化成LMDB格式, 转化脚本是由Caffe自带的examples/imagenet/create_imagenet.sh修改而来, 是比较通用性的转化脚本。脚本涉及到相关路径的修改就不再赘述。由于AlexNet模型要求输入层的图片大小为227×227, HERB12K数据集中的图片尺寸不一致, 故需要将数据集中的图片尺寸统一转换为227×227大小。转换脚本为:
RESIZE=true
if $RESIZE; then
RESIZE_HIGHT=227
RESIZE_WIDTH=227
else
RESIZE_HIGHT=0
RESIZE_WIDTH=0
fi
3.4 准备均值文件为了加快模型的收敛速度, 而又不会对准确率产生较大的影响, 减均值便是很好的实现方式。在Caffe中有两种减均值方式:一种是直接设置均值大小, 如mean_value:104, 另一种是指定均值文件, 如mean_file:mymean.binaryproto。本实验中采用指定均值文件的方式, 具体命令为:
build/tools/compute_image_mean \\
01_alexnet_example/alexnet_train_lmdb \\
01_alexnet_example/alexnet_mean.binaryproto
转化使用build/tools/compute_image_mean命令, 带两个参数。第一个参数为LMDB格式的训练集, 第二个参数为生成均值文件的路径。
3.5 调整AlexNet模型参数本实验的模型网络结构文件置于Caffe根目录下01_alexnet_example/train_val.prototxt, 由于使用LMDB格式作为数据集, 在模型的输入层中设置type:Data, 根据生成均值文件的实际路径修改mean_file, 根据硬件条件设置batch_size:20, 即批量测试时每批次测试20张图像。原始的AlexNet使用的是1 000分类的ImageNet数据集, 而本实验的HERB12K数据集是5分类的数据集, 所以在输出层中设置num_output:5。
3.6 设置超参文件置于Caffe根目录下的超参文件:
01_alexnet_example/solver.prototxt
可以设置模型结构文件、迭代次数、优化方法等。本实验的超参文件详细设置如表 1所示。
表 1 超参文件详细设置 |
![]() |
其中test_iter:60表示每次测试, 迭代60次, 结合测试阶段的batch_size为20次, 60次正好测试完1 200张图片。当采用step策略后基础学习率的变化方式为basr_lr=base_lr * gamma ^ (floor(iter / step))。此外, 冲量的基本思路是为寻优加入了“惯性”的影响, 当误差曲面中存在平坦区的时候, SGD可以更快的速度学习。
4 结果分析参数设置完毕后便可对模型进行训练, 由于采用CPU训练, 训练过程较长。Caffe中提供了一个小工具:build/examples/cpp_classification/classification.bin用于直观的对单张图像进行分类测试。classification.bin有5个参数, 分别为5个文件, 即测试用的网络结构文件、训练得到的模型、均值文件、标签文件和测试图片。本实验从验证集val中抽取一张白花蛇舌草图像文件1209.jpg, 执行测试脚本命令, 得到图 11所示的分类结果。
![]() |
图 11 单张测试结果 |
从分类结果可以发现, 1209.jpg图像可能性排序最高的hedyotis diffusa正是白花蛇舌草。
此外, 将训练过程的日志记录利用Python程序进行可视化分析, 可以绘制训练过程准确率和损失值随迭代次数变化的曲线图, 如图 12所示。
![]() |
图 12 训练过程可视化结果 |
从图中可以发现, 300次迭代后模型的准确率及损失值基本趋于平稳, 准确率达到87.5%。
5 结束语本研究由于数据集采集的限制仅有5类图像, 而AlexNet模型曾经在2012年ImageNet比赛中获得冠军[11], 原始模型能实现1 000分类, 足见该模型的优秀。实验过程要根据实际数据集的情况调整模型参数, 尤其在设置批量测试batch_size参数大小时要根据硬件情况合理设置, 否则会造成训练过程耗时较长或者训练精确度下降等现象。本研究在多次实验的经验基础上选择20作为每批测试的样本容量, 并取得了较好的分类效果。此外, 实验数据集也是影响分类准确率的重要因素, 由于采用有监督学习方式, 数据集的标注是一样耗时且容易出错的工序, 本实验利用Python编写批量命名程序来完成标注的工作, 极大地提高了工作效率。
[1] |
谢宝剑.基于卷积神经网络的图像分类方法研究[D].合肥: 合肥工业大学, 2015.
|
[2] |
姚明胜.基于叶片特征的植物种类识别研究及识别系统实现[D].郑州: 郑州大学, 2016.
|
[3] |
张帅.基于深度学习的植物叶片识别算法研究[D].北京: 北京林业大学, 2016.
|
[4] |
忽胜强.基于叶片图像的植物识别方法研究[D].焦作: 河南理工大学, 2016.
|
[5] |
李龙龙.半监督聚类算法研究及植物叶片识别应用[D].杨凌: 西北农林科技大学, 2017.
|
[6] |
KRIZHEVSK Y, STUSKEVER I, HINTON G E.ImageNet classification with deep convolutional neural networks[C].Proceedings of the Advances in Neural Information Processing Systems.South Lake Tahoe, US: 2012: 1097-1105.
|
[7] |
PAYAN A, MONTANA G.Predicting Alzheimer's disease: a neuroimaging study with 3D convolutional neural networks[OL].http://arxiv.org/pdf/1502.02506.pdf.
|
[8] |
HINTON G, DENG L, YU D, et al. Deep neural networks for acoustic modeling in spoeech recognition[J]. IEEE Signal Processing Magazine, 2012, 29(6): 82-97. DOI:10.1109/MSP.2012.2205597 |
[9] |
彭怀累.基于深度学习与哈希学习的中草药植物图像检索研究[D].济南: 山东大学, 2018.
|
[10] |
陈思文, 刘玉江, 刘冬, 等. 基于AlexNet模型和自适应对比度增强的乳腺结节超声图像分类[J]. 计算机科学, 2019, 46(S1): 146-152. |
[11] |
甘岚, 郭子涵, 王瑶. 基于径向变换和改进AlexNet的胃肿瘤细胞图像识别方法[J]. 计算机应用, 2019, 39(10): 2923-2929. |