YOLT:You Only Look Twice: Rapid Multi-Scale Object Detection In Satellite Imagery 卫星图像快速多尺度目标检测

0. 摘要:

卫星图像分析的主要challenge:大张图像中检测小物体

① 卫星图像的像素个数和地理范围较大,64平方公里,2.5亿像素(16000×16000)
② 感兴趣的目标很小,只有10个像素左右。
③ 目标小,且目标密集

YOLT≥ 0.5 km2/s 的速率评估任意大小的卫星图像

提出的方法可以通过多个传感器上的相对较少的训练数据快速检测到不同尺度的对象。

1. Introduction

摘要部分作者简明的点出了目前用遥感影像做目标识别的最大的两个问题:

  • 一是数据量大,表现在一张图像的范围超过了64km²,像元数量超过了2.5亿(之前一直用Landsat,图像范围大概是185km²,图像尺寸大概8000*8000像元)
  • 二是目标往往特别小,有时候仅仅只有10个像元。

  • faster RCNN 1000×600,SSD 300 × 300 或 512 × 512, YOLO 在 416 × 416 或 544 × 544卫星图像典型的 ∼ 16, 000×16, 000 输入尺寸方面,没有一个可以与之相提并论。由于 YOLO 的速度、准确性和灵活性,在 PASCAL VOC 数据集上展示了最快的推理速度和最高分。
  • 卫星图像要解决前景目标对象的空间范围、完全旋转不变性和大规模搜索空间相关的挑战,需要额外的专门的算法设计。
  • 卫星图像中的目标小且密集。car在最高分辨率下只有15个像素左右。
  • 旋转不变性。船舶可以具有 0 到 360 度之间的任何姿态
  • 相对缺乏训练数据
  • 超高分辨率,2.5亿像素(16000×16000)=244M仅仅取416×416的话,16000=416×38,38^2=1500个非重叠框检测框ROI

2. Related work

深度学习在高空图像中的局限性,如成群的小物体如鸟群就存在挑战。

原因① 是CNN网络方法(YOLO、SSD、Faster-RCNN)有多个下采样层。
        ■  如YOLO32倍下采样,若目标质心之间小于32像素,两个目标是无法区分的。

因此本文使用了更密集的预测网格grid。通过产生更细粒度的特征来帮助分类以提高性能。

原因②是:目标检测网络难以泛化不寻常的或者新的长宽比的目标。

  • 卫星图像上的目标具有任意方向,通过旋转和数据增强来解决这种复杂性。
  • 将训练图像沿着单位圆旋转确保分类器与目标的朝向无关,还在HSV中随机缩放图像来增加分类器的鲁棒性,来适应不同的传感器、大气条件和照明条件。
  • 在高级对象检测技术中,网络在训练和测试时看到整个图像。虽然这极大地改善了背景差异,因为网络为每个对象编码上下文语义(背景)信息,但典型硬件(具有 12GB RAM 的 NVIDIA Titan X GPU)上的内存占用对于 256 兆像素图像是不可行的。

③ 简单方法无法大尺寸卫星图像的目标检测问题:

  • 对图像上采样保证目标对grid来说足够大和分散          × 时间开销太大
  • 在图像上滑动窗口分类器,快速搜索感兴趣的目标      × 每个目标需要多个窗口大小

一个DigitalGlobe图像中的10m长的船需要100万个滑动窗口器。

我们的解决方案是:利用快速目标检测算法来评估卫星图像,将局域图像插值(~200m距离)和多尺度检测器结合起来。

将COWC的卫星数据集裁剪出416×416的图像,分别用标准13×13的YOLO网络去识别图中的car,100%误报。由于目标太小且集中,32倍下采样无法区分出小目标。标准架构网络在高密度区域的性能也很差。


代码环境配置:docker和nvidia-docker安装

注: 能自己安装、上传或导出Docker吗:https://www.easyaiforum.cn/helpDocument?manual_id=191  https://www.easyaiforum.cn/helpDocument?manual_id=191

  • 为什么要装双系统?
    • windows下的docker不能使用GPU
    • 远程主机自己就是一个docker,没法在docker里面再嵌套docker
    • 所以要自己装一个Linux系统(docker才能调用GPU)
  • 怎么理解docker?
    • docker就是用于部署环境的,而且docker里面越简单越好,最好不要在里面放代码。容器已删除就什么都没有了。所以一般是本地代码目录映射到docker容器中。目录映射在docker run创建容器时就可以设置,端口也可以设置。
    • 本地代码目录映射到Docker,然后ssh远程使用Docker中的环境。vs code的remote ssh通过端口127.0.0.1:10001 ,即可进入docker,进入container。也可以打开container的文件夹等。python解释器安装,然后选择doceker的环境解释器,整个代码就可以跑起来了。
    • docer run -it -v 10001:22       注:将主机10001端口映射到docker的22端口,22端口为ssh的端口。


