基于 YOLO11 的宠物皮肤病智能检测系统 | 源码实战项目分享
基于 YOLO11 的宠物皮肤病智能检测系统一套面向宠物家庭、繁育场和宠物医院的皮肤病初筛工具使用 YOLO11n Streamlit 构建。上传宠物皮肤照片或视频AI 自动定位病灶并给出细菌性皮肤病 / 蠕形螨病 / 跳蚤过敏性皮炎 / 真菌感染 / 炎症性皮炎 / 疥螨病六类常见皮肤病的初步判断辅助早期就医。一、背景1.1 行业痛点宠物皮肤病的早期识别有三难症状隐蔽脱毛、红斑、丘疹早期细微铲屎官肉眼难分清是过敏、真菌还是螨虫病种相似细菌性皮肤病、蠕形螨病和疥螨病在病灶视觉表现上高度相似非专业人员极易误判就诊滞后等到大面积溃烂、瘙痒搔抓出血才发现往往已经错过最佳治疗窗口治疗成本翻倍。本项目把看一眼像不像皮肤病这件事用 AI 标准化下来上传照片模型给出病灶位置 类别 置信度作为兽医诊断前的初筛工具帮主人尽早决定要不要就医。数据集包含 3000 张高质量标注图像覆盖宠物毛发遮挡、病变初期、光照不均、毛色差异等真实养护场景按 YOLO 格式组织train / valid / test六个类别nc6细菌性皮肤病 / 蠕形螨病 / 跳蚤过敏性皮炎 / 真菌感染 / 炎症性皮炎 / 疥螨病。视频演示与源码下载https://www.bilibili.com/video/BV1tmHJ6tE31/包含完整项目源码预训练模型权重️数据集1.2 项目运行效果Web 界面总览兽医诊室的薄荷绿 温暖琥珀橙主题强调安心感单张图片检测效果左原图右标注图下方会附病种科普 护理提示卡片1.3 项目介绍创新点 / 亮点维度说明多病种细分一次推理覆盖 6 类常见宠物皮肤病比是否异常二分类更可指导就医病种科普卡片每检出一类前端自动渲染病因 护理提示让铲屎官看得懂、能行动中文类别训练即用中文标签无需前端翻译多源接入单图 / 批量 / 视频 / 摄像头四种入口门诊、家庭、繁育场都能用免责声明检测结果页固定显示仅供初步筛查参考最终诊断以执业兽医为准系统功能概览单张照片上传患处照片 → 标注图 病种 护理建议多张照片多图或 ZIP 批量推理输出整窝/整群的病种分布视频检测短视频逐帧分析导出标注视频与明细 CSV摄像头实时浏览器拉本机摄像头对宠物体表做边扫边看技术栈层级技术选型检测模型YOLO11nUltralyticsWeb 框架Streamlit图像处理OpenCV、Pillow数据 / 图表Pandas、Streamlit 原生图表视频编解码imageio-ffmpeg部署Python 3.9本地 / 容器 / 边缘盒子类别定义nc6names[细菌性皮肤病,蠕形螨病,跳蚤过敏性皮炎,真菌感染,炎症性皮炎,疥螨病]。二、设计框架系统架构┌────────────────────────────────────────────────────────────┐ │ 用户浏览器铲屎官 / 宠物医生 / 繁育主 │ │ 单张照片 │ 多张照片 │ 视频检测 │ 摄像头 │ └──────────────────────┬─────────────────────────────────────┘ │ HTTP / WebSocket ┌──────────────────────▼─────────────────────────────────────┐ │ Streamlit App (app/streamlit_app.py) │ │ · 模式路由 病种科普卡片 │ │ · 配色 / 标题 / 描述均由 project.yaml 驱动 │ │ · 渲染明细表 批量分析图 │ └──────────────────────┬─────────────────────────────────────┘ │ model.predict(conf0.25, iou0.7) ┌──────────────────────▼─────────────────────────────────────┐ │ YOLO11n 推理引擎 │ │ Backbone (C2f SPPF) → Neck (FPN PAN) → Decoupled Head │ │ DFL分布式回归 → NMS │ └──────────────────────┬─────────────────────────────────────┘ │ result.boxes (cls, conf, xyxy) ┌──────────────────────▼─────────────────────────────────────┐ │ 后处理apply_class_display 病种知识库映射 │ │ → 标注图 明细 护理提示卡片 │ └────────────────────────────────────────────────────────────┘YOLO11 网络结构Backbone连续Conv C2f下采样 5 次 末端SPPF多尺度池化NeckFPN自顶向下PAN自底向上双向融合对小面积病灶友好Head解耦头 DFL 分布式回归对边缘模糊、毛发遮挡的病灶定位更稳损失BCE分类 CIoU DFL回归检测流程图像 → letterbox 缩放至 imgsz640 → 推理 → conf 过滤0.25 → NMSiou0.7 → 类别映射 → 病种知识库匹配 → 前端渲染。三、代码结构核心 50 行 解析项目结构宠物皮肤病检测/ ├── app/streamlit_app.py # Streamlit Web 入口 ├── configs/project.yaml # 业务配置病种显示名、UI 配色 ├── model/best.pt # YOLO11n 训练权重 ├── scripts/ # 训练 / 评测 / 导出脚本 ├── 宠物皮肤病目标检测YOLO数据集/ # 数据集train / valid / test └── 宠物皮肤病检测yolo11_train/ # 训练产物中英文两份核心 50 行精简自app/streamlit_app.pyfrompathlibimportPathimportpandasaspdimportstreamlitasstimportyamlfromultralyticsimportYOLO PROJECT_ROOTPath(__file__).resolve().parent.parent CONFIG_PATHPROJECT_ROOT/configs/project.yamlMODEL_PATHPROJECT_ROOT/model/best.ptAPP_CFGyaml.safe_load(open(CONFIG_PATH,r,encodingutf-8))APP_METAAPP_CFG.get(app,{})INFER_METAAPP_CFG.get(inference,{})CLASS_DISPLAYAPP_META.get(class_display_names)or{}DEFAULT_CONFfloat(INFER_META.get(conf,0.25))DEFAULT_IOUfloat(INFER_META.get(iou,0.7))st.cache_resource(show_spinnerFalse)defload_model(model_path:str)-YOLO:returnYOLO(model_path)defapply_class_display(name:str)-str:returnCLASS_DISPLAY.get(name,name)# 支持英文 ↔ 中文病名映射definfer_image(model:YOLO,image_path:Path,conf:float):resultmodel.predict(str(image_path),confconf,iouDEFAULT_IOU,verboseFalse)[0]annotatedresult.plot()rows[]ifresult.boxesisnotNone:forboxinresult.boxes:cls_idint(box.cls.item())raw_nameresult.names[cls_id]rows.append({class_id:cls_id,class_name:raw_name,display_name:apply_class_display(raw_name),# 用于前端展示confidence:round(float(box.conf.item()),4),x1:float(box.xyxy[0][0]),y1:float(box.xyxy[0][1]),x2:float(box.xyxy[0][2]),y2:float(box.xyxy[0][3]),})returnannotated[:,:,::-1],pd.DataFrame(rows)# BGR - RGB# ---------------- Streamlit 主流程 ----------------st.set_page_config(page_titleAPP_META.get(title),layoutwide)modelload_model(str(MODEL_PATH))confst.sidebar.slider(置信度阈值,0.05,0.95,DEFAULT_CONF,0.05)modest.radio(接入源,[ 单张照片, 多张照片, 视频检测, 摄像头],horizontalTrue)ifmode 单张照片:uploadedst.file_uploader(上传宠物患处照片,type[jpg,png,jpeg])ifuploadedisnotNone:tmpPath(/tmp)/uploaded.name tmp.write_bytes(uploaded.getvalue())annotated,dfinfer_image(model,tmp,conf)col1,col2st.columns(2)col1.image(uploaded.getvalue(),caption原图)col2.image(annotated,caption检测结果)ifnotdf.empty:st.bar_chart(df[display_name].value_counts())st.caption(AI 检测结果仅作初步筛查参考最终诊断请以执业兽医为准。)逐段解析project.yaml的class_display_names做了英文 → 中文病名映射训练样本英文标签也可以无缝在前端展示中文对运营友好。st.cache_resource缓存权重单图响应稳定在 100ms 级置信度滑动条 model.predict(confconf)让用户自己控制宽严皮肤病数据噪声大调高一档可显著降误报。infer_image同时返回annotated带框图和DataFrame明细DataFrame 可直接驱动st.bar_chart输出本次检测各病种数量也可导出 CSV 给宠物医生跟进。st.set_page_config st.radio四模式路由复用同一份推理逻辑新增摄像头流只需再写一段st.camera_input。页脚强制提醒仅作初筛参考符合 AI 医疗类应用的合规要求避免误导主人自行诊断。四、训练效果训练采用 YOLO11n 预训练权重微调epochs200, imgsz640, batch16, patience100。best.pt对应的最佳指标指标数值Precision (B)0.680Recall (B)0.649mAP0.50.681mAP0.5:0.950.413说明当前 mAP0.5 ≈ 0.68模型仍在迭代中。皮肤病检测是已知比较硬的任务主要原因有三类内差异大同一种皮肤病在长毛/短毛、白毛/深色毛宠物身上的视觉表现差异显著类间高度相似细菌性皮肤病、蠕形螨病和疥螨病早期病灶在 RGB 图像上几乎无法区分需要纹理 局部细节联合判断样本规模偏小3000 张图分到 6 类单类平均不足 500 张长尾问题明显。下一阶段优化方向扩充难类样本重点补 demodicosis / scabies、引入毛发分割辅助任务、升级到 YOLO11s 并配合多尺度 TTA、训练时加入 MosaicMixup 抑制过拟合。由于本阶段 mAP 尚未达到放出 PR / 混淆矩阵的内部阈值≥ 0.85暂仅展示训练 loss / 指标随 epoch 的总览图。从曲线看box / cls / dfl loss 平稳下降P/R 在中后段趋于平台未出现过拟合震荡模型已经学会任务差距主要在精度上限。五、项目总结做对了什么用六分类替代是否异常二分类让 AI 的输出能直接对接铲屎官的下一步动作科普 / 就医 / 复查。project.yaml描述配色、病种显示名、批量上限换品种、换语言都不用改代码。强制免责声明 病种科普卡片让产品既敢用又会用符合 AI 医疗类应用的伦理与合规要求。还能怎么做引入轻量分割模型YOLO11n-seg对病灶面积做量化给出皮损面积占比这种可比指标方便复诊跟踪。加入皮肤毛发预处理 / GAN 增强提升毛发遮挡场景下的检测召回。接入兽医后台检测明细 标注图自动归档到云端病历复诊时调取跟踪治疗效果。模型迭代到 mAP0.5 ≥ 0.85 后再开放高置信度自动提示就医功能前期保持人工 in-the-loop。一句话总结YOLO11n Streamlit 把宠物皮肤病早期筛查从经验判断变成了可量化、可复用、可合规的工程化能力是 AI for Pet Health 一个非常落地的切入点。