基于CNN遥感图象分类+前后端交互

2023-11-10

                           基于CNN遥感图像分类+前后端交互

                           基于CNN遥感图像分类+前后端交互

一、项目介绍

1.1 项目简述

1.2 几个概念

二、遥感图片分类模型

 2.1 训练数据的处理

三、效果展示

参考资料


项目完整代码:GitHub

一、项目介绍

1.1 项目简述

         通过遥感影像判读识别地物,进行地物信息的识别,提取,分类,进行动态变化监测,以及专题地图制作,遥感图库的建立,设计初期各种格局指数的计算,以及安全格局的建立,都要以图像分类为基础。该项目采用CNN神经网络实现对遥感图片的分类,准确率在90%左右,网络架构中有三层卷积层,两层全连接层,最后采用Softmax激活函数计算每个目标类别在所有可能的目标类中的概率,即可对传入的图片进行分类。后端采用Flask框架实现用户在前端提交页面后,后台调用训练好的模型对传入图片进行分类,再将结果返回到前端页面。可视化方面提取模型训练过程中生成的训练信息中的模型准确率和损失值作为数据,利用E-Chars图表进行动态展示。

                                                                                                 项目架构图

1.2 几个概念

有监督学习(Supervised learning)

图像分类是属于深度学习的有监督学习方式,有监督学习的任务是在给定大量组“输入数据-输出结果”的数据中,学习一个可以描述这中关系的“函数”的过程。与此相对的是无监督学习(Unsupervised learning),无监督学习是一种机器学习的另一种方式,它在没有预先存在的标签和最少的人工监督的情况下,在数据集中寻找先前未检测到的模式。

卷积神经网络(Convolutional Neural Networks)

  CNN被广泛用来做图像识别、图像分类、目标检测等任务。CNN中每个输入图像都会通过一系列带滤波器(Filter )、池(Pooling)、完全连接层(Fully connected)的卷积层,以获得更强的表达能力,并应用Softmax函数对概率值介于0到1之间的对象进行分类。例如猫狗分类中,通过向网络中传入一张图片经过各层运算后得到是猫和狗概率值分别为0.45和0.98,所以判断传入图片属于狗。下图是CNN处理输入图像的完整流程。  

Image for post          来源:https://medium.com/@RaghavPrabhu/understanding-of-convolutional-neural-network-cnn-deep-learning-99760835f148

其中有几个关键操作:

  • 卷积(Convolution)

卷积神经网络的名称表明该类神经网络采用一种称为卷积的数学运算。卷积是一种特殊的线性运算。卷积网络是一种简单的神经网络,它在至少一个层中使用卷积代替一般的矩阵乘法卷积是从输入图像中提取特征的第一层,通过使用滤波器(Filter)学习图像特征来保持像素之间的关系。用不同的滤波器对图像进行卷积可以进行边缘检测、模糊和锐化等操作。二维数据的卷积操作如下图所示。                           

卷积神经网络之卷积计算、作用与思想

                                                                             来源:网络

  •      池化(Pooling)

      池化层也叫下采样层,与卷积层类似,池化层负责减小卷积特征的空间大小。

      主要作用:(1) 降低信息冗余;(2) 提升模型的尺度不变性、旋转不变性;(3) 防止过拟合。

     一般有:

               平均池化(average pooling):计算图像区域的平均值作为该区域池化后的值。             

               最大池化(max pooling):选图像区域的最大值作为该区域池化后的值。

  •     全连接层(Fully Connected Layer)

   添加全连接层是学习由卷积层的输出表示的高级特征的非线性组合的方法。全连接层在这个空间学习一个可能的非线性函数。我们将矩阵展平成向量,然后将其输入到一个完全连接的层中。

来源:https://medium.com/@RaghavPrabhu/understanding-of-convolutional-neural-network-cnn-deep-learning-99760835f148

二、遥感图片分类模型

 2.1 训练数据的处理

