基于卷积神经网络的脊柱骨折识别系统,resnet50,mobilenet模型【pytorch框架+python】

news2024/10/10 16:37:21

   更多目标检测和图像分类识别项目可看我主页其他文章

功能演示:

基于卷积神经网络的脊柱骨折识别系统,resnet50,mobilenet【pytorch框架,python,tkinter】_哔哩哔哩_bilibili

(一)简介

基于卷积神经网络的脊柱骨折识别系统是在pytorch框架下实现的,这是一个完整的项目,包括代码,数据集,训练好的模型权重,模型训练记录,ui界面和各种模型指标图表等。

该项目有两个可选模型:resnet50和mobilenet,两个模型都在项目中;GUI界面由tkinter设计和实现。此项目可在windowns、linux(ubuntu, centos)、mac系统下运行。

该项目是在pycharm和anaconda搭建的虚拟环境执行,pycharm和anaconda安装和配置可观看教程:

windows保姆级的pycharm+anaconda搭建python虚拟环境_windows启动python虚拟环境-CSDN博客

在Linux系统(Ubuntn, Centos)用pycharm+anaconda搭建python虚拟环境_linux pycharm-CSDN博客

(二)项目介绍

1. 项目结构

​​​​

该项目可以使用已经训练好的模型权重,也可以自己重新训练,自己训练也比较简单

以训练resnet50模型为例:

第一步:修改model_resnet50.py的数据集路径,模型名称、模型训练的轮数

​ 

第二步:模型训练和验证,即直接运行model_resnet50.py文件

第三步:使用模型,即运行gui_chinese.py文件即可通过GUI界面来展示模型效果

2. 数据结构

​​​​​

部分数据展示: 

​​​​

3.GUI界面(技术栈:tkinter+python) 

​​​​

4.模型训练和验证的一些指标及效果
​​​​​1)模型训练和验证的准确率曲线,损失曲线

​​​​​2)热力图

​​3)准确率、精确率、召回率、F1值

4)模型训练和验证记录

​​

(三)代码

