2019-12-06 14:42:49 zzj_csdn 阅读数 165
  • Erdas遥感影像处理入门实战教程(GIS思维)

    《Erdas遥感影像处理入门实战教程》以Erdas2010版本经典界面进行实战教学,设计12章内容,正式教学内容总共45课时,15个小时时长。从软件界面开始,到后的应用,适合入门级、初级、中级的人员学习、工作、教师教学参考。课程根据作者实际工作经验,以及采访学员需求,开展课程设计,实用加实战,会是你学习路上的好帮手。

    4616 人正在学习 去看看 黄晓军

       2006年,加拿大多伦多大学教授、机器学习领域的泰斗Geoffrey Hinton和他的学生在《科学》上发表了一篇文章,开启了深度学习在学术界和工业界的浪潮。

       深度学习摧枯拉朽般地实现了各种任务,使得似乎所有的机器辅助功能都变为可能。无人驾驶汽车,预防性医疗保健,甚至是更好的电影推荐,都近在眼前,或者即将实现。

那么,深度学习算法在遥感图像处理领域是否也能发挥它的“神奇”功效,在哪些方面遥遥领先于传统方法呢?小编整理了《中国图象图形学报》2017—2019年的高关注论文,总结了深度学习在遥感图像处理中的六大应用:

  • 遥感图像检索

  • 遥感图像融合

  • 遥感图像超分辨率重建

  • 高光谱图像分类

  • 高分辨率遥感图像分类

  • SAR图像目标识别

01

遥感图像检索

如何快速且高精度地对海量遥感图像数据进行高效检索?

传统的基于内容的图像检索(CBIR)系统主要通过提取低层次的图像特征(颜色、纹理、形状)进行检索,由于没有获取图像的高层语义特征,故存在着低层视觉特征与用户对图像理解的高层语义不一致,从而导致“语义鸿沟”问题的产生。

而在图像检索过程中,卷积神经网络(CNN)通过多层次的网络学习,针对提取到的丰富特征进行检索,使得检索精度大大提升。

 

02

遥感图像融合

 

全色图像的空间细节信息增强和多光谱图像的光谱信息保持通常是相互矛盾的,如何在这对矛盾中实现最佳融合效果?

传统的多光谱与全色图像的融合方法主要包括亮度色调饱和度(IHS)法,主成分分析(PCA)法以及正交变换(GS)法等分量替代方法。这些方法能够有效提高融合图像的空间分辨率,但存在较为严重的频谱失真问题。

近年来,以小波变换为典型的多分辨率分析方法能够得到更好的多光谱图像融合效果,但存在不能有效地表示2维图像信号的缺陷。

深度学习被广泛应用于图像处理的今天,能否借助其思想,提升多光谱与全色图像的融合效果呢?

 

03

遥感图像超分辨率重建

 

如何经济便捷地获取高分辨影像一直是遥感领域的一大挑战,超分辨率(SR)重建技术恰为此类问题的解决提供了思路。

 当前主要的SR重建方法有3类:插值法、重构法和学习法。插值法是最早的SR重建方法,复杂度最低,实时性好,但结果中边缘效应明显,对细节恢复较差。

重构法是一类以时间宽度换取空间分辨率提升的方法,操作复杂,效率较低,通用性较差,目前针对遥感图像的SR重建大多仍停留在此类方法上。

学习法近年迅速发展,其克服了重构法分辨率提高倍数难确定的限制,且可面向单幅图像,是当前SR重建的主流发展方向。

学习法一般依靠构造高、低分辨率图像库,通过样本学习得到二者间内在对应关系,目前常见的基于学习的SR重建方法有邻域嵌入法、稀疏表示法和卷积神经网络(CNN)法。

 

04

高光谱图像分类

 

针对高光谱图像分类问题,既要考虑分类模型的有效性,也要充分利用丰富的空间和光谱信息。

高光谱遥感图像数据包含丰富的空间和光谱信息,但由于信号的高维特性、信息冗余、多种不确定性和地表覆盖的“同物异谱”及“同谱异物”现象,导致高光谱数据结构呈高度非线性。

与传统的人工设计特征相比,基于深度学习的图像分类能够自动提取从底层到高层语义的抽象特征,将图像转换成更容易识别的高级特征,经分类器实现图像像素到标签的映射。

