【飞桨开发者说】马云飞,枣庄学院地理信息科学专业在读,计算机视觉技术爱好者,研究方向为神经网络在遥感领域的应用等。

高光谱反演是什么?

高光谱反演是使用遥感卫星拍摄的高光谱数据以及实地采样化验的某物质含量数据来建立一个反演模型。简单来说就是:有模型以后卫星一拍,就能得知土壤中某物质的含量,不用实地采样化验了。

高光谱遥感可应用在矿物精细识别(比如油气资源及灾害探测)、地质环境信息反演(比如植被重金属污染探测)、行星地质探测(比如中国行星探测工程 天问一号)等。目前有许多模型可用于高光谱反演,如线性模型、自然对数模型、包络线去除模型、简化Hapke模型,人工神经网络模型等,本文选择线性模型进行研究。

准备数据集

本次使用的数据集是前段时间跟一位博士师哥学习时使用的数据,是师哥辛辛苦苦从各地采样带回实验室化验以及处理遥感图像得来的。我们常用的遥感卫星有高分一号、高分二号、Landsat7 、Landsat8等。以Lansat8为例,其OLI陆地成像仪包括9个波段,空间分辨率为30米,其中包括一个15米的全色波段,成像宽幅为185x185km。热红外传感器TIRS包括2个单独的热红外波段,分辨率100米。以下是各波段的常见用途。

本次使用的数据集格式如下:切割数据的比例要考虑到两个因素:更多的训练数据会降低参数估计的方差,从而得到更可信的模型;而更多的测试数据会降低测试误差的方差,从而得到更可信的测试误差。我们这个例子中设置的分割比例为8:2。以下代码可直接在百度AI Studio 上fork我的项目来运行:https://aistudio.baidu.com/aistudio/projectdetail/693750/

dataset = pd.read_csv('data/data48548/data.csv')#读取数据集  # df转array  values = dataset.values  # 原始数据标准化,为了加速收敛  scaler = MinMaxScaler(feature_range=(0, 1))  scaled = scaler.fit_transform(values)  data = scaled  ratio = 0.8 # 训练集和验证集的划分比例  offset = int(data.shape[0]*ratio)  train_data = data[:offset]  test_data = data[offset:]  def reader_creator(train_data):    def reader():    for d in train_data:    yield d[:-1], d[-1:]    return reader  BUF_SIZE=50  BATCH_SIZE=20  #用于训练的数据提供器,每次从缓存中随机读取批次大小的数据  train_reader = paddle.batch(      paddle.reader.shuffle(reader_creator(train_data),                             buf_size=BUF_SIZE),                          batch_size=BATCH_SIZE)     #用于测试的数据提供器,每次从缓存中随机读取批次大小的数据  test_reader = paddle.batch(      paddle.reader.shuffle(reader_creator(test_data),                            buf_size=BUF_SIZE),      batch_size=BATCH_SIZE)   

配置训练程序

下面我们开始配置训练程序,目的是定义一个训练模型的网络结构。

对于线性回归来讲,它就是一个从输入到输出的简单的全连接层。训练程序必须返回 平均损失作为第一个返回值,因为它会被后面反向传播算法所用到。优化器选择的是 SGD(随机梯度下降)optimizer,其中 learning_rate 是学习率,与网络的训练收敛速度有关系。代码如下:

#定义张量变量x,表示14维的特征值x = fluid.layers.data(name='x', shape=[14], dtype='float32')#定义张量y,表示1维的目标值y = fluid.layers.data(name='y', shape=[1], dtype='float32')#定义一个简单的线性网络,连接输入和输出的全连接层#input:输入tensor;#size:该层输出单元的数目#act:激活函数y_predict=fluid.layers.fc(input=x,size=1,act=None)cost = fluid.layers.square_error_cost(input=y_predict, label=y) #求一个batch的损失值avg_cost = fluid.layers.mean(cost)  optimizer = fluid.optimizer.SGDOptimizer(learning_rate=0.001)opts = optimizer.minimize(avg_cost)

开始训练

请使用如下代码开始训练,其中EPOCH_NUM为模型的训练轮数,这个数量要适中,否则可能发生过拟合等问题

model_save_dir:模型的保存目录,保存下来,下次就可以继续训练或者直接推理了。

