目标检测数据集(coco格式转换为voc,以PCB数据为例)

目录

1 VOC数据

2.COCO数据


1.VOC数据

       VOC数据集全称Visual Object Classes(视觉对象类别)数据集,是一个广泛应用于计算机视觉领域的数据集,特别是在目标检测、图像分割和图像分类等任务中。VOC数据集最初由英国牛津大学的计算机视觉小组创建,并在PASCAL VOC挑战赛中使用,该数据包含大量的带有标注信息的图像,用于训练和评估图像识别算法。VOC数据集涵盖了多个年度的发布,每个年度都包含了训练集、验证集和测试集。

VOC数据集下载————百度飞桨

VOCdevkit_数据集-飞桨AI Studio星河社区https://aistudio.baidu.com/datasetdetail/28147包含VOC2007和VOC2012两个年份的。

以VOC2007为例,进行介绍。

图1 VOC数据集介绍

其中Annotation,存放的是文件的注解,包含bbox和种类,图片id等等。文件格式为xml格式。

ImagesSets,存放的是数据集的划分,train,test,val。其中trainval文件没有用。

JPEGImages,存放的是图片

图2 VOC数据集详细介绍


2. COCO数据集

        COCO(Common Objects in Context)数据集是一个大型的、丰富的图像数据集,广泛用与计算机视觉领域,特别是目标检测、分割、姿态估计和图像标题生成等任务。COCO数据集由微软提供,旨在推动场景理解的研究。

以印刷版电路PCB数据集为例进行介绍

图3  pcb数据集介绍

其中,images文件夹,存放的是图片。每张图片的文件名包含类型。

pcbcocoanno文件夹,存放的是文件的分割和注解。json文件是一种轻量级的数据交换格式,其设计初衷是使之易于阅读和编写,并且便于机器解析和生成。


3. 数据格式转换

(1)coco转voc(此代码是将json转换为xml)

from xml.dom import minidom
import json
import glob
import os
from shutil import copyfile

def Convert_coco_to_voc(annotation_path, JPEGImage_path, out_path):
    '''
    将coco数据转换为voc数据
    :param annotation_path:coco标记文件的地址
    :param JPEGImage_path: coco图片数据集的位置
    :param out_path: 生成的voc数据集保存的位置
    :return:
    '''
    # 先创建voc输出文件夹标准格式
    outdir = out_path
    # 创建各级文件夹
    train_xml_out = os.path.join(outdir, 'VOC2007/Annotations')
    if not os.path.exists(train_xml_out):
        os.makedirs(train_xml_out)
    train_img_out = os.path.join(outdir, 'VOC2007/JPEGImages')
    if not os.path.exists(train_img_out):
        os.makedirs(train_img_out)

    data = json.load(open(annotation_path, 'r'))
    imgs = data['images']
    annotations = data['annotations']
    categories = data["categories"]
    cate_list = list()
    print('JSON文件中_图片总数:' + str(len(imgs)))
    for i in range(len(categories)):
        for ca in categories:
            if ca["id"] == i:
                cate_list.append(ca["name"])  # 修改这里,使用"name"而不是"supercategory"
    print("JSON文件中_标注类别:" + str(cate_list))

    # 遍历图片json列表
    for img in imgs:
        filename = img['file_name']
        print(filename)
        img_w = img['width']
        img_h = img['height']
        img_id = img['id']
        ana_txt_name = filename.split('.')[0] + '.txt'
        roi_list = list()
        # 遍历图片标注信息列表
        for ann in annotations:
            if ann['image_id'] == img_id:
                # 图片和标记匹配
                box = convert_boxshape((img_w, img_h), ann['bbox'])
                roi_list.append([cate_list[ann['category_id']], box[0], box[1], box[2], box[3]])
                print(box)
        get_xml(filename, [img_w, img_h, 3], roi_list, train_xml_out)
        copyfile(os.path.join(JPEGImage_path, filename), os.path.join(train_img_out, filename))


