前言
由於系列(五)中提到的github開源項目只針對VOC2012格式數據集進行FCN模型訓練,所以爲了方便起見,我們在對自己數據集進行標註完成後,需要先轉換成VOC格式再來用該項目代碼訓練我們自己的FCN模型。
數據格式轉換
1)將所有標註結果文件(每個樣本圖片都對應一個json文件)放在一個目錄裏面。
2)仿照json_to_dataset.py,寫一個腳本來遍歷上面目錄裏面所有json文件,並分別轉換成同文件名的png圖片。這一步驟是必需而且非常重要。將來訓練時只需要這些png的label圖片即可。
3)另外再寫一個腳本來提取出所有json的文件名,並根據train和val數目的劃分,分別保存成train.txt和val.txt。 當然,這兩個腳本完全可以合併成一個腳本。
4)在linux服務器上,先創建一個數據集根目錄,比如說self_data_set,其路徑假設是/work/self_data_set
5)在self_data_set下面創建JPEGImages子目錄,並把所有樣本圖片都放到該目錄下。
6)類似地,創建SegmentationClass子目錄,並把前面轉換好的png圖片放放到該目錄中。
7)同理,創建ImageSets子目錄,並把train.txt和val.txt放到該目錄中。
模型訓練
由於每個數據集的情況不一樣,比如說class name和number不相同,所以需要對train和樣本數據集相關代碼進行相應修改。
我們先看 train.py
1)要根據自己數據集情況來修改基本訓練參數,比如batch_size, epochs, class num以及learning_rate。
parser = ArgumentParser()
parser.add_argument('-bs', '--batch_size', type=int, default=2, help="batch size of the data")
parser.add_argument('-e', '--epochs', type=int, default=200, help='epoch of the train')
parser.add_argument('-c', '--n_class', type=int, default=2, help='the classes of the dataset')
parser.add_argument('-lr', '--learning_rate', type=float, default=1e-3, help='learning rate')
2) 指定樣本數據集root路徑
# self dataset
data_path = os.path.expanduser('/work/')
voc_loader.py是專門讀取voc格式的數據集的腳本文件,也需要做相應修改:
1)class name的修改:
class VOCClassSegBase(data.Dataset):
class_names = np.array([
'background',
'xxx',
... ...
])
2)進一步指定自己數據集的根目錄
# dataset root dir
dataset_dir = osp.join(self.root, 'self_data_set')
至此,就可以運行 python3 train.py來開始訓練模型了。
其部分log如下所示