基于cnn深度学习的yolov5+pyqt+分类+resnet+骨龄检测系统

在这里插入图片描述

往期热门博客项目回顾:

计算机视觉项目大集合

改进的yolo目标检测-测距测速

路径规划算法

图像去雨去雾+目标检测+测距项目

交通标志识别项目

yolo系列-重磅yolov9界面-最新的yolo

姿态识别-3d姿态识别

深度学习小白学习路线

YOLOv5与骨龄识别 YOLOv5(You Only Look Once version 5)是一种基于深度学习的实时目标检测模型,以其高效性和准确性著称。在骨龄识别场景下,YOLOv5可以被训练用来自动定位X光片中的手部或手腕骨骼结构,作为预处理步骤,以便后续进行骨龄分析。。

  • YOLOv5训练阶段基于yolov5 release 7.0版本,Python 3.11.0和PyTorch
    2.1.0.dev20230703,
  • 由于训练过程中需要float64,但Metal不支持float64,所以采用了CPU训练。我们使用了yolov5s的官方预训练权重。
    骨龄识别 骨龄识别是一种利用医学影像评估个体生长发育阶段的技术,它通过对儿童或青少年的手腕或膝关节等部位的X射线图像进行分析,对比标准骨龄图谱来预测个体生理年龄。结合YOLOv5,首先对X光图像进行目标检测,准确标出手部关键骨骼结构,随后这部分区域会被送入专门设计的骨龄分类模型进行详细的骨龄分期判断。

在这里插入图片描述

yolov5阶段项目结构:

  • 图像数据:handbone/data/orignal_data/Image

  • 数据标签:handbone/data/orignal_data/Annotations

  • 标签类别:handbone/data/ImageSets/label_list.txt

  • 代码文件:

    handbone/data/orignal_data/ImageSets/get_list.py:

  • 将数据集分为train、trainval以及val,并将对应文件名字存储于handbone/data/orignal_data/ImageSets中:train.txt,trainval.txt,val.txt

  • handbone/data/create_label.py:将handbone/data/original_data中的数据集转换为适用于目标检测模型训练的标签文件和图像文件,并将文件保存在handbone/data/images和handbone/data/labels,

  • 并将三组数据集对应的文件路径保存在handbone/data/train.txt handbone/data/trainval.txt
    handbone/data/val.txt

  • 使用yolo官方训练脚本进行模型的训练,训练好的权重保存在runs/train/exp/weights/best.pt。

使用resnet18进行骨龄预测: (handbone/data/arthrosis中有关于骨龄计算相关内容)
PyQt框架 PyQt是一个Python绑定的图形用户界面应用程序开发框架,基于Qt库构建。在骨龄识别系统中,PyQt可用于构建直观易用的桌面应用程序界面,实现如图像上传、显示、预处理、结果展示等功能。开发者可以通过PyQt编写前后端交互逻辑,使得医生或者其他用户能够方便地导入X光片,运行YOLOv5进行骨龄相关部位的检测,并在界面上实时显示检测结果和最终的骨龄分析报告。

数据集

  • 中有九种关节类别分别为「DIP, DIPFirst, MCP, MCPFirst, MIP, PIP, PIPFirst, Radius,
    Ulna」,每种类别有11个等级,根据性别来打分,根据分数推断骨龄

  • handbone/arthrosis_data_util.py:使用自适应直方图均衡化(CLAHE)与随机旋转对图像进行增强处理。
    handbone/arthrosis_datalist.py:将图像进行数据划分(9:1),同时将对应文件路径保存在每种类别的文件夹中

  • handbone/arthrosis_dataset.py:主要训练过程的dataloader,其中统一的输入数据的格式,并进行一定的数据增强

  • handbone/arthrosis_trainer.py:模型训练的主程序,主要框架网络是resnet18,但将第一层的输入改为(1,244,244),输出改为对应类别数,并将每类最优模型保存在./params中

  • handbone/common.py:提供了一些计算和处理手骨骨龄相关的功能,包括筛选手骨骨节、计算骨龄、生成报告等功能

  • 由于pytorch在训练过程中的loss函数出现了总线错误,我们将部分代码重新基于keras编写:keras_datasets.py,
    keras_trainer.py, keras_common.py

  • 其他部分也是基于keras实现:

    handbone/hand_bone_detect.py handbone/hand_view.py handbone/main.py

