基于 YOLOv11 和 Streamlit 的脑肿瘤识别系统,用 YOLOv11 医学图像检测(定位肿瘤位置并分类),用 Streamlit 搭建用户友好 YOLOV11模型如何训练脑肿瘤检测数据集

张开发
2026/6/9 19:48:42 15 分钟阅读
基于 YOLOv11 和 Streamlit 的脑肿瘤识别系统,用 YOLOv11 医学图像检测(定位肿瘤位置并分类),用 Streamlit 搭建用户友好 YOLOV11模型如何训练脑肿瘤检测数据集
脑肿瘤识别系统使用Yolov11Streamlit制作可以帮助识别脑部MRI或CT扫描图片中的肿瘤类型包括正常、胶质瘤、脑膜瘤、垂体瘤和占位性病变。构建一个基于 YOLOv11 和 Streamlit 的脑肿瘤识别系统主要涉及两个核心部分一是使用 YOLOv11 进行医学图像的目标检测定位肿瘤位置并分类二是使用 Streamlit 搭建用户友好的 Web 交互界面。以下是构建该系统的详细步骤和代码。第一步环境准备你需要安装以下 Python 库。建议在虚拟环境如 conda 或 venv中进行。# 安装 ultralytics (包含 YOLOv11)pipinstallultralytics# 安装 streamlit 用于构建网页界面pipinstallstreamlit# 安装 opencv 用于图像处理pipinstallopencv-python-headless# 安装 pillow 用于图像显示pipinstallPillow第二步模型训练概念性步骤在实际运行代码前你需要一个训练好的.pt模型文件。数据集准备收集脑部 MRI/CT 数据集如 Figshare 脑肿瘤数据集并将其标注为 YOLO 格式.txt文件包含类别和归一化坐标。类别 0:no_tumor(正常)类别 1:glioma(胶质瘤)类别 2:meningioma(脑膜瘤)类别 3:pituitary(垂体瘤)类别 4:space_occupying(占位性病变)训练模型使用 Ultralytics 进行训练。fromultralyticsimportYOLO# 加载预训练模型modelYOLO(yolov11n.pt)# 开始训练resultsmodel.train(datapath/to/your/brain_tumor_data.yaml,epochs100,imgsz640,namebrain_tumor_yolov11)训练完成后你会得到一个best.pt文件这是后续代码需要的核心模型。第三步Streamlit 系统代码 (app.py)创建一个名为app.py的文件并将以下代码复制进去。这段代码实现了图片上传、模型推理、结果可视化以及根据识别结果生成诊断建议的功能。importstreamlitasstimportcv2importnumpyasnpfromPILimportImagefromultralyticsimportYOLOimporttempfileimportos# --- 页面配置 ---st.set_page_config(page_title智能脑肿瘤识别系统,page_icon,layoutwide)# --- 侧边栏 ---st.sidebar.title( 系统设置)st.sidebar.markdown(### 模型参数)conf_thresholdst.sidebar.slider(置信度阈值,0.0,1.0,0.25,0.05)iou_thresholdst.sidebar.slider(IOU 阈值,0.0,1.0,0.45,0.05)st.sidebar.markdown(---)st.sidebar.info(本系统基于 YOLOv11 深度学习算法仅供科研与辅助参考不能替代专业医生诊断。)# --- 主界面 ---st.title( 脑肿瘤智能识别与辅助诊断系统)st.markdown( 上传脑部 MRI 或 CT 扫描图像系统将自动识别肿瘤类型及位置。 支持识别类型**正常 (No Tumor)**, **胶质瘤 (Glioma)**, **脑膜瘤 (Meningioma)**, **垂体瘤 (Pituitary)**, **占位性病变**。 )# --- 缓存模型加载 ---st.cache_resourcedefload_model():# 注意这里假设你有一个训练好的 best.pt 文件# 如果没有代码会加载官方预训练模型效果不佳请替换为你的路径try:modelYOLO(best.pt)except:st.warning(未找到本地 best.pt 模型正在加载官方 YOLOv11n 模型仅作演示无法识别脑肿瘤。)modelYOLO(yolov11n.pt)returnmodel modelload_model()# --- 类别名称映射 ---# 请根据你的 dataset.yaml 中的 names 顺序修改这里CLASS_NAMES{0:No Tumor (正常),1:Glioma (胶质瘤),2:Meningioma (脑膜瘤),3:Pituitary (垂体瘤),4:Space Occupying (占位性病变)}# --- 诊断建议逻辑 ---defget_diagnosis_advice(class_name):advice建议定期复查。colorgreenifGliomainclass_name:advice检测到胶质瘤这是最常见的原发性脑肿瘤建议及时就医进行详细检查。colorredelifMeningiomainclass_name:advice检测到脑膜瘤通常为良性建议咨询神经外科医生评估手术必要性。colororangeelifPituitaryinclass_name:advice检测到垂体瘤可能影响激素水平建议进行内分泌检查。colororangeelifSpaceinclass_name:advice检测到占位性病变需进一步确认病变性质。colorredreturnadvice,color# --- 文件上传 ---uploaded_filest.file_uploader(上传 MRI/CT 影像图片,type[jpg,jpeg,png])ifuploaded_fileisnotNone:# 保存上传的文件到临时文件tfiletempfile.NamedTemporaryFile(deleteFalse,suffix.jpg)tfile.write(uploaded_file.read())# 读取图像img_pathtfile.name imgcv2.imread(img_path)imgcv2.cvtColor(img,cv2.COLOR_BGR2RGB)# 转换为 RGB# 显示原始图像和处理后图像的列布局col1,col2st.columns(2)withcol1:st.subheader(原始扫描图像)st.image(img,use_column_widthTrue)# --- 执行推理 ---withst.spinner(正在进行 AI 智能分析...):resultsmodel(img,confconf_threshold,iouiou_threshold)resultresults[0]# 绘制结果annotated_imgresult.plot()# plot() 方法会自动画框和标签annotated_imgcv2.cvtColor(annotated_img,cv2.COLOR_BGR2RGB)# 获取检测结果数据boxesresult.boxes namesresult.names# 显示检测结果withcol2:st.subheader(识别结果)st.image(annotated_img,use_column_widthTrue)# --- 结果详情展示 ---st.markdown(---)st.subheader( 诊断结果详情)iflen(boxes)0:st.success(✅ 检测结果未发现明显异常 (Normal/No Tumor))st.info(图像中未检测到肿瘤特征。)else:# 获取置信度最高的检测结果confidencesboxes.conf.cpu().numpy()classesboxes.cls.cpu().numpy()max_idxnp.argmax(confidences)max_confconfidences[max_idx]max_class_idint(classes[max_idx])max_class_nameCLASS_NAMES.get(max_class_id,names[max_class_id])# 显示主要结果st.metric(label主要诊断结果,valuef{max_class_name},deltaf置信度:{max_conf:.2f})# 显示详细表格data[]foriinrange(len(boxes)):cls_idint(classes[i])c_nameCLASS_NAMES.get(cls_id,names[cls_id])data.append({序号:i1,肿瘤类型:c_name,置信度:f{confidences[i]:.2f}})st.table(data)# 显示建议advice,colorget_diagnosis_advice(max_class_name)ifcolorred:st.error(f⚠️ **医疗建议**{advice})elifcolororange:st.warning(f⚠️ **医疗建议**{advice})else:st.success(f✅ **医疗建议**{advice})# 清理临时文件os.unlink(img_path)第四步运行系统在终端中运行以下命令启动 Web 应用streamlit run app.py代码功能解析模型加载使用st.cache_resource装饰器确保模型只在首次加载时读取到内存中避免每次交互都重新加载模型提高响应速度。图像预处理将上传的文件保存到临时路径并使用 OpenCV 读取和转换颜色空间BGR 转 RGB以适配 YOLO 和 Streamlit 的显示要求。推理与可视化调用model(img)进行预测。result.plot()是 Ultralytics 提供的便捷方法它会自动在图像上绘制边界框、类别名称和置信度。逻辑判断如果len(boxes) 0说明模型未检测到任何肿瘤目标判定为正常。如果检测到目标提取置信度最高的那个作为“主要诊断结果”。交互式反馈根据识别出的类别如 Glioma系统会自动匹配对应的医疗建议文本并使用st.error或st.warning进行高亮提示。该系统通过上述流程实现了从图像输入到智能诊断建议输出的完整闭环。

更多文章