目錄
- FCN介紹
- FCN所用的技術
- 訓練數據的可視化
- 模型訓練
- 模型推理
- FCN的優點和不足
- 優點
- 不足
FCN介紹
FCN主要用于圖像分割領域,是一種端到端的分割方法,是深度學習應用在圖像語義分割的開山之作。通過進行像素級的預測直接得出與原圖大小相等的label map。因FCN丟棄全連接層替換為全卷積層,網絡所有層均為卷積層,故稱為全卷積網絡。
FCN所用的技術
全卷積神經網絡主要使用以下三種技術:
- 卷積化(Convolutional)
- 上采樣(Upsample)
- 跳躍結構(Skip Layer)
跳躍結構利用上采樣技巧對最后一層的特征圖進行上采樣,得到原圖大小的分割是步長為32像素的預測,稱之為FCN-32s。由于最后一層的特征圖太小,損失過多細節,采用skips結構將更具有全局信息的最后一層預測和更淺層的預測結合,使預測結果獲取更多的局部細節。將底層(stride 32)的預測(FCN-32s)進行2倍的上采樣得到原尺寸的圖像,并與從pool4層(stride 16)進行的預測融合起來(相加),這一部分的網絡被稱為FCN-16s。隨后將這一部分的預測再進行一次2倍的上采樣并與從pool3層得到的預測融合起來,這一部分的網絡被稱為FCN-8s。 Skips結構將深層的全局信息與淺層的局部信息相結合。
訓練數據的可視化
import numpy as np
import matplotlib.pyplot as pltplt.figure(figsize=(16, 8))# 對訓練集中的數據進行展示
for i in range(1, 9):plt.subplot(2, 4, i)show_data = next(dataset.create_dict_iterator())show_images = show_data["data"].asnumpy()show_images = np.clip(show_images, 0, 1)
# 將圖片轉換HWC格式后進行展示plt.imshow(show_images[0].transpose(1, 2, 0))plt.axis("off")plt.subplots_adjust(wspace=0.05, hspace=0)
plt.show()
模型訓練
import mindspore
from mindspore import Tensor
import mindspore.nn as nn
from mindspore.train import ModelCheckpoint, CheckpointConfig, LossMonitor, TimeMonitor, Modeldevice_target = "Ascend"
mindspore.set_context(mode=mindspore.PYNATIVE_MODE, device_target=device_target)train_batch_size = 4
num_classes = 21
# 初始化模型結構
net = FCN8s(n_class=21)
# 導入vgg16預訓練參數
load_vgg16()
# 計算學習率
min_lr = 0.0005
base_lr = 0.05
train_epochs = 1
iters_per_epoch = dataset.get_dataset_size()
total_step = iters_per_epoch * train_epochslr_scheduler = mindspore.nn.cosine_decay_lr(min_lr,base_lr,total_step,iters_per_epoch,decay_epoch=2)
lr = Tensor(lr_scheduler[-1])# 定義損失函數
loss = nn.CrossEntropyLoss(ignore_index=255)
# 定義優化器
optimizer = nn.Momentum(params=net.trainable_params(), learning_rate=lr, momentum=0.9, weight_decay=0.0001)
# 定義loss_scale
scale_factor = 4
scale_window = 3000
loss_scale_manager = ms.amp.DynamicLossScaleManager(scale_factor, scale_window)
# 初始化模型
if device_target == "Ascend":model = Model(net, loss_fn=loss, optimizer=optimizer, loss_scale_manager=loss_scale_manager, metrics={"pixel accuracy": PixelAccuracy(), "mean pixel accuracy": PixelAccuracyClass(), "mean IoU": MeanIntersectionOverUnion(), "frequency weighted IoU": FrequencyWeightedIntersectionOverUnion()})
else:model = Model(net, loss_fn=loss, optimizer=optimizer, metrics={"pixel accuracy": PixelAccuracy(), "mean pixel accuracy": PixelAccuracyClass(), "mean IoU": MeanIntersectionOverUnion(), "frequency weighted IoU": FrequencyWeightedIntersectionOverUnion()})# 設置ckpt文件保存的參數
time_callback = TimeMonitor(data_size=iters_per_epoch)
loss_callback = LossMonitor()
callbacks = [time_callback, loss_callback]
save_steps = 330
keep_checkpoint_max = 5
config_ckpt = CheckpointConfig(save_checkpoint_steps=10,keep_checkpoint_max=keep_checkpoint_max)
ckpt_callback = ModelCheckpoint(prefix="FCN8s",directory="./ckpt",config=config_ckpt)
callbacks.append(ckpt_callback)
model.train(train_epochs, dataset, callbacks=callbacks)
模型推理
import cv2
import matplotlib.pyplot as pltnet = FCN8s(n_class=num_classes)
# 設置超參
ckpt_file = "FCN8s.ckpt"
param_dict = load_checkpoint(ckpt_file)
load_param_into_net(net, param_dict)
eval_batch_size = 4
img_lst = []
mask_lst = []
res_lst = []
# 推理效果展示(上方為輸入圖片,下方為推理效果圖片)
plt.figure(figsize=(8, 5))
show_data = next(dataset_eval.create_dict_iterator())
show_images = show_data["data"].asnumpy()
mask_images = show_data["label"].reshape([4, 512, 512])
show_images = np.clip(show_images, 0, 1)
for i in range(eval_batch_size):img_lst.append(show_images[i])mask_lst.append(mask_images[i])
res = net(show_data["data"]).asnumpy().argmax(axis=1)
for i in range(eval_batch_size):plt.subplot(2, 4, i + 1)plt.imshow(img_lst[i].transpose(1, 2, 0))plt.axis("off")plt.subplots_adjust(wspace=0.05, hspace=0.02)plt.subplot(2, 4, i + 5)plt.imshow(res[i])plt.axis("off")plt.subplots_adjust(wspace=0.05, hspace=0.02)
plt.show()
FCN的優點和不足
除了文中提到的FCN的優缺點,我還了解到以下優缺點:
優點
- 端到端的像素級分類:FCN能夠實現從圖像到像素級的端到端語義分割。
- 保留空間信息:FCN通過卷積層和上采樣操作保留了圖像的重要空間信息,有助于提高分割精度。
- 魯棒性:FCN對圖像的旋轉、平移等變化具有較強的魯棒性。
- 廣泛性:FCN適用于各種類型的圖像分割任務,包括彩色圖像、灰度圖像和多光譜圖像等。
不足
- 訓練復雜性:FCN可能需要多次訓練和微調才能獲得較好的性能,例如FCN-32s、FCN-16s和FCN-8s的逐步訓練。
- 計算量大:FCN需要進行大量的卷積運算和參數學習,導致計算量大,訓練時間長。
- 對噪聲敏感:FCN可能對噪聲和圖像中的無關信息較為敏感,容易受到干擾。
- 數據需求量大:FCN的訓練通常需要大量的標注數據,這在某些領域可能是一個挑戰。
此章節學習到此結束,感謝昇思平臺。