如何使用COCO数据集,注意事项

部署运行你感兴趣的模型镜像

COCO数据集可用来训练目标检测,分类,实例分割等。

下面简单说下如何使用这个数据集,
数据集下载可用如下的代码进行,以2017为例。

# Download the image data.
cd ./images
echo "Downloading MSCOCO train images ..."
curl -LO http://images.cocodataset.org/zips/train2017.zip
echo "Downloading MSCOCO val images ..."
curl -LO http://images.cocodataset.org/zips/val2017.zip

cd ../
if [ ! -d annotations ]
  then
    mkdir -p ./annotations
fi

# Download the annotation data.
cd ./annotations
echo "Downloading MSCOCO train/val annotations ..."
curl -LO http://images.cocodataset.org/annotations/annotations_trainval2017.zip
echo "Finished downloading. Now extracting ..."

# Unzip data
echo "Extracting train images ..."
unzip -qqjd ../images ../images/train2017.zip
echo "Extracting val images ..."
unzip -qqjd ../images ../images/val2017.zip
echo "Extracting annotations ..."
unzip -qqd .. ./annotations_trainval2017.zip

会得到这2个文件夹

在这里插入图片描述
annotation文件夹下有各种json文件,记下它们的路径,后面要用到。

下面说下数据集处理的主要流程,主要用COCO API来提取数据,这个API是conda自带的,不需要另外安装
用的时候import就行了

from pycocotools.coco import COCO

刚才说了annotation文件夹下有json文件,假设这个json文件的路径为ann_path(包括json)
把这个路径传给COCO API

self.coco_api = COCO(ann_path)

然后你就能用这个coco_api提取各种数据,
比如提取类别转为label

self.cat_ids = sorted(self.coco_api.getCatIds())
self.cat2label = {cat_id: i for i, cat_id in enumerate(self.cat_ids)}

提取类别的名称

self.cats = self.coco_api.loadCats(self.cat_ids)
self.class_names = [cat["name"] for cat in self.cats]

提取img_id, 每个id对应一个img文件名,还能根据这个img_id提取对应的annotation,
把img_id对应的信息全部放到img_info里面

self.img_ids = sorted(self.coco_api.imgs.keys()) #这个是全部图片的img_id,需要的时候根据idx提取一个
img_info = self.coco_api.loadImgs(self.img_ids)

所以后面能用img_info干什么呢。
从pytorch的__getitem__函数说起吧,
getitem函数会传入一个idx, 提取这个idx对应的图片和annotation.

我们可以根据上面得到的全部图片的img_id, 也就是self.img_ids, 得到idx对应的img_id
再根据这个img_id得到这个图片对应的annotation

img_id = self.img_ids[idx]
ann_ids = self.coco_api.getAnnIds([img_id])
anns = self.coco_api.loadAnns(ann_ids)

得到图片的文件名,于是可以读取图片

file_name = self.coco_api.loadImgs(img_id)[0]['file_name']
if file_name.startswith('COCO'):
    file_name = file_name.split('_')[-1]

path = osp.join(self.root, file_name)
assert osp.exists(path), 'Image path does not exist: {}'.format(path)

img = cv2.imread(path)

下面说如何获得目标框,类别和分割mask
一个图片可能对应多个目标框,所以一个img_id提取出的anns里面可能有多个annotation,
可以用一个循环把它们读出来

for ann in anns:
    if ann.get("ignore", False):
        continue
    x1, y1, w, h = ann["bbox"]  #目标框是(x,y,w,h)形式
    if ann["area"] <= 0 or w < 1 or h < 1:
        continue
    if ann["category_id"] not in self.cat_ids:
        continue
    bbox = [x1, y1, x1 + w, y1 + h]  #有需要的话转为(x1,y1,x2,y2)形式
    
    gt_bboxes.append(bbox)
    gt_labels.append(self.cat2label[ann["category_id"]])
    
    gt_masks.append(self.coco_api.annToMask(ann).reshape(-1))  #提取分割mask
    
    gt_keypoints.append(ann["keypoints"])  #提取特征点

