1. 项目简介

        本文详细介绍了一基于深度卷积神经网络的猴痘分类识别系统。采用TensorFlow和Keras框架,通过卷积神经网络(CNN)进行模型训练和预测,利用迁移学习中的VGG16模型实现99%的分类准确率。系统以Web平台形式呈现,允许患者上传拍摄的病患处图片进行在线测试,系统将自动识别是否患有猴痘病毒。该系统不仅体现了深度学习在医学图像分类中的应用,同时为患者提供了一种方便而准确的自我诊断服务。

2. 卷积神经网络

卷积神经网络(CNN),是一种专门用来处理具有类似网格结构的数据的神经网络。卷积网络是指那些至少在网络的一层中使用卷积运算来替代一般的矩阵乘法运算的神经网络。

卷积神经网络的基本结构由以下几个部分组成:输入层(input layer),卷积层(convolution layer),池化层(pooling layer),激活函数层和全连接层(full-connection layer)。下面以图像分类任务简单介绍一下卷积神经网络结构,具体结构如下图所示。

基于深度卷积神经网络的猴痘分类识别系统-LMLPHP

        核心函数包括:

1.models.Sequential():
Sequential()方法是一个容器,描述了神经网络的网络结构,在Sequential()的输入参数中描述从输入层到输出层的网络结构,可以在()中自定义搭建神经网络的网络结构,类比在桌面上拼积木的话,Sequential()相当于放置积木的桌面。

2.Conv2D():
卷积层,动态提取图片局部特征,
tf.keras.layers.Conv2D(
input_shape = (高, 宽, 通道数), #仅在第一层有
filters = 卷积核个数,对应输出的维数
kernel_size = 卷积核尺寸,(n,k),如果为一个整数则宽和高相同
strides = 卷积横向和纵向的步长,如果为一个整数则横向和纵向相同
padding = ‘SAME’ or ‘VALID’,valid:表示不够卷积核大小的块,则丢弃;same表示不够卷积核大小的块就补0,所以输出和输入形状相同
activation = ‘relu’ or ‘sigmoid’ or ‘tanh’ or ‘softmax’等
)

3.Dropout():
drop层,为了减少过拟合。Dropout的机制:在每次的神经网络的反向传播中,会随机选择一些神经元,设定其反向传播对应的参数为0,然后对于被改变后的神经网络进行反向传播,相当于在反向传播时有一些"神经元"被移除了(与L1正则化效果相同)
主要参数:dropout( rate=丢弃率) 设置为 0.1,则意味着会丢弃 10% 的神经元

4.MaxPooling2D():
layers.MaxPooling2D((2, 2))
主要参数:pool_size:2个整数的整数或元组/列表:(pool_height,pool_width),用于指定池窗口的大小;可以是单个整数,以指定所有空间维度的相同值.
平均池化层为AvgPooling2D()

5.Flatten(): 用于将输入层的数据压成一维的数据

6.Dense(): 全连接层
主要参数: layers.Dense(units, activation), #全连接层,特征进一步提取
units:输出的维度大小,即神经元的个数
activation:激活函数

7.model.summary(): 打印模型结构

3. 基于卷积神经网络的猴痘分类识别

3.1 猴痘图片数据集读取

train_loc = './datas/Train'
val_loc = './datas/Val'
test_loc = './datas/Test'

# ......

fig = plt.gcf()
fig.set_size_inches(10 , 10)
for idx , sample in enumerate(samples):
    sub = plt.subplot(4 , 3 , idx+1)
    img  = mpimg.imread(sample)
    plt.imshow(img)

plt.show()

基于深度卷积神经网络的猴痘分类识别系统-LMLPHP

3.2 卷积神经网络模型构建

         利用Keras深度学习框架,搭建卷积神经网络模型:

model = tf.keras.models.Sequential(
    [#data_augmentation,
        tf.keras.layers.Conv2D(16,(3,3), activation='relu', input_shape = (224,224,3)), ### 1st conv layer
        tf.keras.layers.MaxPool2D((2,2), strides=(2, 2)),

        ## 2nd conv layer
        tf.keras.layers.Conv2D(32,(3,3), activation='relu'),
        tf.keras.layers.MaxPool2D((2,2), strides=(2, 2)),

        ## 3rd conv layer
        tf.keras.layers.Conv2D(64,(2,2), activation='relu'),
        tf.keras.layers.MaxPool2D((2,2), strides=(2, 2)),

        ### 4th conv layer
        tf.keras.layers.Conv2D(128,(2,2), activation='relu'),
        tf.keras.layers.MaxPool2D((2,2), strides=(2, 2)),

        ### 5th conv layer
        tf.keras.layers.Conv2D(32,(2,2), activation='relu'),
        tf.keras.layers.MaxPool2D((2,2), strides=(2, 2)),

        ### flatten output and feed it into dense layer
        tf.keras.layers.Flatten(),
        tf.keras.layers.Dense(32, activation='relu'),

        ## output layer
        tf.keras.layers.Dense(1, activation='sigmoid')
    ]
)

