1.典型的 COCO 标注 JSON 文件
{
"images": [
{
"id": 1,
"file_name": "image1.jpg",
"width": 640,
"height": 480
}
],
"annotations": [
{
"id": 1,
"image_id": 1,
"category_id": 2,
"bbox": [50, 30, 200, 150],
"segmentation": [[50,30,250,30,250,180,50,180]],
"area": 30000,
"iscrowd": 0
}
],
"categories": [
{
"id": 2,
"name": "cat",
"supercategory": "animal"
}
]
}
#images:存储图像信息,如 id、文件名和尺寸。
#annotations:存储标注信息,如目标的 image_id、category_id、bbox([x_min, y_min, width, height])、segmentation(分割点坐标)、area(目标面积)等。
#categories:定义类别信息,包括 id 和 name。
2.COCO json转mask
细胞追踪任务CTC的mask文件一般以背景为0,细胞追踪ID作为该细胞的像素值,而细胞分割不需要区分ID,只需要背景为0,细胞前景非0即可。
import os
import numpy as np
import cv2
import tifffile as tiff
from pycocotools.coco import COCO
from PIL import Image
# COCO 标注文件路径
coco_json_path = ""
mask_output_folder = "" # 存放生成的 mask 的文件夹
# 确保 mask 保存路径存在
os.makedirs(mask_output_folder, exist_ok=True)
# 读取 COCO 标注
coco = COCO(coco_json_path)
image_ids = coco.getImgIds()
# 遍历所有图片
for image_id in image_ids:
image_info = coco.loadImgs(image_id)[0]
width, height = image_info["width"], image_info["height"]
# 生成空白 mask(背景为0)
mask = np.zeros((height, width), dtype=np.uint16)
# 获取该图像的所有标注
ann_ids = coco.getAnnIds(imgIds=image_id)
anns = coco.loadAnns(ann_ids)
# 遍历所有目标
for ann in anns:
segmentation = ann["segmentation"]
track_id = ann.get("track_id", -1) # 获取 track_id
print(track_id)
if track_id == -1:
continue
if isinstance(segmentation, list):
for seg in segmentation:
poly = np.array(seg, dtype=np.int32).reshape(-1, 2)
cv2.fillPoly(mask, [poly], track_id) # 用 track_id 填充 mask 没有可是使用随机像素填充
# 保存 mask 为 tif 格式(使用 LZW 压缩)
mask_path = os.path.join(mask_output_folder, image_info["file_name"].replace(".jpg", ".tif"))
tiff.imwrite(mask_path, mask.astype(np.uint16), compression="lzw")
# img = Image.open(mask_path)
# print(img.mode)
print(f"Saved mask: {mask_path}")
print("finished !")