cocoapi 是目前mask数据记录的一个比较好的解决方案, 网上有很多相关的使用资料.如COCO数据集介绍, 这里感谢大家的贡献.
cocoapi 数据本身是一组json描述结构, cocoapi 项目是解析和生成json数据结构, json有个不能嵌套的弊端, 所以一个json文件往往比较大.
cocoapi核心部分是rle数据的压缩, 我本地尝试了一张图片, 如果保存png格式, 数据大小在1.4M左右, 如果使用rle格式保存存储数据只有82.7K, 相对压缩了17倍, 对于传输和存储非常友好, 很多项目直接使用的 rle 数据结构, 而不是 cocoapi 的完整协议.
比如我这里参考的 SA-1B(segment-anything) 数据结构.SA-1B(segment-anything)/An_...Y0/sa_10001.json
{"image": {"image_id": 10001,"width": 2250,"height": 1500,"file_name": "sa_10001.jpg"},"annotations": [{"bbox": [957.0,514.0,75.0,91.0],"area": 5437,"segmentation": {"size": [1500,2250],"counts": "]]j[1<\\^17J5K5L3K6J6@?F:K5L3O2N1O2M2O1O100O00100O100O10O10O1000O10O1000O100000000O1000001O0O101O000O2O001O1N101O1O0O2O1O1O1O1N2O1O1O2M2O2N1O2N2N2M4M2N3L5K6I8D^Ufg1"},"predicted_iou": 0.9770874977111816,"point_coords": [[1018.0625,559.0625]],"crop_box": [499.0,311.0,755.0,567.0],"id": 857953971,"stability_score": 0.985213577747345},{"bbox": [1373.0,575.0,83.0,75.0],"area": 3007,"segmentation": {"size": [1500,2250],"counts": "_ikn1=]^14N2M2O2N1N3N1O1O1O101N1O101N1O2O0O100O2O001O00001O001O1O001O001O10O0100O100O01N101N001O000000000O10001O00000000001O0O2O1O1O1O1O001O001O001O001O2N3M2M2O2N1O1O2N2M3N4IooXT1"},"predicted_iou": 0.9649069309234619,"point_coords": [[1422.6875,629.9375]],"crop_box": [998.0,311.0,755.0,567.0],"id": 857953972,"stability_score": 0.9847984313964844},
...
其中 segmentation
数据结构就是 rle
结构的.
from pycocotools import mask as maskUtils
import matplotlib.pyplot as plt
import json# 下载和读取上面的 json数据文件到 mask_info 中, 下面代码进行rle数据解码
mask_a = maskUtils.decode(mask_info['annotations']['segmentation'])# 展示
plt.figure('image')
plt.imshow(mask_a)
plt.show()
主要是一个处理记录, 希望对大家有帮助, 欢迎评论区讨论.