cityscapes数据集转化为coco数据格式(超详细,百分百学会)

cityscapes数据集转化为coco数据格式(超详细,百分百学会)

  • 直接进入主题
  • 一、然后我们要做的第一步是先有一个工具包,拿来进行转化.
  • 二、安装一个库,pycococreatortools
  • 三、使用步骤
    • 1.打开你刚刚下载的代码包,打开transcityscapes2coco.py文件。
    • 2.修改你需要的数据集 类别

直接进入主题

从官网下载或者你们从百度云下载的cityscapes数据集多半这个样子的
在这里插入图片描述


提示:以下是本篇文章正文内容,下面案例可供参考

一、然后我们要做的第一步是先有一个工具包,拿来进行转化.

示例:如下是这个包的地址,这个包是一位csdn大佬贡献的,在这里献上它的地址。点开下载即可

二、安装一个库,pycococreatortools

链接如下:https://github.com/waspinator/pycococreator/

三、使用步骤

1.先不着急打开这个包,我们先处理一下我们下载好的原生态的cityscape数据集,先把里面的gfFine.zip解压,还有leftImg8bit解压。然后里面的数据呈现出这个样子。cityscapes数据集转化为coco数据格式(超详细,百分百学会)_第1张图片cityscapes数据集转化为coco数据格式(超详细,百分百学会)_第2张图片由于我们只需要分两个类别,一个train(训练),一个验证(val)。所以没必要多一个test。所以可以把test里面的东西,融进train中。(相当与训练集:验证集=9:1)。然后变成如下的样子cityscapes数据集转化为coco数据格式(超详细,百分百学会)_第3张图片cityscapes数据集转化为coco数据格式(超详细,百分百学会)_第4张图片注意,不用把这些文件里面的图片再提出来了。就保留这样的分级格式。

1.打开你刚刚下载的代码包,打开transcityscapes2coco.py文件。

然后解释一下这个文件是干什么的

代码的思路是根据cityscapes中的gtFine_instanceids.png获取每个instance的二值Mask图像并保存到INSTANCE_DIR中,文件名格式是:

      <原始图片文件名>_<类别名>_<实例序号>.png

随后,读入图片,并依次找出所有对应该图片的Mask,利用coco的API实现images和annotations的生成,并保存。

使用时,需要修改最开始的ROOT_DIR, IMAGES_DIR, ANNOTATION_DIR,并且在ROOT_DIR下创建存放实例Mask的INSTANCE_DIR。

ROOT_DIR = '/home/lhm/mmdetection/SOLO-master/data/city'
IMAGE_DIR = os.path.join(ROOT_DIR, "leftImg8bit/val")
ANNOTATION_DIR = os.path.join(ROOT_DIR, "gtFine/val")
ANNOTATION_SAVE_DIR = os.path.join(ROOT_DIR, "annotations")#annotations是新创建的
INSTANCE_DIR = os.path.join(ROOT_DIR, "gtFine/val")
IMAGE_SAVE_DIR = os.path.join(ROOT_DIR, "val_images")#train_images是新创建的

然后再给大家看一下,具体这个文件怎么摆放。
在这里插入图片描述由于直接对原生态数据集是放在移动硬盘操作的,但我现在做转换是放在home下进行的,所以文件摆放位置变了。(注意:gtFine、leftImg8bit。这两个文件应该是你之前原生态数据集里拷贝过来的。然后annotaions、annotations_train\ instance_dir 、train_images、val_images是我新创建的文件夹。)

这个py文件,一共要执行两次。第一次对训练集操作。第二次对验证集操作。大家只需要改变我上述写的代码,对应的位置就好。(上述是对验证集进行操作的。)

注意,这个转换数据的过程,会产生大量的中间数据,所以大家一定要预留home空间30个G以上。

2.修改你需要的数据集 类别

我们都知道cityscapes有34个类别,但是并不是所有的类别你都需要,有些类别你不会需要。我只做了8个类别的。
代码如下(示例):

import sys
if "/opt/ros/kinetic/lib/python2.7/dist-packages" in sys.path:
    sys.path.remove("/opt/ros/kinetic/lib/python2.7/dist-packages")

import cv2
import numpy as np
import os, glob
from shutil import copyfile
import datetime
import json
import os
import re
import fnmatch
from PIL import Image
import numpy as np
from pycococreatortools import pycococreatortools
 