由于篇幅有限,只展示核心代码

    def main(self, epochs):
        # 记录训练过程
        log_file_name = './results/resnet50训练和验证过程.txt'
        # 记录正常的 print 信息
        sys.stdout = Logger(log_file_name)
 
        print("using {} device.".format(self.device))
        # 开始训练,记录开始时间
        begin_time = time()
        # 加载数据
        train_loader, validate_loader, class_names, train_num, val_num = self.data_load()
        print("class_names: ", class_names)
        train_steps = len(train_loader)
        val_steps = len(validate_loader)
        # 加载模型
        model = self.model_load()  # 创建模型
        # 修改全连接层的输出维度
        in_channel = model.fc.in_features
        model.fc = nn.Linear(in_channel, len(class_names))
 
        # 模型结构可视化
        x = torch.randn(16, 3, 224, 224)  # 随机生成一个输入
        # 模型结构保存路径
        model_visual_path = 'results/resnet50_visual.onnx'
        # 将 pytorch 模型以 onnx 格式导出并保存
        torch.onnx.export(model, x, model_visual_path)  
        # netron.start(model_visual_path)  # 浏览器会自动打开网络结构
 
 
        # 将模型放入GPU中
        model.to(self.device)
        # 定义损失函数
        loss_function = nn.CrossEntropyLoss()
        # 定义优化器
        params = [p for p in model.parameters() if p.requires_grad]
        optimizer = optim.Adam(params=params, lr=0.0001)
 
        train_loss_history, train_acc_history = [], []
        test_loss_history, test_acc_history = [], []
        best_acc = 0.0
 
        for epoch in range(0, epochs):
            # 下面是模型训练
            model.train()
            running_loss = 0.0
            train_acc = 0.0
            train_bar = tqdm(train_loader, file=sys.stdout)
            # 进来一个batch的数据,计算一次梯度,更新一次网络
            for step, data in enumerate(train_bar):
                # 获取图像及对应的真实标签
                images, labels = data
                # 清空过往梯度
                optimizer.zero_grad()
                # 得到预测的标签
                outputs = model(images.to(self.device))
                # 计算损失
                train_loss = loss_function(outputs, labels.to(self.device))
                # 反向传播,计算当前梯度
                train_loss.backward()
                # 根据梯度更新网络参数
                optimizer.step()  
 
                # 累加损失
                running_loss += train_loss.item()
                # 每行最大值的索引
                predict_y = torch.max(outputs, dim=1)[1]  
                # torch.eq()进行逐元素的比较,若相同位置的两个元素相同,则返回True;若不同,返回False
                train_acc += torch.eq(predict_y, labels.to(self.device)).sum().item()
                # 更新进度条
                train_bar.desc = "train epoch[{}/{}] loss:{:.3f}".format(epoch + 1,
                                                                         epochs,
                                                                         train_loss)
            # 下面是模型验证
            # 不启用 BatchNormalization 和 Dropout,保证BN和dropout不发生变化
            model.eval()
            # accumulate accurate number / epoch
            val_acc = 0.0  
            testing_loss = 0.0
            # 张量的计算过程中无需计算梯度
            with torch.no_grad():  
                val_bar = tqdm(validate_loader, file=sys.stdout)
                for val_data in val_bar:
                    # 获取图像及对应的真实标签
                    val_images, val_labels = val_data
                    # 得到预测的标签
                    outputs = model(val_images.to(self.device))
                    # 计算损失
                    val_loss = loss_function(outputs, val_labels.to(self.device))  
                    testing_loss += val_loss.item()
                    # 每行最大值的索引
                    predict_y = torch.max(outputs, dim=1)[1]  
                    # torch.eq()进行逐元素的比较,若相同位置的两个元素相同,则返回True;若不同,返回False
                    val_acc += torch.eq(predict_y, val_labels.to(self.device)).sum().item()
 
            train_loss = running_loss / train_steps
            train_accurate = train_acc / train_num
            test_loss = testing_loss / val_steps
            val_accurate = val_acc / val_num
 
            train_loss_history.append(train_loss)
            train_acc_history.append(train_accurate)
            test_loss_history.append(test_loss)
            test_acc_history.append(val_accurate)
 
            print('[epoch %d] train_loss: %.3f  val_accuracy: %.3f' %
                  (epoch + 1, train_loss, val_accurate))
            # 保存最佳模型
            if val_accurate > best_acc:
                best_acc = val_accurate
                torch.save(model.state_dict(), self.model_name)
 
        # 记录结束时间
        end_time = time()
        run_time = end_time - begin_time
        print('该循环程序运行时间:', run_time, "s")
        # 绘制模型训练过程图
        self.show_loss_acc(train_loss_history, train_acc_history,
                           test_loss_history, test_acc_history)
        # 画热力图
        test_real_labels, test_pre_labels = self.heatmaps(model, validate_loader, class_names)
        # 计算混淆矩阵
        self.calculate_confusion_matrix(test_real_labels, test_pre_labels, class_names)

​​​​​(四)总结

以上即为整个项目的介绍,整个项目主要包括以下内容:完整的程序代码文件、训练好的模型、数据集、UI界面和各种模型指标图表等。

项目运行过程如出现问题,请及时交流!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2202508.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ | Leetcode C++题解之第467题环绕字符串中唯一的子字符串

题目&#xff1a; 题解&#xff1a; class Solution { public:int findSubstringInWraproundString(string p) {vector<int> dp(26);int k 0;for (int i 0; i < p.length(); i) {if (i && (p[i] - p[i - 1] 26) % 26 1) { // 字符之差为 1 或 -25k;} els…

京东统一存储实践

