DeeplabV3+ tensorflow學習以及訓練自己的數據

一:數據準備:

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 的大小
  • 降低全連接層的維度
  • 增加池化 層
  • 縮小輸入圖片大小
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章