- 论文重点: https://blog.csdn.net/u014380165/article/details/81556805
- https://zhuanlan.zhihu.com/p/385504331
- yolo v4和YOLT结合 https://github.com/avanetten/yoltv4
- https://blog.csdn.net/z704630835/article/details/95165116 【文献阅读】YOLT算法实现遥感图像的多尺度目标识别(Adam Van Etten,2018,CVPR)
- https://blog.csdn.net/u014380165/article/details/81556805
- https://blog.csdn.net/qq_42278791/article/details/90979556 论文代码映射
- https://liumin.blog.csdn.net/article/details/105928132
PyTorch实现 作者根本没实现! - https://blog.csdn.net/u014380165/article/details/81556805 总结
- https://zhuanlan.zhihu.com/p/385504331 yolo v4和YOLT结合 https://github.com/avanetten/yoltv4
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
- https://blog.csdn.net/haronchou/article/details/119634457 linux双系统安装
- 在安装docker和nvidia-docker之前,需要把bios设置好,才能安显卡驱动配置环境
选择最后一个进入BIOS
选择Security -> Secure Boot -> Disabled, 然后F10,保存退出
然后重启电脑,进入ubuntu系统,打开软件和更新
应用更改后,重启电脑。
打开终端:nvidia-smi - 安装docker:https://www.cnblogs.com/songxi/p/12788249.html
不执行sudo apt-get update
直接选择跳过这个命令 - 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行给注释掉了。 - typora安装:https://www.typora.io/#linux 用命令安装的,binary File安装的挺奇怪的
- 搜狗输入法安装: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
安装依赖最后重启计算机
- 拉取https://github.com/avanetten/yoltv4 的代码下来:然后
sudo nvidia-docker build -t yoltv4_image ./yoltv4/docker
-
宿主机和容器交换数据:https://blog.csdn.net/weixin_45111741/article/details/104370933
⭕️ 宿主机到容器:docker cp 需要拷贝的文件或者目录 容器名称:容器目录
YOLTv4 环境配置
https://github.com/avanetten/yoltv4
-
Clone this repository (e.g. to /yoltv4/). 拉取代码到本地
-
build docker file
根据dockerfile来创建镜像,镜像名称为yoltv4_image,从/yoltv4/docker文件夹中的dockerfile来创建名为yoltv4_image的docker镜像。nvidia-docker build -t yoltv4_image /yoltv4/docker
-
从镜像创建容器,可以从一个镜像创建多个容器。相当于复制多份环境,不开销时间
① 前面要加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
-
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是最佳的学习工具!