3D-CNN(3D convolutional neural network)能够利用高光谱遥感影像数据立方体的特性,实现光谱和空间信息融合,提取影像分类中重要的有判别力的特征。

 

05

高分辨率遥感图像分类

 

目前CNN模型在高分辨卫星图像分类领域已经有了许多应用,但是依然存在问题。

首先,CNN模型的训练需要大量有标签样本。由于高分辨卫星图像分类领域的训练样本缺乏,上述方法普遍使用交叉验证或者随机选取的方法在有限数据上进行模型的训练和测试,模型得不到充分的训练,并且结果的说服力不足。

其次,由于有标签样本数量的限制,既不能直接训练CNN模型,也无法充分微调深层CNN模型。再次,上述方法普遍使用了CNN模型堆叠或CNN特征和传统分类器的堆叠,增加了模型和计算的复杂度。

因此,使用卷积神经网络进行高分辨率遥感影像分类需首先考虑以上问题。

06

SAR图像目标识别

 

SAR图像自动目标识别在国民经济和国防建设中有着广泛的应用,如海洋监测系统、舰船目标识别、矿藏探测等。

目前主要的SAR图像目标识别算法包括基于模板匹配的方法、基于支持向量机的方法、基于Boosting的方法、基于稀疏表示的方法等。

基于卷积神经网络的深度模型已经开始应用于SAR图像目标识别,通过学习得到的特征进行分类能够取得较高的识别精度,但是基于深度卷积神经网络的SAR目标识别方法需解决以下问题: 

  • 较少的训练样本

  • 深度模型的优化设计

  • 较长的训练时间

来源:中国图象图形学报

https://mp.weixin.qq.com/s/nRMF0-WD2ij3xkq_PG4v9g

 

 

2018-02-27 21:57:05 flopf1016821 阅读数 5662
  • Erdas遥感影像处理入门实战教程(GIS思维)

    《Erdas遥感影像处理入门实战教程》以Erdas2010版本经典界面进行实战教学,设计12章内容,正式教学内容总共45课时,15个小时时长。从软件界面开始,到后的应用,适合入门级、初级、中级的人员学习、工作、教师教学参考。课程根据作者实际工作经验,以及采访学员需求,开展课程设计,实用加实战,会是你学习路上的好帮手。

    4616 人正在学习 去看看 黄晓军

前述

根据语义特征对遥感图像场景进行分类是一项具有挑战性的任务。因为遥感图像场景的类内变化较大,而类间变化有时却较小。不同的物体会以不同的尺度和方向出现在同一类场景中,而同样的物体也可能出现在不同的场景里。

理论上,深度学习能够通过提取遥感图像的高层次特征,表征出遥感场景间的细微差别。然而,目前遥感领域并不具备足够的带标签的遥感图像用于训练深度学习中网络模型中巨量的结构参数。当采用现有遥感数据集训练深度网络模型时会出现严重的过拟合。将在 Image Net 上训练得到的深度网络模型迁移至遥感图像场景分类也成为深度学习理论应用于遥感领域的重要发展方向。经 Image Net 数据集预训练的模型能够成功迁移至遥感场景分类任务的原因在于,遥感图像和日常可见光图像的基本视觉模块(例如:边、角)是相同的。

迁移学习(Transfer Learning)的目标是将从一个环境中学到的知识用来帮助新环境中的学习任务。目前大多数机器学习算法均是假设训练数据以及测试数据的特征分布相同。然而这在现实世界中却时常不可行。例如我们我们要对一个任务进行分类,但是此任务中数据不充足(在迁移学习中也被称为目标域),然而却又需要大量的相关的训练数据(在迁移学习中也被称为源域),但是此训练数据与所需进行的分类任务中的测试数据特征分布不同(例如语音情感识别中,一种语言的语音数据充足,然而所需进行分类任务的情感数据却极度缺乏),在这种情况下如果可以采用合适的迁移学习方法则可以大大提高样本不充足任务的分类识别结果。也即是大家通常所说的将知识迁移到新环境中的能力,这通常被称为迁移学习。当两者的相似度并不大的时候,会出现负迁移的情况,这个时候就不适合做迁移。


预训练模型

