专栏首页AI科技评论RetinaNet在航空图像行人检测中的应用

RetinaNet在航空图像行人检测中的应用

一次RetinaNet实践

作者 | Camel

编辑 | Pita 

航空图像中的目标检测是一个具有挑战性且有趣的问题。随着无人机成本的降低,航空影像数据量的激增,拥有能够从航空数据中提取有价值的信息的模型将非常有用。

RetinaNet是最著名的单级目标检测器,在本文中,我将在斯坦福无人机数据集的行人和骑自行车者的航空图像上测试RetinaNet。

我们来看下面的示例图像。

来自斯坦福无人机数据集的航空图像 – 粉红色和自行车红色行人

这是一个具有挑战性的问题,因为大多数目标只有几个像素宽,某些目标被遮挡,阴影下的目标更难检测。

Retina Net

Retina Net 是一个单级目标检测器,使用特征金字塔网络 (FPN) 和焦点损失函数(Focal loss)进行训练。

特征金字塔网络是本文引入的多尺度目标检测结构,它通过自上而下的路径和横向连接将低分辨率、语义强大的特征与高分辨率、语义薄弱的特征相结合。这样做的结果是,它在网络中的多个层级上生成不同尺度的特征图,这有助于分类和回归网络。

焦点损失旨在解决单阶段目标检测问题,因为图像中可能存在大量的背景类和几个前景类,这会导致训练效率低下。大多数位置都是容易产生任何有用信号的负片,大量这些负样本使训练不堪重负,降低了模型性能。焦力损失基于如下所示的交叉熵损耗,通过调整γ参数,可以从分类良好的样本中减少损失贡献。

焦点损失解释

在本文中,我将讨论如何在Keras上训练Retina Net模型。关于RetinaNet背后的理论,请参考[1]。我的代码可以在Github上下载[2]。训练后的模型在航空目标检测方面的效果可以参考如下动图:

Stanford Drone 数据集

斯坦福无人机(Stanford Drone)数据是在斯坦福校园上空通过无人机收集的航拍图像数据集。这个数据集是目标检测和跟踪问题的理想选择,它包含约了60个航拍视频。每个视频,有6类标注 :"行人"、"自行车"、"滑板"、"购物车"、"汽车"和"巴士"。数据集非常丰富,不过行人和骑行者这2类大约占所有标注的85%-95%。

训练RetinaNet

为了训练RetinaNet,我在Keras使用了keras-retinanet的代码实现[3],它的帮助文档非常好,运行起来没有任何错误。

  • 从大量斯坦福德无人机数据集中选择图像示例。我采用了大约 2200 张训练图像,包含30000 多个标注信息,并保存了大约 1000 张图像进行验证。我已经把我的图像数据集放在google drive[4] 上。
  • 以 RetinaNet 所需的格式生成标注。RetinaNet 要求所有标注都采用该格式。
path/to/image.jpg,x1,y1,x2,y2,class_name

我转换了斯坦福标注的格式,我的训练和验证标注上载到我的 Github。

调整锚点大小:RetinaNet 的默认锚点大小为 32、64、128、256、512。这些锚点大小适用于大多数目标,但由于我们处理的是航空图像,某些目标可能小于 32。这个代码工程里提供了一个方便的工具,用于检查现有锚点是否有效。在下图中,绿色标注被锚点中的标注覆盖,红色标注将被忽略。可以看出,相当一部分标注对于最小的锚点大小来说也太小。

RetinaNet默认锚点大小结果

因此,我调整了锚点,丢弃512中最大的锚点,而是添加一个大小为16的小锚点。这显著改善了结果,如下所示:

增加一个小锚点

有了这一切,我们准备开始训练。我保留了大多数其他默认参数,包括 Resnet50 主干网络参数,并开始通过以下方式进行训练:

keras_retinanet/bin/train.py --weights
snapshots/resnet50_coco_best_v2.1.0.h5  --config config.ini csv
train_annotations.csv labels.csv --val-annotations
val_annotations.csv

