第三章:基于DenseNet(121,161,169,201)卷积神经网络实现的自适应多类别分类:10种常见生活垃圾分类

目录

[1. DenseNet 介绍](#1. DenseNet 介绍)

[2. DenseNet 实现的垃圾图像分类](#2. DenseNet 实现的垃圾图像分类)

[2.1 垃圾10分类数据集](#2.1 垃圾10分类数据集)

[2.2 训练](#2.2 训练)

[2.3 训练结果](#2.3 训练结果)

[2.4 推理](#2.4 推理)

[3. 项目下载](#3. 项目下载)


1. DenseNet 介绍

DenseNet是一种深度学习架构,卷积神经网络(CNN)的一种变体,旨在解决梯度消失的问题并提高网络连接性。

在传统的CNN中,信息流是顺序的,每一层只连接到下一层。这可能会导致梯度在网络中传播时减小,从而难以训练深度网络。DenseNet旨在通过引入密集连接来缓解这一问题,密集连接允许从网络中的任何层直接连接到任何其他层。

DenseNet由多个密集块组成,每个密集块包含多个层。密集块内的每一层都连接到同一块内的其他每一层。这种密集的连接促进了特征重用和信息流,使梯度更容易在整个网络中传播。此外,DenseNet在每个密集块后都加入了一个过渡层,以降低特征图的维度并控制网络的增长。

DenseNet的主要优势包括:

改进的梯度流:层之间的直接连接有助于克服梯度消失问题,并实现深度网络的高效训练。

强大的特征重用:密集的连接促进了特征重用,从而实现了更紧凑的网络和更好的参数效率。

参数数量减少:与传统的CNN架构相比,DenseNet通常需要更少的参数,从而使模型更容易训练,计算效率更高。

提高精度:DenseNet已被证明在各种计算机视觉任务上达到了最先进的性能,如图像分类和物体检测。

总体而言,DenseNet是一个强大的深度学习架构,可以解决训练深度网络的挑战。其密集的连接性和高效的参数共享使其成为各种计算机视觉任务的有效选择。

其中,denseNet不同版本的架构如下

2. DenseNet 实现的垃圾图像分类

densenet实现的model部分代码如下面所示,这里如果采用官方预训练权重的话,会自动导入官方提供的最新版本的权重

复制代码
    if model == 'densenet121':
        net = m.densenet121(pretrained=m.DenseNet121_Weights.DEFAULT if weights else False,progress=True)
    elif model == 'densenet161':
        net = m.densenet161(pretrained=m.DenseNet161_Weights.DEFAULT if weights else False,progress=True)
    elif model == 'densenet169':
        net = m.densenet169(pretrained=m.DenseNet169_Weights.DEFAULT if weights else False,progress=True)
    elif model == 'densenet201':
        net = m.densenet201(pretrained=m.DenseNet201_Weights.DEFAULT if weights else False,progress=True)
    else:
        print('模型选择错误!!')
        return None

2.1 垃圾10分类数据集

数据集的摆放如下:

字典文件:

复制代码
{
    "0": "dianchi",
    "1": "lajiao",
    "2": "pingguo",
    "3": "qiezi",
    "4": "taoci",
    "5": "tudou",
    "6": "xiangjiao",
    "7": "yandi",
    "8": "yilaguan",
    "9": "yinliaoping"
}

其中,训练集总数700,验证集总数300,经过transform预处理的可视化结果如下:

2.2 训练

将数据集按照上述格式摆放好即可开始训练,训练的参数如下:

复制代码
    parser.add_argument("--model", default='densenet121', type=str,help='densenet121,densenet161,densenet169,densenet201')
    parser.add_argument("--pretrained", default=True, type=bool)       # 采用官方权重
    parser.add_argument("--freeze_layers", default=True, type=bool)    # 冻结权重

    parser.add_argument("--batch-size", default=4, type=int)
    parser.add_argument("--epochs", default=30, type=int)

    parser.add_argument("--optim", default='SGD', type=str,help='SGD、Adam')         # 优化器选择

    parser.add_argument('--lr', default=0.001, type=float)
    parser.add_argument('--lrf',default=0.0001,type=float)                  # 最终学习率 = lr * lrf

这里分类的个数不需要指定,代码会根据数据集自动生成!

2.3 训练结果

所有的结果都保存在 runs目录下

这里只展示部分:

训练日志:

复制代码
    "epoch:29": {
        "train info": {
            "accuracy": 0.9985714285571633,
            "dianchi": {
                "Precision": 1.0,
                "Recall": 1.0,
                "Specificity": 1.0,
                "F1 score": 1.0
            },
            "lajiao": {
                "Precision": 1.0,
                "Recall": 1.0,
                "Specificity": 1.0,
                "F1 score": 1.0
            },
            "pingguo": {
                "Precision": 1.0,
                "Recall": 1.0,
                "Specificity": 1.0,
                "F1 score": 1.0
            },
            "qiezi": {
                "Precision": 1.0,
                "Recall": 1.0,
                "Specificity": 1.0,
                "F1 score": 1.0
            },
            "taoci": {
                "Precision": 1.0,
                "Recall": 0.9857,
                "Specificity": 1.0,
                "F1 score": 0.9928
            },
            "tudou": {
                "Precision": 1.0,
                "Recall": 1.0,
                "Specificity": 1.0,
                "F1 score": 1.0
            },
            "xiangjiao": {
                "Precision": 1.0,
                "Recall": 1.0,
                "Specificity": 1.0,
                "F1 score": 1.0
            },
            "yandi": {
                "Precision": 0.9859,
                "Recall": 1.0,
                "Specificity": 0.9984,
                "F1 score": 0.9929
            },
            "yilaguan": {
                "Precision": 1.0,
                "Recall": 1.0,
                "Specificity": 1.0,
                "F1 score": 1.0
            },
            "yinliaoping": {
                "Precision": 1.0,
                "Recall": 1.0,
                "Specificity": 1.0,
                "F1 score": 1.0
            },
            "mean precision": 0.9985900000000001,
            "mean recall": 0.99857,
            "mean specificity": 0.9998400000000001,
            "mean f1 score": 0.99857
        },
        "valid info": {
            "accuracy": 0.9699999999676666,
            "dianchi": {
                "Precision": 0.9032,
                "Recall": 0.9333,
                "Specificity": 0.9889,
                "F1 score": 0.918
            },
            "lajiao": {
                "Precision": 1.0,
                "Recall": 0.9667,
                "Specificity": 1.0,
                "F1 score": 0.9831
            },
            "pingguo": {
                "Precision": 0.9375,
                "Recall": 1.0,
                "Specificity": 0.9926,
                "F1 score": 0.9677
            },
            "qiezi": {
                "Precision": 0.9677,
                "Recall": 1.0,
                "Specificity": 0.9963,
                "F1 score": 0.9836
            },
            "taoci": {
                "Precision": 1.0,
                "Recall": 1.0,
                "Specificity": 1.0,
                "F1 score": 1.0
            },
            "tudou": {
                "Precision": 1.0,
                "Recall": 0.9,
                "Specificity": 1.0,
                "F1 score": 0.9474
            },
            "xiangjiao": {
                "Precision": 0.9677,
                "Recall": 1.0,
                "Specificity": 0.9963,
                "F1 score": 0.9836
            },
            "yandi": {
                "Precision": 0.9375,
                "Recall": 1.0,
                "Specificity": 0.9926,
                "F1 score": 0.9677
            },
            "yilaguan": {
                "Precision": 1.0,
                "Recall": 0.9333,
                "Specificity": 1.0,
                "F1 score": 0.9655
            },
            "yinliaoping": {
                "Precision": 1.0,
                "Recall": 0.9667,
                "Specificity": 1.0,
                "F1 score": 0.9831
            },
            "mean precision": 0.97136,
            "mean recall": 0.97,
            "mean specificity": 0.99667,
            "mean f1 score": 0.96997
        }

训练集和测试集的混淆矩阵:

2.4 推理

推理是指没有标签,只有图片数据的情况下对数据的预测,这里直接运行predict脚本即可

需要把待推理的数据放在inference/img

推理结果:

3. 项目下载

关于本项目代码和数据集、训练结果的下载:

计算机视觉项目:DenseNet卷积神经网络网络【121,161,169,201四种版本】实现的自适应迁移学习、图像识别项目:10种生活中常见垃圾图像分类资源-CSDN文库

关于计算机视觉实战可以继续关注本专栏,会持续更新图像分类和医学图像分割项目

关于图像分类和语义分割的改进:改进系列_Ai 医学图像分割的博客-CSDN博客

相关推荐
过期动态1 小时前
【动手学深度学习】卷积神经网络(CNN)入门
人工智能·python·深度学习·pycharm·cnn·numpy
xy_optics5 小时前
用matlab探索卷积神经网络(Convolutional Neural Networks)-3
开发语言·matlab·cnn
大多_C6 小时前
量化方法分类
人工智能·分类·数据挖掘
deephub8 小时前
计算加速技术比较分析:GPU、FPGA、ASIC、TPU与NPU的技术特性、应用场景及产业生态
人工智能·深度学习·gpu·计算加速
意.远9 小时前
PyTorch参数管理详解:从访问到初始化与共享
人工智能·pytorch·python·深度学习
yy0821yy9 小时前
解锁多元养生密码,开启活力生活
生活
知来者逆10 小时前
计算机视觉——为什么 mAP 是目标检测的黄金标准
图像处理·人工智能·深度学习·目标检测·计算机视觉
MobiCetus10 小时前
Deep Reinforcement Learning for Robotics翻译解读2
人工智能·深度学习·神经网络·机器学习·生成对抗网络·计算机视觉·数据挖掘
搬砖的阿wei10 小时前
跳跃连接(Skip Connection)与残差连接(Residual Connection)
深度学习·residual·skip connection
Listennnn11 小时前
自动化网络架构搜索(Neural Architecture Search,NAS)
人工智能·深度学习·自动化