一:數據準備:
1、網上下載labelme開源標註工具並根據官網配置環境,然後標註數據並生成標籤數據
2、根據voc數據製作方式製作tfrecord數據
二:訓練前代碼準備:
修改:segmentation_dataset.py、train_utils.py
segmentation_dataset.py在deeplab/datasets下面
在_DATASETS_INFORMATION = {對應的位置根據voc格式添加自己的數據,如下:
_DATASETS_INFORMATION = {
'cityscapes': _CITYSCAPES_INFORMATION,
'pascal_voc_seg': _PASCAL_VOC_SEG_INFORMATION,
'ade20k': _ADE20K_INFORMATION,
'lab': _LAB_DATASET, #此爲新添加的自己的數據信息,在訓練參數裏面對應--datasets參數
}
lab數據集仿照pascal_voc_seg數據集添加數據集信息 如下:
_LAB_DATASET = DatasetDescriptor(
splits_to_sizes={
'train': 150, # 訓練集的個數
'trainval': 250, #訓練驗證集的個數
'val': 100, #驗證集的個數
},
num_classes=4, #label+1 (not use ignore label)
ignore_label=255, # 用於有白邊的標註情況
)
修改train_utils.py,此文件在deeplab/util下面,在不需要加載的層裏面添加logits,作用是在使用預訓練權重的時候不加載此層
# Variables that will not be restored.
exclude_list = ['global_step','logits']
if not initialize_last_layer:
exclude_list.extend(last_layers)
logits理解:就是對概率求對數log(p/(1-p))
如果想在DeepLab的基礎上fine-tune其他數據集, 可在train.py中修改輸入參數。有一些選項:
使用預訓練的所有權重,設置initialize_last_layer=True
只使用網絡的backbone,設置initialize_last_layer=False和last_layers_contain_logits_only=False
使用所有的預訓練權重,除了logits,因爲如果是自己的數據集,對應的classes不同(這個我們前面已經設置不加載logits),可設置initialize_last_layer=False和last_layers_contain_logits_only=True
遵循的公式是(crop_size-1)/4爲整數
問題解析:
1、每次運行完eval.py和vis.py後,程序都沒有自己結束,而是提示“Waiting for new checkpoint at tboard_logs”,如何讓程序結束
2、在執行eval的時候出現如下問題:[`predictions` out of bound]
此問題修改方法如下:
把eval.py的145行修改如下:
修改前:
metric_map = {}
metric_map[predictions_tag] = tf.metrics.mean_iou(
predictions, labels, dataset.num_classes, weights=weights)
修改後:
metric_map = {}
# insert by trobr
indices = tf.squeeze(tf.where(tf.less_equal(
labels, dataset.num_classes - 1)), 1)
labels = tf.cast(tf.gather(labels, indices), tf.int32)
predictions = tf.gather(predictions, indices)
# end of insert
metric_map[predictions_tag] = tf.metrics.mean_iou(
predictions, labels, dataset.num_classes, weights=weights)
3、在運行eval的時候出現Expected [513,513,3], got [513,616,3] 這樣的錯誤,此問題是因爲設置的crop_size不滿足所有的圖片要求
解決方法,查詢圖片的最大size,設置上即可
4、InternalError: Dst tensor is not initialized.
此問題是GPU內存耗盡,tensorflow默認使用所有的GPU資源,運行程序之前,先運行export CUDA_VISIBLE_DEVICES=1,僅顯卡設備1GPU可見
5、tensorflow.python.framework.errors_impl.ResourceExhaustedError: OOM when allocating tensor with shap
表示顯卡內容不能此次處理
解決方法:
- 減少批處理Batch 的大小
- 降低全連接層的維度
- 增加池化 層
- 縮小輸入圖片大小