[源码地址]
(https://github.com/zhixuhao/unet)
主要是3部分,main.py, model.py,data.py
一. main,py
from model import * #导入model.py
from data import * #导入data.py
#os.environ["CUDA_VISIBLE_DEVICES"] = "0" #GPU
data_gen_args = dict(rotation_range=0.2,
width_shift_range=0.05,
height_shift_range=0.05,
shear_range=0.05,
zoom_range=0.05,
horizontal_flip=True,
fill_mode='nearest') #数据扩展item字典,可以按照需要增加
myGene = trainGenerator(2,'data/membrane/train','image','label',data_gen_args,save_to_dir = None) #透过keras自带ImageDataGenerator()实现数据增强,再调用flow_from_directory()方法实现训练数据自动生成(batch,W,H,C)
#model = unet()#建模
model = unet(pretrained_weights='unet_membrane.hdf5') #建模并加载预训练模型,用于接着上次的训练继续进行训练,我后加的。首次训练,使用model = unet()
model_checkpoint = ModelCheckpoint('unet_membrane.hdf5', monitor='loss',verbose=1, save_best_only=True) #ModelCheckpoint for callback,包含模型权重生成文件,根据loss选择保存最佳模型。
model.fit_generator(myGene,steps_per_epoch=3000,epochs=1,callbacks=[model_checkpoint])#喂数据给模型训练,因为使用了数据自动生成,可以无限迭代,所以必需要指定steps_per_epoch参数,steps_per_epoch*batch即为需要的迭代生成的数据集大小,这与数据集大小已经固定的不同。epochs为整个生成的数据集训练的次数。
testGene = testGenerator("data/membrane/test") #测试集数据生成
results = model.predict_generator(testGene,30,verbose=1)#模型预测测试数据集,结果保存为npy file
saveResult("data/membrane/test",results) #把npy file数据转成图片
二. model.py
import numpy as np
import os
import skimage.io as io
import skimage.transform as trans
import numpy as np
from keras.models import *
from keras.layers import *
from keras.optimizers import *
from keras.callbacks import ModelCheckpoint, LearningRateScheduler
from keras import backend as keras
#下面代码的unet与原图并不完全相同,原结构padding = 'invalid',没有使用padding,输出的image size小于输入,如果采用 padding = 'same',输入等于输出,不需要crop。unet的精髓i就是编码与解码,并采用skip 并接,实现浅深层特征融合,实现分类(深层)与定位(浅层)精度。
def unet(pretrained_weights = None,input_size = (256,256,1)):
inputs = Input(input_size) #keras 模型的第一层前都是Input()函数
#编码
conv1 = Conv2D(64, 3, activation = 'relu', padding = 'same', kernel_initial