Csnet训练灰度colormap图记录

1.文件所在位置
所在文件夹
Colormap图像集:

train_dataGtest_dataG
每类300张每类150张

train_dataG展示图
灰度化、缩小处理前train_data展示图

代码:

# 2020/10/17  Caroline
#Csnet训练colormap灰度图

# 1 导入模块
from __future__ import print_function
import numpy as np
from scipy import misc
import imageio
import scipy
import matplotlib.pyplot as plt
import glob #用于获取文件夹和文件信息
import re # 主要用于字符串匹配
import keras

from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.callbacks import ModelCheckpoint #保存检查点

#  准备数据
num_classes = 6 #类别
batch_size = 120 #批量大小
epochs = 120 #训练次数

#  2 定义导入数据的函数,读取图片及标注
def loadImages(imgpath):
    img = imageio.imread(imgpath)#imgpath:所有匹配的文件路径列表
    if img is None:
        return None
    img = img.astype('float32') # 转成浮点32位数据类型
    img /= 255 # 将图片归一化,加速模型训练速度
    #print(img[1].shape)
    return img

#  对图片进行维度变换
def changeDim(img):
    img = np.expand_dims(img,axis=2)  # 灰度图像为2D--change3 →(223, 28, 28) (223, 11)
    img = np.expand_dims(img,axis=0)  # 灰度图像前加一批量通道
    return img
# 准备图像数据
def loadDataset( imgpath, pathtype):
    images = loadImages(imgpath[0]) # 一幅图片的变维方法
    images = changeDim(images)

    for single in imgpath[1:]: # 用for循环处理多幅图片变维
        img = loadImages(single)
        img = changeDim(img)
        images =np.append(images,img, axis = 0)
    # 准备标记
    labels = [] # 标签是数列
    pattern = re.compile(pathtype+r"\\(\d{1,2})") # 用正则表达式,读取子文件夹名称;
    # 匹配一个数字的"\\d"可以写成r"\d"; {m,n}   匹配前一个字符出现m到n次
    for single in imgpath:
        label = pattern.findall(single) # 搜索字符串,以列表类型返回全部能匹配的子串
        labels.append(int(label[0]))#图片文件的名称是1的话对应图片写入的标签也为1
    return images, labels # 返回图片的列表,标签列表

print('----------- 准备训练数据------------\n')
imgfiles = '../train_dataG/*/*.jpg' # 准备训练数据
imgpath = glob.glob(imgfiles)#返回所有匹配的文件路径列表
images, labels = loadDataset(imgpath,'./train_dataG')
#print(imgpath) print(images) print(labels)---check
labels = keras.utils.to_categorical(labels, num_classes) #对标记进行转化,输出符合keras标记的类型
print(labels[0])
print(images.shape, labels.shape) #(223, 28, 28, 1) (223, 11)// (350, 64, 64, 1) (350, 5)ok!10/17 10:44

print('----------- 准备测试数据------------\n')
imgfiles2 = '../test_dataG/*/*.jpg' # 准备测试数据
imgpath2 = glob.glob(imgfiles2)  # print(imgpath)
images2, labels2 = loadDataset(imgpath2,'../test_dataG')
labels2 = keras.utils.to_categorical(labels2, num_classes)
print(images2.shape, labels2.shape) #(50, 28, 28, 1) (50, 11)//(105, 64, 64, 1) (105, 5)
print("读取数据完成!")

# 2 搭建模型
def createModel(num_classes):
    input_shape = (256, 256, 1)
    model = Sequential()
    model.add(Conv2D(6, kernel_size=(5, 5),
                    activation='relu',
                    padding = 'same',
                    input_shape=input_shape))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Conv2D(16, (5, 5), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))
    model.add(Flatten())
    model.add(Dense(120, activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(num_classes, activation='softmax'))
    return model


# 4 设计、训练网络
model = createModel(num_classes)
model.compile(loss=keras.losses.categorical_crossentropy,
              optimizer=keras.optimizers.Adam(),
              metrics=['accuracy'])
# 设置检查点
checkpointer = ModelCheckpoint(filepath='../checkpoint/colormap_weights.hdf5', verbose=1, save_best_only=True)
model.fit(images, labels,
          batch_size=batch_size,
          epochs=epochs,
          verbose=1,
          validation_data=(images2, labels2),callbacks=[checkpointer])
# 保存训练模型
model.save('../checkpoint/colormap_model.h5') # 保存为h5文件,方便以后调用

# 5 测试模型
score = model.evaluate(images2, labels2, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])


结果:

... ...
1950/1950 [==============================] - 30s 15ms/step - loss: 0.0124 - acc: 0.9954 - val_loss: 1.4330 - val_acc: 0.7278

Epoch 00120: val_loss did not improve from 0.66124
Test loss: 1.433016248537331
Test accuracy: 0.7277777777777777

下一步工作:
1.绘制中间特征图
2.绘制结果趋势图
3.优化网络模型

本文仅为个人学习记录,可能很多地方不大准确,望大家不吝赐教!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值