使用MMDetection训练自己的数据集(COCO)

 上一篇文章,我们已经搭建了MMDetection的环境

这篇文章将以maskrcnn为例,将labelme格式的数据转化为coco数据集,并展示染色体分类的训练测试过程

人体的染色体有24类,1-22号常染色体 23是x染色体 24是y染色体

数据集处理

labelme->COCO

 先将所有数据集目录进行重构到一个目录底下并对文件进行重命名

下面的代码是将所有数据对应的png和json数据放到一个目录下

import os
import shutil

this_dir_path = './train_labelme/'
destination_directory = './train_new/'
if not os.path.exists(destination_directory):
    os.makedirs(destination_directory)

subdirectories = []  # 存储子目录名称的列表
# 遍历目录
for root, dirs, files in os.walk(this_dir_path):
    for dir_name in dirs:
        subdirectories.append(dir_name)

# for directory in os.listdir(this_dir_path):
for directory in subdirectories:
    for file in os.listdir(os.path.join(this_dir_path, directory)):
        source_file = os.path.join(os.path.join(this_dir_path, directory), file)
        if directory == '211029-009C':
            # 这四个文件采用的是"line strip"无法转化为coco
            if os.path.splitext(file)[0] == '107_1_590_345_0.513' or \
                    os.path.splitext(file)[0] == '129_3_688_378_0.848' or \
                    os.path.splitext(file)[0] == '10_1_737_180_0.571' or \
                    os.path.splitext(file)[0] == '127_2_590_378_0.492':
                continue
        elif os.path.splitext(source_file)[-1] == '.png':
            new_file_path = destination_directory + file
            print(source_file + '---->' + new_file_path)
            destination_file = os.path.join(destination_directory, file)
            shutil.copy2(source_file, destination_file)
        elif os.path.splitext(source_file)[-1] == '.json':
            new_file_path = destination_directory + file
            print(source_file + '---->' + new_file_path)
            destination_file = os.path.join(destination_directory, file)
            shutil.copy2(source_file, destination_file)

 labelme 转化为coco数据集

https://github.com/fcakyon/labelme2coco

下面这段代码是将json对应的已经划分好的训练集和测试集的图片,移动到对应的coco/train2017和coco/val2017目录下

import json
import cv2
import os
import shutil


def copy2dataset(file_src, annotation, file_dir):
    with open(annotation, 'r', encoding='utf-8') as f:
        file_json = json.load(f)
    for img in file_json['images']:
        img_name = img['file_name']
        for file in os.listdir(file_src):
            if file.endswith(img_name):
                img_name = file
                break
        print(img_name)
        shutil.copyfile(os.path.join(file_src, img_name), os.path.join(file_dir, img_name))


if __name__ == '__main__':
    # labelme_path = "./train_new"
    file_root = './train_new/'
    saved_coco_path = "./"
    # 创建文件
    if not os.path.exists("%scoco/annotations/" % saved_coco_path):
        os.makedirs("%scoco/annotations/" % saved_coco_path)
    if not os.path.exists("%scoco/train2017/" % saved_coco_path):
        os.makedirs("%scoco/train2017" % saved_coco_path)
    if not os.path.exists("%scoco/val2017/" % saved_coco_path):
        os.makedirs("%scoco/val2017" % saved_coco_path)

    annotation_train = './runs/labelme2coco/train.json'
    annotation_val = './runs/labelme2coco/val.json'
    file_dest_train = './coco/train2017/'
    file_dest_val = 'coco/val2017/'
    shutil.copyfile(annotation_train, os.path.join("%scoco/annotations/instances_train2017.json" % saved_coco_path))
    shutil.copyfile(annotation_val, os.path.join("%scoco/annotations/instances_val2017.json" % saved_coco_path))
    copy2dataset(file_root, annotation_train, file_dest_train)
    copy2dataset(file_root, annotation_val, file_dest_val)

COCO 数据集格式 和 windows 下 pycocotools - 知乎 (zhihu.com)

可视化预览处理好的COCO数据集

from pycocotools.coco import COCO
import numpy as np
from matplotlib import pyplot as plt
import cv2 as cv

# 加载COCO格式的标注文件
coco = COCO('./runs/labelme2coco/train.json')

imgIds = coco.getImgIds()  # 获取所有的image id,可以选择参数 coco.getImgIds(imgIds=[], catIds=[])
imgIds = coco.getImgIds(imgIds=[0, 1, 2])  # 获得image id 为 0,1,2的图像的id
imgIds = coco.getImgIds(catIds=[0, 1, 2])  # 获得包含类别 id 为0,1,2的图像

annIds = coco.getAnnIds(catIds=[0, 1, 2])  # 获得类别id为0,1,2的标签
annIds = coco.getAnnIds(imgIds=imgIds[0])  # 获得和image id对应的标签

catIds = coco.getCatIds(catNms=['0'])  # 通过类别名筛选
catIds = coco.getCatIds(catIds=[0, 1, 2])  # 通过id筛选
catIds = coco.getCatIds(supNms=[])  # 通过父类的名筛选

print('类别信息')
cats_name = coco.loadCats(ids=catIds)
print(cats_name)

print('\n标签信息:')
anns = coco.loadAnns(annIds)
bboxes = np.array([i['bbox'] for i in anns]).astype(np.int32)
cats = np.array([i['category_id'] for i in anns])
print(anns)
print('\n从标签中提取的Bounding box:')
print(bboxes)

