CNN实现卫星图像分类(tensorflow)

news/2024/5/19 7:31:47

使用的数据集卫星图像有两类,airplane和lake,每个类别样本量各700张,大小为256*256,RGB三通道彩色卫星影像。搭建深度卷积神经网络,实现卫星影像二分类。
数据链接百度网盘地址,提取码: cq47

1、查看tensorflow版本

import tensorflow as tfprint('Tensorflow Version:{}'.format(tf.__version__))
print(tf.config.list_physical_devices())

在这里插入图片描述

2、加载并显示训练数据

从文件夹中获取所有数据路径

import glob
import randomall_image_path = glob.glob('./data/air_lake_dataset/*/*.jpg')  # glob相比于pathlib更简洁
random.shuffle(all_image_path)

读取并处理图像

def load_and_preprocess_image(path):img_raw = tf.io.read_file(path)img_tensor = tf.image.decode_jpeg(img_raw,channels=3)img_tensor = tf.image.resize(img_tensor,[256,256])img_tensor = tf.cast(img_tensor,tf.float32)img_tensor = img_tensor/255return img_tensor

处理标签

label_to_index = {'airplane':0,'lake':1}
index_to_label = dict((v,k) for k,v in label_to_index.items())
labels = [label_to_index.get(img.split('/')[3]) for img in all_image_path]

显示卫星影像

import matplotlib.pyplot as pltdef plot_images_lables(all_image_path,labels,start_idx,num=5):fig = plt.gcf()fig.set_size_inches(12,14)images = [load_and_preprocess_image(img_path) for img_path in all_image_path[start_idx:start_idx+5]]for i in range(num):ax = plt.subplot(1,num,1+i)ax.imshow(images[i])title = 'label=' + index_to_label.get(labels[start_idx+i])ax.set_title(title,fontsize=10)ax.set_xticks([])ax.set_yticks([])plt.show()plot_images_lables(all_image_path,labels,0,5)

在这里插入图片描述

4、使用tf.data.Dataset制作训练/测试数据

制作 Dataset

img_ds = tf.data.Dataset.from_tensor_slices(all_image_path)
img_ds = img_ds.map(load_and_preprocess_image)
label_ds = tf.data.Dataset.from_tensor_slices(labels)
img_label_ds = tf.data.Dataset.zip((img_ds,label_ds))

训练集、测试集划分

test_count = int(len(labels)*0.2) 
train_count = len(labels) - test_counttrain_ds = img_label_ds.skip(test_count)
test_ds = img_label_ds.take(test_count)

分批次加载数据

BATCH_SIZE = 16
train_ds = train_ds.repeat().shuffle(100).batch(BATCH_SIZE)
test_ds = test_ds.repeat().batch(BATCH_SIZE)

5、CNN模型构建

from keras.layers import Input,Dense,Dropout
from keras.layers import Conv2D,MaxPool2D,GlobalAvgPool2Dmodel = tf.keras.Sequential([Input(shape=(256,256,3)),Conv2D(filters=64,kernel_size=(3,3),activation='relu',padding='same'),  # 增加filter个数,增加模型拟合能力Conv2D(filters=64,kernel_size=(3,3),activation='relu',padding='same'),MaxPool2D(),  # 默认2*2. 池化层扩大视野Dropout(0.2),  # 防止过拟合Conv2D(filters=128,kernel_size=(3,3),activation='relu',padding='same'),Conv2D(filters=128,kernel_size=(3,3),activation='relu',padding='same'),MaxPool2D(),Dropout(0.2),Conv2D(filters=256,kernel_size=(3,3),activation='relu',padding='same'),Conv2D(filters=256,kernel_size=(3,3),activation='relu',padding='same'),MaxPool2D(),Dropout(0.2),Conv2D(filters=512,kernel_size=(3,3),activation='relu',padding='same'),Conv2D(filters=512,kernel_size=(3,3),activation='relu',padding='same'),GlobalAvgPool2D(),  # 全局平均池化Dense(1024,activation='relu'),Dense(256,activation='relu'),Dense(1,activation='sigmoid') 
])model.summary()

在这里插入图片描述

6、模型编译与训练