该项目采用的是数据集是尺寸为256x256的遥感图片,每种图片700张,种类有沙漠、岛屿、公路、房屋,如下图所示。

2.1.1 图像数据预处理

import cv2
import os
import glob
from sklearn.utils import shuffle
import numpy as np

load_train函数主要实现对多个文件中的图像,通过从cv2读入转化为矩阵,并对每张图片打标签,这里体现了监督式学习。

# 图像预处理
def load_train(train_path, image_size, classes):
    # 保存所有读入图像的矩阵
    images = []
    # 总标签列表记录所有读入的,图像的标签
    labels = []
    img_names = []
    cls = []

    print('现在开始读取图像:')
    # 遍历类比:先读island的图像,再读seaice的图像
    for fields in classes:
        k = 1
        index = classes.index(fields)
        print('现在读取 {} 文件夹下图片 (索引号: {})'.format(fields, index))
        path = os.path.join(train_path, fields, '*g')  # 把文件夹下的所有图片的路径拿到
        files = glob.glob(path)  # 遍历每个图片
        # 高速路类、房屋的变量
        for fl in files:
            image = cv2.imread(fl)
            #  将图像大小转成64x64
            image = cv2.resize(image, (image_size, image_size), 0, 0, cv2.INTER_LINEAR)
            k = k + 1
            image = image.astype(np.float32)
            # 归一化:矩阵数值都转成0到1之间
            image = np.multiply(image, 1.0 / 255.0)
            # 加到总图像列表中
            images.append(image)
            # 每类图片有自己的label
            label = np.zeros(len(classes))
            # 例如:高速路时:label=[0,1,0,0]  房屋时:label=[0,0,1,0]
            label[index] = 1.0
            labels.append(label)
            flbase = os.path.basename(fl)
            img_names.append(flbase)
            cls.append(fields)

    # 把所有列表转换为一维数组/矩阵
    images = np.array(images)
    labels = np.array(labels)
    img_names = np.array(img_names)
    # 所有图片所属标签
    cls = np.array(cls)

    # 图片已拿到并预处理:把读入并加过标签的数据返回为辅助函数3
    return images, labels, img_names, cls

2.1.2 划分训练集和测试集

因为图片的读入是按照已经划分好类别进行读入的,所以每类图片都是集中在一起的,划分前需要对数据集进行打乱再按照比例进行打乱。

# 打乱数据集并分为测试集和训练集
def read_train_sets(train_path, image_size, classes, validation_size):
    class DataSets(object):
        pass

    data_sets = DataSets()

    # 调用图像预处理函数
    images, labels, img_names, cls = load_train(train_path, image_size, classes)
    # 打乱数据集
    images, labels, img_names, cls = shuffle(images, labels, img_names, cls)

    # 设定测试集的样本数:(判断数据类型isinstance)
    if isinstance(validation_size, float):
        # 测试集个数 = 20% * 1400
        validation_size = int(validation_size * images.shape[0])

    # 测试集
    validation_images = images[:validation_size]
    validation_labels = labels[:validation_size]
    validation_img_names = img_names[:validation_size]
    validation_cls = cls[:validation_size]

    # 训练集
    train_images = images[validation_size:]
    train_labels = labels[validation_size:]
    train_img_names = img_names[validation_size:]
    train_cls = cls[validation_size:]

    # 调用函数2:
    data_sets.train = DataSet(train_images, train_labels, train_img_names, train_cls)
    data_sets.valid = DataSet(validation_images, validation_labels, validation_img_names, validation_cls)

    # 返回一个包含训练集和测试集相关信息的类
    return data_sets

2.2 构建CNN神经网络

为创建卷积层、全连接层编写函数方便调用

# 权重参数设置
def create_weights(shape):
    return tf.Variable(tf.truncated_normal(shape, stddev=0.05))

def create_biases(size):
    return tf.Variable(tf.constant(0.05, shape=[size]))
