我是图像分割的初学者。我试图用预训练的Resnet34(imagenet)作为编码器创建Unet模型。作为比较,我使用了细分模型API来获得相同的模型。但是,即使它们的结构和主干相同,我的模型也不如导入的模型好。
我的模特:
我使用以下代码导入Pretrained Resnet34:
ResNet34, preprocess_input = Classifiers.get('resnet34')
Resmodel = ResNet34((256, 256, 3), weights='imagenet')
然后做了一个卷积块:
def ConvBlock(X,channel,kernel_size,bn=True):
x=layers.Conv2D(filters=channel,kernel_size=(kernel_size,kernel_size),strides=(1,1),dilation_rate=(1,1),padding='SAME',kernel_initializer='he_normal')(X)
if bn:
x=layers.BatchNormalization()(x)
x=layers.Activation('relu')(x)
x=layers.Conv2D(filters=channel,kernel_size=(kernel_size,kernel_size),strides=(1,1),dilation_rate=(1,1),padding='SAME',kernel_initializer='he_normal')(x)
if bn:
x=layers.BatchNormalization()(x)
x=layers.Activation('relu')(x)
return x
最后构建了这个模型:
def new_model(output_channel,output_activation):
inp=Resmodel.input
skip1=Resmodel.layers[5].output #128x128x64
skip2=Resmodel.layers[37].output #64x64x64
skip3=Resmodel.layers[74].output #32x32x128
skip4=Resmodel.layers[129].output #16x16x256
encoder_final=Resmodel.layers[157].output #8x8x512
#upsample
filters=256
k=1
x=layers.UpSampling2D()(encoder_final) #returns 16x16x256
x=layers.Concatenate()([x,skip4]) #returns 16x16x512
x=ConvBlock(x,filters,kernel_size=3) #returns 16x16x256
filters //=2
x=layers.UpSampling2D()(x) #returns 32x32x128
x=layers.Concatenate()([x,skip3]) #returns 32x32x256
x=ConvBlock(x,filters,kernel_size=3) #returns 32x32x128
filters //=2
x=layers.UpSampling2D()(x) #returns 64x64x64
x=layers.Concatenate()([x,skip2]) #returns 64x64x128
x=ConvBlock(x,filters,kernel_size=3) #returns 64x64x64
filters //=2
x=layers.UpSampling2D()(x) #returns 128x128x64
x=layers.Concatenate()([x,skip1]) #returns 128x128x128
x=ConvBlock(x,filters,kernel_size=3) #returns 128x128x32
filters //=2
x=layers.UpSampling2D()(x) #returns 256x256x32
x=ConvBlock(x,filters,kernel_size=3) #returns 256x256x16
x = layers.Conv2D(output_channel, kernel_size= (1,1), strides=(1,1), padding= 'same')(x) #returns 256x256x1
x=layers.Activation('sigmoid')(x)
model=Model(inputs=inp,outputs=x)
return model
作为衡量我是否做对的一种方法,我使用了细分模型Pypi库导入具有Resnet34主干的Unet。
导入的型号:
from segmentation_models import Unet
from segmentation_models.utils import set_trainable
model = Unet(backbone_name='resnet34', encoder_weights='imagenet', encoder_freeze=True)
model.summary()
但是问题是,从segmentation_models API导入的模型似乎比我创建的模型工作得更好(Iou得分更高)。即使结构和主干几乎相同。那么我的模型在做什么错呢?感谢您阅读这么长的帖子。
您是否已在该特定库中检查了UNet的实现?
据我所记得,UpSampling()
层被替换为Conv2DTranspose()
,因此可能是造成差异的原因。
此外,请确保您具有与segmentation_models
中相同的可训练图层,完全相同