def convert_boxshape(size, box):
    '''
    coco数据集标注是xmin,ymin,width,height 而voc和yolo是xmin ymin xmax ynax 需要进行转换
    :param size: 图片宽 图片高
    :param box:
    :return:
    '''
    dw = size[0]  # 图像实际宽度
    dh = size[1]  # 图像实际高度
    x = box[0]  # 标注区域X坐标
    y = box[1]  # 标注区域Y坐标
    w = box[2]  # 标注区域宽度
    h = box[3]  # 标注区域高度

    xmin = int(x)
    ymin = int(y)
    xmax = int(x + w)
    ymax = int(y + h)
    return (xmin, ymin, xmax, ymax)


def get_xml(img_name, size, roi, outpath):
    '''
    传入每张图片的名称 大小 和标记点列表生成和图片名相同的xml标记文件
    :param img_name: 图片名称
    :param size:[width,height,depth]
    :param roi:[["label1",xmin,ymin,xmax,ymax]["label2",xmin,ymin,xmax,ymax].....]
    :return:
    '''
    impl = minidom.getDOMImplementation()
    doc = impl.createDocument(None, None, None)
    # 创建根节点
    orderlist = doc.createElement("annotation")
    doc.appendChild(orderlist)
    # c创建二级节点
    filename = doc.createElement("filename")
    filename.appendChild(doc.createTextNode(img_name))
    orderlist.appendChild(filename)
    # size节点
    sizes = doc.createElement("size")
    width = doc.createElement("width")
    width.appendChild(doc.createTextNode(str(size[0])))
    height = doc.createElement("height")
    height.appendChild(doc.createTextNode(str(size[1])))
    depth = doc.createElement("depth")
    depth.appendChild(doc.createTextNode(str(size[2])))
    sizes.appendChild(width)
    sizes.appendChild(height)
    sizes.appendChild(depth)
    orderlist.appendChild(sizes)
    # object 节点
    for ri in roi:
        object = doc.createElement("object")
        name = doc.createElement("name")
        name.appendChild(doc.createTextNode(ri[0]))
        object.appendChild(name)
        bndbox = doc.createElement("bndbox")

        xmin = doc.createElement("xmin")
        xmin.appendChild(doc.createTextNode(str(ri[1])))
        bndbox.appendChild(xmin)
        ymin = doc.createElement("ymin")
        ymin.appendChild(doc.createTextNode(str(ri[2])))
        bndbox.appendChild(ymin)
        xmax = doc.createElement("xmax")
        xmax.appendChild(doc.createTextNode(str(ri[3])))
        bndbox.appendChild(xmax)
        ymax = doc.createElement("ymax")
        ymax.appendChild(doc.createTextNode(str(ri[4])))
        bndbox.appendChild(ymax)
        object.appendChild(bndbox)
        orderlist.appendChild(object)
        # 将dom对象写入本地xml文件

    # 打开test.xml文件 准备写入
    f = open(os.path.join(outpath, img_name[:-4] + '.xml'), 'w')
    # 写入文件
    doc.writexml(f, addindent='  ', newl='\n')
    # 关闭
    f.close()


if __name__ == "__main__":
    # 传入coco的annotations.json地址,image文件存放的地址 和输出的voc数据存放地址
    Convert_coco_to_voc("D:\\project\\faster-rcnn-pytorch-master\\data_coco2voc\\pcb_coco\\pcb_cocoanno\\val.json",
                        "D:\\project\\faster-rcnn-pytorch-master\\data_coco2voc\\pcb_coco\\images",
                        "D:\\project\\faster-rcnn-pytorch-master\\data_coco2voc\\pcb_voc", )

def gen_txt(images_dir, output_file):
    # 获取文件夹下所有文件名
    filenames = os.listdir(images_dir)

    # 过滤出图片文件(假设图片扩展名为jpg或png)
    image_filenames = [os.path.splitext(filename)[0] for filename in filenames if filename.endswith(('.jpg', '.png'))]

    # 按字母顺序排序文件名
    image_filenames.sort()

    # 将文件名写入txt文件
    with open(output_file, 'w') as f:
        for filename in image_filenames:
            f.write(filename + '\n')