for pass_id in range(EPOCH_NUM):                                  #训练EPOCH_NUM轮# 开始训练并输出最后一个batch的损失值    train_cost = 0for batch_id, data in enumerate(train_reader()):              #遍历train_reader迭代器        train_cost = exe.run(program=fluid.default_main_program(),#运行主程序                             feed=feeder.feed(data),              #喂入一个batch的训练数据,根据feed_list和data提供的信息,将输入数据转成一种特殊的数据结构                             fetch_list=[avg_cost])    if batch_id % 40 == 0:            print("Pass:%d, Cost:%0.5f" % (pass_id, train_cost[0][0]))    #打印最后一个batch的损失值        iter=iter+BATCH_SIZE        iters.append(iter)        train_costs.append(train_cost[0][0])# 开始测试并输出最后一个batch的损失值    test_cost = 0for batch_id, data in enumerate(test_reader()):               #遍历test_reader迭代器        test_cost= exe.run(program=test_program, #运行测试cheng                            feed=feeder.feed(data),               #喂入一个batch的测试数据                            fetch_list=[avg_cost])                #fetch均方误差    print('Test:%d, Cost:%0.5f' % (pass_id, test_cost[0][0]))     #打印最后一个batch的损失值

训练过程图:

模型预测

需要构建一个使用训练好的模型来进行预测的程序,训练好的模型位置在 model_save_dir 。

with fluid.scope_guard(inference_scope):#修改全局/默认作用域(scope), 运行时中的所有变量都将分配给新的scope。#从指定目录中加载 推理model(inference model)    [inference_program,                             #推理的program     feed_target_names,                             #需要在推理program中提供数据的变量名称     fetch_targets] = fluid.io.load_inference_model(#fetch_targets: 推断结果                                    model_save_dir, #model_save_dir:模型训练路径                                     infer_exe)      #infer_exe: 预测用executor#获取预测数据    infer_reader = paddle.batch(reader_creator(test_data),  #测试数据                          batch_size=20)                #从测试数据中读取一个大小为20的batch数据#从test_reader中分割x    test_data = next(infer_reader())    test_x = np.array([data[0] for data in test_data]).astype("float32")    test_y= np.array([data[1] for data in test_data]).astype("float32")    results = infer_exe.run(inference_program,                #预测模型    feed={feed_target_names[0]: np.array(test_x)},  #输入光谱数据    fetch_list=fetch_targets)            #得到推测含量

将结果进行可视化,横轴为实际含量,纵轴为根据光谱预测的含量,大部分得结果还是比较接近得。至此,我们获得了通过光谱看到土壤中某物质含量的火眼金睛啦!高光谱反演的用途还有许多,快快在AI Studio中fork项目展示出你的创意吧:https://aistudio.baidu.com/aistudio/projectdetail/693750/如在使用过程中有问题,可加入飞桨官方QQ群进行交流:1108045677。
如果您想详细了解更多飞桨的相关内容,请参阅以下文档。飞桨官网地址:https://www.paddlepaddle.org.cn/飞桨开源框架项目地址:GitHub: https://github.com/PaddlePaddle/Paddle Gitee: https://gitee.com/paddlepaddle/Paddle