综上,①要linux系统 + docker + nvidia-docker ② 调试debug要 vscode + ssh

  1. https://blog.csdn.net/haronchou/article/details/119634457 linux双系统安装
  2. 在安装docker和nvidia-docker之前,需要把bios设置好,才能安显卡驱动配置环境

    选择最后一个进入BIOS


    选择Security -> Secure Boot -> Disabled, 然后F10,保存退出

    然后重启电脑,进入ubuntu系统,打开软件和更新

    应用更改后,重启电脑。
    打开终端:nvidia-smi
  3. 安装docker:https://www.cnblogs.com/songxi/p/12788249.html
    不执行 sudo apt-get update直接选择跳过这个命令
  4. nvidia-docker安装步骤:https://zhuanlan.zhihu.com/p/139484230
    curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
    出现问题:sudo gedit /etc/apt/sources.list.d/nvidia-docker.list 进去把60行给注释掉了。
  5. typora安装:https://www.typora.io/#linux 用命令安装的,binary File安装的挺奇怪的
  6. 搜狗输入法安装:https://pinyin.sogou.com/linux/help.php

    1️⃣fcitx安装:sudo apt-get install fcitx

    2️⃣ sudo dpkg -i sogoupinyin_版本号_amd64.deb 缺少以来

    3️⃣ sudo apt -f install 安装依赖

    最后重启计算机

  7. 拉取https://github.com/avanetten/yoltv4 的代码下来:然后  
    sudo nvidia-docker build -t yoltv4_image ./yoltv4/docker
  8. 宿主机和容器交换数据:https://blog.csdn.net/weixin_45111741/article/details/104370933
    ⭕️ 宿主机到容器:docker cp 需要拷贝的文件或者目录 容器名称:容器目录

 YOLTv4 环境配置

https://github.com/avanetten/yoltv4

  1. Clone this repository (e.g. to /yoltv4/). 拉取代码到本地

  2. build docker file
    根据dockerfile来创建镜像,镜像名称为yoltv4_image,从/yoltv4/docker文件夹中的dockerfile来创建名为yoltv4_image的docker镜像。

    nvidia-docker build -t yoltv4_image /yoltv4/docker
  3. 从镜像创建容器,可以从一个镜像创建多个容器。相当于复制多份环境,不开销时间
    ① 前面要加sudo,否则会有error
    ② 代码含义如下第4条
    实际使用时,命令如下:

    # 1. 
    sudo NV_GPU=0 nvidia-docker run -it -v /local_data:/local_data -v /yoltv4:/yoltv4 -ti --ipc=host  -p 10001:22  --name yoltv4_gpu0 yoltv4_image
    
    # 端口映射到22, 将10001映射到22,  -p 8888:8888  8888是jupyter notebook的端口号
    # 格式为:-p [宿主机端口号]:[要映射的docker容器端口号] [IMAGE]:[TAG]
    
    # 2. 配置ssh
    apt-get update
    apt-get install ssh-server
    
    # 3. docker容器里面
    service ssh start
    # 自启动
    echo 'service ssh start'>>~/.bashrc
    
    # 4.passwd
    passwd
    
    vim /etc/ssh/sshd_config # 修改配置 见网络上的部分:vscode/pycharm 通过ssh与docker连接
    
    # !!!!!! 一定要执行这一步
    service ssh restart
  4. NV_GPU=0 nvidia-docker run -it -v /local_data:/local_data -v /yoltv4:/yoltv4 -ti --ipc=host --name yoltv4_gpu0 yoltv4_image
    
    # 1. NV_GPU是指定使用哪一块GPU, NV_GPU使能GPU卡
    # 2. -it  nvidia-docker run 启动镜像,将镜像转换为实例运行起来
    # -it docker将创建一个交互式的容器,可以实现应答模式。
    # -v
    # -ti
    
    $ docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG....]
     
    Options
    -- name: 容器名字
    --d: 后台运行容器
    --rm: 容器退出后删除容器
    -v: 数据卷挂载
    -p: 端口映射
    -P: 映射所有暴露的端口
    -e: 设置容器中的环境变量
    -t: 开启终端
    -i: 打开标准输入
    -u: 设置用户的UID
    -w: 设置容器中的工作目录
    -m: 内存限制
    --cpuset-cpus: 设置容器具体使用的CPU
    --add-host: 增加hosts到容器的/etc/hosts
    --privileged: 打开特权模式
    
    # 下面这个命令的含义:
    ①需要sudo 
    ② NV_GPU表明使用的哪个GPU
    ③-it交互式
    ④ -v docker目录映射,在local_data映射到local_data 
    ⑤name 容器名称 yoltv4_gpu0
    ⑥ yoltv4_image 镜像名称
    
    NV_GPU=0 nvidia-docker run -it -v /local_data:/local_data -v /yoltv4:/yoltv4 -ti --ipc=host --name yoltv4_gpu0 yoltv4_image
    
    # 这里面没有映射端口号呢 -p [宿主机端口号]:[要映射的docker容器端口号] [IMAGE]:[TAG]
    # -it 改为 -id,d让容器以守护进程的方式在后台运行。不启动docker的命令行。