分类算法

骨龄分类算法是整个流程的关键部分,它用于对手部骨骼特征进行量化并映射到相应的骨龄阶段。在YOLOv5完成骨骼定位后,提取出的骨骼特征将输入至分类模型,可能是传统的统计学方法或者是深度学习模型,如卷积神经网络(CNN),来进行精细化的骨龄分期预测。

代码

#全部代码----》: qq1309399183
class MainWindow(QMainWindow, Ui_MainWindow):def __init__(self):super().__init__()self.setupUi(self)self.bind_slots()# 加载yolov5模型(本地训练好的)self.mode = torch.hub.load('./','custom',path='./runs/train/exp/weights/best.pt',source='local')self.mode.eval()self.mode.conf = 0.5  # 置信度print("yolov5模型加载完成")# Load other keras modelsself.parm = {}for key, value in keras_common.arthrosis.items():if value[0] in self.parm:continueResNet18, preprocess_input = Classifiers.get('resnet18')base_model = ResNet18((224, 224, 1), weights=None, include_top=False)model = Sequential()model.add(base_model)model.add(Flatten())model.add(Dense(value[1]))# Load weightsmodel.load_weights(f"params/{value[0]}")self.parm[value[0]] = modelprint("九个模型加载完成")# 信号   槽(函数)def btn_open_img(self):print("点击按钮")file_path = QFileDialog.getOpenFileNames(self, dir="handbone/data/images", filter="*.png;*.jpeg;*.jpg")if file_path[0]:# 选择图片print(file_path[0][0])# 回显手骨x光片self.label_2.setPixmap(QPixmap(file_path[0][0]))# 获取性别sex = 'boy' if self.radioButton.isChecked() else 'girl'print(sex)# 侦测result = hand_bone_detect.detect(self.mode, sex , file_path[0][0], self.parm)# 显示检测结果self.label_3.setText(result)# 绑定槽def bind_slots(self):self.pushButton.clicked.connect(self.btn_open_img)if __name__ == '__main__':app = QApplication(sys.argv)window = MainWindow()window.show()app.exec()

最后:计算机视觉、图像处理、毕业辅导、作业帮助、代码获取,远程协助,代码定制,私聊会回复!

##全部代码code--》:qq1309339183

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

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

相关文章

极简生活|2024年让自己越来越好的18个极简好习惯

哈喽,你好啊,我是雷工! 转眼间已经进入了2024年,新的一年,新的开始。 俗话说:百尺高台起于垒土,千里之堤毁于蚁穴。 好习惯积累的越多,坏习惯越来越少,我们的生活才能越…

【NLP笔记】预训练+微调范式之OpenAI Transformer、ELMo、ULM-FiT、Bert..