简单来说,预训练模型(pre-trained model)是前人为了解决类似问题所创造出来的模型。你在解决问题的时候,不用从零开始训练一个新模型,可以从在类似问题中训练过的模型入手。比如说,如果你想做一辆自动驾驶汽车,可以花数年时间从零开始构建一个性能优良的图像识别算法,也可以从Google在ImageNet数据集上训练得到的inception model(一个预训练模型)起步,来识别图像。一个预训练模型可能对于你的应用中并不是100%的准确对口,但是它可以为你节省大量功夫。

通过使用之前在大数据集上经过训练的预训练模型,我们可以直接使用相应的结构和权重,将它们应用到我们正在面对的问题上。这被称作是“迁移学习”,即将预训练的模型“迁移”到我们正在应对的特定问题中。在选择预训练模型的时候你需要非常仔细,如果你的问题与预训练模型训练情景下有很大的出入,那么模型所得到的预测结果将会非常不准确。 
预训练模型已经训练得很好,我们就不会在短时间内去修改过多的权重,在迁移学习中用到它的时候,往往只是进行微调(fine tune)。在修改模型的过程中,我们通过会采用比一般训练模型更低的学习速率


如何使用预训练模型:

场景一:数据集小,数据相似度高(与pre-trained model的训练数据相比而言) 
在这种情况下,因为数据与预训练模型的训练数据相似度很高,因此我们不需要重新训练模型。我们只需要将输出层改制成符合问题情境下的结构就好。我们使用预处理模型作为模式提取器。比如说我们使用在ImageNet上训练的模型来辨认一组新照片中的小猫小狗。在这里,需要被辨认的图片与ImageNet库中的图片类似,但是我们的输出结果中只需要两项——猫或者狗。在这个例子中,我们需要做的就是把dense layer和最终softmax layer的输出从1000个类别改为2个类别。

场景二:数据集小,数据相似度不高 
在这种情况下,我们可以冻结预训练模型中的前k个层中的权重,然后重新训练后面的n-k个层,当然最后一层也需要根据相应的输出格式来进行修改。因为数据的相似度不高,重新训练的过程就变得非常关键。而新数据集大小的不足,则是通过冻结预训练模型的前k层进行弥补。

场景三:数据集大,数据相似度不高 
在这种情况下,因为我们有一个很大的数据集,所以神经网络的训练过程将会比较有效率。然而,因为实际数据与预训练模型的训练数据之间存在很大差异,采用预训练模型将不会是一种高效的方式。因此最好的方法还是将预处理模型中的权重全都初始化后在新数据集的基础上重头开始训练。

场景四:数据集大,数据相似度高 
这就是最理想的情况,采用预训练模型会变得非常高效。最好的运用方式是保持模型原有的结构和初始权重不变,随后在新数据集的基础上重新训练。


微调模型的方法 :
如何使用与训练模型,是由数据集大小和新旧数据集(预训练的数据集和我们要解决的数据集)之间数据的相似度来决定的。 
特征提取 
我们可以将预训练模型当做特征提取装置来使用。具体的做法是,将输出层去掉,然后将剩下的整个网络当做一个固定的特征提取机,从而应用到新的数据集中。

采用预训练模型的结构 
我们还可以采用预训练模型的结构,但先将所有的权重随机化,然后依据自己的数据集进行训练。

训练特定层,冻结其他层 
另一种使用预训练模型的方法是对它进行部分的训练。具体的做法是,将模型起始的一些层的权重保持不变,重新训练后面的层,得到新的权重。在这个过程中,我们可以多次进行尝试,从而能够依据结果找到frozen layers和retrain layers之间的最佳搭配。

2020-02-28 21:41:20 qq_44930937 阅读数 265
  • Erdas遥感影像处理入门实战教程(GIS思维)

    《Erdas遥感影像处理入门实战教程》以Erdas2010版本经典界面进行实战教学,设计12章内容,正式教学内容总共45课时,15个小时时长。从软件界面开始,到后的应用,适合入门级、初级、中级的人员学习、工作、教师教学参考。课程根据作者实际工作经验,以及采访学员需求,开展课程设计,实用加实战,会是你学习路上的好帮手。

    4616 人正在学习 去看看 黄晓军

一、我们应该制作什么样的数据集?

首先我们应该我们了解到遥感图像的变化检测是建立在多时相的基础上的,也就是说,我们对于神经网络的输入至少是有两张图片的,而且必须有一个标签来知道变化的区域的是那一块。
在双时相变化检测里,一般来说对于遥感图像的标注是在最新的时相里进行的,例如2017和2018年份的两张图片中,我们选择在2018年度的图像上进行标注。