(2)voc数据集中数据集划分,以及txt文件的生成

split_data.py文件代码

import os
import numpy as np
root = r"D:\project\faster-rcnn-pytorch-master\data_coco2voc\pcb_voc\VOC2007\JPEGImages"
output = r"D:\project\faster-rcnn-pytorch-master\data_coco2voc\pcb_voc\VOC2007\ImageSets\Main"
filename = []
#从存放原图的目录中遍历所有图像文件
# dirs = os.listdir(root)
for root, dir, files in os.walk(root):
    for file in files:
        print(file)
        filename.append(file[:-4])  # 去除后缀,存储


#打乱文件名列表
np.random.shuffle(filename)
#划分训练集、测试集,默认比例6:2:2
train = filename[:int(len(filename)*0.6)]
trainval = filename[int(len(filename)*0.6):int(len(filename)*0.8)]
val = filename[int(len(filename)*0.8):]

#分别写入train.txt, test.txt
with open(os.path.join(output,'train.txt'), 'w') as f1, open(os.path.join(output,'trainval.txt'), 'w') as f2,open(os.path.join(output,'val.txt'), 'w') as f3:
    for i in train:
        f1.write(i + '\n')
    for i in trainval:
        f2.write(i + '\n')
    for i in val:
        f3.write(i + '\n')

print('成功!')

运行voc_annotation.py文件

其中,分类的话不要自行添加序号,否则会出测。

novel_label_list.txt文件内容,如下所示

missing_hole
mouse_bite
open_circuit
short
spur
spurious_copper

运行代码,将生成2007_val.txt和2007_train.txt两个文件

注解:其中coco2voc文件是用来将json转换为xml,并将xml文件存入Annotations文件夹下,同时将对应图片移动到JPEGImages文件夹下)

split_data文件是数据划分的。并保存在ImageSets的main文件夹下。


运行voc_annotation.py文件,软件显示界面结果

当前将coco数据转换为voc数据即完成了,可以利用本文另一篇博文训练自己的数据集了(精度不高,由于训练的轮次少)

推理结果

目标检测——faster rcnn(代码跑通分分钟)-优快云博客https://blog.youkuaiyun.com/qq_30190551/article/details/149241369?spm=1001.2014.3001.5502


另外公开数据集网站
1、DataSearch :https://datasetsearch.research.google.com

2、OpenDatalab : https://opendatalab.com/

3、Kaggle :https://www.kaggle.com/

4、github:https ://github.com/Bio-Datasets/bio-datasets

5、huggingface :https://huggingface.co/datasets/arcee-ai/EvolKit-20k-vi

6、arXiv : https://arxiv.org/

7、魔搭社区:https://modelscope.cn/datasets

8、FindData:https://www.findata.cn/

9、DataCite Commons : https://commons.datacite.org/doi.org

10、MendeleyData: https://data.mendeley.com/

​11、超神经:https://hyper.ai/cn

12、DataONE : https://search.dataone.org/data

13、Harvard Dataverse: https://dataverse.harvard.edu/

14、MagicHub开源社区:https://magichub.com/

15、DataCite Commons:https://commons.datacite.org/doi.org

16、Papers with Code :https://paperswithcode.com/

17、DataHub :https://datahub.io/

18:data.public.lu:https://data.public.lu/

19、帕依提提:https://www.payititi.com/

20、data.gov:https://catalog.data.gov/dataset

21、和鲸社区:https://www.heywhale.com/

22、data.europa:https://data.europa.eu/data/datasets?locale=en&minScoring=0

23、AI_Studio:https://aistudio.baidu.com/

24、Opendata cern:https://opendata.cern.ch

25、PANGAEA:https://www.pangaea.de/

26、极市:https://www.cvmart.net/

27、Roboflow:https://universe.roboflow.com/

28、IEEE:https://ieee-dataport.org/datasets

29、Stanford:http://snap.stanford.edu/data/

30、GBIF: https://www.gbif.org/dataset/search

31、阿里云天池:https://tianchi.aliyun.com/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值