文章目录 OpenAI TransformerELMoULM-FiTBert基础结构Embedding预训练&微调 【原文链接】: BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 【本文参考链接】 The Illustrated BERT, ELMo, and co. (How NLP Cracked Tra…

STL第一弹

2 STL初识 2.1 STL的诞生 长久以来,软件界一直希望建立一种可重复利用的东西 C的面向对象和泛型编程思想,目的就是复用性的提升 大多情况下,数据结构和算法都未能有一套标准,导致被迫从事大量重复工作为了建立数据结构和算法的一套标准,诞生…

Gradio官方文档

文章目录 构建您的第一个demo分享您的demo进度条受密码保护的应用程序The Interface class(接口类)Components Attributes(组件属性)多个输入和输出组件图像示例嵌套列表描述性内容手风琴中的附加输入The 4 Kinds of Gradio Inter…

蓝桥杯Python B组练习——完美的代价

一、题目 问题描述   回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。   交换的定义是…

C语言-----冒泡排序

今天,让我们来学习一下C语言中一个简单的排序算法------冒泡排序。 什么是冒泡排序呢? 冒泡排序是C语言中一个可以将一个数组的内容按照升序或者降序进行重新排列的算法。简单来说,是一种排序的思维。 冒泡排序的核心思想:让同…

【手撸IM】通讯协议设计与实现

【手撸IM】专题由来:之前利用业余空闲时间写一个Java版Akka-Rpc,并且基于它写了一个分布式高性能文件服务,从反馈上来看,还是得到了一定的关注,甚至部分同学真的基于此直接抄作业和二开了。因此有了再进一步去手撸一个…

【Vue】el-select下选组件

系列文章 【Vue】vue增加导航标签 本文链接:https://blog.csdn.net/youcheng_ge/article/details/134965353 【Vue】Element开发笔记 本文链接:https://blog.csdn.net/youcheng_ge/article/details/133947977 【Vue】vue,在Windows IIS平台…

修改约束

目录 修改约束 创建数据库 添加约束 删除约束 Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 修改约束 如果说表结构的修改还在可以容忍的范畴之内,那么约束的修改是绝对 100% 禁止的 所有的约束一定要在…

【Flutter 面试题】讲一讲 Dart 的一些重要概念?

【Flutter 面试题】讲一讲 Dart 的一些重要概念? 文章目录 写在前面口述回答补充说明完整代码运行结果详细说明 写在前面 🙋 关于我 ,小雨青年 👉 CSDN博客专家,GitChat专栏作者,阿里云社区专家博主&#…

UE5 TPS开发p25 设置大厅,销毁会话,快速退出,检查按钮

这节课主要是完善了菜单选择地图作为游戏大厅,MultiPlayerSessionSubsystem的销毁会话函数,然后就是给Menu菜单添加了Quit和禁止使用按钮 同时还完善了创建房间的漏洞,因为在创建房间的时候如果退出后就马上加入就会发现自己无法创建房间,这是因为服务器判断房间销毁是有一定延…

shell的介绍以及Linux权限的讲解

1 shell命令以及运行原理 1.1 shell命令行的概念 大家在以前的学习中可能会有一个固态的印象: 一台计算机的大概分层为下图 也就是说人可以直接调用计算机的操作系统,但真的是这样吗? 答案是否定的! 其实操作系统还有一个“外壳…

31.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-其它消息的实现与使用优化

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 如果看不懂、不知道现在做的什么,那就跟着做完看效果 内容参考于:易道云信息技术研究院VIP课 上一个内容:30.数据搜索功能…

如果QQ当年有AI,当年的经典头像会是什么样子?-WEBUI有趣案例分享

👔背景介绍 IP_Adapter是个很有趣的模型,可以实现一定程度上的角色一致性,忽然有个想法,用IP_Adapter还原一下QQ当年的经典头像会是什么样子呢? 不过,大家还记得这些古早时期的头像吗?或者&…

优雅的 Markdown

Markdown浅尝 一、勾选框 注意[]前后都要有空格 - [x] 干的漂亮 - [x] 吃饭 - [x] 写代码 - [ ] 睡觉 干的漂亮 吃饭 写代码 睡觉 二、列表 #无序列列表 * 换成 - 也行 * 你 * 你好 * 你好呀 - 你很好啊 你你好你好呀你很好啊 #有序列表 . 后面有个空格 1. 我 2. 是我 3.…

Day73:WEB攻防-支付逻辑篇篡改属性值并发签约越权盗用算法溢出替换对冲

目录 SRC-支付逻辑测试 购买支付-修改数量&篡改价格&订单对冲 修改数量 篡改价格 产品替换对冲 订单替换对冲 购买支付-优惠券复用盗用&积分对冲溢出 优惠卷复用 优惠卷盗用 积分对冲溢出 SRC实战案例分享 越权让他人支付 四舍五入半价购 并发提前全…

python字典:打印字典中的键、值、打印所有字典、python遍历字典

1.定义 字典以花括号({})括起来,里面的元素是成对出现的,不同对元素用逗号(,)分开;一对元素用 冒号(:)分割。 2.解读 字典里的每一对元素准确的来说是键值对&…

javaSwing连连看

一、简介 基于java的连连看游戏设计和实现,基本功能包括:消除模块,重新开始模块,刷新模块,选择难度模块,计时模块。本系统结构如下: (1)消除模块: 完成连连…

python socket 实时通信,多对多,一对一,转发

研究一下python socket 实时通信,多对多,一对一,转发 C>S 单独通信 server1 import socket import threading# 在线客户端列表 online_clients {}def broadcast(message, sender):"""向所有在线客户端广播消息,除了发送…

面试算法-58-求根节点到叶节点数字之和

题目 给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。 每条从根节点到叶节点的路径都代表一个数字: 例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。 计算从根节点到叶节点生成的 所有数字之和…