news 2026/7/10 3:33:08

对coco格式的分割标注生成二值mask

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
对coco格式的分割标注生成二值mask

@对coco格式的分割标注生成二值mask

对coco格式的分割标注生成二值mask

给定_annotations.coco.json文件,将里面的特定类别解码批量生成二值mask,代码如下:

import json from pathlib import Path import numpy as np from PIL import Image from pycocotools import mask as maskUtils def decode_coco_rle(rle: dict) -> np.ndarray: """ 使用 pycocotools 官方实现解码 COCO RLE,返回 0/255 的二值掩码。 rle 形如 {"counts": "...", "size": [height, width]}。 """ # 有些版本要求 counts 为 bytes,这里兼容处理一下 if isinstance(rle.get("counts"), str): rle = rle.copy() rle["counts"] = rle["counts"].encode("utf-8") mask = maskUtils.decode(rle) # H x W,0/1 uint8 # 统一转为 0/255 mask = (mask.astype(np.uint8)) * 255 return mask def main(): root = Path(__file__).resolve().parent coco_path = root / "_annotations.coco.json" images_dir = root / "images" masks_dir = root / "mask" masks_dir.mkdir(exist_ok=True) # 只保留的类别 id TARGET_CATEGORY_ID = 1 with coco_path.open("r", encoding="utf-8") as f: coco = json.load(f) # image_id -> image_info image_map = {img["id"]: img for img in coco["images"]} # image_id -> 该图像下、且 category_id == 1 的所有标注 annos_by_image = {} for anno in coco["annotations"]: if anno.get("category_id") != TARGET_CATEGORY_ID: # 忽略 category_id 为 0 或其它的标注 continue img_id = anno["image_id"] annos_by_image.setdefault(img_id, []).append(anno) # 对每张图,合成只包含 category_id == 1 的 mask for image_id, info in image_map.items(): height = info["height"] width = info["width"] mask = np.zeros((height, width), dtype=np.uint8) for anno in annos_by_image.get(image_id, []): seg = anno["segmentation"] # 只处理 RLE 字典形式 if not isinstance(seg, dict) or "counts" not in seg: continue decoded = decode_coco_rle(seg) # 多个实例取最大,合并为一张前景=255 的二值图 mask = np.maximum(mask, decoded) # 保存为灰度图(0/255) out_path = masks_dir / info["file_name"] Image.fromarray(mask, mode="L").save(out_path) print(f"saved: {out_path}") print("全部处理完成。") if __name__ == "__main__": main()

coco格式的存储形式示例如下:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/9 20:51:05

LangChain工具使用:简化AI函数调用

本章对应源代码:https://github.com/RealKai42/langchainjs-juejin/blob/main/lc-tools.ipynb 上一节中,我们学习了如何直接使用 openAI 的原生 API 去使用 function calling (tools)功能,需要自己维护历史、写参数类…

作者头像 李华
网站建设 2026/7/6 12:17:35

Docker 镜像打包为 tar 并在其他环境加载运行(离线部署实战指南)

Docker 镜像打包为 tar 并在其他环境加载运行(离线部署实战指南)适用场景:内网部署 / 无法访问 Docker Hub / 生产环境离线交付 阅读目标:掌握 Docker 镜像打包、传输、加载、运行的完整闭环一、为什么需要把 Docker 镜像打包成 t…

作者头像 李华
网站建设 2026/7/7 8:01:33

Docker 镜像体积优化实战:从 1GB 到 100MB

Docker 镜像体积优化实战:从 1GB 到 100MB适用人群:已经使用 Docker,有镜像体积焦虑的开发者 / 运维工程师 阅读目标:掌握 一套可复用的镜像瘦身方法论,而不是零散技巧一、为什么 Docker 镜像会变得这么大?…

作者头像 李华
网站建设 2026/7/8 21:41:40

LobeChat能否分配任务?团队协作智能调度

LobeChat能否分配任务?团队协作智能调度 在现代企业中,一个常见的场景是:产品经理在群里说“帮我把昨天会议里的三个需求整理成文档”,接着有人手动打开 Notion,翻找聊天记录,复制粘贴、重新组织语言——整…

作者头像 李华
网站建设 2026/7/10 0:00:20

LobeChat能否拒绝不当请求?安全护栏实践

LobeChat能否拒绝不当请求?安全护栏实践 在AI助手日益普及的今天,一个看似简单的问题正变得至关重要:当用户提出“如何破解公司系统”或“生成一段仇恨言论”时,聊天机器人该不该响应?又能不能主动拒绝? 这…

作者头像 李华
网站建设 2026/7/10 3:19:48

基于Docker安装的TensorRT镜像实现高并发推理

基于Docker安装的TensorRT镜像实现高并发推理 在如今AI模型不断“长大”的时代,部署一个训练好的深度学习模型早已不再是简单地跑通model.predict()就能收工的事。尤其是在视频监控、实时推荐、自动驾驶感知等场景中,系统每秒要处理成百上千个请求&#…

作者头像 李华