寫在前面
和Mask_RCNN入門(一)—— 跑通代碼一樣,本文將列出自己參考的教程,重點介紹注意點和踩的坑。
本文主要參考教程:Mask R-CNN tensorflow 訓練自己的數據
廢話不多說,按照教程開始實踐
step1:使用labelme標註好圖片
關於labelme的安裝和使用,這裏不再贅述,請參考:圖片標註工具Labelme的安裝及使用方法,當然有幾個小建議:
- 建議單獨創建一個conda環境,或者conda的base環境,用於labelme包的安裝
因爲這樣可以所有的conda環境都可以使用此環境下的labelme,不用每個環境都裝一遍,我是單獨創建了一個名爲label的conda環境用於labelme包的安裝。 - 建議將labelme的啓動寫成一個bat腳本
這樣免得每次啓動labelme都要conda activate相應環境,激活,比較麻煩,我的bat腳本內容如下:
@echo.
@echo ***進入conda命令行,並直接切換到labelme環境***
@echo.
@echo.
@echo.
CALL C:\ProgramData\Anaconda3\Scripts\activate.bat C:\ProgramData\Anaconda3\envs\labelme
@echo.
@echo.
@echo.
@echo ***啓動labelme***
@echo.
@echo.
@echo.
::不知道爲啥,直接labelme就會陷入死循環,換成labelme.exe
labelme.exe
這樣每次雙擊bat即可啓動labelme:
接下來就是使用labelme標註好要訓練的圖片,原始圖片和json單獨放置,這裏不再贅述:
step2:批量轉化json文件
單個json文件的轉化,參考:labelme安裝與使用,但這裏坑:
- 坑1:Anaconda/3envs/labelme/Scripts文件夾下沒有label_json_to_dataset.exe
只有labelme_json_to_dataset.exe,所以轉化單個json文件的命令應該爲:
C:/ProgramData/Anaconda3/3envs/labelme/Scripts/labelme_json_to_dataset xxx.json
(labelme_json_to_dataset和json文件路徑根據自己機器位置修改)
- 坑2:無法生成yaml
應該是版本原因,我是用的labelme_json_to_dataset.exe轉化後的數據中沒有info.yaml,經過查資料labelme:缺少生成"info.yaml"文件知修改labelme/cli下的json_to_dataset.py文件(這是labelme_json_to_dataset.exe的源文件)在我的電腦位置爲:
C:\ProgramData\Anaconda3\envs\labelme\Lib\site-packages\labelme\cli
按照資料中修改,之後就可以正常生成info.yaml
- 坑3:批量轉化的代碼跑不通
這裏是我的批量轉化的代碼:
import os
path = r'C:\Users\apple\Desktop\labelme\json' # path是你存放json的路徑
json_file = os.listdir(path)
for file in json_file:
os.system("C:\ProgramData\Anaconda3\envs\labelme\Scripts\labelme_json_to_dataset.exe %s" % (path + '/' + file))
其中的labelme_json_to_dataset.exe和json位置根據自己機器修改。下面是結果:
轉化後的json和原json文件在一個文件夾下,單獨一個xx_json文件:
step3:新建train_data
按照[教程[(https://blog.csdn.net/doudou_here/article/details/87855273)直接跟着做。
項目目錄下,新建directory目錄結構如下:
其中pic放入標註的原圖,json放入labelme標註得到的所有json文件,labelme_json放入轉化後的json文件,cv2_mask放入每個labelme_json文件下的label文件。
其中,前三個直接copy過來就可以,但cv2_mask要重新命名,翻看每個轉化之後的json文件夾可以發現,裏面的掩膜圖片名字都爲label.png:
需要將label.png命名爲對應的“文件名.png”格式,建議使用代碼實現,下面這是我的代碼(其中的文件路徑根據自己需要修改):
import os
import shutil
filename = "C:/Users/apple/Desktop/labelme/json/" # 存放json轉化得到的文件夾名稱,需要保證沒有隱藏的文件夾
fileList = os.listdir(filename)
"""
抽取json轉化得到的5個文件中的label.png,並重新命名
"""
for i in range(len(fileList)):
path = filename + fileList[i];
# 如果不是文件夾,跳過
if os.path.isfile(path):
continue
no = fileList[i][:-5] # 從文件夾上取出文件名
mask_source = path + "/label.png"
mask_target = "train_data/cv2_mask/{}.png".format(no) # 命名爲“文件名.png”
shutil.copy(mask_source, mask_target) # 利用shutil直接copy過去
注意,很多教程都會提示label.png是16位的,而訓練(要用cv2處理)需要使用8位的,所以需要對label.png進行轉化才能使用,但是我參考的Mask R-CNN tensorflow 訓練自己的數據說得很明白,labelme升級以後轉化得到的label.png就是8位的,不用轉換,教程也說明:打開的圖片是彩色的就說明已經是8位的了,這一點我想還是做到有理有據比較好:
- 查看圖片位深度
圖片 —— 屬性 —— 詳細信息,以我的第一張圖片爲例,查看label.png:
很明顯,就是8位的。 - 8位和16位png看起來有什麼區別
爲了看清楚,專門網上找了代碼對上圖中8位的label.png進行了轉化,下面分別是8位和16位圖片:
8位
16位:
step4:新建train.py
按照教程在項目目錄下新建train.py,內容不再贅述,直接copy即可,經實測,修改的地方按教程來即可。
在之前創建的conda環境下,進入項目目錄,直接:
python train.py
即可開始訓練,不一會兒可以看到項目目錄下多了logs目錄:
這個h5文件就是我們下面進行預測用到的模型。
step5:新建test.py
同樣在項目目錄下新建test.py(教程中名字爲fortest.py),內容直接copy即可,但經實測,如果只按教程中修改h5模型路徑和測試圖片路徑,運行test.py 會報錯:
這是因爲就和train.py一樣,在:
需要按自己訓練集修改。修改後再運行,報錯:
這是因爲還有一處需要修改:
除了保留“BG”外,後面放上自己訓練的label。運行,OK:
一些建議
- 成功跑通一個訓練過程以後,以後可以直接copy項目進行其他的訓練
這樣後面的修改的地方很少,基本就是:
- train_data文件夾
- train.py中的NUM_CLASSES,self.add_class()和label[i].find
- test.py中的h5路徑,測試圖片路徑,NUM_CLASSES和class_names
這樣也可以使用統一的運行conda環境,labelme工具等