dockerfile内容如下:

# 指定基础镜像,在此基础上进行定制
FROM nvidia/cuda:9.2-devel-ubuntu16.04
MAINTAINER avanetten

ENV CUDNN_VERSION 7.3.0.29
LABEL com.nvidia.cudnn.version="${CUDNN_VERSION}"

# prep apt-get and cudnn
RUN apt-get update && apt-get install -y --no-install-recommends \
	    apt-utils \
            libcudnn7=$CUDNN_VERSION-1+cuda9.0 \
            libcudnn7-dev=$CUDNN_VERSION-1+cuda9.0 && \
    apt-mark hold libcudnn7 && \
    rm -rf /var/lib/apt/lists/*
	
# install requirements
RUN apt-get update \
  	&& apt-get install -y --no-install-recommends \
	    bc \
	    bzip2 \
        apt-utils \
	    ca-certificates \
	    curl \
	    git \
	    libgdal-dev \
	    libssl-dev \
	    libffi-dev \
	    libncurses-dev \
	    libgl1 \
	    jq \
	    nfs-common \
	    parallel \
	    python-dev \
	    python-pip \
	    python-wheel \
	    python-setuptools \
	    unzip \
	    vim \
		tmux \
	    wget \
	    build-essential \
        libopencv-dev \
        python-opencv \
        eog \
        cmake \
	  && apt-get clean \
	  && rm -rf /var/lib/apt/lists/*

SHELL ["/bin/bash", "-c"]
ENV PATH /opt/conda/bin:$PATH

# install anaconda
RUN wget --quiet https://repo.anaconda.com/miniconda/Miniconda3-4.5.4-Linux-x86_64.sh -O ~/miniconda.sh && \
    /bin/bash ~/miniconda.sh -b -p /opt/conda && \
    rm ~/miniconda.sh && \
    /opt/conda/bin/conda clean -tipsy && \
    ln -s /opt/conda/etc/profile.d/conda.sh /etc/profile.d/conda.sh && \
    echo ". /opt/conda/etc/profile.d/conda.sh" >> ~/.bashrc && \
    echo "conda activate base" >> ~/.bashrc

# prepend pytorch and conda-forge before default channel
RUN conda update conda && \
    conda config --prepend channels conda-forge

# 创建yoltv4环境,python=3.7.5,路径在opt/conda/envs/yoltv4
# set up conda environment and add to $PATH
RUN conda create -n yoltv4 python=3.7.5 \
                    && echo "source activate yoltv4" > ~/.bashrc
ENV PATH /opt/conda/envs/yoltv4/bin:$PATH

RUN source activate yoltv4 \
	&& conda install -n yoltv4 \
                  geopandas \
                  gdal \
				  fiona \
				  rasterio \
	     	      awscli \
	              affine \
	              pyproj \
	              pyhamcrest \
	              cython \
	              h5py \
	              jupyter \
	              jupyterlab \
	              ipykernel \
	              libgdal \
	              matplotlib \
		          ncurses \
	              numpy \
				  statsmodels \
	              pandas \
	              pillow \
	              pip \
	              scipy \
	              scikit-image \
	              scikit-learn \
	              shapely \
	              rtree \
	              testpath \
	              tqdm \
				  opencv \
                  nodejs \
                  seaborn \
	&& conda clean -p \
	&& conda clean -t \
	&& conda clean --yes --all 

# 添加一个Jupyter核给conda环境
# # add a jupyter kernel for the conda environment in case it's wanted
# first install jupyterlab toc (https://github.com/jupyterlab/jupyterlab-toc):
RUN jupyter labextension install @jupyterlab/toc
RUN source activate yoltv4 && python -m ipykernel.kernelspec
RUN python -m ipykernel.kernelspec

# # clone yoltv4
RUN mkdir -p /opt/
RUN git clone https://github.com/avanetten/yoltv4.git /opt/yoltv4/

###################
# 指定工作目录
WORKDIR "/opt/"
# Set up our notebook config.
# open ports for jupyterlab
EXPOSE 8888
RUN ["/bin/bash"]

5. 企图开始debug调试,docker里面没法IDE一样的断点调试。
① 使用pycharm ssh docker开发环境,失败。connecting sftp一直connecting,无法成功
② 使用vs code 成功。可以打开容器

https://stackoverflow.com/questions/60490921/connecting-by-sftp-to-a-deployment-server-in-pycharm-does-not-work 卡在conneting的部分

https://blog.csdn.net/weixin_42548893/article/details/112452997 vsCode教程

配置之后的效果

 同时也可以在里面带卡notebook里面的内容。

至此,环境配置,代码运行算是告一段落!熟悉了Docker等一系列的操作

下面开始学习代码,看代码能否为我所用!加油!debug是最佳的学习工具!

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值