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