二、双时相遥感图像变化检测的标注

一般来说变化的区域是连通的,是一片一片的,因此对于图像的标注我们可以使用labelme的多边形标注进行标注
1.在conda的环境中运行 conda install labelme指令即可安装
2.运行labelme进行标注
3.选用多边形进行标注
4.如果图片较大,推荐进行裁剪后再标注,因为后来发现,有些细小的区域人眼是很难看出来的,但是经过放大后是可以看出来的
5.注意 得用彩图标注,否则很多变化的细节都会漏掉,例如如下水体的变化
在这里插入图片描述
现在将标注的效果展示如下:
一组变化检测数据集
启动labelme的py文件可以将json文件变成五组图片 将其中的label.png挑出来即可

三、如何存放?

个人建议将不同时相的图片分别保存在不同的文件夹,加上label总共三个文件夹,推荐命名方式为纯数字,即从0到100如此即可,注意这里存放的是原始的未处理的文件夹
在这里插入图片描述
然后在后面进行裁剪的时候在放在其他的文件夹
其中x文件夹存放裁剪好的图片,y存放标签,然后图片的命名为数字+字母
A表示变化 B表示不变化在这里插入图片描述

四、裁剪

将其裁剪为64*64的块,采用随机生成的方法,
其中x,y是随机生成的,代码如下:
下面的Import的东西可以忽略 只是将自己的库都Import了一遍,数据增强的东西可以另外放一个Py文件。
步骤为:
1.设定路径
2.读取路径下的所有图片的名字(注意用数字编号开头)
3.裁剪图片
4.裁剪的图片分别以jpg,png进行保存,2017,2018年份的图片分别为两种格式相同名称,标签存在另一个文件夹
5.

import numpy as np
import matplotlib
from matplotlib import pyplot as plt

import cv2
import PIL
import json, os
import sys
from PIL import Image
import labelme
import labelme.utils as utils
import glob
import itertools

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers,optimizers,losses
from tensorflow.keras.callbacks import EarlyStopping
from tensorflow.python.keras import backend as K


#存储路径
origin_path=r'F:\BaiduNetdiskDownload\U_net_dataset\eval\origin'
change_path=r'F:\BaiduNetdiskDownload\U_net_dataset\eval\change'
label_path=r'F:\BaiduNetdiskDownload\U_net_dataset\eval\label'
x_path=r'F:\BaiduNetdiskDownload\x'
y_path=r'F:\BaiduNetdiskDownload\y'
#读取列表名
origin_list= glob.glob(origin_path+'/*.jpg')
origin_list.sort()
change_list= glob.glob(change_path+'/*.jpg')
change_list.sort()
label_list= glob.glob(label_path +'/*.png')
label_list.sort()


#设定裁剪大小
cropping_height = 64
cropping_width = 64
#图像编号初始化
number=0

for k in range(len(origin_list)):#对所有图像和标签进行裁剪
    origin_position,change_position,label_position=next(zipped)
    origin_img=cv2.imread(origin_position,-1)
    change_img=cv2.imread(change_position,-1)
    label_img =cv2.imread(label_position,-1)

    shape = origin_img.shape
    zero_mat=np.zeros(shape=[cropping_height,cropping_width,3])
    print(zero_mat.shape)
    
    i=0
    true_number = 0
    false_number = 0

    while i <=10000:#每张图片生成一万张图片

            y=np.random.randint(0, shape[0]-cropping_height)
            x=np.random.randint(0, shape[1]-cropping_width)
            cropping1 = origin_img[y:(y + cropping_height),x:(x + cropping_width)]
            cropping2 = change_img[y:y+ cropping_height,x:x + cropping_width]
            cropping3 = label_img[y:y + cropping_height,x:x + cropping_width]
            
       #判断矩阵是否为0矩阵,来说明是否变化

            if ((cropping3==zero_mat).all()) :#A为变化 B为不变化
                if((np.abs(true_number-false_number)>50)):
                    print(true_number,false_number)
                    continue
                cv2.imwrite(x_path + '/' + str(number) + 'B' + '.jpg', cropping1)
                cv2.imwrite(x_path + '/' + str(number) + 'B' + '.png', cropping2)
                # cv2.imwrite(y_path + '/' + str(number) + 'B' + '.png', cropping3)
                false_number += 1
                number+=1


            else:
                cv2.imwrite(x_path + '/' + str(number) + 'A' + '.jpg', cropping1)
                cv2.imwrite(x_path + '/' + str(number) + 'A' + '.png', cropping2)
                # cv2.imwrite(y_path + '/' + str(number) + 'A' + '.png', cropping3)
                true_number+=1
                number+=1
            i=i+1
            print('number',number)