​作者&#xff1a;王腾蛟&#xff0c;2021年8月加入京东&#xff0c;目前主要负责京东离线存储(HDFS)相关工作。 导读 随着大数据时代的到来&#xff0c;海量数据的存储与处理成为了众多企业面临的重要挑战。HDFS 作为一个高可靠性、高扩展性的分布式文件系统&#xff0c;在…

1招!统一管理多个微信,工作效率真的太高了!

你是否经常在使用多个微信号时感到疲惫不堪&#xff1f;每当你需要切换账号时&#xff0c;是不是得不停地登陆、登出&#xff0c;甚至要带着几台手机外出&#xff1f;这种繁琐的操作不仅浪费时间&#xff0c;还严重影响了工作效率。 今天&#xff0c;我将为你分享一款强大的多…

【优选算法】(第三十二篇)

目录 ⼆进制求和&#xff08;easy&#xff09; 题目解析 讲解算法原理 编写代码 字符串相乘&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 ⼆进制求和&#xff08;easy&#xff09; 题目解析 1.题目链接&#xff1a;. - 力扣&#xff08;LeetCode&a…

C语言-常见文件操作函数详解(fgetc,fputc,fgets,fputs,fscanf,fprintf,fread,fwrite)

&#x1f30f;个人博客&#xff1a;尹蓝锐的博客 希望文章能够给到初学的你一些启发&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏支持一下笔者吧&#xff5e; 顺序读写数据常用函数 函数名调用形式功能返回值fgetcfgetc(fp)从指针变量fp指向的文件中读…

诺贝尔物理学奖向机器学习与神经网络致敬,科学边界的跨越与未来的启示

2024年诺贝尔物理学奖首次颁发给机器学习与神经网络领域的研究者&#xff0c;这一历史性事件打破了人们对诺贝尔物理学奖的传统认知&#xff0c;激起了全球学术界、科技界的广泛讨论。这一变化不仅标志着科学边界的延伸&#xff0c;也体现出人工智能技术对现实世界的深远影响。…

剪切走的照片:高效恢复与预防策略

一、剪切走的照片现象描述 在日常的数字生活中&#xff0c;照片作为记录生活点滴、工作成果的重要载体&#xff0c;其重要性不言而喻。然而&#xff0c;有时我们可能会遇到一种令人头疼的情况&#xff1a;原本打算通过剪切操作将照片移动到另一个位置&#xff0c;却意外地发现…

Java 8 的内存结构

Java8内存结构图 虚拟机内存与本地内存的区别 Java虚拟机在执行的时候会把管理的内存分配成不同的区域&#xff0c;这些区域被称为虚拟机内存&#xff0c;同时&#xff0c;对于虚拟机没有直接管理的物理内存&#xff0c;也有一定的利用&#xff0c;这些被利用却不在虚拟机内存…

Qt5.15.2静态编译 MinGW with static OpenSSL

如果想用VS2017编译,可参考:Qt5.15.2静态编译 VS2017 with static OpenSSL 一.环境 系统:Windows 10 专业版 64位 编译器:MinGW 8.1.0 第三方工具:perl,ruby和python PS:经验证,用MinGW 12.1.0来编译Qt5.15.2会报错 我用Phthon 2.7.18虽然可以编过,但是强烈建议Pyth…

0.0.0.0 127.0.0.1等几个特殊的IP地址

0.0.0.0 127.0.0.1 localhost 255.255.255.0 255.255.255.255 这都是些什么地址&#xff0c;代表了什么意思。 网络为系统服务器&#xff0c;系统需要网络。 这些地址在系统和网络都存在&#xff0c;作用和意思甚至基本相同。 一、0.0.0.0 在路由中&#xff1a;0.0.0.0表…

【面试宝典】深入Python高级:直戳痛点的题目演示(上)

目录 &#x1f354; 你知道深浅拷⻉的区别吗&#xff1f; &#x1f354; 字典反转&#xff0c;列表反转的实现&#xff1f; &#x1f354; 装饰器是什么&#xff0c;什么场景⽤到装饰器&#xff0c;举个例⼦&#xff1f; &#x1f354; 装饰器的实质是什么…

