基于 LeNet 网络的细胞辨认
作者:陈玥
背景
目前,寰球疫情仍处于严厉时刻,许多计算机相关畛域工作者也都参加到钻研病毒、疫情等工作中。足量的高质量的 COVID-19 图像数据集能用无效地帮忙医院放慢筛选和检测新冠肺炎,但因为隐衷爱护,目前难以获得足量的数据集。因能够先通过疟疾数据集训练细胞检测模型,前面能够利用迁徙学习来训练 COVID-19。本文应用深度学习框架 Keras 在疟疾数据集上训练感化病毒检测器,能够依据细胞图像无效地辨认出是否受到感染,是一篇应用深度学习框架 Keras 进行疾病诊断的残缺入门教程,也能够为日后新冠肺炎图像检测提供参考。
数据集
Malaria Datasets来自疟疾筛查钻研流动的血液涂片图像存储库,收集了 150 名受疟疾感化的患者和 50 名衰弱人员的细胞涂片,数据具备真实性和利用价值。图像由医学钻研人员手动标注,使得分类具备可靠性和专业性,数据集总共蕴含 27,558 个细胞图像,蕴含感化细胞图像细胞和未被感化的图像集。
数据集下载地址:https://lhncbc.nlm.nih.gov/publication/pub9932
图像预处理
为了减少网络辨认的图像数量,本次试验执行了数据加强操作。应用 ImageDataGenerator
类的.flow_from_directory(directory)
的办法在训练期间,执行随机裁剪、缩放和旋转图像等变换,以便在每个期间,通过实时数据加强生成张量图像数据批次,数据将按批次一直循环,网络会看到同一图像的不同变动,进步试验的准确性,加强模型泛化能力。
官网文档:https://keras.io/zh/preprocessing/image/
train_datagen = ImageDataGenerator(
rescale=1./255,
rotation_range=20,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
validation_split=0.1)
train_generator = train_datagen.flow_from_directory(path,target_size = (128, 128),
batch_size = BATCH_SIZE,
class_mode = 'categorical',
subset = 'training',seed = 0)
test_datagen = ImageDataGenerator(
rescale = 1./255,
validation_split = 0.1)
val_generator = test_datagen.flow_from_directory(path,target_size = (128, 128),
batch_size = BATCH_SIZE,
class_mode = 'categorical',
subset='validation', seed=0)
CNN 模型
构建 LeNet 网络
利用深度学习做图像分类通常会采纳卷积神经网络 CNN,但在试验之前也很难确定哪一类 CNN 网络会在本人的分类工作体现最好,因而这里搭建的是最经典的 LeNet 网络,首先察看一下分类成果。图 1 形容了 LeNet 的网络结构,其蕴含了卷积层、池化层和全连贯层
图 1 LeNet 网络
model = Sequential()
# 输出层
model.add(Conv2D(8, kernel_size=(3, 3),
padding="same",
input_shape=input_shape,
activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
# 暗藏层
model.add(Conv2D(16, kernel_size=(3, 3),
padding="same",
activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(32, kernel_size=(3, 3),
activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
# 展平
model.add(Flatten())
model.add(Dense(units=64, activation='relu'))
model.add(Dropout(0.5)) # 增加抛弃层
model.add(Dense(units=2, activation='softmax'))
网络的搭建从输出 -> 卷积 -> 池化 -> 卷积 -> 池化 -> 卷积 -> 池化 ->Dense(relu)>Dense(softmax),其中 Con2D 示意执行卷积操作,MaxPooling2D 是最大池化,展平层 Flatten 将输出“开展”为一层,用于卷积层到全连贯层的过渡,Dense 示意全连贯层,增加抛弃层 Dropout 避免过拟合。
模型编译
这个实验室是二分类问题,因而抉择 binary_crossentrop
作为损失函数,若是多类别分类问题,损失函数能够抉择 categorical_crossentropy
,Adagrad
为优化器。
model.compile(loss=keras.losses.binary_crossentropy,
optimizer=keras.optimizers.Adagrad(),
metrics=['accuracy'])
模型训练
_history = model.fit_generator(
train_generator,
validation_data=val_generator,
steps_per_epoch=2750//BATCH_SIZE,
validation_steps=200//BATCH_SIZE,
epochs = EPOCHS)
可视化训练后果
模型训练过程中的数据会寄存在 _history
中,为了更好地察看迭代过程,将其可视化输入。
N = EPOCHS
plt.style.use("ggplot")#matplotlib 的丑化款式
plt.figure()
plt.plot(np.arange(0,N),_history.history["loss"],label ="train_loss")
plt.plot(np.arange(0,N),_history.history["val_loss"],label="val_loss")
plt.plot(np.arange(0,N),_history.history["accuracy"],label="train_acc")
plt.plot(np.arange(0,N),_history.history['val_accuracy'],label="val_acc")
plt.title("loss and accuracy")
plt.xlabel("epoch")
plt.ylabel("loss/acc")
plt.legend(loc="best")
plt.savefig("./results/result.png")
plt.show()
图 2 损失和精度曲线
从图中的训练后果能够看到,随着迭数的减少,准确率逐步减少,当迭代次数超过 15 次后,趋向于稳固,证实模型的收敛性良好,在验证集上的精度能够达到 90% 以上,且与训练集精度差异不大,阐明分类成果良好,模型的泛化能力不错。
val_loss 曲线震荡不平滑的起因可能是因为 Batch_size 太小或样本分布不平均等其余起因,至于 val_loss 比 train_loss 小的起因很可能是样本数量不足够或者是 random variables,若想模型要达到更好的成果,还要下功夫在超参的设置上。
分类后果
图 3 分类后果(局部)
图 3 的分类后果,pred 是预测的分类,truth 是图像理论的分类,整体来看,对于一个简略的 CNN 网络来看,分类成果还是不错的。
总结与瞻望
在本试验中,应用了 CNN 经典网络 LeNet 网络结构,为细胞分类检测提供了一套残缺的处理过程,能够用作其余类别图像分类的通用框架。若将来要将模型使用到 COVID-19 检测中并将探测器部署在实地中,能够采纳迁徙学习的办法将模型利用到其余数据集下来。
我的项目地址:https://momodel.cn/explore/5ef8135a2d3fa37593d47b3b?blob=master%252Fcoding_here.ipynb&type=app