一、問題說明
最近在訓練mask rcnn時發現輸入的mask格式不對,后面發現通過labelme
標注並轉換得到的Mask
是單通道彩色圖,Mask
圖像的像素值代表了像素點所屬的類別標簽。對於單個類別的數據集來說, Mask
像素值應該是[0,1], 其中0表示背景區域;對於多個類別的數據集, Mask
像素值應該是[0,1,2,…],顯示為彩色以區分不同目標。如下圖所示,雖然看上去是彩色圖像,但是打開屬性看其位深卻是8。
二、解決辦法
最開始采用OpenCV
讀取,但里面自動轉換成了3通道圖(24位),類似於這篇博客在深度學習中遇到的opencv坑,后面采用Pillow
庫,查看其官網說明,支持8位的調色板格式圖片,如下圖所示。
通過PIL讀取后再依次處理即可正常訓練
三、保存mask為單通道彩圖
tmp_image = np.zeros((h, w), np.uint8)
for mask_id, mask in enumerate(masks):
tmp_image[mask >= 1] = mask_id + 1
tmp_image = Image.fromarray(tmp_image, "P")
palette_data = [0, 0, 0, 128, 0, 0, 0, 128, 0, 128, 128, 0, 0, 0, 128, 128, 0, 128, 0, 128, 128, 128, 128, 128,
64, 0, 0, 192, 0, 0, 64, 128, 0, 192, 128, 0, 64, 0, 128, 192, 0, 128, 64, 128, 128, 192, 128, 128,
0, 64, 0, 128, 64, 0, 0, 192, 0, 128, 192, 0] # 調色板
tmp_image.putpalette(palette_data)
tmp_image.save("D:/mask.png")
參考鏈接
numpy轉PIL.Image: 處理Mask圖像為單通道的彩色/灰度圖colormap.png
在深度學習中遇到的opencv坑