智能售货柜视觉识别实战:RTSP拉流、抽帧与YOLO工程化全解析
2026/9/13 10:44:05 网站建设 项目流程

1. 售货柜视觉识别项目,为什么卡在“拉流到识别”这一段

做过智能售货柜的人应该都有体会:真正难的不是训练一个能识别可乐的YOLO模型,而是把“摄像头画面”变成“可下单的订单数据”这条链路。一个柜子摆到线下,环境不可控,网络时好时坏,摄像头角度固定但光线一直在变,用户拿取商品的动作又快又遮挡严重,这套系统的稳定性完全取决于工程细节,而不是模型精度。

这个项目里,我的定位不是做算法研究,而是做方案落地:货柜内部署IPC摄像头(顺便说一句,IPC在这里就是IP Camera,网络摄像机),摄像头通过RTSP协议输出实时视频流;边缘计算盒子(我用的是RK3588平台)拉流、抽帧,再跑YOLO做目标检测,最后把识别结果上报给后端订单系统。整条链路听起来不复杂,但每一步都有不少暗坑,尤其是抽帧策略和流水线整合这两块,做不好画面流畅、识别率却很崩,或者识别正常但CPU被打满,一下就把业务拖垮。

这篇文章我把这个项目的完整实现过程拆开讲,涵盖RTSP拉流的方案选型、抽帧策略的取舍、YOLO模型的选择与训练数据准备、以及整条流水线的工程化整合,最后是上线后我踩过的一些坑。适合正在做或者准备做售货柜、智能货架、门店监控分析这类项目的朋友参考,尤其是刚接触视频流处理、对“怎么把IPC画面稳定地送进模型”这件事还没理清思路的团队。

需要先说明,本文偏工程实践,模型训练部分我只讲与这个项目强相关的要点,不会展开讲YOLO的每个网络结构细节。另外,文中涉及的具体参数和代码都是基于我这边项目环境的实测结果,不同硬件和场景要有调整空间。

2. 从IPC到数据帧:RTSP拉流的方案选型与稳定性处理

2.1 IPC选型和RTSP地址,先搞明白你的视频源

售货柜的摄像头安装方式一般有两种:一种是柜内厂商预埋的IPC,一种是后期改造时自己装的微型摄像头。不管哪种,我们拿到的都是一个网络摄像头设备,厂商会提供一个RTSP地址,类似:

rtsp://admin:password@192.168.1.64:554/Streaming/Channels/101

这个地址里包含了用户名、密码、IP、端口、通道号等关键信息。需要注意的是,不同厂商的RTSP路径格式差别很大,海康、大华、宇视各有一套,甚至同一厂商的不同固件版本也会变。项目初期我建议直接拿厂商的SDK文档或者设备Web管理后台查看,别凭经验猜路径,浪费时间。

这里提一下Hiksimulator这个设备模拟器,我在开发阶段没有真实柜子可用,就是用它在PC上模拟了一路RTSP视频流,把测试视频按海康协议格式推出来。这样在算法开发时不用依赖真机,调试方便很多。如果你手头暂时没有设备,可以先用模拟器跑通全流程,等真机到位后再替换地址就行。

IPC的输出分辨率,售货柜场景我建议用200万像素(1080p)就够了。分辨率太高,拉流带宽和抽帧解码的压力都会变大,而货柜内的识别目标通常是单瓶饮料、零食盒子,1080p完全够用。帧率方面,IPC默认一般是25fps(PAL制),但实际识别根本不需要这么高,这个后面讲抽帧策略时细说。

2.2 OpenCV和FFmpeg两条拉流路线,到底怎么选

拉流本质上就是从RTSP源持续读取视频帧。很多人第一反应是用OpenCV的VideoCapture,因为代码最简单:

import cv2 cap = cv2.VideoCapture("rtsp://admin:password@192.168.1.64:554/Streaming/Channels/101") while True: ret, frame = cap.read() if not ret: print("拉流失败或中断") break # 这里的frame就是BGR格式的numpy数组,可以直接送进模型 cv2.imshow("frame", frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release()

这套代码在局域网环境、网络稳定的情况下跑得很流畅,但一旦出现网络抖动、设备重启,VideoCapture的read会直接阻塞或者返回空帧,而且OpenCV底层的FFmpeg封装在断线重连方面做得很弱,经常需要重启进程才能恢复。我在项目早期用这个方案,线上反馈“画面卡死”的次数特别多,排查下来基本都是拉流线程挂掉了。