print('图像')
imgIdx = imgIds[0]
img = coco.loadImgs([imgIdx])  # 读取图片信息
img = cv.imread('./train_new/' + img[0]['file_name'])
# 绘制bounding box
for i in range(len(bboxes)):
    p1 = bboxes[i][0:2]
    p2 = bboxes[i][0:2] + bboxes[i][2:4]

    cv.rectangle(img, (p1[0], p1[1]), (p2[0], p2[1]), (255, 0, 0))
plt.figure(figsize=(8, 8))
plt.imshow(img)
plt.show()

 参考:

将Labelme标注的数据做成COCO格式的数据集(实例分割的数据集)labelme2coco一直开心的博客-CSDN博客

使用labelme标注数据集并转化为CoCo数据集labelmetococo啊~小 l i的博客-CSDN博客

B站视频:

由labelme数据集转化为coco数据集哔哩哔哩bilibili

GitHub - MrSupW/datasetapi: 规范化管理labelme数据集并生成coco数据集

修改文件中的配置参数

1、先在detection中创建data目录,然后将coco数据集导入到data目录下

2、进入自己需要训练的模型的目录底下,查看对应需要的哪些配置文件 ,依次进入对应文件修改里面的默认的配置

 3、这里只需要修改configs/_base_/models/mask-rcnn_r50_fpn.py修改num_classes的值为分类的数量,默认是80,染色体是24类,因此将num_classes改为24

小心遗漏,可能不只一处需要修改

 3、 mmdet/evaluation/functional/class_names.py 找到coco_classes修改成自己的分类,如下图

4、 mmdet/datasets/coco.py修改成自己的分类,如下图,只有一个分类的时候别忘了逗号   

第一次运行需要指定目录 work-dir

python  tools/train.py configs/mask_rcnn/mask-rcnn_r50_fpn_1x_coco.py   --work-dir run_workstation

运行后会在指定的work-dir目录下生成对应的mask-rcnn_r50_fpn_1x_coco.py,里面包含各种训练参数,可以直接修改(比如学习率lr等参数),下次训练时直接运行这个文件

如果电脑配置不行,CUDA内存不足,可能需要resize图片尺寸或者修改batch_size。默认的图片尺寸是(1333,800)训练集默认的batch_size=2。如下图所示,打开run_workstation/mask-rcnn_r50_fpn_1x_coco.py文件进行修改。

5、对生成的run_workstation/mask-rcnn_r50_fpn_1x_coco.py文件参数进行修改,将checkpoint改为4轮一次,loggerHook改为5轮一次,还可以调整学习率等超参数这个根据自己的需求修改

之后训练可以直接运行这个配置文件,不需要再指定--work-dir目录,执行下面的命令

python  tools/train.py run_workstation/mask-rcnn_r50_fpn_1x_coco.py

训练

python  tools/train.py run_workstation/mask-rcnn_r50_fpn_1x_coco.py

训练过程可视化

python tools/analysis_tools/analyze_logs.py plot_curve  run_workstation/20230602_155324/vis_data/20230602_155324.json --keys acc 

如果要输出多个数据

python tools/analysis_tools/analyze_logs.py plot_curve  run_workstation/20230602_155324/vis_data/20230602_155324.json --keys loss_cls loss_bbox loss_mask

 保存图片为out.pdf

python tools/analysis_tools/analyze_logs.py plot_curve  run_workstation/20230602_155324/vis_data/20230602_155324.json --keys acc --out out.pdf

测试

python tools/test.py run_workstation/mask-rcnn_r50_fpn_1x_coco.py run_workstation/epoch_12.pth --out=results.pkl

python tools/test.py run_workstation/mask-rcnn_r50_fpn_1x_coco.py run_workstation/epoch_12.pth --show

参考文献:

用mmdetection跑通Mask-RCNN - 知乎 (zhihu.com)

  • 19
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
您好!对于训练自己的COCO数据集,可以使用MMDetection进行操作。下面是一般的步骤: 1. 数据准备:将自己的数据集标注为COCO格式,包括图像和对应的标注文件。可以使用标注工具如LabelImg进行标注,并将标注结果转换为COCO格式的JSON文件。 2. 配置文件:根据您的模型需求,在MMDetection中选择合适的配置文件。配置文件定义了模型结构、数据集路径、优化器设置等。您可以在MMDetection的configs目录下找到相关示例配置文件,如faster_rcnn_r50_fpn_1x.py。 3. 修改配置文件:根据您的数据集和项目需求,修改配置文件中的相关参数。主要包括类别数、路径配置、输入尺寸等。确保将数据集路径设置为您自己的COCO数据集路径。 4. 数据集注册:根据您的数据集名称,在MMDetection的datasets目录下创建一个新的数据集文件,继承COCODataset,并注册到datasets/__init__.py中。 5. 训练模型:使用命令行运行训练脚本,指定配置文件和GPU数量。例如,使用以下命令进行训练python tools/train.py <config_file> --gpus <num_gpus> 6. 模型评估和推理:训练完成后,可以使用训练得到的模型进行评估和推理。可以使用以下命令进行评估: python tools/test.py <config_file> <checkpoint_file> [--out <result_file>] --eval <eval_types> 以上是一般的训练自己的COCO数据集的步骤,具体操作可以根据您的需求和数据集来调整。希望对您有所帮助!如果您有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值