定时关机(python)

内容 为了更简单地实现定时关机&#xff0c;不必去记繁琐的命令行&#xff0c;于是搞了一个gui出来 基于python和Windows命令行实现&#xff0c;核心为&#xff1a; shutdown -s -t 60 代码 # -*- coding: utf-8 -*- # Environment PyCharm # File_name autoShutdown…

【教学类-36-10】20241010职业抽卡(midjounery-niji)(涂色、裁剪、游戏)

背景需求 昨天在户外玩了角色游戏&#xff0c;受道具所限&#xff08;只有烧烤做饭锅子材料&#xff09;&#xff0c;所有的孩子都只玩了烧烤店、娃娃家做饭的内容&#xff0c;扮演的都是爸妈、厨师等工作 今天从以前的纸类学具中找出一套数量相对较多的“职业涂色卡” 学具代…

2024中国新媒体技术展 | 蓝海创意云vLive虚拟直播即将亮相!

​​ 2024中国新媒体大会由中央宣传部指导&#xff0c;中华全国新闻工作者协会、湖南省人民政府联合主办&#xff0c;旨在推动媒体深度融合发展&#xff0c;促进新闻事业高质量发展&#xff0c;为中国式现代化贡献力量。中国新媒体技术展&#xff08;CMTE&#xff09;是中国新…

设计模式、系统设计 record part05

行为型模式 模板方法模式、解释器模式是类型为模式&#xff0c; 模板方法模式 模板方法&#xff08;Template Method&#xff09; 抽象类&#xff08;Abstract Class&#xff09; 抽象方法&#xff08;Abstract Method&#xff09; 具体方法&#xff08;Concrete Method&#x…

详细解读“霸王面”战术

“霸王面”战术是指在没有得到雇主面试通知的情况下&#xff0c;强行加入面试&#xff0c;以此争取工作机会的求职策略。以下将以3000字左右的篇幅&#xff0c;通过生动形象的例子详细解释这一战术。 一、背景介绍 在当今竞争激烈的就业市场中&#xff0c;求职者需要经历网申…

2.1 App测试与发布指南

欢迎大家订阅【软件测试】 专栏&#xff0c;开启你的软件测试学习之旅&#xff01; 文章目录 前言1 系统架构2 APP测试范围3 APP发布流程4 发布策略 前言 在当今数字化时代&#xff0c;移动应用程序&#xff08;APP&#xff09;和Web应用程序是两种主要的软件交付方式。本文详…

arm imx6ull docker启动失败问题查找与解决 内核配置相关

1、增加POSIX Message qeue&#xff1a;could not get initial namespace: no such file or directory CONFIG_POSIX_MQUEUEy 2、增加namespace failed to set to initial namespace CONFIG_NAMESPACESy 3、创建网络失败&#xff0c;veth配置&#xff1a;docker create endp…

40条经典ChatGPT论文指令,圈定选题和进行论文构思

目录 1、用ChatGPT圈定选题范围2、用ChatGPT生成研究方法和思路3、用ChatGPT扩展论文观点和论证4、用ChatGPT辅助论文结构设计5、如何直接使用ChatGPT4o、o1、OpenAI Canvas6、OpenAI Canvas增强了啥&#xff1f;7、编程功能增强 &#x1f447; ChatGPT o1网页入口在文末&#…

光路科技TSN交换机:驱动自动驾驶技术革新,保障高精度实时数据传输

自动驾驶技术正快速演进&#xff0c;对实时数据处理能力的需求激增。光路科技推出的TSN&#xff08;时间敏感网络&#xff09;交换机&#xff0c;在比亚迪最新车型中的成功应用&#xff0c;显著推动了这一领域的技术进步。 自动驾驶技术面临的挑战 自动驾驶系统需整合来自雷达…