一、数据集加载:
纯手工打造一个函数用来加载数据,数据分别为image和mask
我们所需要的类型:(B数量,长,宽,通道数),只要将数据加载成这样并mask和image对应就行。
第一步:
获取文件中所有的图片文件,并进行排序(mask和label的标签最好对应起来,这样对文件名进行排序就可以自动对齐)
train_mask = sorted(glob.glob('/kaggle/input/image-xy/Train_Label/*.jpg'))
train_image = sorted(glob.glob('/kaggle/input/image-xy/Train_image/*.jpg'))
第二步:
读取图像,图片大小缩到(256,256,3),标签大小缩到(256,256),读取一张mask和label就将它们加入到mask数组和image数组中。
def data_generation(batch_data_img, batch_data_mask):
images = []
masks = []
# 生成数据
for data_img, data_mask in zip(batch_data_img, batch_data_mask):
# x_train数据
image = cv2.imread(data_img,cv2.IMREAD_COLOR)
image = cv2.resize(image,(256,256))
image = list(image)
images.append(image)
# y_train数据
mask = cv2.imread(data_mask,cv2.IMREAD_GRAYSCALE)
mask = cv2.resize(mask, (256,256))
mask = mask / 255.0
mask = list(mask)
masks.append(mask)
return np.array(images), np.array(masks)
第三步:
增加维度,因为神经网络的输出层为(None,256,256,1),所以我们要将标签的通道数加上。
X,Y=data_generation(train_image,train_mask)
Y = Y[:, :, :, np.newaxis]
查看结果,符合预期
二、模型搭建
模型的搭建在这一节,只不过将其输出通道数改成了1.
纯手工打造编码解码网络-kreas实现
废话不多说,直接上网络架构图
三、模型训练
这里就懒得自定义损失函数了,直接上系统自带的,优化器adam,使用acc作为评估指标。
Batch使用32,计算卡使用p100。
model = En_De()
model.summary()
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
model.fit(X,Y,batch_size=32,epochs=2)
先训练2轮看看效果。
分割效果图就不看了,应该挺差的,毕竟就2个epochs。
后续将改进损失函数,使用交并比等,L1损失或L2损失试试。