【毕业设计】基于卷积神经网络的垃圾分类系统

系统演示视频:

【毕业设计】基于卷积神经网络的垃圾分类系统演示视频

本作品内容包括:

1.数据集

2.网站和模型训练等全部的源代码

3.多种卷积神经网络算法迁移学习实现的源代码:Efficientnet、DenseNet、ResNet、MobileNet、MobileNetV2、InceptionV3等。

4.已经训练好的模型权重。

作品内容截图如下:

数据集

【毕业设计】基于卷积神经网络的垃圾分类系统_第1张图片

模型训练python代码(train文件夹):

【毕业设计】基于卷积神经网络的垃圾分类系统_第2张图片

web源代码:

【毕业设计】基于卷积神经网络的垃圾分类系统_第3张图片

模型训练代码(部分):

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

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