# 创建卷积层的函数:卷积池化各层参数的设置与工作
def create_convolutional_layer(input,
                               num_input_channels,
                               conv_filter_size,
                               num_filters):
    # 权重参数初始化:3 3 3 32
    # 前两个参数是滑动窗尺寸3x3 第三个参数为3通量 第4个参数是这一层观察多少个特征
    weights = create_weights(shape=[conv_filter_size, conv_filter_size, num_input_channels, num_filters])
    biases = create_biases(num_filters)

    # 执行一次卷积操作
    layer = tf.nn.conv2d(input=input,
                         filter=weights,
                         strides=[1, 1, 1, 1],
                         padding='SAME')

    layer += biases

    # relu激活函数:激活后的数值传给下一步
    layer = tf.nn.relu(layer)

    # 池化操作:上一卷积层的输出就是这里的输入;池化窗尺寸为2x2
    layer = tf.nn.max_pool(value=layer,
                           ksize=[1, 2, 2, 1],
                           strides=[1, 2, 2, 1],
                           padding='SAME')

    return layer
# 全连接层参数的设置
def create_flatten_layer(layer):
    # 把到最后一个卷积池化层的尺寸:[7,8,8,64]
    # 既然是全连接层,就要把它拉伸;即对这个全连接层的"输入"应有8x8x64=4096个
    layer_shape = layer.get_shape()

    # 计算得到那个4096的数值
    num_features = layer_shape[1:4].num_elements()

    # 转换成数组/矩阵
    layer = tf.reshape(layer, [-1, num_features])

    return layer


# 全连接层创建与工作
def create_fc_layer(input,
                    num_inputs,
                    num_outputs,
                    use_relu=True):
    # 全连接层的权重参数等的设置
    weights = create_weights(shape=[num_inputs, num_outputs])
    biases = create_biases(num_outputs)

    # 计算:
    layer = tf.matmul(input, weights) + biases

    # dropout解决过拟合,随机剔除30%个节点
    layer = tf.nn.dropout(layer, keep_prob=0.7)

    # relu激活函数
    if use_relu:
        layer = tf.nn.relu(layer)

    return layer

模型训练函数

def train(num_iteration):
    global total_iterations

    for i in range(total_iterations,
                   total_iterations + num_iteration):


        x_batch, y_true_batch, _, cls_batch = data.train.next_batch(batch_size)
        x_valid_batch, y_valid_batch, _, valid_cls_batch = data.valid.next_batch(batch_size)

        # 做好每一个epoch
        feed_dict_tr = {x: x_batch, y_true: y_true_batch}
        feed_dict_val = {x: x_valid_batch, y_true: y_valid_batch}

        # 开始运行训练
        # 保存权重信息,在tensorboard可视化显示
        summary, _ = session.run([merged, optimizer], feed_dict=feed_dict_tr)
        writer.add_summary(summary, i)

        if i % int(data.train.num_examples / batch_size) == 0:
            # 损失值
            val_loss = session.run(cost, feed_dict=feed_dict_val)
            epoch = int(i / int(data.train.num_examples / batch_size))
            show_progress(epoch, feed_dict_tr, feed_dict_val, val_loss, i)
            # 保存文件夹的地方
            saver.save(session, './model1/savemodel.ckpt', global_step=i)

    total_iterations += num_iteration

模型训练记录

三、效果展示

传入一张岛屿图片,下方显示模型分类结果

模型相关信息在tensorboard查看

  • 模型结构

  • 模型训练过程的信息

  • 权重信息

参考资料

 【1】Stuart J. Russell, Peter Norvig (2010) Artificial Intelligence: A Modern Approach, Third Edition, Prentice Hall ISBN 9780136042594.

