/YOLO2COCO

A set of tools for converting a yolov5 format dataset to COCO format working with yolov5, yolox and yolov6.

Primary LanguagePythonApache License 2.0Apache-2.0

YOLO2COCO

简体中文 | English

🎉 推出知识星球RapidAI私享群,这里的提问会优先得到回答和支持,也会享受到RapidAI组织后续持续优质的服务。欢迎大家的加入。

labelImg标注yolo格式数据 → YOLOV5格式

  • labelImg库标注的yolo数据格式一键转换为YOLOV5格式数据

  • labelImg标注数据目录结构如下(详情参见dataset/labelImg_dataset):

      labelImg_dataset
      ├── classes.txt
      ├── images(13).jpg
      ├── images(13).txt
      ├── images(3).jpg
      ├── images(3).txt
      ├── images4.jpg
      ├── images4.txt
      ├── images5.jpg
      ├── images5.txt
      ├── images6.jpg  # 注意这个是没有标注的
      ├── images7.jpg
      └── images7.txt
    
  • 转换

    python labelImg_2_yolov5.py --src_dir dataset/labelImg_dataset \
                                --out_dir dataset/labelImg_dataset_output \
                                --val_ratio 0.2 \
                                --have_test true \
                                --test_ratio 0.2
    • --src_dir:labelImg标注后所在目录
    • --out_dir: 转换之后的数据存放位置
    • --val_ratio:生成验证集占整个数据的比例,默认是0.2
    • --have_test:是否生成test部分数据,默认是True
    • --test_ratio:test数据整个数据百分比,默认是0.2
  • 转换后目录结构(详情参见dataset/labelImg_dataset_output):

    labelImg_dataset_output/
      ├── classes.txt
      ├── images
      │   ├── images(13).jpg
      │   ├── images(3).jpg
      │   ├── images4.jpg
      │   ├── images5.jpg
      │   └── images7.jpg
      ├── labels
      │   ├── images(13).txt
      │   ├── images(3).txt
      │   ├── images4.txt
      │   ├── images5.txt
      │   └── images7.txt
      ├── non_labels        # 这是没有标注图像的目录,自行决定如何处置
      │   └── images6.jpg
      ├── test.txt
      ├── train.txt
      └── val.txt
    
  • 可以进一步直接对dataset/labelImg_dataset_output目录作转COCO的转换

    python yolov5_2_coco.py --data_dir dataset/lablelImg_dataset_output

COCO格式数据 → labelImg

  • 将COCO格式数据一键转换为labelImg标注的yolo格式数据
  • COCO格式数据目录结构如下(详情参见:dataset/YOLOV5_COCO_format):
    YOLOV5_COCO_format
      ├── annotations
      │   ├── instances_train2017.json
      │   └── instances_val2017.json
      ├── train2017
      │   ├── 000000000001.jpg
      │   └── 000000000002.jpg  # 这个是背景图像
      └── val2017
          └── 000000000001.jpg
    
  • 转换
    python coco_2_labelImg.py --data_dir dataset/YOLOV5_COCO_format
    • --data_dir: COCO格式数据集所在目录
  • 转换后目录结构(详情参见:dataset/COCO_labelImg_format):
    COCO_labelImg_format
      ├── train
      │   ├── 000000000001.jpg
      │   ├── 000000000001.txt
      │   |-- 000000000002.jpg
      │   └── classes.txt
      └── val
          ├── 000000000001.jpg
          ├── 000000000001.txt
          └── classes.txt
    
  • 对转换之后的目录,可以直接用labelImg库直接打开,更改标注,具体命令如下:
    $ cd dataset/COCO_labelImg_format
    $ labelImg train train/classes.txt
    
    # or
    $ labelImg val val/classes.txt

