zoukankan      html  css  js  c++  java
  • COCO数据集提取自己需要的类转VOC

    github:https://github.com/zcc720/COCO2VOC.git

    原文地址:http://www.manongjc.com/article/28607.html

    接上篇VOC数据集提取自己需要的类,这次我们依然从coco数据集中提取我们想要的类,并转为voc格式,用于目标检测。

    一、去官网下载数据集

    train2007

    val2007

    train2014

    val2014

    annotations2014

    annotations2017

    二、安装coco-PythonAPI

    linux用户:

    pip install cython
    git clone https://github.com/cocodataset/cocoapi.git
    cd coco/PythonAPI
    make

    windows用户:

    pip install cython
    git clone https://github.com/cocodataset/cocoapi.git
    cd coco/PythonAPI
    python setup.py build_ext --inplace

    三、get自己想要的类,制作成voc文件

    COCO数据集目标检测中有90类:

    classes:
         {1: 'person', 2: 'bicycle', 3: 'car', 4: 'motorcycle', 5: 'airplane', 6: 'bus', 7: 'train', 8: 'truck', 9: 'boat', 10: 'traffic light', 11: 'fire hydrant', 13: 'stop sign', 14: 'parking meter', 15: 'bench', 16: 'bird', 17: 'cat', 18: 'dog', 19: 'horse', 20: 'sheep', 21: 'cow', 22: 'elephant', 23: 'bear', 24: 'zebra', 25: 'giraffe', 27: 'backpack', 28: 'umbrella', 31: 'handbag', 32: 'tie', 33: 'suitcase', 34: 'frisbee', 35: 'skis', 36: 'snowboard', 37: 'sports ball', 38: 'kite', 39: 'baseball bat', 40: 'baseball glove', 41: 'skateboard', 42: 'surfboard', 43: 'tennis racket', 44: 'bottle', 46: 'wine glass', 47: 'cup', 48: 'fork', 49: 'knife', 50: 'spoon', 51: 'bowl', 52: 'banana', 53: 'apple', 54: 'sandwich', 55: 'orange', 56: 'broccoli', 57: 'carrot', 58: 'hot dog',59: 'pizza', 60: 'donut', 61: 'cake', 62: 'chair', 63: 'couch', 64: 'potted plant', 65: 'bed', 67: 'dining table', 70: 'toilet', 72: 'tv', 73: 'laptop', 74: 'mouse', 75: 'remote', 76: 'keyboard',77: 'cell phone', 78: 'microwave', 79: 'oven', 80: 'toaster', 81: 'sink', 82: 'refrigerator', 84: 'book', 85: 'clock', 86: 'vase', 87: 'scissors', 88: 'teddy bear', 89: 'hair drier', 90: 'toothbrush'}
     

    想要的类 

    ​​​​​​​classes_names = ['car', 'bicycle', 'person', 'motorcycle', 'bus', 'truck']
    from pycocotools.coco import COCO
    import os
    import shutil
    from tqdm import tqdm
    import skimage.io as io
    import matplotlib.pyplot as plt
    import cv2
    from PIL import Image, ImageDraw
    
    #the path you want to save your results for coco to voc
    savepath="E:/datasets/COCO/result/"
    img_dir=savepath+'images/'
    anno_dir=savepath+'Annotations/'
    # datasets_list=['train2014', 'val2014']
    datasets_list=['train2017']
    
    classes_names = ['car', 'bicycle', 'person', 'motorcycle', 'bus', 'truck']
    #Store annotations and train2014/val2014/... in this folder
    dataDir= 'E:/datasets/COCO/'
    
    headstr = """
    <annotation>
        <folder>VOC</folder>
        <filename>%s</filename>
        <source>
            <database>My Database</database>
            <annotation>COCO</annotation>
            <image>flickr</image>
            <flickrid>NULL</flickrid>
        </source>
        <owner>
            <flickrid>NULL</flickrid>
            <name>company</name>
        </owner>
        <size>
            <width>%d</width>
            <height>%d</height>
            <depth>%d</depth>
        </size>
        <segmented>0</segmented>
    """
    objstr = """
        <object>
            <name>%s</name>
            <pose>Unspecified</pose>
            <truncated>0</truncated>
            <difficult>0</difficult>
            <bndbox>
                <xmin>%d</xmin>
                <ymin>%d</ymin>
                <xmax>%d</xmax>
                <ymax>%d</ymax>
            </bndbox>
        </object>
    """
    
    tailstr = '''
    </annotation>
    '''
    
    #if the dir is not exists,make it,else delete it
    def mkr(path):
        if os.path.exists(path):
            shutil.rmtree(path)
            os.mkdir(path)
        else:
            os.mkdir(path)
    mkr(img_dir)
    mkr(anno_dir)
    def id2name(coco):
        classes=dict()
        for cls in coco.dataset['categories']:
            classes[cls['id']]=cls['name']
        return classes
    
    def write_xml(anno_path,head, objs, tail):
        f = open(anno_path, "w")
        f.write(head)
        for obj in objs:
            f.write(objstr%(obj[0],obj[1],obj[2],obj[3],obj[4]))
        f.write(tail)
    
    
    def save_annotations_and_imgs(coco,dataset,filename,objs):
        #eg:COCO_train2014_000000196610.jpg-->COCO_train2014_000000196610.xml
        anno_path=anno_dir+filename[:-3]+'xml'
        img_path=dataDir+dataset+'/'+filename
        print(img_path)
        dst_imgpath=img_dir+filename
    
        img=cv2.imread(img_path)
        if (img.shape[2] == 1):
            print(filename + " not a RGB image")
            return
        shutil.copy(img_path, dst_imgpath)
    
        head=headstr % (filename, img.shape[1], img.shape[0], img.shape[2])
        tail = tailstr
        write_xml(anno_path,head, objs, tail)
    
    
    def showimg(coco,dataset,img,classes,cls_id,show=True):
        global dataDir
        I=Image.open('%s/%s/%s'%(dataDir,dataset,img['file_name']))
        #通过id,得到注释的信息
        annIds = coco.getAnnIds(imgIds=img['id'], catIds=cls_id, iscrowd=None)
        # print(annIds)
        anns = coco.loadAnns(annIds)
        # print(anns)
        # coco.showAnns(anns)
        objs = []
        for ann in anns:
            class_name=classes[ann['category_id']]
            if class_name in classes_names:
                print(class_name)
                if 'bbox' in ann:
                    bbox=ann['bbox']
                    xmin = int(bbox[0])
                    ymin = int(bbox[1])
                    xmax = int(bbox[2] + bbox[0])
                    ymax = int(bbox[3] + bbox[1])
                    obj = [class_name, xmin, ymin, xmax, ymax]
                    objs.append(obj)
                    draw = ImageDraw.Draw(I)
                    draw.rectangle([xmin, ymin, xmax, ymax])
        if show:
            plt.figure()
            plt.axis('off')
            plt.imshow(I)
            plt.show()
    
        return objs
    
    for dataset in datasets_list:
        #./COCO/annotations/instances_train2014.json
        annFile='{}/annotations/instances_{}.json'.format(dataDir,dataset)
    
        #COCO API for initializing annotated data
        coco = COCO(annFile)
        '''
        COCO 对象创建完毕后会输出如下信息:
        loading annotations into memory...
        Done (t=0.81s)
        creating index...
        index created!
        至此, json 脚本解析完毕, 并且将图片和对应的标注数据关联起来.
        '''
        #show all classes in coco
        classes = id2name(coco)
        print(classes)
        #[1, 2, 3, 4, 6, 8]
        classes_ids = coco.getCatIds(catNms=classes_names)
        print(classes_ids)
        for cls in classes_names:
            #Get ID number of this class
            cls_id=coco.getCatIds(catNms=[cls])
            img_ids=coco.getImgIds(catIds=cls_id)
            print(cls,len(img_ids))
            # imgIds=img_ids[0:10]
            for imgId in tqdm(img_ids):
                img = coco.loadImgs(imgId)[0]
                filename = img['file_name']
                # print(filename)
                objs=showimg(coco, dataset, img, classes,classes_ids,show=False)
                print(objs)
                save_annotations_and_imgs(coco, dataset, filename, objs)
  • 相关阅读:
    Postfix常用命令和邮件队列管理(queue)
    window7下面rabbitMQ安装配置过程详解
    RabbitMQ系列之消息确认机制
    全文检索:sphinx elasticsearch xunsearch 比较
    用SQL命令查看Mysql数据库大小
    部署Percona监控和管理--- PMM Server
    什么是MTU?为什么MTU值普遍都是1500?
    Mysql删除数据后,磁盘空间未释放的解决办法
    数据库索引
    visual studio 容器工具首次加载太慢 vsdbgvs2017u5 exists, deleting 的解决方案
  • 原文地址:https://www.cnblogs.com/shuimuqingyang/p/13651038.html
Copyright © 2011-2022 走看看