五、数据集

如果想要数据集的可以付5币支援下我,毕竟标注了很久(数个小时)

2018-07-19 22:05:02 zhenaoxi1077 阅读数 494
  • Erdas遥感影像处理入门实战教程(GIS思维)

    《Erdas遥感影像处理入门实战教程》以Erdas2010版本经典界面进行实战教学,设计12章内容,正式教学内容总共45课时,15个小时时长。从软件界面开始,到后的应用,适合入门级、初级、中级的人员学习、工作、教师教学参考。课程根据作者实际工作经验,以及采访学员需求,开展课程设计,实用加实战,会是你学习路上的好帮手。

    4616 人正在学习 去看看 黄晓军

图像配准相关论文代码:
9)Opencv日常之Homography
根据两幅图像相同位置的点对得到变换矩阵H
链接:https://blog.csdn.net/liuphahaha/article/details/50719275

8)Opencv透视变换
warpPerspective函数
https://blog.csdn.net/qq_18343569/article/details/47953843

7)opencv实现最基本的图像配准
https://blog.csdn.net/u011630458/article/details/50561188

6)图像配准简介
https://blog.csdn.net/carson2005/article/details/38757379

5)第八章 医学图像的配准和融合
https://blog.csdn.net/qq_22337877/article/details/52512696

4)icp配准算法 免费开源代码 开发,分享 - CodeForge.cn
http://www.codeforge.cn/article/238435

3)https://blog.csdn.net/wangye_hope/article/details/80009342
TPS算法论文:

MATLAB代码;

2)sift 尺度不变特征提取以及TPS配准:
https://download.csdn.net/download/negative_09/10384509
MATLAB代码、Python代码

1)图像配准C++代码:
https://download.csdn.net/download/wanguangtong/8093831#comment
(不知道是什么算法)

0)图像配准入门:
https://blog.csdn.net/fairylrt/article/details/38054857

2018-11-14 10:20:05 qq_23589775 阅读数 635
  • Erdas遥感影像处理入门实战教程(GIS思维)

    《Erdas遥感影像处理入门实战教程》以Erdas2010版本经典界面进行实战教学,设计12章内容,正式教学内容总共45课时,15个小时时长。从软件界面开始,到后的应用,适合入门级、初级、中级的人员学习、工作、教师教学参考。课程根据作者实际工作经验,以及采访学员需求,开展课程设计,实用加实战,会是你学习路上的好帮手。

    4616 人正在学习 去看看 黄晓军

前述

根据语义特征对遥感图像场景进行分类是一项具有挑战性的任务。因为遥感图像场景的类内变化较大,而类间变化有时却较小。不同的物体会以不同的尺度和方向出现在同一类场景中,而同样的物体也可能出现在不同的场景里。

理论上,深度学习能够通过提取遥感图像的高层次特征,表征出遥感场景间的细微差别。然而,目前遥感领域并不具备足够的带标签的遥感图像用于训练深度学习中网络模型中巨量的结构参数。当采用现有遥感数据集训练深度网络模型时会出现严重的过拟合。将在 Image Net 上训练得到的深度网络模型迁移至遥感图像场景分类也成为深度学习理论应用于遥感领域的重要发展方向。经 Image Net 数据集预训练的模型能够成功迁移至遥感场景分类任务的原因在于,遥感图像和日常可见光图像的基本视觉模块(例如:边、角)是相同的。

