U-net基礎入門(包括糾錯過程)

ckxllf發表於2020-04-02

  原文在此:U-net:執行你的第一個U-net進行影像分割

  程式碼: Github程式碼

  接下來我將就我自己執行原博主程式碼的除錯過程進行一些記錄。

  1.libtiff

  有關libtiff庫的匯入,我認為大家還是使用下載好檔案後,進入你的執行環境中,用

  pip instll 下載好的檔案路徑

  安裝最為穩妥

  注意:博主blog中的檔案結構與他程式碼中使用的檔案結構是有一定出入的,個人認為是在後續更改程式碼的時候忘記更改部落格中的說明了,所以截至今天2020-04-02,請大家先以我的說明為準,如果再產生新的錯誤,大家根據報錯來進行新的更改。

  2.U-Net 資料夾結構

  –Unet-master

  –deform

  –train

  –label

  0.tif

  1.tif

  ……

  29.tif

  train

  0.tif

  1.tif

  ……

  29.tif

  –my_test

  data. py

  unet. py

  –npydata

  –results

  –test

  0.tif

  1.tif

  ……

  29.tif

  test

  0.tif

  1.tif

  ……

  29.tif

  注:–黑體表示的是資料夾;斜體表示的是檔案。

  接下來就要根據這個檔案結構來進行程式碼的除錯執行。

  (PS:之後的報錯還需要對這個結構進行更改)

  3.data.py

  報錯1:

  FileNotFoundError: [Errno 2] No such file or directory: '../npydata/imgs_train.npy' wei shen me

  解決方法:

  確認你的data.py檔案是否在’my_test’資料夾中。

  windows中’…/'表示返回上層檔案,所以,data.py應該是和’npydata’資料夾的子檔案同一級別。

  報錯2:

  FileNotFoundError: [Errno 2] No such file or directory: '../test/test\\0.tif'

  解決方法:

  完全按照上述的資料夾結構佈局,這個問題自然解決。

  原博主的測試圖片檔案儲存在’test’資料夾當中,在Github中,‘test’&'train’資料夾同在’images’資料夾下。

  我猜測博主是複製’images/test’資料夾後又將’images/test’資料夾複製了一遍。(正因為這一點,在之後的一個報錯中我明白了為什麼會產生錯誤。博主這麼做是有意的。)

  成功執行’data.py’檔案後得到以下結果:

  ------------------------------

  Creating training images...

  ------------------------------

  []

  0

  loading done

  Saving to .npy files done.

  ------------------------------

  Creating test images...

  ------------------------------

  30

  loading done

  Saving to imgs_test.npy files done.

  ------------------------------

  load train images...

  ------------------------------

  (0, 512, 512, 1) (0, 512, 512, 1)

  其他:

  注意此次結果中的‘0’的顯示

  ……………………………………

  []

  0

  loading done

  ……………………………………

  (0, 512, 512, 1) (0, 512, 512, 1)

  在執行’data.py’檔案中我還遇到了一些Warning,這個也是預告著之後會出問題。如下:

  ../Unet-master/my_test/data.py:207: RuntimeWarning: Mean of empty slice.

  mean = imgs_train.mean(axis = 0)

  ..\lib\site-packages\numpy\core\_methods.py:78: RuntimeWarning: invalid value encountered in true_divide

  ret, rcount, out=ret, casting='unsafe', subok=False)

  同時,在’npydata’資料夾下生成三個’.npy’檔案

  –npydata

  imgs_mask_train.npy

  imgs_test.npy

  imgs_train.npy

  4.unet.py

  報錯1.1:

  TypeError: 'module' object is not callable

  解決方法:

  更改問題程式碼。

  因為tensorflow不同的版本,語法的使用會有所不同。

  #更改前

  merge6 = merge([crop4,up6], mode = 'concat', concat_axis = 3)

  #更改後

  merge6 = Concatenate([drop4,up6],axis=3)

  同理更改merge7,8,9:

  #更改後

  merge7 = Concatenate(axis=3)([conv3, up7])

  ...

  merge8 = Concatenate(axis=3)([conv2, up8])

  ...

  merge9 = Concatenate(axis=3)([conv1, up9])

  ...

  報錯1.2:

  NameError: name 'Concatenate' is not defined

  解決方法:

  ‘from keras.layers import Concatenate ’

  把Concatenate模組(module)載入後才能呼叫。

  報錯2:

  UnboundLocalError: local variable 'batch_index' referenced before assignment

  解決方法1:

  這次先說報錯原因,在’data.py’的報錯1中的其他提到了注意‘0’的顯示,這說明程式其實並沒能夠載入資料到.npy檔案當中去,程式碼產生了錯誤。而這個錯誤的原因是原作者對程式碼編寫時對路徑的定義產生了問題。

  class dataProcess(object):

  def __init__(self, out_rows, out_cols,

  data_path = "../deform/train",

  label_path = "../deform/label",

  test_path = "../test",

  npy_path = "../npydata",

  img_type = "tif"

  ):

  data_path & label_path的路徑定義和之後的程式碼產生了衝突,為了解決這一衝突,不得已把檔案結構變得更加複雜化。 鄭州做人流哪家醫院好

  還記的以開始所說的要對結構進行更改嗎?

  U-Net 資料夾結構

  –Unet-master

  –deform

  –label

  0.tif

  1.tif

  ……

  29.tif

  train(注意這個train資料夾只是命名為train,裡面的tif檔案是label檔案)

  0.tif

  1.tif

  ……

  29.tif

  –train

  0.tif

  1.tif

  ……

  29.tif

  train

  0.tif

  1.tif

  ……

  29.tif

  –my_test

  data. py

  unet. py

  –npydata

  –results

  –test

  0.tif

  1.tif

  ……

  29.tif

  +test

  0.tif

  1.tif

  ……

  29.tif

  #修改檔案結構前

  imgs = glob.glob(self.data_path+"/*."+self.img_type)

  >>無任何結果顯示

  #修改檔案結構後

  imgs = glob.glob(self.data_path+"/*."+self.img_type)

  >>'../deform/train\\0.tif','../deform/train\\1.tif',...

  #修改檔案結構前

  midname = imgname[imgname.rindex("/")+1:]

  >>無任何結果顯示

  #修改檔案結構後

  midname = imgname[imgname.rindex("/")+1:]

  >>'train\0.tif','train\1.tif',...

  img = load_img(self.data_path + "/" + midname,grayscale = True)

  label = load_img(self.label_path + "/" + midname,grayscale = True)

  #(注意這個midname其實是'train\*.tif',所以之後的檔案結構更改時,'deform-label-train'資料夾只是命名為train,裡面的tif檔案是label的檔案)

  解決方法2:

  這個bug還有一個簡單的解決方式,因為會出現這個問題,說明你用的應該是windows系統,而正因為此,系統的分隔符判定不同。

  #修改前

  midname = imgname[imgname.rindex("/")+1:]

  #修改後

  midname = imgname[imgname.rindex("\\")+1:]

  使用這個方法,你的檔案結構就可以簡化。

  #存放圖片的檔案結構

  | --deform

  | |

  | |--label

  | | | 0.tif

  | | | 1.tif

  | | | ……

  | | | 29.tif

  | | |

  | |--train

  | | | 0.tif

  | | | 1.tif

  | | | ……

  | | | 29.tif

  | | |

  |--test

  | | 0.tif

  | | 1.tif

  | | ……

  | | 29.tif

  | |

  當你把所有以上的程式碼報錯都解決了,重新執行data.py,生成3個.npy檔案,儲存在’npydata’資料夾中,然後執行unet.py,程式碼就可以跑通了,但是結果如何還無法保證。

  5.因為會有

  報錯*

  FileNotFoundError: [Errno 2] No such file or directory: '../results/imgs_mask_test.npy'

  解決方法:

  #定位

  print('predict test data')

  imgs_mask_test = model.predict(imgs_test, batch_size=1, verbose=1)

  #新增程式碼

  path = '../results'

  if not os.path.exists(path):

  os.mkdir(path)

  #定位

  np.save('../results/imgs_mask_test.npy', imgs_mask_test)

  原理

  可以參考我的另一篇blog。

  同理,你之前遇到的任何可能的資料夾錯誤都可以使用這一個方法來解決。

  結束語

  今天先記錄一下U-net學習的第一步,之後的過程有需要繼續更新。

  最後讓大家看那麼久的文字過意不去,最後貼上檔案結構圖:

  執行程式前的結構:

  deform下包含兩個資料夾,label和train。

  my_test資料夾下面是兩個主要的.py檔案。

  label和train資料夾下是訓練用的圖片,為了減少計算,我只放了兩張圖在裡面,同理test資料夾也一樣。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69945560/viewspace-2684151/,如需轉載,請註明出處,否則將追究法律責任。

相關文章