ROOT_DIR = '/home/lhm/mmdetection/SOLO-master/data/city'
IMAGE_DIR = os.path.join(ROOT_DIR, "leftImg8bit/val")
ANNOTATION_DIR = os.path.join(ROOT_DIR, "gtFine/val")
ANNOTATION_SAVE_DIR = os.path.join(ROOT_DIR, "annotations")#annotations是新创建的
INSTANCE_DIR = os.path.join(ROOT_DIR, "gtFine/val")
IMAGE_SAVE_DIR = os.path.join(ROOT_DIR, "val_images")#train_images是新创建的

INFO = {
     
    "description": "Cityscapes_Instance Dataset",
    "url": "https://github.com/waspinator/pycococreator",
    "version": "0.1.0",
    "year": "2020",
    "contributor": "Kevin_Jia",
    "date_created": "2020-1-23 19:19:19.123456"
}
 
LICENSES = [
    {
     
        "id": 1,
        "name": "Attribution-NonCommercial-ShareAlike License",
        "url": "http://creativecommons.org/licenses/by-nc-sa/2.0/"
    }
]

CATEGORIES = [
    {
     
        'id': 1,
        'name': 'car',
        'supercategory': 'cityscapes',
    },
        {
     
        'id': 2,
        'name': 'pedestrian',
        'supercategory': 'cityscapes',
    },
    {
     
        'id': 3,
        'name': 'truck',
        'supercategory': 'cityscapes',
    },
    {
     
        'id': 4,
        'name': 'bus',
        'supercategory': 'cityscapes',
    },
    {
     
        'id': 5,
        'name': 'rider',
        'supercategory': 'cityscapes',
    },
    {
     
        'id': 6,
        'name': 'caravan',
        'supercategory': 'cityscapes',
    },
    {
     
        'id': 7,
        'name': 'motorcycle',
        'supercategory': 'cityscapes',
    },
    {
     
        'id': 8,
        'name': 'bicycle',
        'supercategory': 'cityscapes',
    }
]

background_label = list(range(-1, 24, 1))+[30,31,34]


idx=0
pic_scale = 1.0
h_bias = 1.0

def image_trans():
    img_subfolders = os.listdir(IMAGE_DIR)
    image_count = 0
    for sub in img_subfolders:
        # sub_path = sub + '/' + sub
        image_sub_path = os.path.join(IMAGE_DIR, sub)
        for image in os.listdir(image_sub_path):
            img_path = os.path.join(image_sub_path, image)
            ann_name = image.split('_')[0] + '_' + image.split('_')[1] + '_' + image.split('_')[2] + '_gtFine_instanceIds.png'
            ann_sub_path = os.path.join(ANNOTATION_DIR, sub)
            ann_path = os.path.join(ann_sub_path, ann_name)
            if os.path.exists(ann_path): 
                pic = cv2.imread(img_path)
                h, w = pic.shape[:2]
                new_w = w * pic_scale
                new_h = new_w / 2
                top = int((h_bias*h-new_h)/2)
                bottom = int((h_bias*h+new_h)/2)
                left = int((w-new_w)/2)
                right = int((w+new_w)/2)
                roi = pic[top:bottom, left:right]
                img_save_path = os.path.join(IMAGE_SAVE_DIR, image)
                cv2.imwrite(img_save_path, roi) 
                annotation = cv2.imread(ann_path, -1)
                ann_roi = annotation[top:bottom, left:right]
                ann_save_path = os.path.join(ANNOTATION_SAVE_DIR, ann_name)
                cv2.imwrite(ann_save_path, ann_roi)
            else:
                print(image + '  do not have instance annotation')
            print(image_count)
            image_count += 1

def data_loader():
    imgs = os.listdir(IMAGE_SAVE_DIR)
    masks_generator(imgs, ANNOTATION_SAVE_DIR)

