资讯详情

资讯详情

无人机街道巡检占道经营识别实战:数据、训练与部署全解

做无人机城市巡检这个方向快两年了如果问我最难啃的骨头是什么我的答案不是飞控、不是航线规划而是让模型在几十米高的空中拍到的画面里分清哪些是人行道上的正常停留哪些是占道经营。这个场景看着简单实际做起来才发现模型谁都能跑通真正能拉开差距的是数据。这一期把“无人机街道巡检占道经营识别”这套东西从数据采集、标注、训练、部署到踩坑完整拆一遍项目基于YOLO系列目标检测框架应用场景是智慧城市治理中的街道商贩违规摆摊识别适合正在做城市治理算法、无人机巡检应用或者想入行目标检测实战的朋友参考。1. 为什么巡检项目里最难的是“识别”而不是“飞行”1.1 无人机巡检的整条链路最后都压给识别一个完整的无人机街道巡检项目链路大概是无人机沿着规划好的航线飞行机载相机以俯视角度拍摄街道视频视频流回传后抽帧再由目标检测模型在每一帧上找“摊贩”“推车”“帐篷”之类的目标最后把检测结果转换成城市管理事件推送给街道负责人。听起来很完整但真正做下来才发现飞控、航线、图传这些环节都是成熟设备能解决的你只需要把参数调好就行。唯独“识别”这一步没有任何现成模型可以直接拿来用几乎必须要自己造数据集、调算法、反复迭代。落地时最先遇到的尴尬是业务方拿到第一版检测结果后第一反应不是夸你检测得准而是问“为什么这里有个摊位没出来”“为什么树荫底下会框出一个摊位”。这些问题全部集中在识别环节。所以这个项目前期大部分精力不是在飞无人机而是在整理数据、调模型、看误检样本。我们后来统计过从项目启动到能达到常规巡检要求数据整理和标注的时间占了总开发时间六成以上。1.2 占道经营目标在航拍画面里的视觉难点占道经营识别不是普通的目标检测它有几个非常具体的特点导致难度比一般物体检测更高。第一是目标尺度小。在30到60米的飞行高度下一个两米宽的摊位在1080p画面里往往只有三四十像素属于典型的小目标一个只有轮胎和顶棚外露的三轮车可能只剩十几个像素人工看都得拿放大镜。第二是背景极乱街道上行人、电动车、绿化树、垃圾桶、施工围挡都会出现在画面里很多物体和摊贩的颜色、外形很接近。第三是遮挡严重摊贩经常被行人挡住货物堆得很高多个摊位挨在一起有的只有半截被拍到。第四是光照变化剧烈晴天的阳光会把摊位压成一片黑影阴天又缺少对比度傍晚的逆光几乎让所有物体变成剪影。这些视觉难点单独拿出来任何一个都够模型喝一壶的但它们经常同时出现在同一张图里。这就是为什么我们不能用一个通用预训练模型直接做推理。通用模型见过的是地面的、正视角的“人”“车”“货物”但航拍俯视角下的摊位、三轮车、蓝色帐篷在它眼里已经完全是另一类东西了。1.3 为什么不能靠规则和传统CV方法早期我们也试过不用深度学习靠颜色分割加形态学判断。比如通过颜色识别蓝色遮阳棚、通过边缘检测找矩形摊位看起来思路很直接但真实场景完全不行蓝棚子可能是废品回收点的遮盖物矩形区域可能是地砖拼花阴影边缘更是能造出无数个伪目标。再加上无人机每帧画面的旋转角度、尺度都不一样固定阈值很难泛化。所以最后只能走目标检测路线。目标检测里的YOLO系列又因为端到端速度快的优势最适合巡检场景。后面我们做的所有数据、所有模型都是围绕YOLO这个框架展开的。但在讲训练之前必须先说数据集因为在这样的任务里数据质量几乎决定了最终效果的天花板。其实在决定用YOLO之前我们花了一周时间做对照测试拿通用模型直接跑航拍图结果惨不忍睹。后来才彻底明白不是模型不够强是训练分布完全不匹配航拍俯视的“摊位长相”和通用数据集里的物体是两回事。2. 占道经营数据集的采集与制作比模型更吃功夫2.1 先跟业务方敲定“占道经营”的定义做数据集之前最重要的一件事不是打开标注软件而是把“占道经营”在项目里的定义掰开揉碎。不同城市、不同街道对占道经营的界定差别很大。有的地方把摊贩推到店铺门外台阶上就算违规有的地方只在机动车道上才算有的店铺外摆桌椅是允许的有的则严格禁止。我们项目里经过跟管理方反复确认最终把目标类别定成三个流动商贩推车、固定摊位或帐篷、店外堆物。流动商贩推车包括三轮车、手推车、改装小货车这类可移动摊点固定摊位或帐篷包括遮阳伞下的小摊、简易棚、支架上搭起来的货架店外堆物是店铺界限外的货物、桌椅、展示架。分了这三个类不是想追求分类精细而是这几个类的处理方式在业务上不同推车可能是无证游商固定摊位可能是合规早市店外堆物往往只需要提示整改。而且类别数量控制得越少类别之间的视觉差异越大模型越好学。我们也踩过把类别拆得太细的坑比如单独分“三轮车卖水果”“三轮车卖小吃”“四轮车卖饮品”结果模型在夜间和阴天完全分不清后来全部合并成“流动商贩推车”。2.2 采集航线、飞行高度与时空覆盖数据不能随便找网图拼必须和实际巡检的拍摄条件保持一致。我们主要在自有的采集区域里用无人机采集同时也从已有的街道摄像头历史视频里抽帧补充一些低视角画面。采集时规定了几个硬性条件飞行高度20到80米云台角度在-45度到-90度之间也就是要拍到明显的俯视感正上方拍出来的物体形状会非常抽象时段覆盖早晨摊位进场、上午营业高峰、午后人流稀疏、傍晚下班高峰另外专门采集了一部分夜间灯光条件下的画面天气上尽量覆盖晴天、阴天、小雨后路面反光的情况街道类型也做了区分商业步行街、主干道、学校周边、农贸市场周边都各采一批。在实际采集时我们一般规划航线沿着街道中心线飞行相机每隔1到2秒自动拍摄一帧。需要注意的是如果一段街上摊位很密集无人机飞太高会把一堆摊点挤在一起飞太低又覆盖不了全街所以我们在同一条街会采用两个高度各飞一遍40米高度用于常规识别20米高度专门补采小目标和遮挡样本。这样数据分布会比较健康。另外只要是航拍采集都要注意避开不适宜拍摄的区域对车牌和人脸也做了脱敏处理避免后期合规方面的麻烦。2.3 标注细节遮挡、小目标、边缘截断标注工具我们用的是开源标注工具支持自动保存成YOLO格式就可以重点是别漏标。针对航拍占道经营的数据我总结了几条标注规范。第一目标只要在画面里可见哪怕只有一小部分也要把整体框出来因为识别目标本身是“摊位”实体算法需要学会从局部推断整体。第二多个摊位挨在一起的时候允许框之间有部分重叠但每个框至少要包含一半以上的核心区域不要把两个摊位合成一个大框。第三紧贴画面边缘的目标不能因为不完整就放弃也要标注否则模型在画面边缘的召回率会异常低。第四小尺寸目标比如只有15像素的三轮车如果人眼能确认就一定要标不能因为看不清就跳过真正需要跳过的是那种连人也无法判断的像素块否则会给模型带去标注噪声。标注完直接导出成YOLO格式的txt文件每行是“class x_center y_center width height”坐标都归一化到0到1之间。类别列表固定写在classes.txt里。团队规定每个人标注后必须有另一个人抽检10%重点检查遮挡和边缘目标因为这两个位置最容易产生不一致。2.4 数据增强光调通用增强不够还要模拟航拍变化数据增强是很多人的误解点以为开了模型官方默认的增强就完事了。但航拍项目的增强需要注意两个方向。一是通用增强要控制力度mosaic、mixup、随机亮度对比度、HSV扰动都可以开但要把旋转角度限制在±30度以内因为无人机虽然会转动但不会出现车底朝天的角度上下翻转绝对不能开路灯杆和店面招牌“上下颠倒”后模型很容易学会错误的方向特征。二是要有针对飞行高度的增强比如随机缩放加随机裁剪模拟不同高度下目标尺寸的变化还可以做随机透视变换模拟云台角度和无人机偏航带来的形变。项目里有一项特别有效的增强是把原始大图随机切成不同比例的局部图再resize到训练尺寸这既增加了样本数量又让模型看到更多“局部放大”的细节。另外因为航拍图像里大量存在阳光阴影我们在颜色增强里特意提高了亮度扰动范围还定期加入一点高斯噪声模拟阴天昏暗和夜间噪点避免模型对某个亮度区间过度敏感。增强不是越多越好加得太猛会让模型学到扭曲的图形反而损害真实场景的泛化。2.5 数据量、划分比例与验证集设计关于数据量我可以给一个参考项目第一版跑了大概8000张图像、3.5万个标注框能得到可用的效果但要在不同街道泛化至少再扩到2万张其中负样本约3000张。这个量级对无人机巡检任务来说并不过分因为航拍画面里目标通常不多一张图可能只有几个框甚至没有框所以需要大量“干净”背景来告诉模型“这里没有摊位”。划分比例我们固定用train:val:test8:1:1但有一个关键原则按“采集路段”而不是按“视频帧”划分。如果我们把同一条街连续抽样出的前后帧一部分放训练集、一部分放验证集模型等于提前看到了答案验证指标看起来很高一到新街道就崩。所以切分时把同一段航拍视频的所有帧放进同一个集合不同路段之间再随机划分这样验证集才能反映真实的跨街道泛化能力。同时验证集里要刻意混入一些难例和负样本。负样本指的是看起来像摊位实际不是的东西停着的空三轮车、垃圾收集箱、施工围挡、电力检修箱。这些负样本不参与标注但作为“无目标”的图像放进验证集和测试集。如果模型在负样本上输出一堆可疑框说明它的误检会非常多我们要用这个信号来找问题。3. YOLO模型选型与训练从精度到速度的平衡3.1 为啥把YOLOv8s作为主力基线项目落地时我们其实不是只跑一个模型而是先定一个基线模型再根据部署环境换不同容量。主力基线选了YOLOv8s原因有三个首先是检测头的解耦设计让分类和回归分支各管各的在遮挡和重叠目标多的场景下比YOLOv5收敛更稳定其次是官方训练和导出工具链比较完整从PyTorch权重导出成ONNX、engine推理格式的路径比较顺省了很多折腾时间最后是模型体积适中比nano大一倍但精度明显更好在服务器上跑推理速度也扛得住。如果你的目标设备是机载盒子算力很紧张可以用YOLOv8n牺牲一些mAP换取实时性如果主要是离线分析、对精度要求高则用YOLOv8m甚至更大。但别一上来就追大模型航拍占道经营是极度依赖数据规模和标注质量的任务模型背不动数据的锅。我们一开始也尝试过用较大的模型总以为能靠容量硬吃下复杂背景结果训练时间长、部署困难精度却没有比s版本提高多少最终还是回到s版本作为通用选择。3.2 数据配置和训练参数为什么imgsz960训练前先把data.yaml写清楚path指向数据集根目录train/val/test分别给路径nc3names列表和标注时保持一致。然后一条命令启动训练。我用的是yolo命令行工具一个实际可参考的配置如下yolo detect train dataoccupancy.yaml modelyolov8s.pt \ epochs300 imgsz960 batch16 \ optimizerAdamW lr00.001 weight_decay0.0005 \ patience50 device0这里重点说imgsz。很多人习惯用默认640但航拍图像里目标平均尺寸偏小用640输入会让很多关键细节直接被压缩掉。我们做过对比实验同一份数据从640升到960mAP50能提升6到8个点代价是训练和推理时间都涨了一倍。考虑到巡检任务的及时性要求并不算苛刻我们选择960作为主训练尺寸。如果部署设备必须做到实时再用640训练一个快速版本两组模型都保留按场景切换。batch_size设置成16是因为24G显存的显卡配960输入这个参数刚好不会爆显存。如果显存小就把batch降到8同时可以开混合精度训练。对这种多类别目标检测预训练权重直接沿用YOLO官方在COCO上训练好的yolov8s.pt即可迁移学习比从零训练收敛快很多训练集只有两万张的时候尤其明显。3.3 训练过程里真正要盯的指标训练时不要只看训练集loss下降就高兴。我一般把验证集上的mAP50和mAP50-95作为核心指标同时盯着precision和recall。对占道经营场景更关注recall因为漏检比误检严重。每周会跑一次完整测试集除了看汇总指标还会把所有漏检和误检图片导出来按问题类型分类。训练中常见的问题是“loss降了但mAP不动”。这种情况十有八九是标注里有错比如类别标反、漏标严重或者难负样本被错误地标成正样本。另一个问题就是过拟合如果train loss持续下降、val loss不降反升patience参数会在50个epoch后自动早停但提前观察验证指标也能发现。我还习惯在训练日志里记录每个类别的AP如果发现“固定摊位或帐篷”的AP远低于其他两类就得回看这一类别的标注是不是太乱、样本是不是太少。3.4 一组实测数据和部署导出参考下面这组结果是我们项目在自己数据集上的实测不代表什么通用结论但能说明尺度关系同一份数据集YOLOv8n在640输入下mAP50大约0.54mAP50-95约0.25YOLOv8s在640下mAP50约0.63mAP50-95约0.32YOLOv8s在960下mAP50约0.71mAP50-95约0.39单帧推理延迟在服务器端24G显存显卡分别约6ms、10ms、22ms。可以看到换输入尺度的收益比单纯换模型更大这也印证了航拍小目标场景的特点。训练完导出部署模型时我们一般先把权重转成engine格式也就是半精度推理引擎用来加速yolo export modelbest.pt formatengine device0 halfTrue推理时置信度阈值先设0.3NMS的IoU阈值设0.5。如果漏检偏多可以把置信度阈值降到0.25甚至0.2但如果误检暴增就要往上调。这个阈值没有绝对标准完全取决于业务方愿意接受哪种失败。4. 无人机巡检落地的完整链路与联动逻辑4.1 航线规划高度、速度和拍摄角度怎么定识别问题解决后真正飞起来又是一堆细节。我们的航线一般沿道路中心线设置飞行高度40米左右速度5到8米每秒云台角度锁定在-60度俯视。为什么是-60度而不是正下方正下方拍出来的物体顶面非常大、立面和形状信息少算法很难认出“这是三轮车”-60度或-45度能看到物体的侧面轮廓识别率明显提高同时也能把路面沿街店铺的情况带进画面。在一条商业街上我们用“弓字形”航线来回扫保证同一条路既有正向视角也有反向视角。如果街面特别宽可以并排飞两条航线重叠率控制在20%到30%这样既不会漏掉边缘又不会产生过多重复数据。航线高度不是一刀切人少路宽的街道40米没问题学校门口这类摊位高度参差的小街最好降低到20米专门补一个低速悬停巡检模式。低速悬停时飞机更稳拍出的画面清晰度更高对小目标识别有明显帮助。4.2 实时识别链路机载计算还是视频回传实时识别有两种主流方案我们两种都试过。一是机载计算盒子方案在无人机上挂一个带GPU的AI计算模块直接拉取相机视频流跑推理引擎识别结果带坐标和时间戳推送到地面站二是把4G或5G图传的视频流拉到服务器服务器端统一识别。两种方案的取舍很简单如果允许2秒以上延迟回传足够如果要做到“飞过即知”必须机载盒子。我们最终选了“混合”日常巡检采用服务器端识别因为可以统一维护模型、方便模型更新重点区域和需要快速响应的任务使用机载盒子。延迟拆解的话服务器方案是抽帧间隔1秒、模型推理22ms、4G网络传输约200ms到500ms、业务平台处理约500ms整条链路差不多1.7到2.2秒。机载盒子可以把网络耗时降到几乎为零端到端控制在0.5秒左右。对于“发现占道经营后立即喊话提醒”这种业务机载盒子方案才有意义。4.3 从像素坐标到街道事件的业务映射模型输出的只是框业务系统要的是“哪条街哪家店附近有占道经营”。这里不能简单地把框中心当作GPS坐标因为无人机云台有角度、无人机本体有偏航还要考虑相机内参。我们做了一套轻量标定把无人机的位置、云台姿态和焦距联合解算把像素坐标投影到经纬度然后跟街道地图数据叠加匹配最近的门牌和路段。也有更简单的过渡方案不要精确到店门只精确到“某一段路”把该路段内所有识别结果合并成一条事件由人工查看截图再定位。实际业务中一线人员更信任“路段截图时间”的组合而不是一个孤零零的GPS点。最后事件要进城市管理平台自动生成工单推送给对应的网格员事后回传“已处理”状态。整个联动逻辑不复杂但细节非常多任何一环断了前面识别的功夫都会白费。5. 实测中的坑误检、小目标和业务边界5.1 阳光阴影和遮阳棚误检率的最大来源第一版模型上线最让人崩溃的是误检。大晴天路边行道树的阴影落在地砖上边缘和摊位轮廓很像蓝色遮阳棚在画面里和一辆蓝色三轮车几乎没有区别车辆盖着深色车衣停在街边也被识别成“固定摊位”。我们看了几天误检截图总结出一个规律把一张图里的阴影和棚子全部圈出来误检率至少能砍掉一半。解决方案分三层。第一层是数据收集大量“阴影、车衣、蓝色棚子、施工围挡”的负样本图放进训练和验证集让模型在验证阶段就暴露误检。第二层是增强提高亮度扰动范围甚至专门做一张“阴影增强”的小数据集把图像局部压暗再喂给模型。第三层是推理后处理比如根据目标的高宽比过滤掉明显的长条阴影或者利用同一位置多帧的置信度做时间平滑只有连续两帧以上检出的目标才触发事件。这三层叠加后误检率降得很快但不可能归零所以业务侧依旧保留人工复核。5.2 小目标漏检从调整输入到切片推理占道经营里最典型的漏检是“远距离的一个小推车”。在960输入下一个20像素的目标依然可能被忽略。一个直接的办法是继续把输入推到1280代价是很多部署设备做不到。另一个办法是切片推理逻辑很简单把原始大图切成若干块每块分别送入模型再把所有检测框坐标映射回原图重叠区域通过NMS合并。在1200万像素的航拍图上我们切512x512、重叠率20%小目标的召回率能提升3到5个点。切片推理的缺点也很明显计算量成倍增加不适合机载实时识别但非常适合离线巡检数据清洗和精细化分析。我们一般在每天航线任务完成后把当天所有图片用切片推理跑一遍作为“精细巡检”的结果实时识别只管粗筛。这种“两条腿走路”的方式既保证了实时性又保证了最终成果的完整性。5.3 漏检和误检的取舍给业务方清晰交代城市管理场景里业务方对漏检的容忍度远低于误检因为漏检意味着“管不住”误检还可以人工删掉。所以我们在参数上刻意偏向召回置信度阈值放到0.25宁可让每个路段多报几条事件。同时把误检的截图和管理员复核流程做顺降低人工成本。如果后续要自动化生成处罚单那阈值必须提高到0.5以上并且要求目标在连续多帧稳定出现防止行政复议。这个取舍必须一开始就和业务方说清楚否则后面会出现“算法明明不准”的质疑。我们在项目报告里也明确写了模型的“召回倾向”定位让管理人员知道哪些结果可以直接采信哪些需要先过滤。这不是示弱而是真实系统落地必须有的预期管理。5.4 数据闭环每周都在喂新的难样本模型上线不是终点。我们每周把当周的误检、漏检截图拉出来按问题类型分组新的负样本直接扩充到数据集里漏检的重新标注后补进训练集然后每两周做一次增量训练。增量训练不是每次都全部重训而是用最新数据集微调上一版权重既快又能保持稳定性。标注队列用“困难样本优先”策略让标注员先处理那些模型最容易错的新样本这个闭环跑起来后模型的提升速度会肉眼可见。6. 从“识别摊位”到“辅助治理”的扩展思路6.1 夜间巡查可见光不够就上双光城市治理不可能只在大白天干活。我们有段时间尝试夜间巡检可见光模型表现很差摊贩在路灯下只剩一团光晕几乎无法区分。后来参考了一些双光方案用热红外通道看摊位的灶台热源、照明灯光再和可见光画面做通道融合夜间识别率才达到可用水平。如果你也想做夜间模式建议直接把“夜间可见光热红外”当成一个新的数据域单独扩充数据而不是拿白天模型硬扛。夜间样本的亮度、颜色分布和白天完全不在一个空间里强行混在一起会互相干扰。6.2 从目标检测走向时空分析识别出“哪里有人摆摊”之后其实还有很多可玩的东西。把每次巡检的检测结果按GPS落到地图上按天累计就可以得到每个路段、每个时间点的占道经营热力分布哪些点长期反复出现哪些点是偶尔流动数据一目了然。这个分析结果可以直接用来优化巡逻路线也能辅助管理部门调整定点值守的资源分配。我们在项目里就给客户输出了“重点点位热力图”比单纯几个检测框实用得多。时间维度上的分析也很有意思某个摊位总是在早上九点出现、下午两点收摊另一个摊位只有周末出现。这些模式可以帮助业务方区分“长期占道”和“临时流动”从而采用不同的处置流程。6.3 大模型辅助标注和跨城市迁移最后说一个省人工的方向。现在多模态大模型能做初步预标注把无人机航拍图丢给它让它先圈出疑似摊位和推车再由标注员修正效率能提高不少。不过大模型的输出不能直接进训练集它经常把“货车车厢”和“摊位帐篷”混在一起需要人工严格把关。另外模型换一个城市用的时候不要指望原样部署无人机拍摄角度、街道环境、摊贩形态都会有差异。我们一般先在新城市飞一天采集两三百张图片人工快标后做一次小规模微调就能快速适应当地场景。这比从零开始重新采集标注再训练要省太多。最后分享一点个人体会这个项目做下来我觉得收益最大的动作不是换更强模型而是把“数据采集—标注—训练—落地误检—再采集”这条闭环跑通。模型再先进也只是把数据规律压缩成权重真正值钱的是每天都有新样本自动回流、每周都有人去看误检、每两周模型就在更新的这套机制。如果你也正在做类似的航拍识别项目可以先从一套严格的标注规范开始把负样本和验证集划分认真设计好后面会省掉非常多的返工时间。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →