【毕业设计】基于卷积神经网络的植物花卉识别系统

系统演示视频:

【毕业设计】基于卷积神经网络的植物花卉分类系统

本项目使用到的技术包括:卷积神经网络(CNN)算法,Django框架搭建网站,CNN模型调优。

项目包括四部分:

1.数据集

2.模型训练代码

3.web网站部署代码

4.帮助文档等其他文档说明等

数据集:包括20种植物花卉图像的数据。

【毕业设计】基于卷积神经网络的植物花卉识别系统_第1张图片

用数字图像处理的方法对图像做过扩充,每类图片大概在1000-2000张左右。

模型训练代码:

卷积神经网络模型训练代码,用于训练植物花卉识别模型,以实现多个经典的卷积神经网络。

【毕业设计】基于卷积神经网络的植物花卉识别系统_第2张图片

模型训练部分代码:

from tensorflow.keras.applications.resnet50 import ResNet50
from keras.models import Model, load_model
from keras.layers import Dense, GlobalAveragePooling2D, Dropout
from keras.preprocessing.image import ImageDataGenerator
import os

# verbose:日志显示
# verbose = 0 为不在标准输出流输出日志信息
# verbose = 1 为输出进度条记录
# verbose = 2 为每个epoch输出一行记录
# 注意: 默认为 1
verbose = 1
# NB_CLASS: 分类的类别数量
NB_CLASS = 40
IM_WIDTH = 224
IM_HEIGHT = 224
batch_size = 32
EPOCH = 30
# 数据集路径
train_root = '..\\dataset\\data\\final\\train'
validation_root = '..\\dataset\\data\\final\\test'
test_root = '..\\dataset\\data\\final\\test'

# train data
train_datagen = ImageDataGenerator(
    width_shift_range=0.1,
    height_shift_range=0.1,
    shear_range=0.1,
    zoom_range=0.1,
    horizontal_flip=True,
    rescale=1. / 255
)
train_generator = train_datagen.flow_from_directory(
    train_root,
    target_size=(IM_WIDTH, IM_HEIGHT),
    batch_size=batch_size,
    shuffle=True
)

# vaild data
vaild_datagen = ImageDataGenerator(
    width_shift_range=0.1,
    height_shift_range=0.1,
    shear_range=0.1,
    zoom_range=0.1,
    horizontal_flip=True,
    rescale=1. / 255
)
vaild_generator = train_datagen.flow_from_directory(
    validation_root,
    target_size=(IM_WIDTH, IM_HEIGHT),
    batch_size=batch_size,
)

# test data
test_datagen = ImageDataGenerator(
    rescale=1. / 255
)
test_generator = train_datagen.flow_from_directory(
    test_root,
    target_size=(IM_WIDTH, IM_HEIGHT),
    batch_size=batch_size,
)


# 构建不带分类器的预训练模型
if os.path.exists("ResNet50-0.h5"):
    model = load_model('ResNet50-0.h5')
    # 开放所有的卷积层
    # for layer in base_model.layers:
    #     layer.trainable = True

    # 迁移学习,只训练最后10层
    for layer in model.layers:
        layer.trainable = False
    for i in range(-8, 0):
        model.layers[i].trainable = True
else:
    base_model = ResNet50(weights='imagenet', include_top=False)
    # 添加全局平均池化层
    x = base_model.output
    x = GlobalAveragePooling2D()(x)

    # 添加一个全连接层
    x = Dense(1024, activation='relu')(x)
    x = Dropout(0.5)(x)
    # 添加一个分类器,假设我们有NB_CLASS个类
    predictions = Dense(NB_CLASS, activation='softmax')(x)

    # 构建我们需要训练的完整模型
    model = Model(inputs=base_model.input, outputs=predictions)

    # 开放所有的卷积层
    # for layer in base_model.layers:
    #     layer.trainable = True

    # 迁移学习,只训练最后8层
    for layer in model.layers:
        layer.trainable = False
    for i in range(-8, 0):
        model.layers[i].trainable = True


# 编译模型
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['acc'])
print('Model Compiled')
model.summary()

# 在数据集上训练
model.fit_generator(train_generator, validation_data=vaild_generator, epochs=EPOCH,
                    steps_per_epoch=train_generator.n / batch_size
                    , validation_steps=vaild_generator.n / batch_size, verbose=verbose)

save_path = "ResNet50-"
for i in range(100):
    if not os.path.exists(save_path + str(i) + '.h5'):
        model.save(save_path + str(i) + '.h5')
        break

web部署代码:

采用python的django框架对CNN模型进行部署,用网站实现对植物花卉的识别。

【毕业设计】基于卷积神经网络的植物花卉识别系统_第3张图片

最终效果:

4.帮助文档

【毕业设计】基于卷积神经网络的植物花卉识别系统_第4张图片

你可能感兴趣的:(课程设计,卷积神经网络,深度学习,python,分类算法)