这里加载的权重是 COCO 权重。用于训练和验证的标注是输入数据, config.ini 具有更新的锚点大小。所有的文件都在我的Github中。

到这里,就完成了!

这个模型训练速度很慢,我训练一晚上。

通过检查测试集的平均平均精度 (Mean Average Precision,MAP),测试了下训练模型的准确性。

Biker: 0.4862
Car:0.9363
Bus: 0.7892
Pedestrian: 0.7059
Weighted: 0.6376

如上所示,第一个经过训练的模型有一个非常好的 MAP 0.63。特别是在汽车和巴士类上,表现较好,原因在于在航拍图片中这些都是很容易区分出来的。自行车类的 MAP 很低,主要原因在于经常和行人混淆一起。我目前打算进一步提高自行车类的准确性。

结论

RetinaNet是一个强大的模型,使用特征金字塔网络。它能够用在航拍物体检测场景中,即使是目标尺寸极小、极具挑战性的数据集也可以。我大概花了一晚上的时间训练 RetinaNet,而训练出的模型性能还不错。接下来我准备探索如何进一步调整RetinaNet 架构,在航拍物体检测中能够获得足够高的精度。

参考资料:

[1] https://ai.yanxishe.com/page/postDetail/14362?from=ttweixin190824

[2] https://github.com/priya-dwivedi/aerial_pedestrian_detection

[3] https://github.com/fizyr/keras-retinanet

[4] https://drive.google.com/drive/u/0/folders/1bLt6KK_9zKogJdvW-lKh9BnBKgFfvPp9

[5] https://github.com/priya-dwivedi/keras_retinanet_cs230

本文分享自微信公众号 - AI科技评论(aitechtalk)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-08-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 学界 | 来认识认识微软的「画家 AI」

    AI 科技评论按:近年来图像生成模型方面的研究可谓是突飞猛进,内容的丰富程度和清晰程度都在不断刷新着以往的记录。终于,微软研究院的这篇新论文突破了另一个瓶颈,能...

    AI科技评论
  • 学界 | 如何让医学图像诊断网络具备可解释性?CVPR oral 作者张子钊详解 MDNet 技术细节

    AI 科技评论按:AI 科技评论对各大顶级会议的论文及作者一直保持高度关注,在邀约优秀的与会老师和同学参加GAIR大讲堂等线下分享活动外,AI 科技评论也会持续...

    AI科技评论
  • 学界 | 专家标注的数据少就少吧,普通人标的数据现在也可以用了

    AI 科技评论按:对于缺乏高质量标注数据的专业应用,除了继续花钱标数据之外,常用方法似乎也就只有 ImageNet 预训练 + 任务专用数据 fine-tune...

    AI科技评论
  • 提高PHP编程效率的53个要点

    沈唁
  • 如何提高PHP编程效率,提升程序编译质量(53条)

    用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串...

    V站CEO-西顾
  • 良好的书写规范提高PHP代码执行效率

    用单引号代替双引号来包含字符串,这样做会更快一些。因为 php 会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有 echo 能这么做,它是一种可以把多...

    wangxl
  • [PyTorch填坑之旅]·from torch._C import * ImportError: DLL load failed解决方法

    笔者使用conda安装PyTorch1.10 gpu版本指令如是:conda install pytorch torchvision cudatoolkit=9...

    小宋是呢
  • 启动物联网项目所需的一切:第 1 章

    本文旨在帮助读者围绕物联网或流处理系统的技术问题,建立完整的基础和多方面的理解。

    未来守护者
  • Oracle存储过程

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    颍川
  • 机器学习|二分法迭代求零点

    01 — 二分法求解 对于区间 [a,b] 上单调连续,且 f(a)· f(b)< 0 的函数 y = f(x),通过不断地把函数 f(x)的零点所在的区间一...

    double

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动