model.compile(optimizer=tf.keras.optimizers.Adam(0.0001),loss=tf.keras.losses.BinaryCrossentropy(from_logits=False),  # 已经使用sigmoid激活过了metrics=['acc'])steps_per_epoch = train_count//BATCH_SIZE
val_step = test_count//BATCH_SIZEH = model.fit(train_ds,epochs=10,steps_per_epoch=steps_per_epoch,validation_data=test_ds,validation_steps=val_step,verbose=1)

在这里插入图片描述

7、模型评估

import matplotlib.pyplot as pltfig = plt.gcf()
fig.set_size_inches(12,4)
plt.subplot(1,2,1)
plt.plot(H.epoch, H.history['loss'], label='loss')
plt.plot(H.epoch, H.history['val_loss'], label='val_loss')
plt.legend()
plt.title('loss')plt.subplot(1,2,2)
plt.plot(H.epoch, H.history['acc'], label='acc')
plt.plot(H.epoch, H.history['val_acc'], label='val_acc')
plt.legend()
plt.title('acc')
plt.show()

在这里插入图片描述

8、模型预测

def pred_img(img_path):img = load_and_preprocess_image(img_path)img = tf.expand_dims(img, axis=0)pred = model.predict(img)pred = index_to_label.get((pred>0.5).astype('int')[0][0])return predimg_path = './data/air_lake_dataset/airplane/airplane_240.jpg'
pred = pred_img(img_path)
img_tensor = load_and_preprocess_image(img_path)
plt.imshow(img_tensor)
title = 'label=' + img_path.split('/')[3].strip() + ', pred=' + pred
plt.title(title)
plt.show()

在这里插入图片描述


http://www.mrgr.cn/p/28036673

相关文章

Android 14 变更及适配攻略

准备工作 首先将我们项目中的 targetSdkVersion和compileSdkVersion 升至 34。 影响Android 14上所有应用 1.最低可安装的目标 API 级别 从 Android 14 开始,targetSdkVersion 低于 23 的应用无法安装。要求应用满足这些最低目标 API 级别要求有助于提高用户的安…

安全数据交换系统哪个好?该如何选型?

安全数据交换系统是用于在不同网络或组织之间安全、高效地传输和共享数据的解决方案。安全数据交换系统对于任何需要处理敏感数据、确保数据安全、并满足合规要求的组织来说都是至关重要的。 这种系统通常用于以下目的: 1)数据传输:允许用户在不同的地理位置或网络环境之间…

python雨滴数浓度计算

前面已经将3232的数据删除了不需要的列,数据变成了3221的数据 excel的粒径为了匹配txt的32行数据,我进行了重复复制,将excel变成下图: 那么采用数浓度公式:代码:# -*- coding:utf-8 -*- """ @author: SuYue @file: shunongdu.py @time: 2024/04/30 @desc:…

【智能家居入门3】(MQTT服务器、MQTT协议、微信小程序、STM32)

前面已经写了三篇博客关于智能家居的,服务器全都是使用ONENET中国移动,他最大的优点就是作为数据收发的中转站是免费的。本篇使用专门适配MQTT协议的MQTT服务器,有公用的,也可以自己搭建(应该要钱)&#xf…

开发体育赛事直播平台,研发技术选型与架构设计实现方案

本文将深入探讨“东莞梦幻网络科技”现成体育直播源码的技术实现方案,如何为用户提供流畅、互动、个性化的观赛体验。 一、技术栈选择:强强联合的基石1、后端开发:采用Java与PHP作为主要开发语言。Java以其强大的企业级应用支持,保…

aardio爬虫) 实战篇:逆向有道翻译web接口

前言 之前的文章把js引擎(aardio封装库) 微软开源的js引擎(ChakraCore))写好了,这篇文章整点js代码来测一下bug。测试网站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻译js逆向(MD5加密,AES加密)附完整源码,逆向我就不赘述了。这篇文章说一下怎…

【Mac】graphpad prism for Mac(专业医学绘图工具) v10.2.3安装教程

软件介绍 GraphPad Prism for Mac是一款专业的科学数据分析和绘图软件,广泛用于生物医学和科学研究领域。它具有强大的统计分析功能,可以进行各种数据分析,包括描述性统计、生存分析、回归分析、方差分析等。同时,它还提供了丰富…

“any”类型的参数不可分配给“never”类型的参数。ts(2345)

问题引入在进行项目开发时,用到了 el-tree 标签,就是组织树状数据渲染页面,类似菜单,然后父级菜单下会有多个子菜单。本次总共就两层。这里遇到的问题是,后端返回的数据就是一个list,属于叶子节点,父级节点是固定的,需要前端写死,但就在写死了父级节点,并将叶子节点加…

ubuntu 桥接模式无法上网解决

ubuntu安装,根据个人的选择来配置网络信息,以下是vmare配置桥接模式时ubuntu无法上网的处理方式: 1. vmare-》虚拟机-》设置, 选中桥接模式(复制物理状态可以不勾选)2. vmare-》编辑-》虚拟网络编辑器, 选中更改设置 2. 选中VMnet0网卡,该网卡选中电脑目前在用的网卡名…