def masks_generator(imges, ann_path):
    global idx
    pic_count = 0
    for pic_name in imges:
        image_name = pic_name.split('.')[0]
        ann_folder = os.path.join(INSTANCE_DIR, image_name)
        os.mkdir(ann_folder)
        annotation_name = pic_name.split('_')[0] + '_' + pic_name.split('_')[1] + '_' + pic_name.split('_')[2] + '_gtFine_instanceIds.png'
        # annotation_name = image_name + '_instanceIds.png'
        print(annotation_name)
        annotation = cv2.imread(os.path.join(ann_path, annotation_name), -1)
        h, w = annotation.shape[:2]
        ids = np.unique(annotation)
        for id in ids:
            if id in background_label:
                continue
            else:
                class_id = id // 1000
                if class_id == 26:
                    instance_class = 'car'
                elif class_id == 24:
                    instance_class = 'pedestrian' 
                elif class_id == 27:
                    instance_class = 'truck'
                elif class_id == 28:
                    instance_class = 'bus'
                elif class_id == 25:
                    instance_class = 'rider'
                elif class_id == 29:
                    instance_class = 'caravan'
                elif class_id == 32:
                    instance_class = 'motorcycle'
                elif class_id == 33:
                    instance_class = 'bicycle'
                else:
                    continue    
            instance_mask = np.zeros((h, w, 3),dtype=np.uint8)
            mask = annotation == id
            instance_mask[mask] = 255
            mask_name = image_name + '_' + instance_class + '_' + str(idx) + '.png'
            cv2.imwrite(os.path.join(ann_folder, mask_name), instance_mask)
            idx += 1
        pic_count += 1
        print(pic_count)
 
def json_generate():
    car = 0
    pedestrian = 0
    truck = 0
    bus = 0
    rider = 0
    caravan = 0
    motorcycle =0
    bicycle =0
    files = os.listdir(IMAGE_SAVE_DIR)

    coco_output = {
     
        "info": INFO,
        "licenses": LICENSES,
        "categories": CATEGORIES,
        "images": [],
        "annotations": []
    }

    image_id = 1
    segmentation_id = 1

    # go through each image
    for image_filename in files:
        image_name = image_filename.split('.')[0]
        image_path = os.path.join(IMAGE_SAVE_DIR, image_filename)
        image = Image.open(image_path)
        image_info = pycococreatortools.create_image_info(
                image_id, os.path.basename(image_filename), image.size)
        coco_output["images"].append(image_info)
        print(image_filename)
        annotation_sub_path = os.path.join(INSTANCE_DIR, image_name)
        ann_files = os.listdir(annotation_sub_path)
        if len(ann_files) == 0:
            print("ao avaliable annotation")
            continue
        else:
            for annotation_filename in ann_files:
                annotation_path = os.path.join(annotation_sub_path, annotation_filename)
                for x in CATEGORIES:
                    if x['name'] in annotation_filename:
                        class_id = x['id']
                        break
                # class_id = [x['id'] for x in CATEGORIES if x['name'] in annotation_filename][0]
                if class_id == 1:
                    car += 1
                elif class_id == 2:
                    pedestrian += 1
                elif class_id == 3:
                    truck += 1
                elif class_id == 4:
                    bus += 1
                elif class_id == 5:
                    rider += 1
                elif class_id == 6:
                    caravan += 1
                elif class_id == 7:
                    motorcycle += 1
                elif class_id == 8:
                    bicycle += 1
                else:
                    print('illegal class id')
                category_info = {
     'id': class_id, 'is_crowd': 'crowd' in image_filename}
                binary_mask = np.asarray(Image.open(annotation_path)
                                            .convert('1')).astype(np.uint8)

                annotation_info = pycococreatortools.create_annotation_info(
                        segmentation_id, image_id, category_info, binary_mask,
                        image.size, tolerance=2)

                if annotation_info is not None:
                    coco_output["annotations"].append(annotation_info)

                    segmentation_id = segmentation_id + 1

            image_id = image_id + 1
            print(image_id)
 
    with open('{}/val_modified.json'.format(ROOT_DIR), 'w') as output_json_file:
        json.dump(coco_output, output_json_file)
    print(car, pedestrian, truck, bus, rider,caravan,motorcycle,bicycle)
 
 
if __name__ == "__main__":
     image_trans()
     data_loader()
     json_generate()
    
    

主要是修改你要的类别,代码很简单,相信大家都能看懂。主要是改标绿色部分的地方。还有。
background_label = list(range(-1, 24, 1))+[30,31,34]这句话。表示背景类别,是我们所要剔除掉的。大家按照自己需求来改。

以上都改完之后,就可以执行代码了。
直接python transcityscapes2cpcp.py就行了。

当然执行一次,你可以获得val_images.json(验证集)
执行第二次的时候,记得把这个已经生成好的val_images.json.放其他地方。免得第二次执行的时候被覆盖掉。然后改训练集的路径。然后执行这个python文件。又会生成一个val_images.json(实际上这个是训练集的json了。应该你用的训练集的路径。)把名字改了就好了。

最后是这样的结果。
cityscapes数据集转化为coco数据格式(超详细,百分百学会)_第5张图片


如果大家中间遇到什么问题额可以留言。

你可能感兴趣的:(数据转化,深度学习,pytorch)