iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 26
0
AI & Data

從零.4開始我的深度學習之旅:從 用tf.data處理資料 到 用tf.estimator或tf.keras 訓練模型系列 第 26

二、教你怎麼看source code,找到核心程式碼 ep.19:把tfrecord parse完了,接著做了哪些preprocess? 3

文章說明

文章分段

  1. 文章說明
  2. deeplab的簡單介紹、於我的意義
  3. tensorflow的程式碼特色
  4. 訓練流程的細節
  5. 逛deeplab的github程式,順序:train.py model.py datasets/data_generator.py …

前情提要

接續ep.18。

逛deeplab的github程式(cont.)

input_preprocess.py (cont.)

  • 107-109行取得目前有經過resize這道處理的圖片的尺。tf.shape的axis 0是平常圖片的高、axis 1則是圖片的寬。
  • 111-112行則是分別把圖片高寬加上圖片與裁切尺寸的差值,作為data新的高與寬,也就是說如果裁切尺寸大於圖片的話,圖片周圍就會被多加pixel;如果裁切尺寸小於圖片的話,則圖片的高寬先維持原樣。

 

  • 116行是feature.extractor的mean_pixel()method:
    • core/feature_extractor.py

    • 回傳的是根據各backbone預設的平均pixel值,list由左至右的是RGB三通道。
  • 115行的tf.reshape會把mean_pixel()回傳的list,reshape成(1, 1, 3)的tensor放入mean_pixel變數中。

 

  • 接著117行就把data、offset與指定的高寬和平均pixel輸入pad_to_bounding_box()中,tensorflow的image API中也有實作一個同名的method,但這兩個有稍微不同之處:Deeplab這裡實作的方法,可以輸入任意要padding的值,不用一定是0;在圖片尺寸不明的狀況下亦可處理
  • 然後120-122行就是對label做同樣的padding處理,讓data與label一致。

 


再來是將已經經過resize、padding的影像,用random_crop()隨機裁切,他的第一個參數是把data與label這兩個高寬相同、但channel數不同的tensor用list包起來,這樣分批可以加快速度處理。

所做的事情是隨機在圖片的任意位置上產生指定crop尺寸(預設是513,513)的bounding box,然後再根據bounding box做裁切。

 


做完一切處理後,所有的影像皆為指定的crop尺寸,就把影像的尺寸給設定好。label也是。

 


接著最後就是在訓練時,以0.5的機率將data與label作為一組進行左右翻轉。這個method也是自製的,而非使用tf.random_flip_left_right,這樣可以調控翻轉的比例並且確保data與label是接受相同的處理。

最後就將處理完成的data與label回傳。


上一篇
二、教你怎麼看source code,找到核心程式碼 ep.18:把tfrecord parse完了,接著做了哪些preprocess? 2
下一篇
二、教你怎麼看source code,找到核心程式碼 ep.20:總結一下第二篇每個ep在介紹什麼
系列文
從零.4開始我的深度學習之旅:從 用tf.data處理資料 到 用tf.estimator或tf.keras 訓練模型30

尚未有邦友留言

立即登入留言