第11章:根据 ShuffleNet V2 迁移学习医学图像分类任务:甲状腺结节检测

ops/2025/2/3 22:29:03/

目录

1. Shufflenet V2

2. 甲状腺结节检测

2.1 数据集

2.2 训练参数

2.3 训练结果

2.4 可视化网页推理

3. 下载


1. Shufflenet V2

shufflenet v2 论文中提出衡量轻量级网络的性能不能仅仅依靠FLOPs计算量,还应该多方面的考虑,例如MAC(memory access cost),还应该比较在不同的硬件设备下的性能等等

因此,基于多方面的考虑。shufflenet v2 通过大量的实验和测试总结了轻量化网络的四个准则,然后根据这四条准则搭建了shufflenet v2网络

 

  1.  输入输出通道个数相同的时候,内存访问量MAC最小
  2. 分组卷积的分组数过大会增加MAC
  3. 碎片化操作会并行加速并不友好
  4. element-wise 操作带来的内存和耗时不可以忽略

每条原则的具体解释参考:ShuffleNet V2 迁移学习对花数据集训练_shufflenetv2进行预训练的效果-CSDN博客

2. 甲状腺结节检测

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

这里提供了4种网络结构,分别对应output channels参数

2.1 数据集

数据集文件如下:

标签如下:

{"0": "0","1": "1"
}

其中,训练集的总数为5103,验证集的总数为2185

2.2 训练参数

训练的参数如下:

    parser.add_argument("--model", default='x0_5', type=str,help='x0_5,x1_0,x1_5,x2_0')parser.add_argument("--pretrained", default=True, type=bool)       # 采用官方权重parser.add_argument("--freeze_layers", default=True, type=bool)    # 冻结权重parser.add_argument("--batch-size", default=8, type=int)parser.add_argument("--epochs", default=10, type=int)parser.add_argument("--optim", default='SGD', type=str,help='SGD,Adam,AdamW')         # 优化器选择parser.add_argument('--lr', default=0.01, type=float)parser.add_argument('--lrf',default=0.001,type=float)                  # 最终学习率 = lr * lrfparser.add_argument('--save_ret', default='runs', type=str)             # 保存结果parser.add_argument('--data_train',default='./data/train',type=str)           # 训练集路径parser.add_argument('--data_val',default='./data/val',type=str)               # 测试集路径

需要注意的是网络分类的个数不需要指定,摆放好数据集后,代码会根据数据集自动生成!

网络模型信息如下:

{"train parameters": {"model": "x0_5","pretrained": true,"freeze_layers": true,"batch_size": 8,"epochs": 10,"optim": "SGD","lr": 0.01,"lrf": 0.001,"save_folder": "runs"},"dataset": {"trainset number": 5103,"valset number": 2185,"number classes": 2},"model": {"total parameters": 343842.0,"train parameters": 2050,"flops": 43550112.0},

2.3 训练结果

所有的结果都保存在 save_ret 目录下,这里是 runs 

weights 下有最好和最后的权重,在训练完成后控制台会打印最好的epoch

这里只展示部分结果:可以看到网络没有完全收敛,增大epoch会得到更好的效果

训练日志:

    "epoch:9": {"train info": {"accuracy": 0.6607877718975881,"0": {"Precision": 0.6989,"Recall": 0.4334,"Specificity": 0.8471,"F1 score": 0.535},"1": {"Precision": 0.646,"Recall": 0.8471,"Specificity": 0.4334,"F1 score": 0.733},"mean precision": 0.67245,"mean recall": 0.64025,"mean specificity": 0.64025,"mean f1 score": 0.634},"valid info": {"accuracy": 0.5711670480523059,"0": {"Precision": 0.5455,"Recall": 0.2866,"Specificity": 0.8043,"F1 score": 0.3758},"1": {"Precision": 0.5791,"Recall": 0.8043,"Specificity": 0.2866,"F1 score": 0.6734},"mean precision": 0.5623,"mean recall": 0.54545,"mean specificity": 0.54545,"mean f1 score": 0.5246}}

 

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

2.4 可视化网页推理

推理是指没有标签,只有图片数据的情况下对数据的预测,这里使用了网页推理

值得注意的是,如果训练了自己的数据集,需要对infer脚本进行更改,如下:

  • 都需要绝对路径,这个是代码自动生成的类别文件,在runs下
  • IMAGE_PATH 是默认展示的demo图片位置

在控制台输入下面命令即可:

streamlit run D:\project\shufflenetV2\infer.py

 

3. 下载

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

计算机视觉项目:计算机视觉项目:ShufflenetV2模型实现的图像识别项目:甲状腺结节识别资源-CSDN文库

关于Ai 深度学习图像识别、医学图像分割改进系列:AI 改进系列_听风吹等浪起的博客-CSDN博客

神经网络改进完整实战项目:改进系列_听风吹等浪起的博客-CSDN博客


http://www.ppmy.cn/ops/155407.html

相关文章

Hive之数据定义DDL

Hive之数据定义DDL 文章目录 Hive之数据定义DDL写在前面创建数据库查询数据库显示数据库查看数据库详情切换当前数据库 修改数据库删除数据库创建表管理表(内部表)外部表管理表与外部表的互相转换 修改表重命名表增加、修改和删除表分区增加/修改/替换列信息 删除表 写在前面 …

LabVIEW如何有效地进行数据采集?

数据采集(DAQ)是许多工程项目中的核心环节,无论是测试、监控还是控制系统,准确、高效的数据采集都是至关重要的。LabVIEW作为一个图形化编程环境,提供了丰富的功能来实现数据采集,确保数据的实时性与可靠性…

neo4j-community-5.26.0 install in window10

在住处电脑重新配置一下neo4j, 1.先至官方下载 Neo4j Desktop Download | Free Graph Database Download Neo4j Deployment Center - Graph Database & Analytics 2.配置java jdk jdk 21 官网下载 Java Downloads | Oracle 中国 path: 4.查看java -version 版本 5.n…

复制粘贴小工具——Ditto

在日常工作中,复制粘贴是常见的操作,但Windows系统自带的剪贴板功能较为有限,只能保存最近一次的复制记录,这对于需要频繁复制粘贴的用户来说不太方便。今天,我们介绍一款开源、免费且功能强大的剪贴板增强工具——Dit…

Linux防火墙基础

一、Linux防火墙的状态机制 1.iptables是可以配置有状态的防火墙,其有状态的特点是能够指定并记住发送或者接收信息包所建立的连接状态,其一共有四种状态,分别为established invalid new related。 established:该信息包已建立连接&#x…

【Redis】List 类型的介绍和常用命令

1. 介绍 Redis 中的 list 相当于顺序表,并且内部更接近于“双端队列”,所以也支持头插和尾插的操作,可以当做队列或者栈来使用,同时也存在下标的概念,不过和 Java 中的下标不同,Redis 支持负数下标&#x…

Redis|前言

文章目录 什么是 Redis?Redis 主流功能与应用 什么是 Redis? Redis,Remote Dictionary Server(远程字典服务器)。Redis 是完全开源的,使用 ANSIC 语言编写,遵守 BSD 协议,是一个高性…

Cypher入门

文章目录 Cypher入门创建数据查询数据matchoptional matchwhere分页with 更新数据删除数据实例:好友推荐 Cypher入门 Cypher是Neo4j的查询语言。 创建数据 在Neo4j中使用create命令创建节点、关系、属性数据。 create (n {name:$value}) return n //创建节点&am…