YOLOV5格式数据 → COCO

  • 可以将一些背景图像加入到训练中,具体做法是:直接将背景图像放入backgroud_images目录即可。

  • 转换程序会自动扫描该目录,添加到训练集中,可以无缝集成后续YOLOX的训练。

  • YOLOV5训练格式目录结构(详情参见dataset/YOLOV5):

    YOLOV5
    ├── classes.txt
    ├── background_images  # 一般是和要检测的对象容易混淆的图像
    │   └── bg1.jpeg
    ├── images
    │   ├── images(13).jpg
    │   └── images(3).jpg
    ├── labels
    │   ├── images(13).txt
    │   └── images(3).txt
    ├── train.txt
    └── val.txt
    
  • train.txtval.txt中图像路径,以下两种均可:

    • 相对于根目录的路径
      dataset/YOLOV5/images/images(3).jpg
      
    • 相对于dataset/YOLOV5的相对路径
      images/images(3).jpg
      
  • 转换

    python yolov5_2_coco.py --data_dir dataset/YOLOV5 --mode_list train,val
    • --data_dir:整理好的数据集所在目录
    • --mode_list:指定生成的json,前提是要有对应的txt文件,可单独指定。(e.g. train,val,test
  • 转换后目录结构(详情参见dataset/YOLOV5_COCO_format):

    YOLOV5_COCO_format
    ├── annotations
    │   ├── instances_train2017.json
    │   └── instances_val2017.json
    ├── train2017
    │   ├── 000000000001.jpg
    │   └── 000000000002.jpg  # 这个是背景图像
    └── val2017
        └── 000000000001.jpg
    

YOLOV5 YAML描述文件 → COCO

  • YOLOV5 yaml 数据文件目录结构如下(详情参见dataset/YOLOV5_yaml):

    YOLOV5_yaml
    ├── images
    │   ├── train
    │   │   ├── images(13).jpg
    │   │   └── images(3).jpg
    │   └── val
    │       ├── images(13).jpg
    │       └── images(3).jpg
    ├── labels
    │   ├── train
    │   │   ├── images(13).txt
    │   │   └── images(3).txt
    │   └── val
    │       ├── images(13).txt
    │       └── images(3).txt
    └── sample.yaml
    
  • 转换

    python yolov5_yaml_2_coco.py --yaml_path dataset/YOLOV5_yaml/sample.yaml

darknet格式数据 → COCO

  • darknet训练数据目录结构(详情参见dataset/darknet):

    darknet
    ├── class.names
    ├── gen_config.data
    ├── gen_train.txt
    ├── gen_valid.txt
    └── images
        ├── train
        └── valid
    
  • 转换

    python darknet_2_coco.py --data_path dataset/darknet/gen_config.data

可视化COCO格式下图像

python coco_visual.py --vis_num 1 \
                    --json_path dataset/YOLOV5_COCO_format/annotations/instances_train2017.json \
                    --img_dir dataset/YOLOV5_COCO_format/train2017
  • --vis_num:指定要查看的图像索引
  • --json_path:查看图像的json文件路径
  • --img_dir: 查看图像所在的目录

COCO格式Object Instance示例

{
    "info": {
      "year": 2022,
      "version": "1.0",
      "description": "For object detection",
      "date_created": "2022"
    },
    "licenses":  [{
        "id": 1,
        "name": "Apache License v2.0",
        "url": "https://github.com/RapidAI/YOLO2COCO/LICENSE"
    }],
    "images": [{
        "date_captured": "2022",
        "file_name": "000000000001.jpg",
        "id": 1,
        "height": 224,
        "width": 224
    }, {
        "date_captured": "2022",
        "file_name": "000000000002.jpg",
        "id": 2,
        "height": 424,
        "width": 550
    }],
    "annotations": [{
        "segmentation": [[18.00, 2.99, 105.00, 2.99, 105.00, 89.00, 18.00, 89.00]],
        "area": 7482.011,
        "iscrowd": 0,
        "image_id": 1,  // 对应images中的id
        "bbox": [18.00, 2.99, 87.00, 86.00],  // [x, y, w, h]其中(x,y)是左上角的值,w,h是框的宽和高
        "category_id": 1,  // 对应categories中的ID
        "id": 1  // 唯一区分不同标注实例的编号
    }, {
        "segmentation": [
            [126.99, 3.99, 210.99, 3.99, 210.99, 88.99, 126.99, 88.99]
        ],
        "area": 7139.994,
        "iscrowd": 0,
        "image_id": 1,
        "bbox": [126.99, 3.99, 84.0, 84.99],
        "category_id": 1,
        "id": 2
    }],
    "categories": [{
        "supercategory": "stamp",
        "id": 1,
        "name": "stamp"
    }]
}

相关资料