geoai-py 0.42.x 仅用于调用 masks_to_vector 将异常掩膜转成候选多边形。首版没有引入深度嵌入权重。geoai-py 当前的 Embeddings API 主要服务于预计算地球嵌入数据集,不是本 Demo 的本地通用异常模型。
256 x 256、步长 128,边缘窗口锚定到影像边界。每个窗口提取 17 个特征:RGB/HSV 均值与标准差、灰度熵、边缘密度、Laplacian 清晰度以及暗/亮像素比例。
auto 模式下,3 张以上同尺寸固定机位参考图会先消除每张图的整体亮度/色彩漂移,再将测试窗口只与参考图的相同位置比较;条件不满足时回退到全局中位数/MAD。两种模式都记录贡献最大的原因特征。StandardScaler,再训练 IsolationForest(n_estimators=200, random_state=42)。99.5% 分位数定阈值,不通过固定污染率强制标记正常窗口。0=正常、1=仅规则、2=仅 Isolation Forest、3=两者一致。环境固定在仓库内的 .venvs/09-anomaly-detection,使用 Python 3.12,不安装到系统 Python:
.\scripts\setup.ps1 -Capability 09-anomaly-detection
.\.venvs\09-anomaly-detection\Scripts\python.exe -m pip check
运行 CLI:
.\.venvs\09-anomaly-detection\Scripts\python.exe `
.\capabilities\09-anomaly-detection\run_anomaly_detection.py `
--reference <正常参考影像或目录> `
--input <待检测影像或目录> `
--output <新的空目录> `
--tile-size 256 `
--stride 128 `
--threshold-quantile 0.995 `
--random-state 42 `
--spatial-mode auto `
--truth-manifest <可选验证真值JSON>
生成可重复的验证输入(复制源图时校验 SHA256,绝不覆盖 baseData 原图):
.\.venvs\09-anomaly-detection\Scripts\python.exe `
.\capabilities\09-anomaly-detection\generate_validation_inputs.py `
--source-dir .\baseData `
--raw-output .\shared\data\raw\09-anomaly-detection\validation-20260818-v2 `
--processed-output .\shared\data\processed\09-anomaly-detection\validation-20260818-v2
每张输入影像生成:
*.rule.heatmap.png 和 *.isolation.heatmap.png*.comparison.overlay.png*.anomaly-mask.tif*.anomalies.geojson*.tiles.csv运行目录还会生成 run_metadata.json,记录环境版本、阈值、特征、参考/输入数量、耗时、空间参考、逐图统计、真值指标、矢量化路径和限制。GeoJSON 包含方法标记、最大分数、主要原因特征和像素面积。
验证输出位于 shared/outputs/09-anomaly-detection/validation-20260818-v3/。参考图产生 588 个窗口,共处理 3 张目标图,CPU 总耗时 41.051 秒。
| 样本 | 规则覆盖率 | Isolation Forest 覆盖率 | 单图耗时 |
|---|---|---|---|
注入异常 07-16-injected.png |
7.16% | 3.74% | 14.741 秒 |
未修改正常图 07-16-normal.jpg |
0.33% | 0.00% | 9.211 秒 |
困难真实图 07-19-difficult.jpg |
1.46% | 0.56% | 10.341 秒 |
受控注入包含颜色块、局部模糊和暗色遮挡。规则方法命中 3/3,precision 0.583、recall 0.672、IoU 0.454;Isolation Forest 命中 2/3,precision 0.831、recall 0.500、IoU 0.454。这些指标只验证受控链路,不代表真实业务准确率。
人工查看结果图后确认:颜色块和暗色遮挡与候选明显对齐;模糊区域主要由规则方法检出。正常图在左上植被/岩体过渡处有少量规则误报;困难图的候选集中在混凝土结构、门洞和顶部暗区,可能来自视角、材质和光照差异,不能称为真实异常。
.\.venvs\09-anomaly-detection\Scripts\python.exe -m unittest discover `
-s .\capabilities\09-anomaly-detection\tests -v
测试覆盖边缘切片、特征响应、随机种子复现、完整 CLI 输出、非空输出拒绝、参考窗口下限、目录输入、无支持格式,以及带投影三波段 GeoTIFF 的 CRS/仿射变换保留。
| 项目 | 许可证/状态 |
|---|---|
geoai-py |
MIT |
| scikit-learn、SciPy、Rasterio、GeoPandas | BSD 系列;Rasterio 依赖的 GDAL 需独立核查 |
| OpenCV | Apache-2.0 |
| Pillow | HPND |
| 模型权重 | 无 |
| 验证影像 | 用户已有样本;本 Demo 不扩展其授权范围 |
当前只处理 RGB 可视影像,不支持热红外、SAR 或任意多光谱组合。下一步应先取得多场景正常参考图、真实异常人工标注和地理配准影像,测量跨视角/光照的误报与漏报,再决定是否接入控制台或产品告警。
控制台已接入输入、后台运行、案例库和结果工作区:
http://127.0.0.1:6173/apps/workbench-console/#/capability/09-anomaly-detection
GET/POST /api/anomaly-detection/runs、PUT /api/anomaly-detection/uploads/<upload-id>、GET /api/anomaly-detection/jobs/<job-id>。2026-08-18 使用一张 3664 × 2748 参考图和一张困难影像完成控制台真实上传验证,后台任务成功产生 6 个候选区;原图与结果工件均通过本地 HTTP 读取。控制台仍只用于实验复核,不连接产品告警。
使用内置 ImageGen 生成同一固定机位的排水沟场景:5 张正常参考图分别覆盖阴天、晴天、雨后、晨雾和傍晚,异常图仅在沟内加入树枝、落叶、泥土和石块形成的堵塞。生成信息位于 shared/data/raw/09-anomaly-detection/validation-20260819-imagegen-v1/generation_metadata.json。
该运行已登记到控制台案例库,名称为 ImageGen 五参考图堵塞复核(漏检案例),保留 0 候选的真实输出以及五张参考图、测试原图、热力图和下载工件。
该结果否定了“多放几张正常图就能可靠识别排水沟堵塞”的假设。为此新增了固定机位同位置规则:--spatial-mode auto 在至少 3 张参考图且所有图像尺寸一致时自动启用,否则保留原全局规则;也可显式选择 aligned 或 global。Isolation Forest 仍作为全局外观基线保留。
优化后的新运行位于 shared/outputs/09-anomaly-detection/validation-20260819-imagegen-aligned-v2/,没有覆盖原漏检结果:
99.5% 参考分位阈值为 13.6367,没有为命中样本降低阈值。ImageGen 五参考图堵塞复核(同位置优化),与 漏检案例 并列用于前后对照。同位置模式解决的是固定机位、相同构图中的局部画面变化,不具备“堵塞”语义。明显机位偏移仍会造成误报;真实部署还应增加图像配准、排水沟 ROI 或专门的检测/分割模型,并取得真实标注数据。
针对运行 anomaly-20260819-061029-583672 中面积较小的显著新增图案漏检,新增通用局部外观/结构通道。红色图案只作为漏检验证样本,算法没有红色阈值、物品类别或样本坐标规则。
local_appearance_change 候选,覆盖验证区域全部 6,710 个高饱和红色像素;整图局部变化覆盖率 0.602%。原有 Isolation Forest 建筑区域候选保持不变。validation-20260819-small-local-v5/ 和 validation-20260819-imagegen-local-v5/;小目标修复结果登记为控制台案例 通用局部异常增强(小目标漏检修复)。当前局部通道要求固定机位和相同尺寸,最小保留 512 像素且过滤细长稀疏连通区。它仍可能把移动阴影、树叶变化或生成式影像细节漂移标为异常,不代表理解了物体类别或业务原因。