【2】http://cadesign.cn/bbs/thread-548-1-1.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于CNN遥感图象分类+前后端交互 的相关文章

  • Python的unpack中的逗号是什么意思?

    我们可以简单地使用 crc struct unpack gt i data 为什么人们这样写 crc struct unpack gt i data 逗号是什么意思 第一个变体返回一个单元素元组 In 13 crc struct unpac
  • 从终端调用时 uvicorn 不工作

    我尝试通过 pip3 在系统上安装 uvicorn 这有效 但是我无法从命令行运行相同的命令 有关如何解决此问题的任何指示 Requirement already satisfied uvicorn in home vhawk19 loca
  • 对 Python DataFrame 进行子集化

    我正在从 R 过渡到 Python 我刚刚开始使用 Pandas 我有一个可以很好地子集化的 R 代码 k1 lt subset data Product p id Month lt mn Year yr select c Time Pro
  • Python 按文件夹模块导入

    我有一个目录结构 example py templates init py a py b py a py and b py只有一个类 名称与文件相同 因为它们是猎豹模板 纯粹出于风格原因 我希望能够在中导入和使用这些类example py像
  • 如何在 pygame 中聚焦光线或如何仅绘制窗口的某些圆形部分?

    对于这一点 如果您熟悉它 请想想 超级马里奥制造2 中嘘关卡中的黑暗模式 我试图在角色周围创建一个圆形聚光灯 这也将使圆圈范围内的任何内容都可见 例如部分站在地板上 敌人或场景中的任何其他物体 我的计划是首先绘制圆圈 聚光灯 然后绘制场景
  • Python 可以使用单独的媒体播放器打开 mp3 文件吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 是否可以开一个mp3Python 中的文件 可以使用Popen 我并不是要在程序中运行它 我的意思是作为媒体播放器中的一个单独窗口或其
  • 将列表传递给 PyCrypto 中的 AES 密钥生成器

    我尝试使用 Pycrypto 生成 AES 密钥 但收到以下错误 类型错误 列表 不支持缓冲区接口 对于以下声明 aescipher AES new mykey AES MODE ECB mykey 属于类型list并包含 18854347
  • ValueError:在 R 中使用 keras 模型时在用户代码中

    我正在尝试使用 R 在 R 中运行一维 CNNkeras包裹 我正在使用以下代码 library MASS library keras Create some data data Boston data lt Boston create a
  • 字母表中的加密和解密 - Python GCSE

    我目前正在尝试为学校编写一个程序 以便加密和解密输入的消息 我需要加密或解密的消息仅在字母表中 没有其他符号或密钥 例如 使用消息车加密输入的偏移量为 5 我希望它输出 afs 有人可以帮忙吗 这是我目前的代码 def find offse
  • Cython:为什么 size_t 比 int 快?

    更改某些 Cython 变量的类型int输入size t可以显着减少某些功能的时间 30 但我不明白为什么 例如 cimport numpy as cnp import numpy as np def sum int cnp int64 t
  • 在 (i)python 脚本中从 jupyter 内核获取输出

    我想从单个 ipython 会话中打开多个内核 在这些内核上运行代码 然后收集结果 但我不知道如何收集结果 甚至不知道如何查看 stdout stderr 我怎样才能做这些事情呢 到目前为止我所得到的 我已经使用如下代码管理了前两个步骤 打
  • Python3.1中的视图?

    Python3 1中的视图到底是什么 它们的行为方式似乎与迭代器类似 并且它们也可以具体化为列表 迭代器和视图有何不同 据我所知 视图仍然附加到创建它的对象上 对原始对象的修改会影响视图 来自docs http docs python or
  • 为什么全新安装后会有pip和conda包?

    All Windows 10 64 位 d l Anaconda 2 5 0 与 Python3 64 位并安装 全新安装后我输入conda list 并且 在软件包中 我看到 重复像 jupyter 1 0 0 py35 1 jupyte
  • 尝试修复我的功能

    我正在开发一个函数 我必须返回一个元组 其中第一个参数是最大数字的 str 第二个参数是 int 列表 这是示例以及我为该函数编写的内容 投票 G G N G C G 1 3 0 1 您必须将最大值的位置映射到正确的一方 parties N
  • 收到的标签值 1 超出了 [0, 1) 的有效范围 - Python、Keras

    我正在使用具有张量流背景的 keras 开发一个简单的 cnn 分类器 def cnnKeras training data training labels test data test labels n dim print Initiat
  • 从 sublime_plugin.WindowCommand 获取当前文件名

    我开发插件sublime text 3 并想要获取当前打开的文件路径 absolute1 self window view file name 在哪里self is sublime plugin WindowCommand 但失败了 Att
  • 使用 Pandas 和 Group By 绘制堆叠直方图

    我正在使用如下所示的数据集 Gender Height Width Male 23 4 4 4 Female 45 4 4 5 我想可视化高度和宽度的堆叠直方图 我希望每个图有两个堆叠的直方图 每个性别一个 这是文档中的堆叠直方图 如果存在
  • Python请求401错误但url在浏览器中打开

    我正在尝试从这个位置提取 json https www nseindia com api option chain indices symbol BANKNIFTY https www nseindia com api option cha
  • Python pip 安装错误 [SSL: CERTIFICATE_VERIFY_FAILED]

    我已经尝试解决这个问题有一段时间了 由于某种原因 我陷入了 ssl 问题 并且不知道发生了什么 问题 我已经安装了 python2 7 和 easy install2 7 但是当尝试使用 easy install2 7 安装 pip 时 出
  • 将 pandas 数据框中的多列更改为日期时间

    我有一个 13 列和 55 000 行的数据框 我正在尝试将其中 5 行转换为日期时间 现在它们返回类型 对象 我需要转换这些数据以进行机器学习 我知道如果我这样做 data birth date pd to datetime data b