后来我把拉流核心换成了FFmpeg命令行配合自研解析,或者直接用Python的ffmpeg-python库来管理进程,思路是用FFmpeg把RTSP流转成原始帧数据,通过管道输出给Python端:

import subprocess import numpy as np RTSP_URL = "rtsp://admin:password@192.168.1.64:554/Streaming/Channels/101" WIDTH, HEIGHT = 1920, 1080 command = [ "ffmpeg", "-rtsp_transport", "tcp", # 用TCP传输,比UDP稳 "-i", RTSP_URL, "-f", "rawvideo", "-pix_fmt", "bgr24", "-vf", f"scale={WIDTH}:{HEIGHT}", "-an", "pipe:1" ] proc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL) frame_size = WIDTH * HEIGHT * 3 while True: raw = proc.stdout.read(frame_size) if not raw: print("流中断") break frame = np.frombuffer(raw, dtype=np.uint8).reshape(HEIGHT, WIDTH, 3) # 拿到frame后送去做抽帧判断

看到区别了吗?FFmpeg方式把解码压力放在独立的子进程里,即使Python端处理慢了,也只会导致管道积压,不会把整个进程拖死。而且FFmpeg对RTSP协议的处理比OpenCV成熟得多,支持TCP/UDP切换、超时重连参数,抗抖动能力更强。

不过这套方案也有它的麻烦:原始视频帧数据量很大,1080p的BGR帧一帧就有1920×1080×3≈6MB,如果流是25fps,每秒就是150MB数据从管道里过,这对内存拷贝和管道吞吐是不小的压力。所以实际项目中,我通常会在FFmpeg侧先做缩放,把分辨率降到640×640或者768×768再输出,这样既保留了识别需要的细节,又大幅降低传输和后续处理的成本。

2.3 拉流要做到“断线自动恢复”,不能靠人工重启

售货柜部署在户外或半户外环境,IPC重启、交换机重启、网络闪断都是家常便饭。拉流模块必须内置重连机制,否则一次断流,识别系统就永久失效了。我用的是“指数退避重连”策略:

  • 第一次断线后等2秒重试;
  • 重试失败后等待时间翻倍:4秒、8秒、16秒……上限30秒;
  • 连续重试成功超过1分钟后,把等待时间重置回2秒。

这样做的好处是避免在网络恢复前高频空转,又保证了网络恢复后能快速拉回流。还有一个细节:重连前一定要主动释放上一次的进程和管道,否则会积累大量僵尸连接,把设备的RTSP会话数耗尽(IPC一般支持的并发会话有限,有的只有4路)。

拉流这块我还有一个经验:尽量用TCP而不是UDP。RTSP默认可以走UDP,延迟低一些,但UDP在弱网环境下丢包严重,画面会出现花屏、马赛克,而YOLO模型对这种噪声很敏感,误检率明显上升。TCP虽然延迟略高,但保序可靠,对后续识别更友好。

3. 抽帧策略:不是每帧都识别,也不是随便丢帧

3.1 逐帧识别的成本有多高,算一笔账就清楚

如果IPC输出25fps,每帧都送进YOLO做检测,以YOLOv8s模型在RK3588上的推理速度为例,单帧推理大概30~50ms,看起来能跑到20fps以上,似乎可以“实时识别”。但别忘了,拉流、解码、预处理、后处理这些步骤都要占用CPU/NPU资源,而且售货柜往往是边缘盒子上同时跑多个路数(比如一个柜子2路摄像头,一个网关接多个柜子),逐帧识别很快就打满算力。

更关键的是:售货柜的识别业务根本不需要连续检测。用户只有在开门、取货、关门这个时间段内才需要关注画面变化,且单次取货行为一般在3~10秒内完成,25fps下就是75~250帧,但这些帧里真正包含“手伸向货架拿起商品”这个动作的,可能只有10~30帧。逐帧识别不仅浪费算力,还会因为商品被手遮挡的中间帧产生大量误检和抖动,反而增加后处理的复杂度。

3.2 三种抽帧策略的对比与选择

我实际验证过三种抽帧策略:

策略做法优点缺点
固定时间间隔每200ms或500ms取一帧简单可靠,节奏稳定动作快时可能错过关键帧
按关键帧(I帧)只在编码关键帧上做检测帧质量高,省解码关键帧间隔不固定,动作捕捉粗糙
事件触发+间隔补充检测到画面变化时提高采样率,平时低频采样兼顾算力与召回率需要额外的事件检测逻辑

我最终选择的是第三种思路,但做了一些简化和调整。核心逻辑是:

  • 平时(无人取货状态)按每2秒抽一帧做“环境基线检测”,用来判断柜内商品是否被放回错误位置;
  • 通过简单的帧差法判断画面中有明显变化(手伸入、取出商品)时,切换到密集采样模式,每150ms抽一帧;
  • 连续20帧没有显著变化,自动退回低频模式。

这里的帧差法不复杂,就是计算相邻两帧的像素差均值,超过阈值就认为画面有活动。虽然简单,但配合货柜内固定的摄像头角度非常好用。需要留意的是,货柜内灯光可能存在频闪(尤其是日光灯),会导致帧差始终偏高,我这边是先把图像转成灰度并做高斯模糊后再算帧差,可以有效滤波。

3.3 抽帧怎么做到“不影响画面”,关键在时间戳对齐和帧复用

很多人担心抽帧会漏掉“用户拿了一瓶水又放回去换了一瓶可乐”这种关键动作。这个担心有道理,但解决方案不是把帧率提上去,而是做好两件事:

第一,时间戳对齐。抽帧不是简单地“每隔几帧取一个”,而是要保证取出来的帧有时间语义,能还原动作发生的先后顺序。我在流水线里给每一帧都打上PTS(显示时间戳),后续把所有识别结果都按PTS排到时间轴上,这样即使中间跳过了很多帧,也能准确判断“哪次动作在前、哪次在后”。比如拿商品和放回商品这两个动作的先后顺序,就是判断用户最终是否购买的关键。

第二,帧复用。很多项目把“抽帧”理解成“只处理一部分帧”,但其实抽出来的帧应该分发给所有需要的地方。比如同一帧,既要做YOLO商品检测,也要做人形检测(判断用户是否在柜前),还要存入本地缓存做追溯。如果这些模块各自去拉流取帧,那就是对视频流的重复消费,不仅浪费带宽,还容易导致模块间拿到的帧不是同一时刻,数据不一致。正确做法是让拉流线程成为唯一的“帧生产者”,把抽好的帧放进一个队列,其他模块从队列订阅,实现帧复用。

我碰到过一个具体问题:抽帧后直接送模型识别,识别结果和实际画面总是有零点几秒的偏差,导致后台显示的用户操作记录和监控回放对不上。排查下来就是时间戳没对齐,模型推理本身有延迟,我却在拿推理结束时的系统时间当作事件时间。改成用帧自身的PTS作为事件时间后,这个问题就消失了——这一点在对接订单系统时尤其重要,因为订单时间要以系统时间为准,前后偏差过大用户会投诉。

4. YOLO识别:商品检测的模型选型、数据与训练要点

4.1 模型选型:YOLOv5、YOLOv8还是YOLO11

YOLO系列更新到现在的YOLO11,新版本确实在Coco数据集上有更好的表现,但本地化部署项目里,并不一定追逐最新版本。我在这个售货柜项目里综合评估下来,用的是YOLOv8s,选它的原因很实际:

  • 模型体积适中(s版本约22MB),在边缘设备推理速度可观;
  • 文档、社区生态成熟,部署资料多,团队上手快;
  • 和YOLOv5相比,Anchor-Free结构不用手工调锚框参数,对不同尺寸的商品适应更好;
  • 和YOLO11相比,v8的算力占用更低,且能满足咱们的精度要求。

如果你的售货柜识别目标很单一(比如只卖某一种规格的饮料),可以试试YOLOv8n,模型更小,速度更快;如果需要识别几十上百种SKU且外形接近(比如不同口味的同品牌饮料),建议上YOLOv8m甚至更大,并在数据集上下功夫。不是越大的模型越好,边缘盒子的算力瓶颈才是硬约束。

这里要特别提一点:售货柜识别场景,模型的召回率优先于精确率。漏检一单,用户拿了商品但系统没识别到,造成丢货损失;误检一单,用户没拿但系统识别到了,用户投诉也会很麻烦。两害相权,宁可多产生一些候选识别结果,交给后端的置信度过滤和订单逻辑去仲裁,也不能漏检。所以我在训练时会把置信度阈值调低(0.25左右),把能检出来的尽量检出来,再用业务逻辑(比如“同一商品连续N帧出现才认定有效”)去过滤误检。

4.2 商品数据集的构建与标注,决定模型精度的天花板

YOLO模型训练数据质量直接决定模型精度的上限,这一点怎么强调都不过分。售货柜商品数据集构建,我的经验是分三步走:

第一步,真实环境数据采集。让测试人员模拟真实用户动作:开门、拿起商品、转动商品、换手、放回、关门,用柜内IPC录下来,再把视频抽帧成图片。采集时要覆盖不同时间段(白天/夜晚)、不同灯光条件、商品不同摆放位置(前中后排、横放竖放)。这里有个容易被忽略的点:售货柜是带玻璃门的,玻璃反光造成的干扰必须靠真实数据来学习,纯用网上开源数据集的图片,模型上线后遇到反光大概率识别崩溃。

第二步,数据清洗与标注。采集到的图片不是都能用的,模糊帧、严重遮挡帧(手完全盖住商品)建议剔除,或者单独标注并加标签用于增强。标注工具我用的是LabelImg和X-Anylabeling,导出格式直接转YOLO格式。YOLO格式的标注文件是一个txt,每行是“类别id x_center y_center width height”,坐标值都是归一化到0~1的。如果你的数据集是KITTI等其他格式,可以使用转换脚本统一转换,网上工具很多,但注意转换时坐标系的差异——KITTI的框是kitti格式的(xmin, ymin, xmax, ymax),需要除以图片宽高做归一化,别搞混。

第三步,数据增强。售货柜场景最有价值的增强是光照变化、模糊模拟(模拟快速取货动作)、以及轻微的透视变换。我用的是Albumentations库,增强比例控制在30%左右,增强过猛会破坏商品文字和图案的语义。

我一开始图省事,直接从网上下载了一堆商品的公共图片来标注,结果模型训练出来在真实柜子里表现很差,漏检严重。后来认真复盘才明白,网上图片大多是白底商品图,商品居中、光线均匀、没有遮挡,和柜内真实场景的分布完全不同。这种“数据分布漂移”问题不是靠调模型能解决的,必须回归真实数据,哪怕脏一点、乱一点,也不能用好看的公开图凑数。

4.3 训练、验证与常见指标,以及YOLO损失函数的直觉理解

训练这块我不过度展开,主要说几个和这个项目强相关的点:

  • 输入端分辨率:我用的640×640,这是性能和精度的平衡点。虽然有些算法可以通过大分辨率(如1280)提升小目标识别效果,但售货柜商品在中景镜头下并不算小目标,640够用。
  • 训练轮数:这个项目里模型收敛得比较快,150~200轮基本足够,配合早停策略防止过拟合。
  • Batch Size:边缘设备显存有限,训练时如果显存不够,调低batchsize而不是强制用大batch,否则梯度不稳定,loss会震荡。

关于YOLO的损失函数,很多人把它当黑盒,其实理解一点直觉就够了:YOLO的损失由三部分组成——分类损失(判断框里是什么商品)、定位损失(框的位置和大小是否准确)、置信度损失(判断框里有没有目标)。训练时模型同时优化这三个目标,最终用一个加权和作为总损失。调参时有个简单规律:如果模型“检出了目标但框得不准”,定位损失权重可以适当加大;如果“经常把背景框错成商品”,置信度损失里正负样本的权重可以调整。

模型评估阶段,我主要看mAP@0.5和mAP@0.5:0.95这两个指标。售货柜场景我更看重mAP@0.5,因为IOU只要大致框住商品就算定位成功,过于严格的IOU指标在这个场景意义不大。同时还要看每一类的AP值,防止某个商品类别拖后腿。如果有个别SKU AP特别低,优先检查该类别的样本数量是不是比其他类少很多,或者外观和其他类别太接近。比如同品牌的可乐和零度可乐,罐体图案差异极小,标签稍微歪一点模型就分不清,这时要么增加这类样本的标注量,要么考虑在摄像头端加装更近距离的辅助镜头。

5. 流水线整合:RK3588上的多线程架构与业务对接

5.1 用队列解耦四个环节,避免“一卡全卡”

完整的流水线分四步:拉流、抽帧、识别、后处理。如果这四个环节串行执行,某一步慢一点整条链路就堵死。我采用的是生产者-消费者模型,每个环节通过队列连接,互不阻塞。

具体架构是:

  • 拉流线程:从RTSP读取帧,做缩放,写入“原始帧队列”;
  • 抽帧控制器:从原始帧队列取帧,按策略判断是否需要进入“待识别队列”;
  • 推理线程池:从待识别队列取帧,送入YOLO模型(NPU加速),得到检测结果,写入“结果队列”;
  • 后处理线程:从结果队列取数据,结合时序判断用户行为,触发订单上报。

Python里用queue.Queue即可,但要特别注意队列长度上限。如果生产速度大于消费速度,队列会越积越多,延迟越来越大。我给原始帧队列设置了最大长度20,待识别队列最大长度5,满了之后主动丢帧(拉流线程直接跳过这一帧继续读下一帧)。这种“丢新保旧”还是“丢旧保新”的策略,我建议丢新保旧——保留旧帧的原因是你需要基于历史帧判断动作,如果新帧挤掉旧帧,时序逻辑就会乱。

5.2 端到端延迟测试,用数据说话

流水线整合完成后,我用GStreamer工具和自研脚本做了端到端延迟测试。方法是:在IPC旁边放置一个毫秒级计时器(手机秒表即可),同时拍摄IPC画面和算法识别输出画面,对比两边时间差。

测试结果是:从IPC生成图像到YOLO识别结果输出的端到端延迟,平均在180ms左右,峰值不超过300ms。其中拉流缓冲占40ms,抽帧等待占50ms(密集采样模式下是150ms的采样间隔,平均等待75ms),模型推理占50ms,后处理和网络上报占40ms。这个延迟对于售货柜的订单场景完全可接受——用户在关门后1秒内收到扣款通知,体验上没问题。

如果你追求更低的延迟,几个优化方向:一是缩短抽帧间隔,从150ms降到100ms,但算力消耗上升;二是使用模型推理的批处理,把多个帧合并成一个batch同时推理,在NPU上效率更高;三是把后处理逻辑中的状态机判断做简化,减少不必要的等待。

5.3 识别结果如何变成一笔真实的订单

识别出商品后,最后一步是和业务系统对接。售货柜的典型交互流程是:用户扫码开门 -> 取货 -> 关门 -> 系统根据识别结果自动扣款。系统判断的核心逻辑是“用户最终带走了什么商品”,也就是取走和放回的商品差异。

我的实现是维护一个“当前柜内商品状态表”,初始状态在每次关门后更新。在用户开门期间,每一帧识别出商品后,都会和状态表做比对,更新“候选取走商品”和“候选放回商品”两个集合。关门事件触发后,对候选集合做最终仲裁:设定一个置信度阈值,只有在一段时间内连续被识别到多次的商品才计入最终结果;单次偶发识别到的基本视为误检,丢弃。

这里还有一个关键细节:用户在决定要不要买某个商品时,可能会拿起又放下,甚至换一个口味,状态机必须能正确处理这种“拿起-放下-换一个”的序列。我的状态机将同一个商品位上的连续识别结果串起来,识别到商品A,中止识别(手遮挡),再识别到商品B,则判定为A被放回、B被取走。这类逻辑建议在上线前用大量模拟动作视频做回归测试,我当时整理了一套包含50种操作序列的测试集,每次改完逻辑都全量跑一遍。

6. 上线后踩到的坑,以及对应的排查链路

6.1 画面间歇性卡顿,IPC和算法两端都没报错

上线一周后,有柜子反馈识别经常超时。查IPC后台,视频流正常;查算法日志,拉流线程没有断线重连记录;查NPU利用率,也不高。看起来一切都正常,但用户实际体感就是“摄像头卡了”。

后来我把问题定位到拉流的缓冲参数上。FFmpeg默认会为RTSP流维护一个内部缓冲,当网络抖动时,解码出来的帧会积压在缓冲里,导致算法端拿到的画面比真实时间滞后,而且这个滞后是动态累积的,表现出来就是“画面卡顿”。解决的思路是主动清空缓冲:在FFmpeg命令里设置-fflags nobuffer来关闭缓冲,或者缩短缓冲区时长。一个更实用的技巧是每隔一段时间主动丢弃一定数量帧,强制让解码端追上实时画面。

这个坑之所以难排查,是因为它既不是断流也不是设备故障,而是“延迟逐渐累积”的软性问题,只有用端到端延迟监测才能发现。我在流水线里加了一个每30秒上报一次“当前帧时间戳与系统时间差”的监控指标,超过500ms就告警,从根上杜绝了这个问题。

6.2 夜间补光灯导致的反光和曝光过度,怎么处理

售货柜夜间会开补光灯(通常是柜内的LED灯带),但灯光从某个角度照射到玻璃门上,会在门上映出大面积反光,YOLO的检出率下降30%以上。我一开始的应对思路是调训练数据,增加大量“带反光”的样本,效果有一定改善,但反光位置随用户开门的动作变化,样本覆盖不全。

实际上更有效的方案是在算法前处理阶段做图像增强:对高光区域做局部直方图均衡化,把过曝区域压暗,提升低对比度区域的细节。我在抽帧后、送模型前加了这样一段处理:

import cv2 def preprocess_for_yolo(frame): # 分离亮通道,做自适应增强 lab = cv2.cvtColor(frame, cv2.COLOR_BGR2LAB) l_channel, a_channel, b_channel = cv2.split(lab) clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(8, 8)) l_channel = clahe.apply(l_channel) enhanced = cv2.merge((l_channel, a_channel, b_channel)) enhanced = cv2.cvtColor(enhanced, cv2.COLOR_LAB2BGR) return enhanced

这个CLAHE增强能让反光区域的商品轮廓更清晰,实测召回率比用原始帧直接识别提升10个百分点。但要注意,增强不是万能的,如果画面过曝到商品图案完全消失在白色区域里,什么算法都救不回来。所以摄像头安装时,尽量调整补光灯的角度和亮度,使玻璃门上的反光带偏离商品区域,这是治本的方法。算法只是兜底。

6.3 YOLO识别结果的抖动问题,最终靠后处理解决

模型单帧识别的结果天然有抖动,同一帧里的同一个商品,这一帧检出置信度0.9,下一帧就变成0.3,或者框的大小、位置在相邻帧之间轻微跳动。如果直接把单帧识别结果上报给业务系统,会导致订单出现“用户明明只拿了一瓶水,系统却认为他拿了两瓶”的重复识别问题。

我的解法是引入“基于时间的滑动窗口去重”。具体逻辑是:对每个商品类别,维护一个最近1秒内的检测记录列表;每当出现新的检测框,就计算它与已有记录的IOU(交并比),如果IOU超过0.5且类别相同,则认为是同一个目标,更新该目标的置信度和最后出现时间;如果IOU低于阈值,新建一个目标记录。只有当一个目标连续出现超过3帧(窗口内)且置信度均值超过阈值,才认定是有效检测。

这个去重逻辑笔直地解决了两个问题:一是单帧误检被平滑掉了,二是同一个商品多次出现的重复上报被合并了。如果你在做类似项目,这套滑动窗口思路可以直接抄,注意根据你的抽帧间隔调整窗口大小和“连续出现帧数”这两个参数,我这里用的是密集采样150ms间隔下的参数,如果你用的是500ms间隔,连续3帧就意味着要1.5秒,反应会偏慢,需要相应调整。

7. 写在最后:这套流水线的扩展可能

回看这个售货柜项目,最核心的收获是:算法精度只是一部分,拉流、抽帧、后处理、工程化这些“脏活累活”才是决定系统能不能稳定跑起来的生死线。如果把识别系统比作一座房子,YOLO模型是客厅,看起来最光鲜;但拉流是地基,抽帧是管道,后处理是电路,任何一个环节出问题,房子都住不了人。

如果后续要拓展,我建议在这几个方向上发力。第一,使用具身智能或大语言模型做柜内异常行为分析,比如判断用户是否故意遮挡摄像头;第二,做多柜联动,一个边缘盒子同时管理多个柜子的视频流,用Dify这类知识库流水线来统一沉淀不同柜型的识别经验;第三,把YOLO换成分割模型(实例分割),直接输出商品的轮廓面积,用来估计商品剩余量,这在做自动补货预测时很有用。事实上,我现在已经在一个改造项目里尝试用双模型并行——YOLO负责快速检测,SAM2负责难例分割精校——效果还在验证中,但方向是确定的:售货柜的视觉能力会越来越强,流水线本身的设计模式不会变。

最后说一个所有做视觉售货柜项目的人都会懂的小技巧:给每台柜子配上独立的“设备画像”参数,里面记录摄像头安装位置、补光灯亮度、柜内商品布局图、RTSP地址、拉流参数等,交付新柜子时直接灌入这套参数,就能把别处跑通的识别模型低成本迁移过去。这个思路帮我省掉了很多现场调试的时间,你们可以试试。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询