BDD100K数据集下载和标签格式转换问题

BDD100K数据集下载和标签格式转换问题

数据集介绍

加州大学伯克利分校的Berkeley DeepDrive数据集由超过100K的视频序列组成,包含各种各样的注释,包括图像级标记、对象边界框、可行驶区域、车道标记和全帧实例分割。数据集具有地理、环境和天气多样性,这对于训练模型很有用,因此可以减少环境因素对识别结果的影响。
详细介绍可查看官方文章:https://bair.berkeley.edu/blog/2018/05/30/bdd/

数据集下载方法(三种)

  1. 官方下载
    下载地址:https://bdd-data.berkeley.edu/portal.html#download
    需要注册,我尝试之后感觉不好用,下载速度很慢。
  2. archive.org下载
    下载地址:https://archive.org/details/bdd100k
    同上下载速度很慢,连接不稳定
  3. kaggle下载(只含图片、标签和语义分割)
    下载地址:https://www.kaggle.com/solesensei/solesensei_bdd100k
    连接很稳定
    由于我是用来进行目标检测所以只需要图片及标签数据。

标签格式转换

格式转换工具下载:https://github.com/ucbdrive/bdd-data

目录结构如下:
├── bdd_data
│ ├── bdd2coco.py #转换为coco格式
│ ├── coco2bdd.py #coco格式转换为BDD格式
│ ├── evaluate.py
│ ├── gen_lists.py
│ ├── geometry.py
│ ├── label2det.py #转化为2D目标检测格式 (分类标签+坐标格式)
│ ├── label2det_v1.py #针对之前发布的BDD100K转换
│ ├── label.py
│ ├── show_gps_trajectory.py #在谷歌地图上显示位置
│ ├── show_labels.py #用于在图片上显示标签
├── doc
│ ├── apollo
│ │ ├── apollo_test_list_md5.txt
│ │ ├── apollo_test_list.txt
│ │ ├── apollo_train_id.csv
│ │ └── README.md
│ ├── evaluation.md
│ ├── format.md
│ ├── teaser.png
│ └── trajectory_gmap.jpg
├── LICENSE
├── README.md
└── requirements.txt

README中有详细的使用说明,其中bdd2coco.py、 coco2bdd.py、label2det.py、 label2det_v1.py等Python脚本都是用来进行标签格式转换的根据需要更改使用。

我是使用keras版本的YOLOV3来训练该数据集,转换格式为:

Row format: image_file_path box1 box2 ... boxN;
Box format: x_min,y_min,x_max,y_max,class_id (no space).

import argparse
import json

def parse_args():
    """Use argparse to get command line arguments."""
    # define labels_path and dets_path
    labels_path = "/DataSet/BDD100K/bdd100k/labels/bdd100k_labels_images_train.json"
    dets_path = "/DataSet/BDD100K/bdd100k/labels/bdd100k_labels_images_yolo_train_0.1.txt"

    parser = argparse.ArgumentParser()
    parser.add_argument('label_path',nargs='?', default=labels_path, help='path to the label dir')
    parser.add_argument('det_path',nargs='?', default=dets_path, help='path to output detection file')
    args = parser.parse_args()

    return args

def label2det(frames):
    categorys = ['car', 'bus', 'person', 'bike', 'truck', 'motor', 'train', 'rider', 'traffic sign', 'traffic light']
    # print(len(frames))
    boxes = str()
    for index,frame in enumerate(frames):   # index用来控制循环次数
        # print(frame["name"])
        # print(len(frame["labels"]))
        box = "image_dir/"+frame["name"]
        for label in frame['labels']:
            if 'box2d' not in label:
                continue
            xy = label['box2d']
            if xy['x1'] >= xy['x2'] or xy['y1'] >= xy['y2']:
                continue
            # print(xy['x1'], xy['y1'], xy['x2'], xy['y2'], categorys.index(label['category']))
            box = box+" "+str(xy['x1'])+','+str(xy['y1'])+','+str(xy['x2'])+','+str(xy['y2'])+\
                    ','+str(categorys.index(label['category']))
        box = box+"\n"
        boxes=boxes+box
        if index>100 :
            break

    return boxes


def convert_labels(label_path, det_path):
    frames = json.load(open(label_path, 'r'))
    det = label2det(frames)
    # json.dump(det, open(det_path, 'w'), indent=4, separators=(',', ': '))
    result = open(det_path, "a")
    result.write(det)


def main():
    args = parse_args()
    convert_labels(args.label_path, args.det_path)

你可能感兴趣的:(数据集,机器学习,python,人工智能,计算机视觉)