仓储盘点与库区安全是物流与制造环节的核心痛点。传统人工盘点效率低、误差大、夜班盲区多条码/RFID方案需要对货物做贴标改造部署成本高、柔性差且无法覆盖货物倒塌、通道堵塞等安全异常。基于 YOLO 视觉方案的智能仓储系统以普通监控摄像头为感知入口在本地工控机完成货物品类识别、数量自动盘点、库区异常检测全流程推理无需改造货物、无需依赖云端、可直接对接现有WMS库存系统是中小仓库、产线边仓智能化升级的高性价比方案。本文从业务痛点、系统架构、三大核心功能实现、C#部署落地到工程化优化完整拆解智能仓储视觉系统的全栈开发思路所有逻辑均经过制造业边仓项目验证。一、业务背景传统仓储管理的三大核心痛点1.1 人工盘点效率低、误差大盘点一次需要全员投入耗时几小时甚至整天严重影响进出库作业人工点货误差率通常在 2%~5%堆叠、遮挡货物更容易数错账实不符成常态夜班、节假日盘点人力成本高盲区多异常发现不及时1.2 条码/RFID 方案改造重、柔性差每个货物/托盘必须贴标耗材与人工成本高非标货物难以适配只能识别“有还是没有”无法判断摆放是否规范、是否存在安全隐患新增品类需要重新做标签、录入系统调整灵活度低1.3 安全异常靠巡检发现滞后货物倒塌、越位摆放、通道堵塞、异物入侵等异常只能靠巡检人员定时巡查异常发生后往往要等下一次巡检才能发现小问题拖成大事故尤其夜班风险高方案定位视觉辅助盘点 安全异常预警不是完全替代人工盘点而是实现高频自动巡检异常提前预警人工只做复核与异常处理大幅降低人力投入。二、系统整体架构边缘侧全闭环设计整套系统部署在仓库本地所有摄像头接入工控机推理、计算、告警全部本地完成断网不影响基础功能数据可按需对接WMS系统支持大屏展示与移动端告警推送。2.1 四层解耦架构展示交互层业务层推理层 工控机本地感知层 库区摄像头货架监控摄像头 盘点用通道监控摄像头 安全用出入口摄像头 进出识别视频流拉取与抽帧YOLO 检测引擎 货物/异常识别盘点计数与异常判定库存数据对接 WMS异常告警与事件记录历史数据与报表统计WPF 本地监控上位机仓库大屏实时展示移动端告警推送2.2 核心设计原则边缘闭环视频流不外出推理全部本地完成数据安全、延迟低断网可正常运行分级告警普通异常本地提示严重异常推送负责人避免告警风暴结果可复核每次盘点、每次异常都留存截图与数据支持人工复核与追溯最小侵入利用现有监控摄像头无需大规模改造仓库与货物快速上线人工兜底视觉结果作为辅助参考正式盘点以人工复核为准不直接强写库存三、三大核心功能识别、盘点、异常检测3.1 货物品类识别这是基础功能目标是“看得准是什么”。实现思路基于 YOLOv8/11 目标检测模型识别不同SKU的货物、托盘、周转箱按货架区域划分检测ROI只处理货架区域排除背景干扰提升速度与准确率支持多品类同时识别单画面可同时检测数十种货物训练与标注要点覆盖不同角度、不同光照、不同堆叠程度、不同遮挡情况的样本相似品类重点采集区分样本比如同尺寸不同颜色的箱子避免混淆工业场景优先选用 YOLOv8n/s 轻量模型CPU工控机即可流畅运行落地指标常规摆放货物识别准确率 ≥ 98%部分遮挡场景识别准确率 ≥ 92%3.2 数量自动盘点这是核心难点也是价值最大的功能。单纯靠检测框直接计数堆叠、遮挡场景误差会非常大必须结合场景做分层设计。三种盘点方案按需适配方案1单层货架检测计数最简单、最准适用场景平层货架、货物平铺摆放、无堆叠实现逻辑划定每个货位的ROI区域YOLO检测出该区域内的货物目标按类别统计数量直接输出盘点结果精度准确率 ≥ 98%几乎和人工一致方案2堆叠货物检测 层数估算适用场景规则纸箱整齐堆叠如整箱货物码垛实现逻辑检测最上层货物得到平面数量结合相机标定的高度信息、货物单箱高度估算堆叠层数平面数量 × 层数 总数量优化加入侧边视角摄像头辅助校验层数误差可控制在 5% 以内方案3整托盘体积估算适用场景整托盘散装货物、不规则货物实现逻辑双目摄像头或单目定高得到托盘货物的整体体积结合单货物体积先验换算估算数量适合粗盘、巡检场景精度略低但效率极高计数防抖校准连续抽帧检测 3~5 次取众数作为最终结果避免单帧误检导致计数跳动固定机位定期校准像素当量保证尺寸与数量估算的稳定性进出库时自动联动盘点和WMS账面数据做差值校验偏差过大触发人工复核3.3 库区异常检测这是安全增值功能投入小、收益高。四类核心异常货物倒塌/倾斜判定逻辑货物检测框的宽高比、倾斜角度超出正常阈值或连续帧位置发生大幅变化级别二级告警推送仓管员越位摆放 / 占用通道判定逻辑在禁止摆放区域检测到货物目标持续超过指定时间级别二级告警占消防通道升级为一级通道堵塞 / 异物滞留判定逻辑通道区域检测到货物、托盘、异物停留超过阈值时间级别普通滞留二级堵塞消防通道一级人员闯入禁区判定逻辑结合人员检测禁区时间段/区域出现人员级别一级告警推送安保与负责人异常判定核心原则延时确认单帧检测到不算异常持续 N 秒都存在才触发避免误报区域分级普通区域、通道、消防通道、禁区不同区域严重程度不同频次抑制同一异常短时间内只告警一次不重复刷屏四、全栈落地C# 端核心实现基于 YOLO ONNX ML.NET 技术栈和工业缺陷检测共用一套底座C# 原生实现零 Python 依赖可直接嵌入仓储上位机系统。4.1 YOLO 检测引擎封装/// summary/// 仓储YOLO检测引擎货物识别、人员检测、异常目标检测/// /summarypublicclassWarehouseYoloDetector:IDisposable{privatereadonlyMLContext_mlContextnew();privatereadonlyITransformer_model;privatereadonlyPredictionEngineImageInput,DetOutput_predEngine;privatereadonlyint_inputSize640;privatereadonlyfloat_confThreshold0.5f;privatereadonlystring[]_classNames;publicWarehouseYoloDetector(stringonnxPath,string[]classNames){_classNamesclassNames;varpipeline_mlContext.Transforms.ResizeImage(images,_inputSize,_inputSize,nameof(ImageInput.Image)).Append(_mlContext.Transforms.ExtractPixels(images,scaleImage:1f/255f)).Append(_mlContext.Transforms.ApplyOnnxModel(modelFile:onnxPath,outputColumnNames:new[]{output0},inputColumnNames:new[]{images}));varemptyData_mlContext.Data.LoadFromEnumerable(newListImageInput());_modelpipeline.Fit(emptyData);_predEngine_mlContext.Model.CreatePredictionEngineImageInput,DetOutput(_model);}/// summary/// 检测一帧画面返回所有目标/// /summarypublicListDetTargetDetect(Matframe){var(scaled,ratio,padX,padY)Preprocess(frame);varinputnewImageInput{Imagescaled};varoutput_predEngine.Predict(input);varboxesParseBoxes(output.Output0,ratio,padX,padY);returnNmsSuppress(boxes,0.45f);}// 预处理、框解析、NMS 通用逻辑和YOLO检测一致此处省略private(Mat scaled,floatratio,intpadX,intpadY)Preprocess(Matframe)default;privateListDetTargetParseBoxes(float[]output,floatratio,intpadX,intpadY)new();privateListDetTargetNmsSuppress(ListDetTargetboxes,floatiouThresh)new();publicvoidDispose()_predEngine?.Dispose();}/// summary/// 检测目标/// /summarypublicclassDetTarget{publicintClassId{get;set;}publicstringClassName{get;set;}publicfloatConfidence{get;set;}publicRectangleFBbox{get;set;}}4.2 货位盘点计数核心逻辑/// summary/// 货位盘点计算器/// /summarypublicclassShelfStockCounter{privatereadonlyWarehouseYoloDetector_detector;privatereadonlyDictionarystring,ShelfConfig_shelfConfigs;/// summary/// 对指定货架画面执行盘点/// /summarypublicStockCountResultCountShelf(stringshelfCode,Matframe){if(!_shelfConfigs.TryGetValue(shelfCode,outvarconfig))thrownewArgumentException($货架{shelfCode}未配置);// 1. 裁剪货架ROI区域只检测货架内usingvarroiFramenewMat(frame,config.ShelfRoi);// 2. YOLO检测货物vartargets_detector.Detect(roiFrame);// 3. 按品类分组统计vargroupBySkutargets.Where(tconfig.AllowedSkus.Contains(t.ClassName)).GroupBy(tt.ClassName).Select(gnewSkuCountItem{Skug.Key,Countg.Count(),AvgConfidenceg.Average(xx.Confidence)}).ToList();// 4. 多层堆叠场景结合层数估算根据项目配置启用if(config.EnableStackEstimate){foreach(varitemingroupBySku){intlayerCountEstimateLayerCount(g,config.BoxHeightPx);item.Countitem.Count*layerCount;}}// 5. 结果防抖连续多次检测取众数由上层调用实现returnnewStockCountResult{ShelfCodeshelfCode,SkuItemsgroupBySku,TotalCountgroupBySku.Sum(xx.Count),TimestampDateTime.Now};}/// summary/// 估算堆叠层数/// /summaryprivateintEstimateLayerCount(IEnumerableDetTargettargets,floatsingleBoxHeightPx){// 根据检测框的纵坐标分布计算垂直方向层数varyPositionstargets.Select(tt.Bbox.Top).OrderBy(xx).ToList();intlayers1;floatlastYyPositions.First();foreach(varyinyPositions.Skip(1)){if(y-lastYsingleBoxHeightPx*0.7f){layers;lastYy;}}returnlayers;}}4.3 区域异常检测逻辑/// summary/// 区域异常检测器/// /summarypublicclassRegionAbnormalDetector{privatereadonlyDictionarystring,RegionConfig_regions;privatereadonlyDictionarystring,DateTime_regionFirstDetectTimenew();/// summary/// 检测区域异常/// /summarypublicListAbnormalAlarmCheckAbnormal(ListDetTargettargets,Matframe){varalarmsnewListAbnormalAlarm();foreach(varregionin_regions.Values){// 1. 检查该区域内是否存在禁止目标varinRegionTargetstargets.Where(tregion.ForbiddenClasses.Contains(t.ClassName)IsInRegion(t.Bbox,region.Area)).ToList();stringkeyregion.RegionCode;if(inRegionTargets.Any()){// 2. 首次检测到记录时间if(!_regionFirstDetectTime.ContainsKey(key)){_regionFirstDetectTime[key]DateTime.Now;continue;}// 3. 持续时间超过阈值触发告警doubleduration(DateTime.Now-_regionFirstDetectTime[key]).TotalSeconds;if(durationregion.DurationThreshold){alarms.Add(newAbnormalAlarm{RegionCoderegion.RegionCode,AlarmTyperegion.AlarmType,Levelregion.AlarmLevel,Durationduration,TargetCountinRegionTargets.Count,Snapshotframe.Clone()});}}else{// 目标消失清除计时_regionFirstDetectTime.Remove(key);}}returnalarms;}privateboolIsInRegion(RectangleFbbox,RectangleFregion){// 判断目标中心点是否在区域内floatcenterXbbox.Xbbox.Width/2;floatcenterYbbox.Ybbox.Height/2;returnregion.Contains(centerX,centerY);}}五、工程化优化从Demo到量产的关键实验室准确率再高到了真实仓库也可能水土不服。以下几个优化点是决定系统能不能长期稳定运行的关键。5.1 相机标定与视角校准固定机位必须做像素当量校准保证尺寸、层数估算的准确性每个货位、每个警戒区域在画面上手动标定ROI避免背景干扰定期校验相机位置防止摄像头被碰歪导致检测失效5.2 光照自适应仓库昼夜光照差异大加入亮度判断与自动曝光补偿夜间红外模式下单独优化模型补充红外样本训练避免夜间准确率暴跌极端过曝/过暗画面自动跳过检测触发摄像头异常告警5.3 遮挡与堆叠优化货物边缘部分遮挡通过可见部分推断完整目标提升召回率堆叠严重的场景增加侧面辅助摄像头双视角交叉校验数量设置置信度动态阈值遮挡区域适当降低阈值保证不漏检5.4 结果防抖与可信分级连续 3~5 帧检测一致才输出最终结果单帧误检直接过滤对盘点结果做可信分级高置信结果直接更新低置信结果标记待复核偏差超过阈值自动触发人工复核绝不盲目替换账面数据5.5 多机位联动调度多路视频流分时复用推理引擎避免并发推理导致CPU占满卡顿重点区域高频检测普通区域低频巡检平衡性能与实时性单路推理异常不影响其他路故障隔离六、现场踩坑与避坑指南坑1光照变化大白天准晚上不准现象白天准确率很高晚上开灯/红外模式下误检漏检飙升解决训练集必须包含夜间、阴天、开灯、关灯各种光照样本加入图像预处理归一化极端光照下降低检测灵敏度避免误报。坑2相似货物分不清SKU识别混乱现象外观相近的不同品类货物模型经常识别错误解决增加相似品类的难例样本补充特征区分点如标签、标识的标注实在难以视觉区分的场景结合条码辅助校验不要硬上纯视觉。坑3堆叠货物计数误差大现象平铺很准一堆叠数量就差很多解决不要强行靠单目视觉实现高精度堆叠计数规则堆叠结合层数估算不规则堆叠做粗盘提示高精度场景加深度相机或双目相机。坑4蚊虫、灰尘、光影导致误报现象夜间小飞虫、地面光影、灰尘反光频繁触发异常告警解决加入面积阈值过小目标直接过滤增加持续时间判定瞬间出现的不告警结合时序变化判断静态光影不会触发。坑5摄像头角度偏移系统直接失效现象摄像头被碰歪、角度变了ROI全部错位盘点和检测全错解决加入画面基准校验和基准图偏差过大自动告警并暂停检测重要点位采用固定支架防止轻易被挪动。七、落地价值总结盘点效率大幅提升人工盘点几小时的工作量系统几分钟自动完成全仓巡检人力投入减少 70% 以上异常响应提速从“定时巡检发现”变为“实时自动检测”安全异常发现时间从小时级降到秒级改造成本低利用现有监控摄像头即可上线不需要对货物、货架做改造中小仓库也能承受数据全程可溯每次盘点、每次异常都有截图与数据留存支持追溯与复盘技术栈统一全栈 C# .NET 实现和现有仓储上位机、WMS系统无缝对接运维成本低对于制造业边仓、中小成品仓、备件仓这套方案投入小、见效快是仓储智能化升级非常务实的切入点。