3.3 模型训练和性能评估 

        对训练集完成 40个 epoch 的训练,同时设定 early stop 机制,并绘制模型训练损失函数和准确率曲线:

history = model.fit(train_dataset, batch_size=16,
                    validation_data = validation_dataset,
                    epochs=epochs,
                    callbacks= [early_stopping_callback])

print("Learning stoped on epoch:", early_stopping_callback.stopped_epoch)

基于深度卷积神经网络的猴痘分类识别系统-LMLPHP         利用测试集进行模型性能评估,可以看出,测试集预测准确率为 92%,从损失函数曲线也可以看出,继续训练性能还会有所提升。

test_loss, test_acc = model.evaluate(test_dataset, verbose=2)
print('测试集预测准确率:', test_acc)
print('测试集平均损失:', test_loss)

8/8 - 0s - loss: 0.2652 - accuracy: 0.9211 - 356ms/epoch - 44ms/step
测试集预测准确率: 0.9210526347160339
测试集平均损失: 0.2651972472667694

4. 基于迁移学习的模型优化

4.1  VGG16 预训练模型

vgg16卷积神经网络总共有16层,13个卷积层和3个全连接层,第一次经过64个卷积核的两次卷积后,采用一次pooling,第二次经过两次128个卷积核卷积后,再采用pooling,再重复两次三个512个卷积核卷积后,再pooling,最后经过三次全连接。

基于深度卷积神经网络的猴痘分类识别系统-LMLPHP

        加载 VGG16 模型权重,并添加输出层:

# 加载模型参数
VGG16_model_con.load_weights('./vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5')
# 冻结前13层网络参数  保证加载的预训练参数不被改变
for layer in VGG16_model_con.layers[:13]:
    layer.trainable = False

# 添加模型分类层(顶层)
VGG16_model_all = tf.keras.models.Sequential([
    VGG16_model_con,
    layers.Flatten(),                       
    layers.Dense(64, activation='relu'), 
    layers.Dense(32, activation='relu'),
    layers.Dense(1, activation="sigmoid")               
])   
VGG16_model_all.summary()  # 打印网络结构

 4.2 模型训练和性能评估

history = VGG16_model_all.fit(train_dataset,
                    validation_data=validation_dataset,
                    epochs=epochs,
                    callbacks=[checkpointer, earlystopper])

# ......

test_loss, test_acc = VGG16_model_all.evaluate(test_dataset, verbose=2)
print('测试集预测准确率:', test_acc)
print('测试集平均损失:', test_loss)

基于深度卷积神经网络的猴痘分类识别系统-LMLPHP

8/8 - 16s - loss: 5.6020e-04 - accuracy: 1.0000 - 16s/epoch - 2s/step
测试集预测准确率: 1.0
测试集平均损失: 0.0005602042656391859

         可以看出,利用VGG16进行迁移学习后,测试集的预测准确率达到了100%,效果非常好!

4.3 模型保存

        将训练好的模型权重保存为 h5 格式的权重文件:

save_id= 'vgg16_monkey_pox_best_model.h5' 
model_save_loc=os.path.join('./', save_id)
VGG16_model_all.save(model_save_loc)
print ('model was saved as ' , model_save_loc ) 

5. 猴痘分类识别系统

5.1 首页

基于深度卷积神经网络的猴痘分类识别系统-LMLPHP

5.2 猴痘病毒实时分类预测

基于深度卷积神经网络的猴痘分类识别系统-LMLPHP

6. 结论

        本文详细介绍了一基于深度卷积神经网络的猴痘分类识别系统。采用TensorFlow和Keras框架,通过卷积神经网络(CNN)进行模型训练和预测,利用迁移学习中的VGG16模型实现99%的分类准确率。系统以Web平台形式呈现,允许患者上传拍摄的病患处图片进行在线测试,系统将自动识别是否患有猴痘病毒。该系统不仅体现了深度学习在医学图像分类中的应用,同时为患者提供了一种方便而准确的自我诊断服务。

基于深度卷积神经网络的猴痘分类识别系统-LMLPHP

01-04 05:08