【iOS】KVO

文章目录 前言一、KVO使用1.基本使用2.context使用3.移除KVO通知的必要性4.KVO观察可变数组 二、代码调试探索1.KVO对属性观察2.中间类3.中间类的方法3.dealloc中移除观察者后,isa指向是谁,以及中间类是否会销毁?总结 三、KVO本质GNUStep窥探…

用php找出字符串中连续重复次数最多的字符,你有方法吗?

找出字符串中连续重复次数最多的字符,这里总结了几种方法,不管是在开发中,还是在面试中都会遇到。 方法一<?php $arr = str_split($str); //字符串分隔到数组中$arr = array_count_values($arr); //用于统计数组中所有值出现的次数,返回一个数组//键名为原数组的键值,…

WEB安全~X-Frame-Options

X-Frame-Options 是一个HTTP响应头,用于控制网页是否可以嵌套在 <frame>, <iframe>, <embed> 或者 <applet> 中。通过设置 X-Frame-Options 头部,网站管理员可以防止网页被嵌套到其他网站的框架中,从而有效防范点击劫持等安全风险。下面是关于 X-Fr…

微服务 - 作业调度 Hangfire集成式 仪表盘 DolphinScheduler分布式 定义流程

Hangfire,Client,Storage,Server,Dashboard,一次性作业任务,延迟作业,周期性定时作业,触发型作业任务,删除作业任务,作业队列,异常重试机制,原理机制与适用场景,DolphinScheduler,自定义业务流程,流程节点类型,串行并行逻辑节点,流程节点参数,数据源,流程实…

RK3568笔记二十四:基于Flask的网页监控系统

若该文为原创文章&#xff0c;转载请注明原文出处。 此实验参考 《鲁班猫监控检测》&#xff0c;原代码有点BUG&#xff0c;已经下载不了。2. 鲁班猫监控检测 — [野火]嵌入式AI应用开发实战指南—基于LubanCat-RK系列板卡 文档 (embedfire.com) 一、简介 记录简单的摄像头监…

flutter 编译环境部署

一. 编译环境安装 1. 安装ubuntu20.04,详细的教程请看以下链接 VMware虚拟机下安装Ubuntu20.04(保姆级教程)_ubuntu 20.04 虚拟机-CSDN博客 2. 部署flutter环境,详细教程请参照以下链接 构建 flutter 应用程序 sony/flutter-elinux 维基 GitHub上 注意:在进行docker映射时…

智能决策新时代:可视化大屏是否能够超越传统白板?

前言 2015年,国务院提出了中国制造2025制造强国“三步走”规划,旨在推动中国制造业成为全球制造强国:第一个十年规划,2015-2025:中国制造业迈入制造强国行列,实现技术创新和产业升级。 第二个十年规划,2025-2035:中国制造业整体达到世界强国中等水平,推动产业智能化和…

【汇编语言】中断及外部设备操作

【汇编语言】中断及外部设备操作 文章目录 【汇编语言】中断及外部设备操作前言一、中断及其处理中断的概念8086内中断中断处理程序案例&#xff1a;系统中的0号中断中断过程 二、编制中断处理程序中断处理程序及其结构编制中断处理程序——以除法错误中断为例do0子程序应该放在…

day31-jQuery

1、jQuery介绍jQuery是什么jQuery是一个快速、简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架)。jQuery设计的宗旨是“write Less,Do More”,即倡导写更少的代码,做更多的事情。它封装JavaScript常用的功能代码,提供一种简便的J…

物联网小demo

机智云生成代码 具体参考之前的文章 初始化 ADC用来使用光敏电阻 连续采样开启 采样的周期调高 定时器 定时器1用来实现延时 为了只用温湿度模块DHT11 定时器4用来和51进行交互 实现定时的发送和检测心跳信号 IIC 用来使用oled屏幕 USART 串口1和串口2是机智云自己…

VMware ESXi 7.0U3p macOS Unlocker Dell (戴尔) OEM 定制版自定义镜像 A20

VMware ESXi 7.0U3p macOS Unlocker Dell (戴尔) OEM 定制版自定义镜像 A20VMware ESXi 7.0U3p macOS Unlocker Dell (戴尔) OEM 定制版自定义镜像 A20 ESXi 7.0U3 标准版,Dell (戴尔)、HPE (慧与)、Lenovo (联想)、Inspur (浪潮)、Cisco (思科)、Hitachi (日立)、Fujitsu (富…