切片目标检测(yolo)
检测图片较大时,通过将大图划分为子图分别推理后再还原回大图结果,是保证推理精度的一种有效手段。
graph TD
A[输入大图 High-Res Image] --> B{是否需要重叠切片?}
B -->|是| C[计算切片坐标: 3x3 矩阵]
C --> D[执行切片: Slicing]
subgraph Inference_Stage [并行/串行推理阶段]
D --> S1[子图 1]
D --> S2[子图 2]
D --> S3[...]
D --> S9[子图 9]
S1 --> Y1[YOLO 推理]
S2 --> Y2[YOLO 推理]
S3 --> Y3[YOLO 推理]
S9 --> Y9[YOLO 推理]
Y1 --> T1[坐标还原: 局部 -> 全局]
Y2 --> T2[坐标还原: 局部 -> 全局]
Y3 --> T3[坐标还原: 局部 -> 全局]
Y9 --> T9[坐标还原: 局部 -> 全局]
end
T1 & T2 & T3 & T9 --> E[结果汇总: Detection Boxes]
subgraph Post_Processing [结果合并与后处理]
E --> G[NMS/Soft-NMS: 抑制重叠框]
end
G --> H[输出最终结果图/JSON]
切片目标检测流程图
切片 (Slicing) 切片策略
为了避免物体刚好在切割线上导致漏检,通常建议设置 Overlap(重叠率)。例如:3x3 切片时,每张子图边缘保留 15%-20% 的重叠区域。
坐标映射 (Coordinate Mapping)
假设子图在原图中的左上角坐标为
\[(X_{offset},Y_{offset})\]
子图检测到的框为
\[(x_{1},y_{1},x_{2},y_{2})\]
还原全局坐标
\[X_{global}=X_{offset}+x_{local}\]
结果合并 (NMS)
在切片重叠处,同一个物体会被重复检测出多次。解决:将所有还原后的坐标汇总,统一运行一次 NMS(非极大值抑制)。
评估系统验证
sequenceDiagram
participant App as 上位机应用逻辑
participant RPC as RPC Client
participant Edge as 下位机 (Model Engine)
App->>App: 图像切片 (Split into 9 tiles)
loop 对每一张子图
App->>RPC: infer(tile_data)
RPC->>Edge: jsonrpc(infer, tile_data_b64)
Edge-->>RPC: 返回 tensor_b64
RPC-->>App: tensor
App->>App: getbox
App->>App: 坐标偏移补偿 (Apply Offsets)
end
App->>App: 全局 NMS 过滤重叠框
App->>App: 绘制/输出结果
评估系统时序图
下位机部署完整示例
作者 @sq suiqiang@hngwg.com