对mask进行rle编码然后进行解码-详细注释
生活随笔
收集整理的這篇文章主要介紹了
对mask进行rle编码然后进行解码-详细注释
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
代碼來自:
https://www.kaggle.com/artgor/segmentation-in-pytorch-using-convenient-tools
代碼如下
import numpy as np# 進行mask存儲,rle一種壓縮存儲方式 # 還有一種是polygon(多邊形)# 這個函數是對mask進行rle編碼,所以輸入的值非0即1 import numpy as np# 進行mask存儲,rle一種壓縮存儲方式 # 還有一種是polygon(多邊形)# 這個函數是對mask進行rle編碼,所以輸入的值非0即1 def mask2rle(img):'''Convert mask to rle.img: numpy array, 1 - mask, 0 - backgroundReturns run length as string formated'''print("看下輸入的img",img)pixels= img.T.flatten()#轉置后看圖像print("pixels進行flatten以后=",pixels) # pixels進行flatten以后= [1 1 0 0 0 0 0 0 0 0 0 0 1 1]#14位pixels = np.concatenate([[0], pixels, [0]])print("pixels=",pixels) # pixels = [0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0]#16位runs = np.where(pixels[1:] != pixels[:-1])[0] + 1print("runs=",runs)#這個記錄的是bit值開始變化的位置,這里+1是為了位置的調整runs[1::2] -= runs[::2]#這句代碼寫得很抽象,其實是在進行編碼.#運行前的結果是:# runs= [ 1 3 13 15] #runs中的每個數值都代表像素值發生變化的位置# 運行后的結果是:# runs= [ 1 2 13 2]# 意思是第1個位置算起,共有2個bit是相同的,所以用3-1得到# 意思是第13個位置算起,共有2個bit是相同的,所以用15-13得到。# 對應上面頭部和末尾的兩個11print("runs=",runs)return ' '.join(str(x) for x in runs)# 這個是用來解碼train.csv中的Encoded Pixels的 def rle_decode(mask_rle: str = '', shape: tuple = (1400, 2100)):'''Decode rle encoded mask.:param mask_rle: run-length as string formatted (start length):param shape: (height, width) of array to return Returns numpy array, 1 - mask, 0 - background'''s = mask_rle.split()#這個運算前后沒啥區別print("-----------------------------------------------------------")print("s[0:][::2]=",s[0:][::2])#這個獲取的是變化的像素的位置序號的列表# ['1', '13']print("s[1:][::2]=",s[1:][::2])#這個獲取的是相同像素的長度列表(分別記錄每個變化的像素后面連續的同等像素值的連續長度)#['2', '2']starts, lengths = [np.asarray(x, dtype=int) for x in (s[0:][::2], s[1:][::2])]print("看下最初的starts=",starts)#變化的像素的位置序號的列表print("lengths=",lengths)starts -= 1ends = starts + lengthsprint("ends=",ends)img = np.zeros(shape[0] * shape[1], dtype=np.uint8)for lo, hi in zip(starts, ends):#進行恢復img[lo:hi] = 1return img.reshape(shape, order='F')if __name__ == '__main__':img=np.array([[1,0,0,0,0,0,1],[1,0,0,0,0,0,1]])print("輸入的圖像是",img)result=mask2rle(img)print("mask2rle的編碼結果=",result)result=rle_decode("1 2 13 2", (2, 7))print("rle_decode的解碼結果=",result)?
上述mask2rle與rle_decode是互為可逆的。
?
rle編碼的格式是:
格式是像素位置,長度(這了包含其實位置的像素的計數)
根據大佬的說法是,rle編碼能節省內存。
?
?
總結
以上是生活随笔為你收集整理的对mask进行rle编码然后进行解码-详细注释的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Understanding Clouds
- 下一篇: wine运行游戏时候的最小化