嵌入式AI这几年不算新鲜词了,工业质检、农业巡检、安防监控都在往边缘端搬模型。但我做完这套落石检测系统之后,最大的感受是:落石检测和前面那些场景完全是两回事。它不在恒温车间里,不在有稳定网络的园区里,它工作在野外山区,面对的是全天候光照变化、时不时的大雾暴雨、有限供电,以及"漏一次就可能出大事"的后果。这篇文章把我从需求分析到现场调试验收的完整过程记录下来,包括硬件选型时的参数计算、数据集构建的细节、模型量化和推理优化的坑,以及现场试运行阶段踩过的一堆问题,希望能给正在做类似边缘视觉项目的朋友一些参考。
这套系统解决的核心问题很直接:在公路边坡、隧道洞口、矿山采场这类场景,用摄像头实时盯着崖面,一旦检测到石块松动脱落或正在滚落,系统要在几百毫秒内完成识别并触发声光报警和平台推送。为什么必须把AI推理放到前端设备上,而不是把视频传回机房分析?一句话:山区网络条件差,落石从松动到滚落往往只有几秒到几十秒的窗口期,本地推理才是对"实时"的真正保障。下面我从头拆解。
1. 落石检测为什么必须上嵌入式AI
1.1 落石检测的难点在哪
落石检测的目标对象是岩石,这和行人检测、车牌识别有本质区别。行人、车辆有相对固定的外形和比例,落石没有。同样一块石头,晴天拍出来是灰白色,雨后变成深褐色;50米外看就是一个小黑点,两米外看却是一块巨石。更麻烦的是背景本身就是山体崖壁,落石和背景都是石头,颜色、纹理高度相似。这个任务说白了是在"同类中找异类",靠传统图像差分或背景建模根本做不了——岩壁本身天天在变化,光照一变整面山都在"动"。
另一个难点是检测窗口期极短。落石从出现松动、裂缝扩展,到石块脱离母岩开始滚动,快的话只有几秒。等石头真正滚到路面上,留给系统反应的时间所剩无几。所以系统必须做到"边采集边推理",不能等视频回传、等待服务器出结果这一套。
1.2 边缘端 vs 云端:这不是选择题
我在项目初期也评估过"摄像头+云端识别"的方案,实际梳理下来发现这条路线在野外根本走不通。拿山区公路边坡来说,布置点往往在隧道口、桥墩旁、陡坡路段,要么没有有线网络,要么4G信号时好时坏。按1080P、10帧每秒计算,一路视频的码流在4~8Mbps,一旦信号波动,画面直接卡顿,识别延迟根本没法保证。
云端方案还有一笔账要算:10个监测点就是10路视频同时回传,一年的流量费、服务器带宽费叠加起来,远超一台边缘设备的成本。更关键的是可靠性——真到了落石发生的那一刻,运营商基站恰好拥塞,视频传不出去,云端再强的模型也没用。算完这笔账,方案很明确:把模型部署在前端边缘设备上,本地完成检测和告警,云端只做数据展示和远程管理。边缘端和云端的关系不是谁替代谁,而是各管一段:边缘端管实时告警,云端管事后存档和统计分析。
1.3 系统总体架构与数据流
这套系统的整体架构分为采集、推理、告警、通信四层。采集层是网络摄像机,固定在崖面对面的立杆或桥墩上,通过网线或光纤接到边缘计算盒子。推理层是核心,一个巴掌大的ARM架构边缘AI盒子,内置NPU(神经网络处理器),跑着量化后的目标检测模型,同时运行一个多线程推理服务。告警层包括声光报警器、LED提示屏,通过继电器或者RS485联动。通信层用4G路由器把检测结果、抓拍图片、设备状态上传到云平台,同时接收远程配置指令。
数据流是单向的:摄像头视频流到达盒子后,先做抽帧和解码,送入推理队列;模型输出检测框,经过置信度过滤、尺寸过滤、ROI区域判断之后,进入防抖逻辑;连续多帧确认命中才触发告警,同时把告警时刻的图片和视频片段保存到本地,并推送到云平台。整个流程里,视频流不会离开前端设备,这是它和传统方案的又一个关键区别。
2. 硬件选型与技术参数测算
2.1 镜头焦距与像素密度的计算
硬件选型最容易犯的错误是随便买个大变焦球机装上就完事。镜头焦距直接决定你能看清多远的落石,这里必须做定量计算。
目标场景是某山区公路边坡,崖面宽度约120米,拟安装点选在道路对侧,距离崖面约80米。传感器用常见的1/2.7英寸CMOS,感光面宽度约6.18毫米。计算镜头焦距的公式是:
[ f = \frac{w_{sensor} \times D}{W_{scene}} ]
代入数据:f = 6.18 × 80 / 120 ≈ 4.1毫米。理论上选4mm镜头就能覆盖整个崖面。但关键问题来了:4mm镜头的视场角太大,像素被摊薄了。200万像素摄像机(1920×1080)在覆盖120米宽时,像素密度是1920/120 = 16像素/米。一个30厘米的落石在画面上只有不到5个像素宽。这个尺度下,再好的模型也识别不了——目标检测通常要求目标至少占10~15个像素,否则特征完全丢失。
所以必须换长焦镜头,用画面宽度换像素密度。换成12mm镜头后,覆盖宽度变为 6.18 × 80 / 12 ≈ 41米,像素密度提升到1920/41.2 ≈ 46.6像素/米,30厘米的落石能占到约14个像素,这才达到可靠检测的门槛。代价是一个摄像头只能覆盖41米宽的崖面,120米宽度需要拆成3个点覆盖。最终方案调整为:单镜头焦距12mm,配置两套摄像机分别监视左右两段崖面,中间留少量重叠区域。
这个计算过程给所有类似的视觉监测项目一个通用启示:不要先选摄像机再想能看清什么,要先定义"最小检测目标"和"最远检测距离",反推镜头焦距和像素密度,再决定要装几台。
2.2 边缘算力平台怎么选
算力选型同样需要定量估算。检测模型我选的是YOLOv8n级别,输入分辨率640×640,浮点运算量大约8.7 GFLOPs。目前主流的边缘AI芯片普遍带NPU,算力在2~6 TOPS之间。注意TOPS是万亿次/秒的INT8整数运算,而8.7 GFLOPs是FP32浮点运算。模型经过INT8量化后,运算量大体可以视为不变,但单位从浮点换成了整数。
理论推理时间是 8.7×10^9 / (6×10^12) ≈ 1.45毫秒。但这只是纯计算时间的理想值,实际还要算上图像预处理、数据搬运、NPU访存带宽、后处理解码这些开销,真实推理耗时通常在25~35毫秒。也就是说,单帧推理35毫秒,配上10帧每秒的抽帧速率,实时性完全够用,NPU占用率在40~60%左右,还留有余量跑第二路模型或者做图像增强。
选平台时我建议关注三个硬指标:NPU的实际可用算力(而不是宣传峰值)、内存带宽(影响大输入分辨率下的实际速度)、散热设计。很多开发板标称6 TOPS,跑起来温度一高就降频,实际性能掉一半。我最终选的是被动散热的全金属外壳盒子,整机功耗控制在15W以内,工业级宽温设计,-20℃到60℃都能稳定运行。
2.3 供电与接口设计
野外设备供电是个容易被低估的问题。整机功耗15W(摄像头PoE供电加盒子本体),24小时就是360Wh。如果现场没有市电,要配太阳能加蓄电池。按山区日均有效日照4小时、系统效率0.7估算,太阳能板功率需要 360 / (4×0.7) ≈ 129W,工程上取1.2倍冗余,配150W组件。蓄电池按连续阴雨3天、放电深度80%设计,需要 360×3 / 0.8 = 1350Wh,12V系统对应约112Ah,取120Ah。
接口层面,必须留足余量:摄像头用PoE供电走一根网线解决数据和供电,盒子预留RS485串口用于联动声光报警器,预留两路继电器输出用于控制LED提示屏和道闸,4G路由器单独供电。安装时所有户外线缆必须做防水接头和浪涌保护器——山区雷雨天气多,浪涌打坏设备是现场最常见的故障之一。
3. 数据集准备与模型训练
3.1 数据从哪来,怎么标注
落石检测没有公开的成熟数据集可用,这是项目启动时最大的阻力。我做数据主要靠三条路。第一是现场实测采集,在模拟场地用绳索从崖壁上方放下不同尺寸的石头,记录下落过程,覆盖不同光线和天气;第二是从网络公开视频中截取崩塌、落石灾害的片段,注意筛选分辨率合格、角度接近的素材;第三是合成数据,把岩石贴图叠加到不同背景上,叠加运动模糊模拟下落状态。
数据总量控制在8000张左右,其中正样本(有明显落石或松动岩块)约6000张,负样本约2000张。负样本很重要,它决定了系统会不会乱报。负样本里必须包含飞鸟、落叶、昆虫、雨水、光影变化、施工人员、车辆通行等所有可能在画面中出现但又不是落石的东西。
标注类别我设计了两个目标:falling_rock(正在坠落的石块)和 loose_rock(松动但未脱落的岩块)。后者看似不必要,实际上非常有用——很多事故的预警窗口来自"松动—脱落"之间的阶段,识别出异常凸出的岩块能提前给出风险提示。标注工具用常见的LabelImg或X-AnyLabeling,标注规范里特别要求:落石边界框必须贴合石块轮廓,不能为了省事圈一大块背景,否则会引入大量背景特征污染训练数据。
3.2 数据增强策略
野外场景的光照变化是模型最大的敌人。上午顺光、中午顶光、傍晚逆光、夜间补光,同一条崖面的成像差异巨大。数据增强里我重点做四类操作:
- 颜色与亮度增强:随机调整gamma值、对比度、饱和度,模拟日出日落和阴天。
- 天气模拟:用程序绘制半透明直线叠加模拟雨丝,用高斯模糊模拟雾气,用随机噪声块模拟画面噪点。
- 尺度扰动:把目标随机缩放到0.5~2.0倍,模拟不同距离的落石。
- Mosaic与MixUp:把多张图拼接或叠加混合,提升模型对遮挡、复杂背景的鲁棒性。
这里有一个容易被忽略的点:雨丝和雾气的合成需要控制在合理幅度。增强太狠会让模型学到"模糊即落石"的错误关联,导致夜间下雨时疯狂误报。我的经验是增强强度适中,同时把增强后的样本拿去做人工抽检,发现不真实的样本及时剔除。
3.3 模型训练与评价指标
基础模型选了YOLOv8n,输入640×640,主干是轻量级结构,适合边缘部署。训练时用预训练权重做迁移学习,初始学习率0.01,batch size 16,训练100个epoch,学习率用余弦退火衰减,早停机制观察验证集loss连续15个epoch不降就停。训练集、验证集、测试集按7:2:1划分,划分时保证同一段视频的连续帧不跨集——否则帧之间的高度相似性会导致验证指标虚高,这个坑我踩过。
评价指标上,行业通用的是mAP,但对落石检测来说,mAP只能做参考,真正要盯的是召回率(Recall)。漏报一个落石的后果远大于误报十次。我设定了一个硬性指标:在测试集上,对场景中出现时间超过0.5秒、尺寸大于15像素的落石,召回率不低于95%。如果召回不达标,优先调整的不是模型结构,而是阈值、输入分辨率、锚框设计。实测下来,把输入分辨率从640提到768,对小目标召回率能提升4~6个百分点,但推理速度会慢约30%,这个取舍要结合算力余量来定。
4. 模型压缩、转换与推理优化
4.1 为什么要做INT8量化
训练好的模型是FP32浮点精度,直接部署到边缘设备上能跑,但速度不理想。边缘盒子的NPU对FP32支持有限,真正的高算力来自INT8整数运算。所以量产部署前必须做INT8量化。
量化原理可以这样理解:FP32相当于用一把精确到毫米的尺子量东西,INT8相当于换成一把刻度到厘米的尺子。大多数情况下厘米精度够用,但尺子换小了,测量速度大幅提升。具体做法是把权重和激活值从32位浮点映射到8位整数,通常用校准数据集统计激活值的分布范围,确定缩放系数。量化后模型体积减小到原来的约1/4,推理速度能提升3~5倍,精度损失通常控制在1~3个百分点以内。
这里有个经验:量化校准推荐用200~500张覆盖各光照条件的真实场景图,不要用训练集原图。训练集图像的分布和真实场景有偏差,校准出来的缩放系数会失真。我第一版量化就是用训练集做的,结果部署后晴天表现正常,黄昏时段误报率突然飙升,最后排查发现就是校准集分布太单一,模型对低照度特征的量化尺度不合适。
4.2 模型转换工具链的坑
现在主流边缘AI芯片厂商都提供模型转换工具链,大致流程都是:先把PyTorch模型导出为ONNX格式,再做算子映射和INT8量化,最终生成设备专用的推理模型文件。这个流程看起来简单,实际操作中坑很多。
最典型的是算子兼容性。YOLOv8里有些自定义算子(比如特定形式的SiLU激活、上采样方式)在NPU上不支持或效率极低。解决办法有两个:一是换结构,把不兼容的模块替换为原生支持的等价实现;二是走工具链的算子融合优化,有些工具链能自动把卷积+BN+激活融合成一个算子。这些都要在转换时逐层检查日志,确认没有算子落到CPU回退执行——一旦有回退,那个算子的推理时间会呈数量级增加。
转换后必须做精度验证:把同一批测试图分别用原始FP32模型和量化后模型推理,对比输出框的位置偏差和置信度偏差。我的验证标准是:量化后模型对同一目标的置信度下降不超过0.1,检测框IoU与原始模型相比不低于0.85。如果超过这个范围,就调整量化校准策略,或者对特定层做"跳过量化"处理,保留FP32精度——代价是该层速度慢,但只针对个别敏感层,整体影响可控。
4.3 推理耗时与资源实测
部署完成后,我记录了不同版本模型在边缘盒子上的实际推理数据,整理如下:
| 模型版本 | 输入分辨率 | 平均推理耗时 | NPU占用率 | 内存占用 | 精度(mAP@0.5) |
|---|---|---|---|---|---|
| FP32原始模型 | 640×640 | 约120ms | CPU运行 | 512MB | 0.87 |
| INT8量化模型 | 640×640 | 约28ms | 45% | 128MB | 0.85 |
| INT8量化模型 | 768×768 | 约45ms | 65% | 180MB | 0.86 |
从数据能看到,INT8量化后的推理速度提升非常明显。我最终部署选的是640分辨率加INT8的组合,理由是28毫秒的推理耗时对比10帧每秒的抽帧间隔(100毫秒)有充裕余量,可以再做一帧去重和一帧防抖的预处理逻辑,整体告警延迟控制在150毫秒以内。
5. 部署流程与现场联调
5.1 多线程推理流水线设计
边缘端的推理程序不能是简单的"取帧—推理—输出"单线程循环。摄像头帧率、模型推理速度、告警IO的响应速度各不相同,串行处理会导致帧数白白丢失。我采用的是三线程加环形缓冲区的架构:
采集线程负责从RTSP流解码取帧,抽帧间隔100毫秒,图像先缩放到640×640,转成NPU要求的输入格式,写入环形缓冲区。推理线程从缓冲区取帧,送入NPU推理,对输出做后处理:解析检测框、过滤低置信度目标、按预设ROI区域和最小尺寸阈值筛选,结果写入告警队列。告警线程负责消费告警队列,执行连续帧确认、去重、联动IO、保存图片、上报平台。三个线程之间通过无锁队列或加锁队列通信,环形缓冲区深度设为8帧,满了丢最旧的帧,保证推理线程永远处理最新画面而不是积压的旧帧。
这个设计解决了实际部署中一个很现实的问题:网络抖动导致视频流卡顿几秒,恢复后旧帧大量涌入。如果不做丢帧策略,系统会花好几秒处理历史积压帧,等处理完,当下的新落石已经错过了。
5.2 告警联动与防抖逻辑
单帧检测到落石就立刻报警吗?不行。我测试时发现,夜间飞虫、镜头前的雨滴、偶尔飘过的树叶,都可能让模型输出一个高置信度检测框。直接报警会把现场值班人员折腾疯。
防抖逻辑很简单:同一ROI区域内,连续3帧(间隔100毫秒)都检测到目标,且检测框中心点位置偏差小于目标宽度的50%,才判定为有效告警。这个逻辑同时过滤了随机误报和快速移动的干扰物(飞虫速度太快,连续帧位置偏差大)。确认后触发声光报警器,同时抓拍当前帧和前后各5帧存入本地存储,通过4G网络把告警图片和视频片段推送到云平台。
现场联调时,我们做了专门的真实验证:从崖壁上方用绳索系住一块约40厘米的石块,模拟松动后自然下坠,反复测试了20次。系统全部正确检出,告警延迟平均约180毫秒(3帧确认时间加IO响应)。同时做了10组对照测试,向崖壁扔小石子、放飞无人机靠近监测区域,系统均未触发误报。
5.3 野外防护与现场安装
野外设备的可靠性,一半靠软件,一半靠物理防护。安装时有几个细节必须把关:摄像头和盒子之间用防水航空接头,所有网线、电源线进入设备箱处加防水格兰头;设备箱采用IP65防护等级,箱内加装温控风扇和加热器——白天太阳直晒箱内温度可达70℃,夜里山区低温又会结露,没有温控措施设备寿命会大打折扣。
镜头起雾是另一个防不胜防的问题。雨季空气湿度大,镜头玻璃内外温差导致结雾,画面模糊后模型性能直线下降。常规做法是在摄像头护罩内加干燥剂,有条件的话选带自动加热功能的护罩。我在项目里做了一道软件兜底:定时检测画面对比度,若连续10分钟低于阈值且通过云台命令无法恢复,就自动上报告警"视频质量异常",提醒维护人员到场处理。
避雷措施不能省。立杆顶端装避雷针,设备箱内装电源浪涌保护器和网络信号浪涌保护器,接地电阻实测小于4欧姆。头一年雷雨季过后检查,三套设备里的浪涌保护器有两个已经击穿,但后端设备全部完好,这钱花得值。
6. 常见问题与排查实录
6.1 误报太多怎么办
试运行期间误报是最大的舆情压力。我把收集到的误报样本分成了几类,排查思路也清晰了:
| 误报类型 | 典型表现 | 解决办法 |
|---|---|---|
| 飞鸟/大型昆虫 | 快速穿过区域,单帧或两帧出现 | 提高连续帧确认数,增加目标最小尺寸过滤 |
| 光影变化 | 早晚低角度阳光在崖面扫过 | 在ROI区域管理中排除阴影变化区 |
| 雨滴/镜头水痕 | 画面前景出现模糊半透明块 | 增加前景距离判断,检测框贴近画面边缘时忽略 |
| 施工机械/车辆 | 挖掘机、卡车在ROI内作业 | 增加静止目标过滤逻辑,长时静止目标不触发 |
最实用的排查工具是把所有告警抓拍图按月归档,每周复盘一次,逐步把误报类别做减法。模型层面不用动,主要通过过滤规则和ROI管理就能解决大部分误报。
6.2 夜间漏检怎么处理
夜间是漏检高发时段,原因不复杂:可见光摄像机在低照度下噪点严重,模型本来就训练在偏明亮的图像上,夜间性能必然下降。我的处理方案是加装850nm红外补光灯,配合摄像机的红外模式。实测下来,在补光范围内,夜间检测召回率能恢复到白天的90%以上。
这里有个细节:红外补光会把彩色画面变成黑白,景物的纹理细节照样保留,对落石检测影响不大。反而比可见光补光更稳——可见光补光在潮湿天气会形成光晕和反射,造成大量误报。另外,夜间模型输出的置信度普遍偏低约0.1~0.2,需要单独设置夜间阈值,比日间阈值低一档,避免漏检。
6.3 设备死机与掉线
边缘设备在野外最怕两件事:死机和掉线。死机多半是长时间运行后的内存泄漏,掉线通常是网络模块异常或供电波动。我的应对措施有三层:程序层面,推理进程每24小时自动重启一次,避开午夜低流量时段;系统层面,启动硬件看门狗,程序心跳异常时自动冷重启;网络层面,4G模块定时拨号检测,丢包率超阈值就触发软重启。这三层配套下来,设备月均离线时间从最初的十几个小时降到了半小时以内。
另外,日志系统要限制大小,按天滚动覆盖,否则存储卡写满后程序会无征兆崩溃。这个坑我调试了一整天才定位,最后发现是日志文件把32G存储卡写满了,排查过程颇为曲折。
落石检测这个项目做下来,我最大的体会是:这类野外视觉监测系统的难点根本不在算法本身,而在算法之外的工程细节——焦距算得准不准、供电冗余够不够、量化的校准集选得对不对、防抖逻辑合不合理,这些才是决定系统能不能真正稳定运行的关键。模型精度从0.87降到0.85,大多数场景完全无感,但设备断一次电、网络断一次线,代价是实打实的。
最后再分享一个经验:现场联调阶段一定不要只挑晴天测试。选一个雨天、一个雾天、一个夜间,分别跑完整的告警链路。这三个场景跑通了,系统才算真正具备实用条件。如果条件允许,再模拟一次真实验收——找一块大小接近设计指标的石头,从崖壁固定位置释放,观察系统从发现到告警的完整响应时间。这一步做完,你对这套系统的信任程度会完全不一样。