一、預處理數據部分
1、創建 tfrecord(修改 deeplab\ dateasets\ build_data.py)
模型本身是把一張張 jpg 和 png 格式圖片讀到一個 Example 里,寫入 tfrecord。但我是一個大的 tif 文件,需要把幾萬像素的圖片分割成小塊寫入到一個 tfrecord 文件里,而 tf 沒有對 tif 格式的圖片的解碼,因此不能直接使用原來的 build_data.py。
先用 osgeo 里的 gdal 讀取 tif 文件,得到大 tif 的 np.array,再設置步長一塊塊讀取,調用 tobytes() 轉成二進制字符串,保存到 tfrecord 中,不過需要把圖片 shape 都設置好,大小還有維度,這點有待改進。
最后的 tfrecord 里就只有兩個數組:原圖片和標簽值
加入高度和寬度信息后會報錯,不知道怎么 debug,只能從頭到尾固定好大小 321 了
2、data_generator讀數據(修改 deeplab\ dateasets\ data_generator.py)
加入自己的數據集,只需模仿它已經創建的數據就好,訓練驗證測試大小,以及忽略值等
解碼時用 tf.decode_raw() 解碼,不用再根據后綴判斷調用哪個。
二、訓練部分
1、訓練(修改 deeplab\ train.py)
參數設置里需要指定自己的數據集 dataset
由於類別數不同,設置 initialize_last_layer=False,last_layers_contain_logits_only=True
crop_size縮小為321(由於內存不夠,將其改小,但是crop_size至少要大於300,遵循的公式是(crop_size-1)/4為整數)
2、修改 deeplab\ utils\ train_utils.py
159 行改成 exclude_list = ['global_step','logits'],即把 logits 層加到不恢復的列表中,這樣才能訓練自己的數據,改類別數
訓練的一些問題可以參考:https://github.com/tensorflow/models/issues/3730
logits
is the last feature maps before softmax. logits 層是在 softmax 前的最后一層特征圖,是沒有經過歸一化的預測值,如果面對分類問題再經過一層 softmax 就可以得到每類的概率
Maybe this can help you.
The vector of raw (non-normalized) predictions that a classification model generates, which is ordinarily then passed to a normalization function. If the model is solving a multi-class classification problem, logits typically become an input to the softmax function. The softmax function then generates a vector of (normalized) probabilities with one value for each possible class.
三、驗證部分
1、驗證(修改 deeplab\ eval.py)
eval.py 不會出現 miou 分數,在 summary 里加入一個 tf.Print 的 op,就可以顯示了
四、可視化部分
1、可視化(修改 deeplab\ vis.py)
由於沒有每個文件的文件名,需要把 vis.py 里有關文件名的地方做相應的修改,sample.HEIGHT,WIDTH 也沒有要注釋掉。_process_batch 的參數對應修改
需要在 get_dataset_colormap.py 中加入自己的數據集
2、可視化標簽(再修改 deeplab\ vis.py)
原來的 vis 只可視化了圖片和預測值,為了方便比較,把真值也顯示,把 tfrecord 里的真值讀出來就可以
3、可視化預測圖像(修改 deeplab\ utils\ get_dataset_colormap.py)
加入自己的數據集,根據類別設置顏色個數
可視化真值時報錯 label[255] 超出索引,把忽略值直接賦值為0解決
五、預測部分
1、修改deeplab\ datasets\ build_data_test.py
預測數據沒有真值,需要重寫一個 build_data
2、修改 deeplab\ input_preprocess.py
預測時 label 為 None,但原始影像還是要裁剪,去適配我的 data_generator,原始的不需要因為大小信息都在 tfrecord 里,會自動處理,我指定了大小
3、修改 deeplab\ datasets\ data_generator_test.py
不解析 label
參考:https://blog.csdn.net/weixin_38385446/article/details/82781109