keras Unet 细胞分割边缘检测代码走读

本文详细走读了keras实现的UNet模型在细胞分割任务中的应用,主要涉及main.py、model.py和data.py三个部分。在实际运行中,若输出图像出现全黑或全白,可能是因为训练损失过高,准确率需超过90%时,预测概率才会明显分化,从而得到正常的黑白图像。输出的是像素的概率分布图,通过阈值处理转化为二值图像。
摘要由CSDN通过智能技术生成

[源码地址]
(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
Unet结构

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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值