一、技术原理与算法设计
系统不直接把图片交给大模型判断,而是先用确定性的视觉算法提取可解释指标,再将指标组合成 0–100 综合分。DeepSeek 只负责把结构化结果转换为面向宠物主人的文字解读,不能替代视觉检测和兽医诊断。
二、流程图
浏览器选择 JPG / PNG / BMP(≤ 16MB)
↓
Flask POST /api/detect
↓
高斯模糊 → HSV 粗分割 → 形态学开闭运算
↓
最大轮廓 + 20px 边界 → GrabCut 5 次迭代
↓
┌─────────┬─────────┬─────────┬─────────┬─────────┐
│形态纹理 │颜色 HSV │血丝像素 │黏液高光 │杂质轮廓 │
│GLCM │平均 H/S/V│红色比例 │亮度比例 │面积阈值 │
└─────────┴─────────┴─────────┴─────────┴─────────┘
↓
健康评分 calculate_health_score()
↓
标注图 + JSON 结果 → 前端报告 → 可选 DeepSeek 解读三、软件基础设置信息
| 项目 | 当前设置 |
|---|---|
| 后端框架 | Flask + Gunicorn,systemd 服务 cat-poop.service |
| 部署目录 | /data/cat-poop/ |
| 本地监听 | 127.0.0.1:5080 |
| 公网入口 | https://cdqtech.online/cat-poop/ |
| 上传限制 | 16 MB;支持 JPG、JPEG、PNG、BMP |
| API | GET /api/health、POST /api/detect、POST /api/ai-report |
| 反向代理 | nginx 将 /cat-poop/ 转发到 127.0.0.1:5080 |
四、软件系统设计
| 模块 | 文件 | 职责 |
|---|---|---|
| Web 接入 | app.py | 接收图片、生成 UUID 文件名、调用处理流水线、返回 JSON 和标注图。 |
| 预处理 | src/preprocessing.py | 中文路径读取、HSV 初筛、形态学处理、最大轮廓定位和 GrabCut。 |
| 五维检测 | src/detector.py | 颜色、血丝、黏液、GLCM 纹理、杂质检测。 |
| 评分引擎 | src/health.py | 把五个子分数按配置权重合成总分和健康等级。 |
| 配置中心 | config.py | Purina 1–7 级、HSV/面积阈值、健康评分权重和上传目录。 |
| AI 解读 | call_deepseek() | 将结构化检测结果组织成提示词,调用 DeepSeek 返回自然语言报告。 |
服务状态与容错
systemd 设置为自动启动和异常重启;图片未检测到主体时返回 detected=false,单条坏 JSON/外部 AI 请求失败不会改变检测主流程的视觉结果。
五、参数配置
图像分割参数
| 参数 | 数值 | 用途 |
|---|---|---|
| HSV 粗定位 | H 3–40,S 15–255,V 20–255 | 从背景中筛选疑似粪便区域 |
| 边界扩展 | 最大轮廓外扩 20 px | 为 GrabCut 保留边缘上下文 |
| GrabCut | 5 次迭代 | 精细分离前景与背景 |
血丝与黏液参数
| 检测项 | 阈值 | 判定 |
|---|---|---|
| 血丝 HSV | H 0–10 或 170–180;S > 80;V > 40 | 红色面积比例 > 2% 报警;> 5% 为严重 |
| 黏液高光 | 灰度 > 200 | 高光面积 > 5% 视为存在黏液;> 15% 为高风险 |
| 杂质面积 | 冻干 > 100 px;猫粮 > 150 px;白色碎片 > 80 px | 轮廓满足颜色范围和面积后计入 |
综合评分权重
| 维度 | 权重 | 满分条件 |
|---|---|---|
| Purina 形态评分 | 35% | 3、4 级为 100 分 |
| 颜色 | 25% | normal=100,medium=60,high=30,critical=10 |
| 血丝 | 15% | normal=100,medium=70,high=30,critical=5 |
| 黏液 | 10% | normal=100,medium=60,high=25,critical=5 |
| 杂质 | 15% | normal=100,medium=60,high=30,critical=10 |
六、五个检测阶段
Stage 1:形态评分(Purina 1–7 级)
目标:判断粪便干湿、成形和质地。
方法:对 ROI 灰度图量化为 16 个灰度级,计算四方向 GLCM 的 contrast、homogeneity、energy、correlation,再映射到 1–7 级。3–4 级为理想区间,1–2 偏干,5–7 偏软或水样。
Stage 2:颜色分析(HSV)
目标:筛查黑色、红色、黄色、灰白和绿色等异常颜色。
方法:在 mask 内计算平均 H/S/V;V<60 判为黑色风险,H<8 且 S>80 判为鲜红风险,H 25–40 且 S>50 判为黄色风险,S<30 且 V>150 判为灰白风险。
Stage 3:血丝检测
目标:检测 ROI 中红色像素占比。
方法:合并 H 0–10 与 170–180 两个红色区间,统计红色像素 / mask 像素;比例 <2% 正常,2–5% 警告,>5% 严重。
Stage 4:黏液检测
目标:通过高光面积和 Laplacian 平滑度识别湿润黏液特征。
方法:灰度 200–255 作为高光候选,计算其在 ROI 的占比,并统计 Laplacian 标准差辅助判断表面平滑度。
Stage 5:杂质检测
目标:发现未消化冻干、猫粮碎屑和白色异物。
方法:按每类 HSV 范围分割,开运算去噪,提取外轮廓并执行最小面积过滤,输出数量和面积占比。
七、边界与使用说明
AI 解读仅对已经计算出的检测指标进行文字化说明;视觉评分主流程不依赖 AI 服务。建议在相近光照和拍摄距离下连续记录多次结果,而不是依据单张图片做结论。