Scoliosis-AI-Analysis 是我参与设计和构建的脊柱侧弯辅助分析原型。我的工作覆盖数据转换、模型训练、关键点推理、Cobb 角算法、结果可视化、报告接口和 Gradio 应用,目标是验证一条从 X 光图像到可复核测量结果的完整路径。

这个仓库要解决什么问题

脊柱侧弯评估需要在 X 光图像中确定椎体方向并测量 Cobb 角。人工测量依赖专业经验,重复操作也会产生差异。这个项目尝试自动定位椎体关键点,再用明确的几何方法计算角度,并把测量依据画回图像。

我没有把目标设成“上传图片后直接给出诊断”。模型输出必须能被检查,角度计算要能追溯,生成式报告也只能整理测量结果。仓库因此更适合作为辅助分析原型和研究验证。

我采用的整体方案

整套代码按数据、模型、测量、报告和界面组织。

数据层把原始 .mat 标注转换为 YOLO Pose 格式,将 17 个椎体表示为 68 个关键点,并生成训练、验证、测试拆分和数据集 YAML。train_model.py 负责 YOLOv11-Pose 训练,训练结果、曲线和权重保存在仓库中;yolo_detector.py 封装推理与关键点输出。

测量层由 Cobb_API_Raw.py 与修正后的 Cobb_API_Fix.py 承担,使用 OpenCV、NumPy 和 SciPy 处理椎体方向、端板线与中心线。Report_API.py 把结构化测量交给兼容接口生成报告。web_ui.py 再用 Gradio 串起上传、推理、测量、可视化和报告。

这套端到端结构是我在仓库构建中参与完成的。模型只负责找点,医学测量规则和结果呈现由独立模块处理,避免一个黑盒直接给出最终结论。

数据转换为什么先做回绘检查

原始 .mat 不能直接用于 Ultralytics 训练。我先对齐图像与标注文件,再按固定顺序写入 68 个关键点,并把坐标归一化到 YOLO Pose 格式。

这一步容易出现静默错误:文件名错配、椎体顺序颠倒、左右角点交换或归一化越界,都可能让训练正常启动,却一直学不到正确关系。为此我在训练前将转换后的点重新画回 X 光图,抽样检查椎体顺序和落点。

数据集配置与拆分也由脚本生成,减少手动移动文件造成的不一致。训练输出保留关键点指标、验证预测和权重,便于比较不同阶段结果。

从关键点到 Cobb 角

YOLOv11-Pose 输出椎体角点后,几何层计算端板方向并选择候选椎体,再求夹角。我也尝试从椎体中心点拟合脊柱中心线,通过样条曲线观察弯曲趋势。

端板法与中心线关注的对象不同,不能在没有说明的情况下混成一个数字。界面会把关键点、端板线、拟合曲线和角度画回图像。角度异常时,可以判断是模型点位、椎体选择还是几何计算出了问题。

这种可视化是系统设计的一部分。用户看到的不应只有一个看似精确的数值,还要看到这个数值使用了哪些椎体和线段。

报告和 Gradio 如何接入

Gradio 页面负责组织完整工作流,不承担核心算法。图像上传后先走关键点模型,再调用 Cobb 角模块,最后把结构化结果交给报告 API。报告通过 DeepSeek/OpenAI 风格的兼容接口流式输出。

web_ui.py 为部分模块缺失的演示环境保留了模拟 fallback。它能用于检查页面流程,但必须与真实推理明确区分。报告同样不能根据一张图自由补充结论,只能围绕已经计算并可视化的测量数据组织文字。

截至这次提交的复盘

这一版已经完成数据集转换、YOLOv11-Pose 训练、关键点提取、两类曲线与角度计算、标注回绘、报告生成和 Gradio 集成。整个仓库从数据到界面的构建设计都有我的参与。

当前还不能宣称达到临床精度。接下来需要按数据来源、成像条件和侧弯程度拆分评估,并记录模型版本、关键点和每次角度计算的中间量。演示 fallback 也要增加醒目标识。

做到这个阶段,我最重视的是可复核性。医学 AI 可以帮助完成重复测量,但每个结果必须能回到图像、关键点和几何依据,不能让完整界面掩盖模型仍然存在的不确定性。