手骨骨龄检测项目
2024-06-06 12:04:40 6 举报
AI智能生成
项目答辩
作者其他创作
大纲/内容
引言
项目背景
手骨骨龄检测是一种通过分析手骨X光片来评估骨骼成熟度的方法。骨龄检测在临床诊断方面具有重要意义,能够帮助医生评估儿童和青少年的生长发育情况以及预测成年身高。
提前发现生长发育异常
预测成年身高
检测方法
传统的人工经验诊断法
依赖于经验丰富的医生,通过对手骨X光片的观察,对骨骼进行评分,并据此确定骨龄。
主观性
结果易受医生主观判断的影响
难度大
对医生的经验和技能要求高
耗时长
过程较为复杂
准确率不稳定
医生个人精力有限
现代的计算机辅助诊断法
利用图像处理技术和机器学习算法,对X光片进行自动分析和骨龄预测
准确率高
基于大量数据训练的模型,能够提供稳定且精确的诊断结果。
速度快
自动化处理,能够在短时间内完成大量X光片的分析。
可持续学习
通过不断引入新的病例,系统的诊断能力可以不断提升。
项目目标
开发一个高精度的骨龄推理预测模型,利用现代机器学习和深度学习技术,对手骨X光片进行分析和骨龄评估。
开发一个用户友好的 GUI 界面,实现骨龄评估系统的前端显示和交互功能,并将其打包成 exe 文件,方便医生和相关人员直接使用。
项目流程
①本项目采用 git 进行版本管理
②除了更换网络结构外,尽量不侵入yolov5模块
③目标检测与多分类均采用yolov5提供的框架
②除了更换网络结构外,尽量不侵入yolov5模块
③目标检测与多分类均采用yolov5提供的框架
.gitignore
使用git初始化项目文件
在GitHub创建仓库后,Clone到本地
修改.giignore文件,增加过滤项,避免仓库装不下(仓库总上限 1g,单文件上限 100m)
yolov5/requirements.txt
环境搭建
创建一个新的 conda 环境,yolov5 要求 `Python >= 3.80` 。
再安装 yolov5 目录下 requirements.txt 中包含的依赖库sehll
requirements.txt 默认安装的是 cpu 版的 PyTorch,根据自己的电脑的 CUDA 版本选择合适版本的的 GPU 版 PyTorch
CMD 中使用 nvidia-smi 命令查看的是本机最高支持的 CUDA 版本
一般来说官网选择低于本机 CUDA 版本的 PyTorch 都可以使用,但是版本不要相差太大
安装其他依赖
安装用于查看神经网络结构信息的 torchinfo 库
安装用于可是查看训练情况的 tensorboard 库
安装用于绘制 GUI 界面的 PySide6 库
global_cfg.py
定于全局的配置参数
定义用于数据预处理、训练、预测的路径
定义各种映射关系
①训练好的目标检测模型预测出手骨图的21个指关节位置信息,同时将这21个指关节分为了7大类;
②对每个分类下的检测框基于x_min进行排序(左手从大到小,左右手根据桡骨和尺骨的x_min进行判断);
③根据字典1的映射关系确定21个指关节的位置信息;
④再根据字典2筛选出13个参与评分的指关节,基于映射关系送到9种分类模型中的某一种中进行检测,
来确定指关节的成长等级用于评分
②对每个分类下的检测框基于x_min进行排序(左手从大到小,左右手根据桡骨和尺骨的x_min进行判断);
③根据字典1的映射关系确定21个指关节的位置信息;
④再根据字典2筛选出13个参与评分的指关节,基于映射关系送到9种分类模型中的某一种中进行检测,
来确定指关节的成长等级用于评分
data
preprocess.py
base_utils.py
preprocess.py
base_utils.py
数据预处理和数据集划分
handbone 数据集
对图像进行自适应直方图均衡化以增强对比度
将图像对应的 xml 标注文件转换为 yolo 格式的 txt 标注文件
9 类 arthrosis 数据集
对图像进行自适应直方图均衡化以增强对比度
提前将图像缩放填充到 224*224 的固定尺寸,避免训练的时候中心裁剪到分类主体
由于当前数据集图像样本较少,所以还需要对其进行旋转数据增样
备注:实现缩放填充的方法
老师发的 common.py
Pillow 库的 ImageOps.pad 方法
yolov5
更改模型结构
目标检测
common.py
定义神经网络的组件
C2f模块
mobilenet_v3_small的组件
使用torchinfo查看网络结构方便修改
使用torchinfo查看网络结构方便修改
yolov5s-c2f.yaml
mobilenet_v3_small.yaml
mobilenet_v3_small.yaml
定于网络结构
yolo.py
基于网络配置文件利用神经网络组件拼装成完整网络
就是把我们自己定义的组件注册进去
多分类
yolov5/classifier/train.py
train_ob.py
train_cls.py
train_cls.py
在yolov5目录外对调用其方法对模型进行训练
train_ob.py
detect_handbone.py
detect_arthrosis.py
detect_arthrosis.py
以面向对象的方式,构建检测器来加载训练好的模型
预备知识
目标检测和多分类的模型类都位于yolo.py中
输入数据最终都时进入到BaseModel的forward方法,注意forward方法的可接受的传参
detect_handbone.py:手骨指关节检测器类
加载目标检测模型的方法
这是老师告诉我们的目标检测模型的加载接口
yolov5/models/common.py
detect方法中增强容错能力,记录检测出错的图像,以便进行分析
detect_arthrosis.py:指关节成长等级检测器
加载多分类模型的方法
但我们还不知道多分类模型是否支持这样做,所以完全模仿目标检测的使用
加载模型,发现不报错,说明模型可以加载
传入图像的路径字符串,发现报错了
yolov5/models/common.py
验证了可以加载模型,可以传图像张量进行检测,训练分类时trainloader会默认对图像进行处理,我们在预测时
也需要做同样的处理吗
也需要做同样的处理吗
为了确保模型在不同阶段的数据输入具有相同的分布和尺度,从而提高预测的准确性和模型的泛化能力。
所以预测数据也要做相同的处理
所以预测数据也要做相同的处理
子主题
entity.py
以面向对象的方式,构建hand对象和arthrosis对象来包含模型的预测信息
mainApp.py
程序的入口,构建GUI界面+集成功能
样式
组件
QWidget
主界面
QLabel
标签组件,可以展示文字或图片
QRadioButton
单选按钮
QTextEdit
文本编辑框
......
布局
QVBoxLayout
垂直布局
QHBoxLayout
水平布局
......
功能
信号函数signal
(类似于OpenCV中讲过的鼠标事件)
(类似于OpenCV中讲过的鼠标事件)
槽函数slot
(类似于OpenCV中讲过的onMouse回调函数)
(类似于OpenCV中讲过的onMouse回调函数)
训练结果展示
目标检测
原生backbone(CSPDarknet53+SPPF)
backbone部分的C3替换为C2f
backbone整个更换为 mobilenet_v3_small
多分类
原生backbone
0.9699
vgg13_bn
没有训练的必要
resnet18
0.9791
mobilenet_v3_small
0.9869
GUI效果展示
Qt介绍
Qt
Qt 是一个 LGPL 开源的跨平台C++图形用户界面应用程序开发框架。
PyQt
PyQt 是另一家公司的 GPL 开源项目,即用 Python 语言实现的 Qt
PySide
PySide 是 Qt 官方支持的 LGPL 开源项目,同样是用 Python 语言实现的 Qt
GUI库选择
PySide 官方支持+对商业开发更友好,所以选择最新的 PySide6 进行开发
绘制GUI界面的方法
纯代码编写
没有系统学习,无法熟练使用API
Qt Designer设计后,再转换为Python代码
没有系统学习,无法知道具体使用何种组件效果最好、如何布局
引导chatGPT编写
打包exe
使用 auto-py-to-exe 库
测试用例
默认选择男性
切换性别和重新上传图像需要清空检测结果
上传不规范图像给出友情提示
例如右手、无关图像等
界面自适应拉伸
问题汇总
选择vgg13_bn作为框架的分类模型出现报错
使用 auto-py-to-exe 三方库打包成exe,各种报错异常
模块名或包名不能带短横线
解决办法
用下划线代替短横线
Python的相对路径具有不确定性
相对路径是相对于启动模块所在位置,而不是相对于代码所在模块
获取到当前模块的上级目录路径的方法
B.py
使用子yolov5子模块中的脚本文件,报错找不到
yolov5单独作为一个项目就不报错,作为子模块导入就报错:ModuleNotFoundError: No module named 'utils'
sys.path
是一个路径列表,解释器会去这些路径下搜索模块进行导入
又一个坑:在augmentations.py 报错之前使用相对路径将yolov5加入到sys.path中
将作为子模块的yolov5路径加入到sys.path中,虽然PyCharm仍然报红,但是不再报错了
PyCharm的sys.path
C:\Users\marui199710\Desktop\BoneAgeDetection
C:\Users\marui199710\Desktop\BoneAgeDetection
F:\Develop\JetBrains\PyCharm 2024.1\plugins\python\helpers\pycharm_display
F:\Develop\anaconda3\envs\python310-BoneAgeDetection\python310.zip
F:\Develop\anaconda3\envs\python310-BoneAgeDetection\DLLs
F:\Develop\anaconda3\envs\python310-BoneAgeDetection\lib
F:\Develop\anaconda3\envs\python310-BoneAgeDetection
F:\Develop\anaconda3\envs\python310-BoneAgeDetection\lib\site-packages
F:\Develop\JetBrains\PyCharm 2024.1\plugins\python\helpers\pycharm_matplotlib_backend
C:\Users\marui199710\Desktop\BoneAgeDetection
F:\Develop\JetBrains\PyCharm 2024.1\plugins\python\helpers\pycharm_display
F:\Develop\anaconda3\envs\python310-BoneAgeDetection\python310.zip
F:\Develop\anaconda3\envs\python310-BoneAgeDetection\DLLs
F:\Develop\anaconda3\envs\python310-BoneAgeDetection\lib
F:\Develop\anaconda3\envs\python310-BoneAgeDetection
F:\Develop\anaconda3\envs\python310-BoneAgeDetection\lib\site-packages
F:\Develop\JetBrains\PyCharm 2024.1\plugins\python\helpers\pycharm_matplotlib_backend
CMD中的sys.path
C:\Users\marui199710\Desktop\BoneAgeDetection
F:\Develop\anaconda3\envs\python310-BoneAgeDetection\python310.zip
F:\Develop\anaconda3\envs\python310-BoneAgeDetection\DLLs
F:\Develop\anaconda3\envs\python310-BoneAgeDetection\lib
F:\Develop\anaconda3\envs\python310-BoneAgeDetection
F:\Develop\anaconda3\envs\python310-BoneAgeDetection\lib\site-packages
F:\Develop\anaconda3\envs\python310-BoneAgeDetection\python310.zip
F:\Develop\anaconda3\envs\python310-BoneAgeDetection\DLLs
F:\Develop\anaconda3\envs\python310-BoneAgeDetection\lib
F:\Develop\anaconda3\envs\python310-BoneAgeDetection
F:\Develop\anaconda3\envs\python310-BoneAgeDetection\lib\site-packages
0 条评论
下一页