大尺寸卫星图像目标检测:yoloT
大尺寸卫星图像目标检测:yoloT
1. 前言
YOLT论文全称「You Only Look Twice: Rapid Multi-Scale Object Detection In Satellite Imagery」,是专为卫星图像目标检测而设计的一个检测器,是在YOLOV2的基础上进行改进的。
论文原文:https://arxiv.org/abs/1805.09512?context=cs.CV
代码实现:https://github.com/CosmiQ/yolt
2. 介绍
大范围图像中的小目标检测是卫星图像分析的主要问题之一。虽然地面图像中的目标检测得益于对新的深度学习方法的研究,但将这种技术过渡到头顶图像并非易事。挑战之一是每幅图像的像素数量和地理范围:一幅DigitalGlobe卫星图像的面积超过64平方公里,像素超过2.5亿。另一个挑战是,感兴趣的物体很小(通常只有10像素),这使传统的计算机视觉技术复杂化。为了解决这些问题,我们提出了一个管道(你只看两次,或者说YOLT),它可以以大于0.5 km2/s的速度评估任意大小的卫星图像。该方法可以在多个传感器上用相对较少的训练数据快速检测出不同尺度的物体。我们评估了原始分辨率下的大型测试图像,得到了F1>0.8的车辆定位分数。通过系统地测试管道在降低分辨率时的分辨率和目标大小要求,我们进一步探索了分辨率和目标大小的要求,并得出结论:只有~5像素大小的目标仍然可以高置信度地定位。
3. YOLT核心理论
由于各种原因,深度学习方法在传统目标检测管道中的应用是不平凡的,由于卫星图像的独特性,需要采用多分辨率算法来解决与前景目标的空间范围、完全旋转不变性和大尺度搜索空间相关的挑战。排除实现细节,算法必须调整:感兴趣的卫星图像对象中的小空间范围通常非常小且密集,而不是像网数据中典型的大而突出的对象。在卫星领域,分辨率通常定义为地面采样距离(GSD),它描述一个图像像素的物理尺寸。商用图像从最清晰的数字地球图像的30厘米GSD到行星图像的3-4米GSD不等。这意味着,对于小型物体,如汽车座椅,即使在最高分辨率下,物体的范围也只有15像素。从头顶观察的完全旋转不变性对象可以具有任何方向(例如,船舶可以具有0到360度之间的任何航向,其中图像网数据中的树是可靠垂直的)。训练示例频率有一个相对地球的训练数据(尽管像SpaceNet这样的努力有可能改善这个问题)超高分辨率的输入图像是巨大的(通常是数亿像素),所以简单地降低采样到大多数算法所需的输入大小(几百像素)不是一个选项(见图1)。
卫星图像目标检测的主要几个难点以及YOLT的解决方案
我们来描述一下这几个难点和解决方案:
第一,卫星图目标的「尺寸,方向多样」。卫星图是从空中拍摄的,因此角度不固定,像船、汽车的方向都可能和常规目标检测算法中的差别较大,因此检测难度大。针对这一点的解决方案是对数据做「尺度变换,旋转等数据增强操作」。
第二,「小目标的检测难度大」。针对这一点解决方案有下面三点。
1、修改网络结构,使得YOLOV2的stride变成,而不是原始的,这样有利于检测出大小在。
2、沿用YOLOV2中的passthrough layer,融合不同尺度的特征(和大小的特征),这种特征融合做法在目前大部分通用目标检测算法中被用来提升对小目标的检测效果。
3、不同尺度的检测模型融合,即Ensemble,原因是例如飞机和机场的尺度差异很大,因此采用不同尺度的输入训练检测模型,然后再融合检测结果得到最终输出。
第三,「卫星图像尺寸太大」。解决方案有将原始图像切块,然后分别输入模型进行检测以及将不同尺度的检测模型进行融合。
YOLT的网络结构如Table1所示:
YOLT的网络结构
可以看到网络结构相对于YOLOV2最大的修改就是最后输出特征尺寸只到了,这样就能有效的提高对小目标的检测效果。
4. 一些观察
Figure2展示了使用两种不同类型的图像作为输入时模型(原始的YOLOv2)的预测结果对比,左边是直接把卫星图像原图resize到大小,可有看到结果是一辆车都检测不出来。右边则是从原图中裁剪出大小的区域然后作为模型的输入,可以看到部分车被检测出来了,但是效果一般。从这个实验可以发现,如果直接将原图resize到网络输入大小是不靠谱的,所以YOLT采用了裁剪方式进行训练和测试图片。
将原图resize到网络输入大小是不合理的,还是得使用裁剪方式
Figure4则展示了在测试模型时如何对输入图像进行处理。
YOLT在测试模型时如何对输入图像进行处理
上半部分表示的是原始的卫星图片,因为图片分辨率太大,所以采用了划窗方式裁剪指定尺寸如的图像作为模型的输入,论文将裁剪后的区域称为chip,并且相邻的chip会有15%的重叠,这样做的目的是为了保证每个区域都能被完整检测到,虽然这带来了一些重复检测,但可以通过NMS算法滤掉。通过这种操作,一张卫星图像会被裁剪出数百/千张指定尺寸的图像,这些图像被检测之后将检测结果合并经过NMS处理后就可以获得最终的检测结果了。
Figure5展示了训练数据的整体情况,一共有个类别,包括飞机,船,建筑物,汽车,机场等。对训练数据的处理和测试数据是类似的,也是从原图裁剪多个chip喂给网络。
训练数据的整体情况,一共5个类别,注意有两张图像都是车
这篇论文的一个核心操作就是:
针对「机场目标」和「其它目标」分别训练了一个检测模型,这两个检测模型的输入图像尺度也不一样,测试图像时同理,最后将不同检测模型、不同chip的检测结果合并在一起就得到最终一张卫星图像的输出。也即是说这篇文章的核心操作就是这个「不同尺度的模型融合」以及「针对机场单独训练一个模型」,这样确实是从数据出发能够很好的解决实际场景(卫星图像)中机场目标数据太少带来的问题。
5. 实验结果
Figure7展示了一张对于汽车目标的检测结果,可以看到效果还是不错的,并且在内能获得结果,同时F1值达到0.95。
YOLT对汽车目标的检测结果可视化
接下来作者还对不同输入分辨率做了实验,Figure10代表对原始分辨率(左上角的0.15m表示GSD是0.15m)进行不同程度的放大之后获得的低分辨率图像,这些图像都被用来训练模型,
不同分辨率的卫星图像
然后Figure13将不同分辨率输入下检测模型的F1值进行了图表量化,其中横坐标代表目标的像素尺寸。可以看到,随着分辨率的降低,图像中目标的像素尺寸也越来越小,检测效果(F1值)也越来越低。
我们还可以发现即便目标只有个像素点,依然有很好的检测效果,但需要注意的是这里的个像素点指的是在原图上,你crop之后目标的相对于网络输入的大小肯定是大于个像素点的,至少让YOLT网络能够检测出来。
不同分辨率输入下检测模型的F1值可视化
其中不同的场景有不同颜色的线代表,不过这不重要,重要的已经讲过了。
Figure12则可视化了不同分辨率图像的检测效果,左边是15cm GSD的结果,右边则表示了90cm GSD的效果,直观来说,左边的效果是比右边好的。
不同分辨率图像的检测效果
Table3展示了YOLT算法对于不同目标的测试精度以及速度情况。
YOLT算法对于不同目标的测试精度以及速度情况
6. 结论
在ImageNet风格的数据集中,目标检测算法在目标定位方面取得了很大的进展。然而,这种算法很少能很好地适应卫星图像中的目标大小或方向,也没有设计出数以亿计像素的处理图像。为了解决这些限制,本文实现了一个完全卷积的神经网络工作管道(YOLT),以快速定位卫星图像中的车辆、建筑物和机场。注意到,由于大小特征(如高速公路和跑道)之间的混淆,组合分类器的结果很差。在不同规模上训练双分类器(一个用于建筑物/车辆,一个用于基础设施),取得了更好的效果。根据类别,此管道产生的目标检测F1分数约为0.6~-0.9。虽然F1的分数可能不在许多读者从ImageNet比赛中习惯的水平,但卫星图像中的目标检测仍然是相对新生的领域,有着独特的挑战。此外,对于监督学习方法,针对大多数类别的训练数据集都相对较小,并且F1分数可能会随着检测的进一步后处理而提高。本文还演示了在一个传感器(如数字地球仪)上进行训练的能力,并将我们的模型应用于另一个传感器(如行星仪)。实验表明,至少对于从头顶观看的汽车,大于5像素的物体大小产生的物体检测分数F1>0.85。探测管道能够以自然分辨率评估任意输入尺寸的卫星和航空图像,以≈30km2的速率处理车辆和建筑物,以≈6000km2的速率处理机场。在这种推理速度下,16GPU集群可以对数字地球观3卫星进行实时推理。
大尺寸卫星图像目标检测:yoloT的更多相关文章
- YOLT:将YOLO用于卫星图像目标检测
之前作者用滑动窗口和HOG来进行船体监测,在开放水域和港湾取得了不错的成绩,但是对于不一致的复杂背景,这个方法的性能会下降.为了解决这个缺点,作者使用YOLO作为物体检测的流水线,这个方法相比于HOG ...
- 使用Caffe完成图像目标检测 和 caffe 全卷积网络
一.[用Python学习Caffe]2. 使用Caffe完成图像目标检测 标签: pythoncaffe深度学习目标检测ssd 2017-06-22 22:08 207人阅读 评论(0) 收藏 举报 ...
- 在opencv3中利用SVM进行图像目标检测和分类
采用鼠标事件,手动选择样本点,包括目标样本和背景样本.组成训练数据进行训练 1.主函数 #include "stdafx.h" #include "opencv2/ope ...
- 10分钟学会使用YOLO及Opencv实现目标检测(下)|附源码
将YOLO应用于视频流对象检测 首先打开 yolo_video.py文件并插入以下代码: # import the necessary packages import numpy as np impo ...
- ILSVRC2016目标检测任务回顾——视频目标检测(VID)
转自知乎<深度学习大讲堂> 雷锋网(公众号:雷锋网)按:本文作者王斌,中科院计算所前瞻研究实验室跨媒体计算组博士生,导师张勇东研究员.2016年在唐胜副研究员的带领下,作为计算所MCG-I ...
- ICCV2021 | TOOD:任务对齐的单阶段目标检测
前言 单阶段目标检测通常通过优化目标分类和定位两个子任务来实现,使用具有两个平行分支的头部,这可能会导致两个任务之间的预测出现一定程度的空间错位.本文提出了一种任务对齐的一阶段目标检测(TOOD) ...
- 目标检测的图像特征提取之(一)HOG特征(转载)
目标检测的图像特征提取之(一)HOG特征 zouxy09@qq.com http://blog.csdn.net/zouxy09 1.HOG特征: 方向梯度直方图(Histogram of Orien ...
- 一文带你学会使用YOLO及Opencv完成图像及视频流目标检测(上)|附源码
计算机视觉领域中,目标检测一直是工业应用上比较热门且成熟的应用领域,比如人脸识别.行人检测等,国内的旷视科技.商汤科技等公司在该领域占据行业领先地位.相对于图像分类任务而言,目标检测会更加复杂一些,不 ...
- 【数字图像处理】目标检测的图像特征提取之HOG特征
1.HOG特征 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子.它通过计算和统计图像局部区域的梯 ...
随机推荐
- Python中面向对象和类
目录 面向对象 类的定义 类的访问 类的属性和方法 继承和多态 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的. 面向对象: 类(C ...
- JavaScript 的入门学习案例,保证学会!
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 【python】Leetcode每日一题-最长公共子序列
[python]Leetcode每日一题-最长公共子序列 [题目描述] 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度.如果不存在 公共子序列 ,返回 0 . ...
- Day003 注释、标识符和关键字
注释.标志符.关键字 注释 当项目逐渐复杂,注释就很重要了. 注释不会被执行,是给我们写代码的人看的. 书写注释是一个非常好的习惯. Java中的注释有三种: 当行注释 // 多行注释 /* 注释 * ...
- 【maven】maven资源过滤问题<build>
需要在pom.xml加入以下代码(在父项目添加即可,如果还不行的话,就在子module的pom.xml也添加) <build> <resources> <resource ...
- MarkDown写ppt
首先给你的VSCode安装插件 MarkDown语法 例子 --- marp: true paginate: true theme: default class: - lead - invert si ...
- 【opencv】Java+eclipse+opencv 环境搭建 helloword入门demo
文章为博主原创,纯属个人理解,如有错误欢迎指出. 如需转载,请注明出处. 引入jar包 引入配置文件 到此环境配置完成!!! 可能会出现的问题: 1. jdk版本不一致导致发生异常.如图 build ...
- 基于蒙特卡洛树搜索(MCTS)的多维可加性指标的异常根因定位
摘要:本文是我在从事AIOps研发工作中做的基于MCTS的多维可加性指标的异常根因定位方案,方案基于清华大学AIOPs实验室提出的Hotspot算法,在此基础上做了适当的修改. 1 概述 ...
- 从零开始搞监控系统(1)——SDK
目前市面上有许多成熟的前端监控系统,但我们没有选择成品,而是自己动手研发.这里面包括多个原因: 填补H5日志的空白 节约公司费用支出 可灵活地根据业务自定义监控 回溯时间能更长久 反哺运营和产品,从而 ...
- Asp.NetCore Web开发之Nlog日志配置
接着讲基于ASP .net Core 的web开发,这节主要讲一下如何使用和配置Nlog进行日志记录. 日志在开发中的作用是很重要的,使用日志,程序出了错误可以及时捕获并记录下来,开发人员可以通过日志 ...