随机推荐

  • 数据压缩(13):AR模型

    一 AR模型 自回归模型 二 AR模型参数的估计 1 AR 模型参数和自相关函数的关系 2 Y W 方程的解法 L D 算法 3 AR 模型参数估计的各种算法的比较和阶数的选择 三 举例及MATLAB实现 例1 题a 利用 MATLAB实现
  • Java的类名与文件名必须一致

    1 Java保存的文件名必须与类名一致 2 如果文件中只有一个类 文件名必须与类名一致 3 一个Java文件中只能有一个public类 4 如果文件中不止一个类 文件名必须与public类名一致 5 如果文件中不止一个类 而且没有publi
  • RHEL7计划任务和日志管理

    本节所讲内容 at 定制单次执行的计划任务 cron定制周期性计划任务 配置脚本实现周期性任务 配置公司内网服务器每天自动开关机 Linux系统日志记录规律 自定义日志记录方式 配置远程收集日志服务器 计划任务 at 只能执行一次 语法 a
  • 电商项目完成的BUG调查原因和解决方案

    这是我来到浙大网新恒天后 第一个完成的项目 在完成项目后 我总结了那些自己感觉重要的BUG 第一项目为电商项目 1 BUG系列一 界面销毁时 未关闭广播 dialog等 崩溃 Bug现象 Bug 85778 同一个账号 两部手机登陆 第一个
  • [es6]Symbol.iterator 和 for of

    Symbol iterator 和 for of 是es6的新特性 可以为对象设置 自己的迭代器 首先介绍我们的for of var arr 1 2 3 8 33 for var i of arr console log i 1 2 3 8
  • 使用Python,OpenCV进行去水印,图像修复

    图像修复是图像保存和图像恢复的一种形式 其历史可以追溯到1700年代 当时意大利威尼斯的公共图片修复总监彼得 爱德华兹 Pietro Edwards 应用这种科学方法来修复和保存著名作品 资料来源 图像修复技术显着提高了图像绘画的质量 使我
  • nginx配置代理

    背景 公司一台裸金属服务器由于限制无法访问内部100 X网段的机器 而申请这台裸金属的用户需要访问这个网段的代码仓库codehub 更换机器已经来不及 所以申请了另一台服务器作为nginx代理来访问 配置如下 1 tar包安装nginx指定
  • Java中静态的main方法为什么可以调用非静态成员变量?方法之间调用局部变量?

    静态方法不可以 直接 调用动态方法或动态变量 但是可以创建动态变量 也可以 直接 调用静态方法和静态变量 对象属于动态的 动态的可以调用动态的 也可以调用静态的 综上 1 main 方法是静态的 在main 方法中 我们可以直接调用main
  • Git和其远程仓库的使用

    一 什么是Git远程仓库 目前我们已经掌握了Git基础操作 对于文件的增删改 再也不用担心文件的丢失与误删问题了 如果还有不了解的可以看下我上章节的Git基础教程 对于文件增删改的操作 Git与SVN基本没啥区别 但是GIt究竟强在哪了 这
  • 数据挖掘十大算法(二):K-means聚类算法原理与实现

    参考 1 机器学习 KMeans聚类 K值以及初始类簇中心点的选取 2 K Means算法的研究分析及改进 一 K means算法原理 K means算法是最常用的一种聚类算法 算法的输入为一个样本集 或者称为点集 通过该算法可以将样本进行
  • 运维平台权限表结构设计

  • 【node 报错】Error: Cannot find module ‘路径 / 具体文件名‘

    过程如下 输入 node 文件名 出现报错信息 原因 该终端是在错误的文件路径打开 没在当前文件下的路径打开 因此要在当前的文件下打开终端 运行 node 文件名
  • linux终端密码星星,如何在Ubuntu终端中显示密码星号

    每当要求您在Ubuntu终端中键入密码时 都将插入密码 而不会得到任何可视显示或屏幕反馈 在这种情况下 您可能会通过错误输入密码而弄乱密码 这就是视觉反馈如此重要的原因 它可以帮助您跟踪输入的字符数 尤其是在输入密码时 这样您就不会错过任何
  • tp5 链表查询,查出left表为空的数据

    背景 tp5 A B两表join链表查询 查出B表数据为空的A表数据 以及 B表数据不为空的A表数据 此操作将使用到 EXP 和 IS NULL 查出B表数据为空的A表数据SQL where exp Db raw b id IS NULL
  • 代码随想录算法训练营第十天

    今天是打基础的一天 了解队列和栈的实现 上次学习这块记忆犹新 只要打基础 那天的我肯定是沮丧的 总会是说的时候都懂 写的时候不知道从哪里下手 看看这次会遇到什么 艰难险阻 及时记录下来 哈哈 Java 中 我总是不清楚为什么queue的cr
  • iis服务器文件上传大小限制,IIS修改最大上传文件限制的方法

    我们在修改PageAdmin网站管理系统的附件上传大小时候 经常出现修改后还是上传不了大文件 这是因为服务器系统本身的限制导致的 下面分别对IIs6和IIs7的修改方法作详细介绍 IIS7的修改方法 IIS7 0默认限制上传文件大小为300
  • 堆栈认知——栈溢出实例(ret2libc)

    参考 栈溢出实例 笔记三 ret2libc 地址 https qingmu blog csdn net article details 119481681 目录 1 栈溢出含义及栈结构 2 ret2libc基本思路 3 实战 3 1 二进制
  • python爬虫系列4--BeautifulSoup

    Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库 中文文档链接 https www crummy com software BeautifulSoup bs4 doc index zh html id
  • jQuery的选择器中的通配符[id^='code']或[name^='code']及jquery选择器总结

    原文地址 http www jb51 net article 76917 htm 建议直接查看原文 1 选择器 1 通配符 input id code id属性以code开始的所有input标签 input id code id属性以cod
  • 基于CNN遥感图象分类+前后端交互

    基于CNN遥感图像分类 前后端交互 基于CNN遥感图像分类 前后端交互 一 项目介绍 1 1 项目简述 1 2 几个概念 二 遥感图片分类模型 2 1 训练数据的处理 三 效果展示 参考资料 项目完整代码 GitHub 一 项目介绍 1 1