【数据处理】COCO 数据集掩码 Run-Length Encoding (RLE) 编码转二进制掩码
输入:结果.json
输出:mask.jpg
json内容示例如下:
{
"labels":[ # class_id
1,
2,
3,
...
],
"scores":[ # 置信度
0.2,
0.7,
0.3,
...
],
"bboxes":[
[
1244.0,
161.0,
1335.0,
178.0
],
[
1243.0,
161.0,
1336.0,
178.0
],
[
1242.0,
160.0,
1336.0,
179.0
],
...
],
"masks": [ # Run-Length Encoding (RLE) 编码格式的掩码
{
"size": [
1024,
1536
],
"counts": "]UlV15eo06M3O1O100O1000KcPOG]o09dPOF\\o0:dPOF\\o0:dPOF\\o0:dPOF\\o0:cPOG]o0:bPOF^o0:bPOF^o0>0000000000000000000000000O100000000000000O100IaPOM_o03aPOM_o03aPOM_o02bPON^o02bPON^o02cPOM]o03cPOM]o02dPON\\o02dPON\\o02dPOM]o03cPOM]o03cPOM]o03cPOM]o03cPOM]o03cPOM]o03cPOM]o03cPOM]o03cPOM]o03cPOM]o03cPOM]o03cPOM]o03dPOK]o05cPOK]o05700000000O1O2MYP;1hoD00Ojo10WPN002N1ONPkX6"
},
{
"size": [
1024,
1536
],
"counts": "]UkV13io06K3N2N200O10000000000000000000000000000000000000000000000000O1000000000000000000O1000000IaPOM_o03aPOM_o03aPOM_o03aPOM_o03aPOM_o03aPOM_o03aPOM_o03aPOM_o03aPOL`o04`POL`o04`POL`o04`POL`o04`POL`o04`POL`o04`POL`o04`POL`o04`POL`o04aPOJ`o06`POJ`o06aPOI_o06bPOJ^o06600O1O2N1O1O10000000000000WP21hoM00OJ0^PO0ao026002N000001LQkW6"
},
{
"size": [
1024,
1536
],
"counts": "]UjV12lo05J3M3N3N100O10000000O100000000000000000000000000000000000000000000O1000000000000000000O1000000000000000000000000O10O1000000000O1L_POIbo06_POIao06aPOI_o075O1O101N100O100000O010001NXPO0bo00^PO1ho00O1JN^PO2ao00^POOco02\\PONdo043000000O1MRkW6"
},
}
counts
字段是 COCO 数据集中用于表示二进制掩码的 Run-Length Encoding (RLE) 编码格式。RLE 是一种无损数据压缩方法,特别适用于包含大量连续重复值的数据(如二进制掩码)。
RLE 编码格式
RLE 编码的基本思想是将连续的相同值(如 0 或 1)压缩为一个计数值。在 COCO 数据集的 RLE 编码中:
- 编码是一个字符串,由一系列数字和符号组成。
- 数字表示连续像素的数量。
- 符号(如字母或特殊字符)表示像素的值(通常是 0 或 1)。
代码
Python 示例,使用 pycocotools 库将 RLE 编码转换为二进制掩码
def json2starmask(json_data):
"""
Processes the JSON data, decoding the masks for labels == 1 and scores > 0.3.
Args:
json_data (dict): Loaded JSON data.
"""
results = []
labels=json_data['labels']
scores=json_data['scores']
masks=json_data['masks']
for i,(label,score,mask) in enumerate(zip(labels,scores,masks)) :
if label == 1 and score > 0.3: # 这边可以设置想要解吗的label和置信度分数
binary_mask = maskUtils.decode(mask) # min=0,max=1
results.append(binary_mask*255) # mask*255,看的更清楚~
results = np.sum(results, axis=0) #(可选)这一步是将实例分割转为语义分割mask,
return results
json_path='/path/to/结果.json'
with open(json_path, "r", encoding='utf-8') as jsonf:
json_data = json.load(jsonf)
decoded_masks = json2starmask(json_data)
cv2.imwrite('decoded_masks.jpg',decoded_masks)