ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

无人机巡线如何用Faster R-CNN自动识别工程车辆?

无人机巡线如何用Faster R-CNN自动识别工程车辆? 简介一篇题为《深度学习在军用光缆线路无人机巡检中的应用》的学术论文PDF面向军事通信保障、无人机巡检及计算机视觉目标检测方向的研究人员和工程技术人员。文章针对传统人工徒步巡检耗时长、成本高、易受地形影响的问题提出将Faster R-CNN应用于无人机航拍图像中的工程车辆检测并基于VE-DAI公共数据集制作工程车辆数据集实现对挖掘机、推土机等目标的精确识别平均精度AP达0.659优于DPM、HOGLBPSVM等传统算法。资源包共含1个PDF文件大小1.31MB为论文完整全文。目前已有104人学习浏览。读者可从中获得研究背景、方法原理、网络结构、实验设计与结果对比等完整内容也可借鉴其数据集制作与模型训练思路为军用光缆线路智能化巡检及其他航拍目标检测应用提供参考。1. 无人机巡线最大的坑不是飞控而是“看得懂”做光缆线路维护的都知道光缆障碍里相当大比例不是自然老化而是施工挖掘直接挖断。传统人工巡线靠腿走、靠眼盯遇到赶工期的工地今天巡查没事明天一早线路就断了。无人机解决了“看得快”的问题但航拍图像如果靠人工判读效率照样上不去——飞一趟能出几百上千张图人眼看完一遍还不如不飞。这篇论文做的正是把航拍图像里的挖掘机、推土机这类工程车辆用 Faster R-CNN 自动检测出来AP 做到 0.659单张推理约 89 ms直接打通了“航拍采集 → 自动识别 → 线路隐患预警”这条链路。对做巡检系统、航拍目标检测或者小目标识别的工程团队来说这篇文档的完整价值在于从 VEDAI 数据集加工到四步交替训练再到精度验证每个环节都有可复现的细节。2. Faster R-CNN 凭什么被选中两阶段检测器的结构逻辑2.1 RPN 与 Fast R-CNN 的分工关系Faster R-CNN 由两个模块构成候选区域提议网络RPN和 Fast R-CNN 检测模块。RPN 是一个全卷积网络输入经过共享卷积层提取的特征图输出的是候选区域——也就是图上“可能含有目标”的一些边界框位置Fast R-CNN 则对这些候选区域做进一步分类和位置精修。两阶段不是简单的先粗后细而是这两个模块在训练时共享了卷积层。RPN 提出区域Fast R-CNN 筛选确认共享的卷积层让候选框生成几乎不再消耗额外计算时间。这一点是它比早期 R-CNN 快得多的核心原因。R-CNN 是先用 Selective Search 生成约 2000 个候选区域再逐个送入卷积网络提取特征速度慢且重复计算多Fast R-CNN 虽然加了 RoI Pooling 做了加速但候选区域生成仍然是独立模块到了 Faster R-CNN候选区域这一步也被卷积分支替代真正做到了端到端训练。2.2 与 YOLO、SSD 的选型权衡论文里明确提到2016 年出现了 YOLO 和 SSD 这类基于回归的一阶段检测算法但精度上 Faster R-CNN 依然更好且比 SSD 消耗更小的计算存储资源。实际做这类巡检场景时我的选型经验是一阶段算法YOLO、SSD速度快适合移动端或者实时性要求非常高的场景但小目标检测精度通常不如两阶段。两阶段算法Faster R-CNN 系列结构上天然适合多尺度、密集、小目标的航拍场景因为 RPN 的锚点在多个尺度上独立滑动漏检率更低。航拍图像里工程车辆往往只有几十到一两百像素一阶段算法在特征融合不够时很容易把这些小目标漏掉。另外锚点机制也是 Faster R-CNN 的关键参数。RPN 默认在特征图的每个位置放置多组不同尺寸和长宽比的锚点框论文的实验里工程车辆涵盖了挖掘机、推土机、拖拉机和压路机等多种类型车辆形状差异大锚点尺寸如果设置得不好召回率会明显下降。后面训练阶段能看到基于 VGG16 在迭代 30 万次时达到最优这个结论其实也说明特征提取网络的深度对航拍小目标检测的影响比多数人想象的大。2.3 RoI Pooling 的作用与边界框回归在 Fast R-CNN 检测模块中RoI Pooling 把 RPN 输出的不同尺寸候选区域映射到固定尺寸的特征图上这样才能接全连接层做 Softmax 分类和边界框回归。分类器同时输出两类结果目标种类和精确位置。Softmax 给出这个候选框属于“工程车辆”的概率边界框回归输出的是相对锚点框的平移量和缩放量用于修正框的位置。提示实操中很多人只关注分类准确率忽略了边界框回归的收敛情况。边界框回归 loss 不收敛检测框会漂移看起来“检测到了”但框的位置整体偏左上或右下。遇到这种情况优先检查回归目标是否做了归一化处理。3. 训练数据从哪来VEDAI 数据集的加工与 VOC 格式转换3.1 选 VEDAI 的理由贴近航拍真实分布工程车辆航拍数据集没有现成公开的论文选的是 VEDAIVehicle Detection in Aerial Imagery数据集。这个数据集每个场景提供了 1024×1024 和 512×512 两种尺寸的彩色与红外图像总共约 5000 张照片涵盖皮卡、轿车、面包车等十多种车辆目标其中就包含挖掘机和推土机。关键是这些车辆目标很小且存在姿态变化、光照阴影、镜面反射和遮挡和无人机光缆巡线的实际拍摄情况非常接近。3.2 从 VEDAI 到 VOC2007 格式的转换脚本数据准备的核心步骤是从 VEDAI 的 Annotation 文件中提取车辆位置和类别信息筛选出工程车辆然后重新标注边界框并生成 VOC2007 格式的 xml 文件。这里给出一个可复用的转换逻辑思路是按类别白名单过滤原标注文件再重写到标准 VOC 结构import os import xml.etree.ElementTree as ET eng_classes {excavator, bulldozer, tractor, road_roller} def convert_vedai_to_voc(vedai_ann, img_name, img_size, out_dir): tree ET.parse(vedai_ann) root tree.getroot() annotation ET.Element(annotation) ET.SubElement(annotation, folder).text ENG-Vehicle ET.SubElement(annotation, filename).text img_name source ET.SubElement(annotation, source) ET.SubElement(source, database).text VEDAI size ET.SubElement(annotation, size) ET.SubElement(size, width).text str(img_size[0]) ET.SubElement(size, height).text str(img_size[1]) ET.SubElement(size, depth).text 3 for obj in root.findall(object): cls obj.find(name).text if cls not in eng_classes: continue # 只保留工程车辆类别 obj_elem ET.SubElement(annotation, object) ET.SubElement(obj_elem, name).text ENG-Vehicle ET.SubElement(obj_elem, difficult).text 0 box obj.find(bndbox) bndbox ET.SubElement(obj_elem, bndbox) ET.SubElement(bndbox, xmin).text box.find(xmin).text ET.SubElement(bndbox, ymin).text box.find(ymin).text ET.SubElement(bndbox, xmax).text box.find(xmax).text ET.SubElement(bndbox, ymax).text box.find(ymax).text out_path os.path.join(out_dir, img_name.replace(.jpg, .xml)) ET.ElementTree(annotation).write(out_path, encodingutf-8)这段代码的逻辑是先解析 VEDAI 的原始标注文件遍历每个object节点只保留类别匹配工程车辆集合的实例其余轿车、卡车等目标直接跳过。注意ENG-Vehicle是把多种工程机械合并成了一个统一类别这也和论文里“将所有训练数据合并为一类进行实验”的做法一致。合并类别的好处在于训练样本更充足坏处是模型只能回答“这里有没有工程车辆”不能区分挖掘机和推土机——如果你的巡检场景需要报具体车型就要按原始类别分别建标签。另外VEDAI 原始标注的坐标是相对于整张大图的转换时不需要做坐标变换直接拷贝即可。但要注意部分 VEDAI 图像本身有旋转过的情况如果标注文件包含旋转角度字段最好先还原到正方向再做 bndbox 提取否则训练时标签和图像内容会错位。3.3 数据增强与训练集划分从原始数据集里筛选出 468 张彩色照片包含 638 个工程车辆目标。468 张对于训练一个检测网络来说明显偏少论文对数据做了水平翻转扩充样本数量翻倍到约 1300 个目标。水平翻转在检测任务里基本不会破坏语义信息工程车辆的左右朝向不影响类别判断这个增强手段非常稳妥。数据划分的比例是 7:3即训练验证集占 70%测试集占 30%训练验证集内部再按 7:3 拆分成训练集和验证集。从工程习惯来看这个比例在小样本数据集上相对合理。如果训练集占比过高验证集样本太少模型选择时看指标容易过拟合如果测试集占比过高训练数据又不够。我在做小目标巡检检测时如果数据总量低于 1000 张一般会改用交叉验证来选取超参数而不是只跑一次划分以减少因为随机划分造成的指标波动。提示xml 文件生成后还要在ImageSets/Main下生成train.txt、val.txt、trainval.txt、test.txt四个文件每行是对应的图片文件名不带后缀。很多人在这一步漏掉文件就跑去训练Caffe 直接报错找不到索引文件。生成时注意保持训练集和验证集的图片名不重叠。4. 四步交替训练法共享卷积层的核心操作4.1 为什么要用四步交替训练RPN 和 Fast R-CNN 需要共享卷积层这就带来一个训练难题两部分的损失函数耦合在一起直接联合训练时梯度互相干扰早期实现很难稳定收敛。论文采用的是原作者提出的四步训练法把问题拆解成四个可控制的阶段用预训练模型初始化 RPN独立训练 RPN 的参数。用上一步 RPN 生成的候选区域训练 Fast R-CNN此时两个网络还没有共享。用 Fast R-CNN 的参数初始化 RPN固定共享卷积层只微调 RPN 特有的层。固定共享卷积层微调 Fast R-CNN 特有的层。四步走完之后RPN 和 Fast R-CNN 各自特有层的参数都收敛了而共享卷积层同时被两侧微调过最终实现权重共享。4.2 网络结构与迭代次数怎么定论文做了 ZFnet 和 VGG16 两种骨干网络的对比实验。ZFnet 结构浅、参数量少、训练快适合先跑通流程验证数据没问题VGG16 更深提取的特征语义级别更高对航拍小目标更友好最终在 VGG16 迭代 30 万次时拿到最优检测精度。这里有个关键点30 万次迭代是四个阶段迭代次数累加的结果。各阶段超参数配置如下训练阶段迭代次数基础学习率lr_policystepsizedisplay阶段1: RPN 初始化1000000.001step7500020阶段2: Fast R-CNN 初始化500000.001step3750020阶段3: RPN 微调1000000.001step7500020阶段4: Fast R-CNN 微调500000.001step3750020四个阶段的动量都为 0.9权值衰减 0.0005学习率衰减因子 gamma 为 0.1。step 策略的含义是迭代次数达到 step size 时学习率乘以 gamma从 0.001 降到 0.0001。观察这个表可以看出两个设计思路微调阶段阶段3、4迭代次数比初始化阶段少一半因为这时网络骨干已经有了好的局部最优stepsize 与 max_iter 的比值约 0.75也就是在学习率衰减之前已经完成了大部分收敛。4.3 损失曲线怎么看论文绘制了四个阶段的 loss 随迭代次数的变化曲线四个阶段都收敛到了较低水平。这是判断训练是否正常最直接的依据。实操时我一般会关注这样几点RPN 的 loss 和 Fast R-CNN 的 loss 应该同步下降如果一边降另一边涨说明共享卷积层的梯度冲突需要调小学习率。迭代前 20% 的 loss 通常是断崖式下降后面进入缓慢下降如果全程波动剧烈先检查锚点框和真实标签的 IoU 阈值设置是否合理。阶段3 和阶段4 的初始 loss 应该比阶段1、阶段2 更低因为它们承接了共享卷积层的已有特征表达。如果反而更高基本可以判断共享层被破坏了。4.4 小目标数据集上的训练建议这个实验基于 VGG16 在 1080Ti 级别的 GPU 上跑了 30 万次迭代。我当时做类似巡检检测的经验是如果数据量只有一两千张可以不用跑满 30 万次验证集 mAP 连续 20 个 epoch 不再提升就可以提前截断能省不少时间。提示数据量小的时候BNBatch Normalization层的衰减率对检测结果的影响会被放大。Caffe 的 BatchNorm 默认use_global_stats在测试阶段需要设为 true训练阶段为 false。很多人在转换模型做部署时忘记这一步导致检测结果全乱检查点往往不是网络结构而是这个参数。5. 检测效果怎么评估P-R 曲线、AP 值与对比基准5.1 AP 值如何计算与解读检测结果好不好不能只看几张图片的目视效果要用 P-R 曲线下的面积来量化。P-R 曲线横轴是查全率 Recall反映漏检率纵轴是查准率 Precision反映误检率。AP 是曲线下的面积越接近 1 越好。论文在测试集上 AP 达到 0.659同时检测速度为 89 ms/张接近 11 FPS。考虑到现场巡检场景通常不需要实时视频流检测而是航拍结束后批量处理这个速度完全够用。对比实验数据需要单独看同样是基于 VEDAI 彩色航空影像DPM 的 mAP 是 0.404HOGLBPSVM 是 0.441Faster R-CNN 的 AP 是 0.659分别高出 0.255 和 0.218。这里有个细节值得注意论文的 Faster R-CNN 检测对象只有“工程车辆”一类所以 AP 值等价于 mAP对比时可以直接使用。检测方法检测对象mAP 值DPM十类车辆含工程车辆0.404HOGLBPSVM十类车辆含工程车辆0.441Faster R-CNN工程车辆0.659从差异不难看出传统方法的特征表达依赖人工设计的 HOG 特征和 LBP 纹理对遮挡、光照变化和镜像反射的鲁棒性很差Faster R-CNN 从一开始就在原始像素上学习特征把“什么是工程车辆”这件事交给了网络自己判断这也是深度学习方法在航拍小目标场景下最核心的优势。5.2 错检与漏检的原因拆解论文测试结果中存在少量错检原因总结了两个一是数据集数量有限网络没有学到工程车辆的所有高层语义特征二是部分图像目标过小、清晰度不够部分工程车辆携带附属物件给识别带来干扰。这个结论其实指向两个后续优化方向。第一个是增加数据量的方式不一定只能靠对外采集合成数据、Mosaic 增强、多尺度裁剪都是有效的方案第二个是特征表达层面VGG16 的最后一层卷积特征对过小的目标不敏感在检测头之前加 FPN特征金字塔网络结构融合浅层高分辨率特征和深层语义特征是提升小目标 AP 更直接的手段。有兴趣的可以把骨干网络换成 ResNet50 FPN 的实验配置对比一下 VGG16 的指标差异。6. 落地部署置信度阈值、热区复查与多帧确认6.1 置信度阈值的选择技巧论文里检测框上的数字是目标被判定为工程车辆的概率越接近 1 表示置信度越高。实际部署时阈值不能直接取 0.5 或 0.8要看巡检场景对漏检和误检的容忍度。光缆巡检的核心诉求是“宁可错报不可漏报”——漏掉一台正在施工的挖掘机可能直接导致光缆中断而错报几次顶多多跑一趟复核。所以我一般会把阈值降到 0.3 到 0.4 之间把模型输出概率值大于阈值的所有目标都标记为待复核再由人工快速确认。6.2 巡检链路的完整闭环把 Faster R-CNN 检测结果接入实际巡检流程我通常这样组织无人机按光缆路由的 GPS 轨迹飞行航拍图像与地理位置时间戳同步。地面端跑目标检测推理只保留置信度达标的检测框。对检测框做空间聚合把连续多帧都检测到工程车辆的区域标记为“热区”。热区叠加在 GIS 地图上生成疑似施工点列表推送巡检工单。第 3 步是关键——依赖单帧检测结果直接报警会引入大量偶然误判比如树木的影子被误检成车辆边缘、移动的车斗被识别成挖掘机。多帧确认的思路是同一地理位置上的工程车辆不会在几秒钟内消失如果连续 3 帧在重叠区域都检测到同类目标才确认为真实目标否则丢弃。这个策略对论文中的 89 ms/张的推理速度来说没有压力。6.3 数据闭环与模型迭代巡检系统上线半年后真正拉开效果差距的是数据闭环。每次人工复核的结果都会回传为标注样本正样本是“AI 检测出但人工确认属实”的检测框负样本是“AI 误报但人工确认无工程车辆”的检测框。这些新样本不需要从零标注直接基于 AI 的候选框做修正标注成本远低于原始数据制作。有了这些新增数据模型每季度微调一次不重新随机初始化而是在现有模型权重上继续训练几个 epoch学习率设置为初始训练时的十分之一左右。这样才能让模型跟着巡检区域的实际施工特征、季节性光照变化和新型工程车辆类型一起演进否则模型只能反应训练集覆盖过的模式部署三个月后精度会因为数据漂移而明显下降。提示模型迭代的哪个阶段替换上线需要以测试集 AP 和误报率两个指标同时把关。只看 AP 提升就上线很可能换上一个精度更高但误报率增加的模型反而增加人工复核工作量。本文还有配套的精品资源点击获取
返回列表