Mask_RCNN入門(二)—— 訓練自己的數據集

寫在前面

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項目進行其他的訓練
    這樣後面的修改的地方很少,基本就是:
  1. train_data文件夾
  2. train.py中的NUM_CLASSES,self.add_class()和label[i].find
  3. test.py中的h5路徑,測試圖片路徑,NUM_CLASSES和class_names
    這樣也可以使用統一的運行conda環境,labelme工具等
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章