高光谱数据集_基于飞桨实现高光谱反演:通过遥感数据获取土壤某物质含量相关推荐

  1. 基于飞桨 DeepLabV3+实现人体肾组织图像中肾小球识别

    基于飞桨 DeepLabV3+实现人体肾组织图像中肾小球识别 一.项目背景 估计显示,地球上有超过70亿人,银河系中有3000亿颗恒星.相比之下,成年人体内含有37万亿个细胞.确定这些细胞之间的功能和 ...

  2. 基于飞桨实现高精度岩相自动分析,助力油气田勘探开发设计

    1. 概述 1.1 行业背景与痛点 岩相分析是以岩石薄片的微观描述和分类为基础的研究工作,也是沉积和成岩研究的一项重要技术,对于油气勘探开发的工程实践具有基础性指导地位.通过薄片分析矿物的比例.分布. ...

  3. [C4AI_2022]基于飞桨的无人机智能工地安全监管系统

    ★★★ 本文源自AI Studio社区精品项目,[点击此处]查看更多精品内容 >>> 基于飞桨的无人机智能工地安全监管系统 项目展示 scrolling="no" ...

  4. [C4-AI2022]基于飞桨的手语翻译与辅助教学系统

    ★★★ 本文源自AI Studio社区精品项目,[点击此处]查看更多精品内容 >>> 基于飞桨的手语翻译与辅助教学系统 项目概述 世卫组织统计,现今有1.5亿人患有听力障碍,而到20 ...

  5. 基于“飞桨”的深度学习智能车

    本文作者:吴东昱,北京钢铁侠科技深度学习算法工程师 前言   我在观察历届智能车竞赛以及教学实验中发现,采用传统视觉算法的视觉智能车只能在特定赛道中行驶,一旦赛道环境改变,必须修改大量的代码才能运行. ...

  6. 基于飞桨图像分类套件PaddleClas的柠檬分类竞赛实战

    前情提要   通过之前教程中的学习,相信大家对于如何搭建一个分类网络已经清晰了.那么我们不禁会想,有没有更快速的尝试模型及技巧的方法呢?因为我们在上一次课程中使用的代码都需要自己进行开发,自己写需要很 ...

  7. 基于飞桨复现图像分类模型TNT,实现肺炎CT分类

    本项目介绍了TNT图像分类模型,讲述了如何使用飞桨一步步构建TNT模型网络结构,并尝试在新冠肺炎CT数据集上进行分类.由于作者水平有限,若有不当之处欢迎批评指正. TNT模型介绍 TNT模型全称是Tr ...

  8. 强烈推荐 | 基于飞桨的五大目标检测模型实战详解

    机器视觉领域的核心问题之一就是目标检测(object detection),它的任务是找出图像当中所有感兴趣的目标(物体),确定其位置和大小.对于人类来说,目标检测是一个非常简单的任务.然而,计算机能 ...

  9. 基于飞桨的小样本学习工具包助你举一反三

    王雅晴,PaddleFSL负责人.飞桨高级开发者技术专家(高级PPDE).2019年博士毕业于香港科技大学计算机科学及工程学系.通过百度公司AIDU计划加入百度研究院商业智能实验室,现任资深研发工程师 ...

最新文章

  1. 前端学习(1295):第三方模块npm
  2. Delphi Format函数功能及用法详解
  3. 无内存在优盘可以启动计算机吗,没有U盘不要紧,内存卡做启动盘装Win7方法
  4. HTTPS原理与流程
  5. 1019 数字黑洞 (20)
  6. LINUX下载编译redis
  7. 使用ColorUI组件
  8. 文本转成图片(自动换行、自定义字体),图片抗锯齿优化,图片压缩优化
  9. [自测]linux运维100题目(阿里巴巴内部题目)
  10. 20.SPDY_QUIC_HTTP2_HTTP3
  11. 游戏网络架构逆向分析--1
  12. 【牛客网】算法学习笔记
  13. requests+正则表达式爬取猫眼电影TOP100!
  14. 解决win10访问xp服务器共享文件出现smb1问题
  15. Centos下openresty-1.19.9-1环境搭建
  16. Arduino遥控小车
  17. SQLPro Studio for Mac(可视化数据库管理工具)
  18. Vlan 单线复用之复式二层住宅网络改造实操案例(一)
  19. 一个ACM底层参赛选手的退役感言
  20. NtripShare EdgeEngine GNSS边缘解算盒子/模块/软件用户手册

热门文章

  1. python n个list如何组成矩阵_有序矩阵中第K小的元素amp;x的平方根(二分法篇)
  2. 计算机手速如何学,南华学子巧用计算机,比拼手速与才思
  3. 鸿蒙os智能座舱,华为智能座舱的野心:HiCar上车,为鸿蒙OS铺路
  4. java设计模式 建造模式_理解java设计模式之建造者模式
  5. cad怎么选择一个对象打散vba_CAD制图的二十四字秘诀!
  6. 5v继电器模块实物接线_电气工程师都收藏的西门子S71200PLC接线图设计大全
  7. android x86 sleep,如何打开Android X86对houdini的支持
  8. oracle 进入gdsctl,oracle的分析函数over 及开窗函数[转]
  9. 转list_quot;quot;转 Int,{} 转 List,还有什么奇葩的 JSON 要容错?| 实战
  10. Java讲课笔记02:Java集成开发环境