迁移学习(Transfer Learning)的目标是将从一个环境中学到的知识用来帮助新环境中的学习任务。目前大多数机器学习算法均是假设训练数据以及测试数据的特征分布相同。然而这在现实世界中却时常不可行。例如我们我们要对一个任务进行分类,但是此任务中数据不充足(在迁移学习中也被称为目标域),然而却又需要大量的相关的训练数据(在迁移学习中也被称为源域),但是此训练数据与所需进行的分类任务中的测试数据特征分布不同(例如语音情感识别中,一种语言的语音数据充足,然而所需进行分类任务的情感数据却极度缺乏),在这种情况下如果可以采用合适的迁移学习方法则可以大大提高样本不充足任务的分类识别结果。也即是大家通常所说的将知识迁移到新环境中的能力,这通常被称为迁移学习。当两者的相似度并不大的时候,会出现负迁移的情况,这个时候就不适合做迁移。

预训练模型

简单来说,预训练模型(pre-trained model)是前人为了解决类似问题所创造出来的模型。你在解决问题的时候,不用从零开始训练一个新模型,可以从在类似问题中训练过的模型入手。比如说,如果你想做一辆自动驾驶汽车,可以花数年时间从零开始构建一个性能优良的图像识别算法,也可以从Google在ImageNet数据集上训练得到的inception model(一个预训练模型)起步,来识别图像。一个预训练模型可能对于你的应用中并不是100%的准确对口,但是它可以为你节省大量功夫。

通过使用之前在大数据集上经过训练的预训练模型,我们可以直接使用相应的结构和权重,将它们应用到我们正在面对的问题上。这被称作是“迁移学习”,即将预训练的模型“迁移”到我们正在应对的特定问题中。在选择预训练模型的时候你需要非常仔细,如果你的问题与预训练模型训练情景下有很大的出入,那么模型所得到的预测结果将会非常不准确。
预训练模型已经训练得很好,我们就不会在短时间内去修改过多的权重,在迁移学习中用到它的时候,往往只是进行微调(fine tune)。在修改模型的过程中,我们通过会采用比一般训练模型更低的学习速率
如何使用预训练模型:

场景一:数据集小,数据相似度高(与pre-trained model的训练数据相比而言)
在这种情况下,因为数据与预训练模型的训练数据相似度很高,因此我们不需要重新训练模型。我们只需要将输出层改制成符合问题情境下的结构就好。我们使用预处理模型作为模式提取器。比如说我们使用在ImageNet上训练的模型来辨认一组新照片中的小猫小狗。在这里,需要被辨认的图片与ImageNet库中的图片类似,但是我们的输出结果中只需要两项——猫或者狗。在这个例子中,我们需要做的就是把dense layer和最终softmax layer的输出从1000个类别改为2个类别。

场景二:数据集小,数据相似度不高
在这种情况下,我们可以冻结预训练模型中的前k个层中的权重,然后重新训练后面的n-k个层,当然最后一层也需要根据相应的输出格式来进行修改。因为数据的相似度不高,重新训练的过程就变得非常关键。而新数据集大小的不足,则是通过冻结预训练模型的前k层进行弥补。

场景三:数据集大,数据相似度不高
在这种情况下,因为我们有一个很大的数据集,所以神经网络的训练过程将会比较有效率。然而,因为实际数据与预训练模型的训练数据之间存在很大差异,采用预训练模型将不会是一种高效的方式。因此最好的方法还是将预处理模型中的权重全都初始化后在新数据集的基础上重头开始训练。

场景四:数据集大,数据相似度高
这就是最理想的情况,采用预训练模型会变得非常高效。最好的运用方式是保持模型原有的结构和初始权重不变,随后在新数据集的基础上重新训练。

微调模型的方法 :
如何使用与训练模型,是由数据集大小和新旧数据集(预训练的数据集和我们要解决的数据集)之间数据的相似度来决定的。
特征提取
我们可以将预训练模型当做特征提取装置来使用。具体的做法是,将输出层去掉,然后将剩下的整个网络当做一个固定的特征提取机,从而应用到新的数据集中。

采用预训练模型的结构
我们还可以采用预训练模型的结构,但先将所有的权重随机化,然后依据自己的数据集进行训练。

训练特定层,冻结其他层
另一种使用预训练模型的方法是对它进行部分的训练。具体的做法是,将模型起始的一些层的权重保持不变,重新训练后面的层,得到新的权重。在这个过程中,我们可以多次进行尝试,从而能够依据结果找到frozen layers和retrain layers之间的最佳搭配。

作者:flopf
来源:CSDN
原文:https://blog.csdn.net/flopf1016821/article/details/79393205
版权声明:本文为博主原创文章,转载请附上博文链接!

没有更多推荐了,返回首页