使用Python图像处理与识别

题目 CNN卫星图像识别 一、项目内容 题目:通过使用 tensorflow框架,选取卫星图片数据集airpalne和lake,使用卷积神经网络对卫星图像进行图像分类以及识别。 数据集如下: airplane: lake: 代码如下:import tensorflow as tf import numpy as np import matplotlib.pyplot as plt %matplotlib inline import glob #使用glob获取图片的路径 #获取所有图片的路径 all_images_path = glob.glob(.class/*/*.jpg) #*代表匹配所有的文件名以及所有文件 all_images_path[:5] all_images_path[-5:] 对所有图片的路径进行乱序排序 import random random.shuffle(all_images_path) all_images_path[:5] all_images_path[-5:] 标签转换 label_to_index = {airplane:0, lake:1} index_to_label = dict((v,k) for k,v in label_to_index.items()) index_to_label img = all_images_path[100] img all_labels = [label_to_index.get(img.split(\)[1]) for img in all_images_path] all_labels[:10] 读取图片以及图片预处理 img = all_images_path[100] img 1、读取图片 img_raw = tf.io.read_file(img) 2、解码成图片tensor img_tensor = tf.image.decode_jpeg(img_raw) img_tensor.shape 3、转换数据类型 img_tensor = tf.cast(img_tensor, tf.float32) 4、归一化 img_tensor = img_tensor/255 img_tensor.numpy().max() img_tensor.numpy().min() 加载图片 def load_img(path): img_raw = tf.io.read_file(img) img_tensor = tf.image.decode_jpeg(img_raw) img_tensor = tf.cast(img_tensor, tf.float32) img_tensor = img_tensor/255 return img_tensor 创建数据的Dataset import random #随机选取一个路径 i = random.choice(range(len(all_images_path))) img_path = all_images_path[i] label = all_labels[i] img_tensor = load_img(img_path) plt.title(index_to_label.get(label)) plt.imshow(img_tensor.numpy()) 创建dataset img_ds = tf.data.Dataset.from_tensor_slices(all_images_path) #map是对每个图片的路径使用load_img函数 img_ds = img_ds.map(load_img) 创建标签的dataset label_ds = tf.data.Dataset.from_tensor_slices(all_labels) #查看前10个标签 for la in label_ds.take(10): #print(la.numpy()) print(index_to_label.get(la.numpy())) 划分训练以及测试数据 #将图片路径的Dataset和标签的Dataset合并成一个Dataset img_label_ds = tf.data.Dataset.zip((img_ds, label_ds)) image_count = len(all_images_path) test_count = int(image_count*0.2) train_count = image_count - test_count #得到train_dataset train_ds = img_label_ds.skip(test_count ) #得到test_dataset test_ds = img_label_ds.take(test_count ) BATCH_SIZE = 16 train_ds = train_ds.repeat().shuffle(100).batch(BATCH_SIZE) train_ds test_ds = test_ds.batch(BATCH_SIZE) 模型的创建 model = tf.keras.Sequential() model.add(tf.keras.layers.Conv2D(64,(3,3), input_shape=(256, 256, 3), activation=relu)) model.add(tf.keras.layers.Conv2D(64,(3,3),activation=relu)) model.add(tf.keras.layers.MaxPooling2D()) model.add(tf.keras.layers.Conv2D(128,(3,3),activation=relu)) model.add(tf.keras.layers.Conv2D(128,(3,3),activation=relu)) model.add(tf.keras.layers.MaxPooling2D()) model.add(tf.keras.layers.Conv2D(256,(3,3),activation=relu)) model.add(tf.keras.layers.Conv2D(256,(3,3),activation=relu)) model.add(tf.keras.layers.MaxPooling2D()) model.add(tf.keras.layers.GlobalAveragePooling2D()) #将数据展平 model.add(tf.keras.layers.Dense(1024,activation=relu)) model.add(tf.keras.layers.Dense(1,activation=sigmoid)) 模型的编译以及训练 model.compile(optimizer=tf.keras.optimizers.Adam(0.0001), loss=tf.keras.losses.BinaryCrossentropy(), metrics=[acc]) step_per_epoch = train_count//BATCH_SIZE val_step = test_count//BATCH_SIZE history = model.fit(train_ds, epochs=3, steps_per_epoch=step_per_epoch, validation_data=test_ds, validation_steps=val_step) history.history.keys() plt.plot(history.epoch, history.history.get(loss), label=loss) plt.plot(history.epoch, history.history.get(val_loss), label=val_loss) plt.legend() plt.plot(history.epoch,history.history.get(acc), label=acc) plt.plot(history.epoch,history.history.get(val_acc), label=val_acc) plt.legend()
经验分享 程序员 微信小程序 职场和发展