需要注意的是一个图片里面可能没有目标框,也就是annotation为[ ],
这种情况就不要把它当作训练图片了,需要重新采样,
所以需要这样一个流程

    def __getitem__(self, idx):
        
        while True:
              data = self.get_train_data(idx) #annotation为空时要返回None
              if data is None:
                  idx = self.get_another_id()
                  continue
              return data

    def get_another_id(self):
        return np.random.random_integers(0, len(self.data_info) - 1)

在预处理中,如果对图片进行各种变换,不要忘了同时要对目标框,分割mask做同样的变换

示例:

原图
在这里插入图片描述

对图像做翻转,scale,crop变换后

在这里插入图片描述

那么对mask, 目标框也要做同样的变换。

在这里插入图片描述

还有一种情况,annotation不为空,数据是有的,
但是,
在各种预处理变换后,目标没了,这个情况也是要重新采样的

示例:
在这里插入图片描述
它的目标比较小,在左上角的地方,很容易就没了,
比如做如下的预处理变换,

在这里插入图片描述

那怎么判断目标是不是没了呢,
一般来说,目标框经过变换后,会出现x1=x2, 或者y1=y2的情况,
也就是说这个box的w或者h为0

在这里插入图片描述
只需要把w和h很小的box滤掉即可,
滤掉后如果为空,就返回None, 让getitem函数重新采样。

w = meta_data["gt_bboxes"][:, 2] - meta_data["gt_bboxes"][:, 0]
h = meta_data["gt_bboxes"][:, 3] - meta_data["gt_bboxes"][:, 1]

keep = (w > self.discard_box_width) * (h > self.discard_box_height)
meta_data["gt_masks"] = torch.FloatTensor(meta_data["gt_masks"][keep])
meta_data["gt_bboxes"] = meta_data["gt_bboxes"][keep]
meta_data["gt_labels"] = meta_data["gt_labels"][keep]

if meta["gt_bboxes"].size == 0:
    return None 

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

### 使用COCO数据集进行模型训练和数据预处理的完整流程 #### 1. 数据预处理 在使用COCO数据集进行模型训练之前,需要对数据进行适当的预处理。以下是具体步骤: - **转换数据格式** 如果原始数据集不是COCO格式,可以参考引用[^3]中的方法,将VOC格式或其他格式的数据转换为COCO格式。转换后,生成的文件通常命名为`instances_train.json`、`instances_val.json`和`instances_test.json`。这些文件包含了图像标注信息,包括类别、边界框和分割掩码等。 - **检查JSON文件结构** COCO格式的数据集包含多个字段,其中`info`字段用于描述数据集的基本信息,例如年份、版本、描述等。具体结构可以参考引用[^4]中的说明。确保JSON文件中包含以下关键字段: - `images`: 图像信息列表。 - `annotations`: 标注信息列表,包括边界框和分割掩码。 - `categories`: 类别定义。 #### 2. 模型训练 完成数据预处理后,可以选择合适的深度学习框架进行模型训练。以下是两种常见方法: - **使用Mask R-CNN训练模型** 参考引用[^1],首先需要准备一个预训练模型(如`mask_rcnn_coco.h5`),并将其存放在指定路径下。接下来,修改配置文件(如`mdf.py`)中的分类数参数,以适配自定义数据集的类别数量。最后运行以下命令开始训练: ```bash python mdf.py train --dataset=./coco_mdf --model=coco ``` - **使用MMDetection框架** MMDetection是一个流行的开源目标检测框架,支持多种模型和数据集。为了训练自定义COCO数据集,可以参考引用[^2]中的可视化工具进行训练过程监控。例如,使用以下命令绘制训练日志曲线: ```python python tools/analysis_tools/analyze_logs.py plot_curve run_workstation/20230602_155324/vis_data/20230602_155324.json --keys acc ``` #### 3. 注意事项 - 确保训练环境已正确安装相关依赖库,例如TensorFlow、PyTorch或MMDetection。 - 在训练过程中,合理调整超参数(如学习率、批量大小等),以获得更好的性能。 - 如果数据集中存在不平衡问题,可以尝试使用数据增强技术来缓解。 ```python # 示例:数据增强代码 import albumentations as A transform = A.Compose([ A.HorizontalFlip(p=0.5), A.RandomBrightnessContrast(p=0.2), ]) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值