基于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 models
        self.parm = {}
        for key, value in keras_common.arthrosis.items():
            if value[0] in self.parm:
                continue

            ResNet18, 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 weights
            model.load_weights(f"params/{value[0]}")

            self.parm[value[0]] = model
        print("九个模型加载完成")

    # 信号   槽(函数)

    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.niftyadmin.cn/n/5441615.html

相关文章

2024年最新Anaconda3 2024版中Jupyter Notebook安装

一、 Anaconda3 2024版下载 1.下载:Free Download | Anaconda 2.等待 解释:默认选择等等下载 ,时间可能数分钟 3.安装 解释:打开刚刚下载的Anaconda Navigator,并如图安装低版本,高版本会直接报错 4. …

应急响应-Web2

应急响应-Web2 1.攻击者的IP地址(两个)? 192.168.126.135 192.168.126.129 通过phpstudy查看日志,发现192.168.126.135这个IP一直在404访问 , 并且在日志的最后几条一直在访问system.php ,从这可以推断 …

Oracle19C静默安装教程

文章目录 一、安装前的准备1、安装Linux操作系统2、配置网络源或者本地源3、hosts文件配置 二、准备安装环境1、安装依赖包2、创建oracle用户组3、配置系统内核参数4、关闭selinux5、配置oracle用户环境6、修改用户的Shell限制 三、静默安装Oracle数据库1、创建oracle安装目录2…

【运维】MacOS Wifi热点设置

目录 打开热点 配置共享网段 打开热点 打开macOS设置,进入通用->共享 点击如下图标进行配置, 会进入如下界面(⚠️目前是打开共享状态,无法修改配置,只有在未打开状态才能进入配置) 配置完成后&#x…

Vue2 CSS小知识点

1.1 CSS 1.1.1 选择器 1.常用选择器 id选择器(#box)——选择id为box的元素类选择器(.one) ——选择类名为one的所有元素标签选择器(div)——选择标签为div的所有元素后代选择器(#box div&…

CY7C144

关于CY7C144和CY7C145这两款双端口静态随机存取存储器(Dual-Port SRAM)的数据手册,由Cypress Semiconductor公司生产。以下是文档的翻译内容和详细解读: 特性 真正的双端口存储单元,允许同时读取同一内存位置CY7C144…

分享一些关于在实施面试过程被问到的问题

1,说说你对行业现状和发展趋势的看法 一、行业现状: 技术创新:科技行业在近年来取得了显著的技术突破,包括人工智能、大数据、云计算、物联网等领域的发展。这些技术的创新为各行各业带来了前所未有的变革。竞争激烈:…

在Spring Boot中如何处理跨域请求(CORS)?

什么是跨域? 跨域(Cross-Origin Resource Sharing,CORS)是一种机制,它允许在 Web 页面上运行的脚本能够请求从不同源(域名、协议或端口)的资源。在浏览器安全策略中,有一条称为同源…