【舰船数据集格式转换】AIR-SARShip-1.0数据集VOC转COCO

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、sar舰船图像检测数据集
  • 二、使用步骤
    • 1.原始数据集
    • 2.xml2json_AIR-SARShip-1.0
    • 3.json文件
  • 总结


前言

最近一直在做sar舰船图像检测的工作,其中涉及到了一些sar舰船常用的数据集,但大多都是VOC格式的数据集,因为我需要COCO格式,因此需要进行转换。我希望记录下来,能给后来的人提供一些微不足道的帮助。本文介绍了4种常用舰船数据集的转换,在AIR-SARShip 1.0、AIR-SARShip 2.0 、HRSID、SSDD数据集。可直接使用,无需修改!


一、sar舰船图像检测数据集

先简单介绍一下数据集:

AIR-SARShip-1.0 数据集均来自高分三号卫星,场景包含港口、岛礁、不同等级海况的海面,目标覆盖运输船、油船、渔船等十余类近千艘舰船。。为了增强数据集,我们对 AIR-SARShip-1.0 数据集进行切片后获得 200 张大小为 640*640 的 JPEG 图像,并将其划分为包含 178 张与 22 张 SAR 舰船图像的训练集与测试集。

AIR-SARShip 2.0在1.0版本的基础上加入了更多的高分三号数据,构建了一套基于高分三号卫星数据的数据集AIR-SARShip-2.0。该数据集包含300幅SAR图像,场景类型包含港口、岛礁、不同级别海况的海面等,标注信息主要为舰船目标的位置,并经过专业判读人员的确认。

HRSID数据集是电子科技大学在2020年1月发布数据集,HRSID是高分辨率sar图像中用于船舶检测、语义分割和实例分割任务的数据集。该数据集共包含5604张高分辨率SAR图像和16951个ship实例。ISSID数据集借鉴了Microsoft Common Objects in Context (COCO)数据集的构建过程,包括不同分辨率的SAR图像、极化、海况、海域和沿海港口。该数据集是研究人员评估其方法的基准。对于HRSID, SAR图像的分辨率分别为:0.5m, 1 m, 3 m。

SSDD数据集是国内外第一个专门用于基于SAR图像的舰船目标检测公开数据集,数据集包含各种情况下的船舶图像,如不同图像分辨率、船舶尺寸、海况、传感器类型等,可以作为研究人员评估其算法的基准。对于SSDD数据集中的每一艘船,都标注有带置信分数的边界框。

二、使用步骤

1.原始数据集

原始数据为.xml格式,如下图所示:
【舰船数据集格式转换】AIR-SARShip-1.0数据集VOC转COCO_第1张图片

其中每一个文本都是一副图像的标注,如下图所示:

【舰船数据集格式转换】AIR-SARShip-1.0数据集VOC转COCO_第2张图片
目的是将其变为.json格式,将所有图像的标注放在同一个文件里,因为每种数据集的标注格式不同,我们想把它们转换为统一的coco格式的json文件。

2.xml2json_AIR-SARShip-1.0

代码如下:

# coding=utf-8
import xml.etree.ElementTree as ET
import os
import json


voc_clses = ['ship']


categories = []
for iind, cat in enumerate(voc_clses):
    cate = {}
    cate['supercategory'] = cat
    cate['name'] = cat
    cate['id'] = iind
    categories.append(cate)

def getimages(xmlname, id):
    sig_xml_box = []
    tree = ET.parse(xmlname)
    root = tree.getroot()
    images = {}
    for i in root:  # 遍历一级节点
        if i.tag == 'filename':
            file_name = 'SARShip' + i.text[:-4] + '.jpg'  # 0001.jpg
            # print('image name: ', file_name)
            images['file_name'] = file_name
        if i.tag == 'size':
            for j in i:
                if j.tag == 'width':
                    width = j.text
                    images['width'] = width
                if j.tag == 'height':
                    height = j.text
                    images['height'] = height
        if i.tag == 'object':
            for j in i:
                if j.tag == 'name':
                    cls_name = j.text
                cat_id = voc_clses.index(cls_name) + 1
                if j.tag == 'bndbox':
                    bbox = []
                    xmin = 0
                    ymin = 0
                    xmax = 0
                    ymax = 0
                    for r in j:
                        if r.tag == 'xmin':
                            xmin = eval(r.text)
                        if r.tag == 'ymin':
                            ymin = eval(r.text)
                        if r.tag == 'xmax':
                            xmax = eval(r.text)
                        if r.tag == 'ymax':
                            ymax = eval(r.text)
                    bbox.append(xmin)
                    bbox.append(ymin)
                    bbox.append(xmax - xmin)
                    bbox.append(ymax - ymin)
                    bbox.append(id)   # 保存当前box对应的image_id
                    bbox.append(cat_id)
                    # anno area
                    bbox.append((xmax - xmin) * (ymax - ymin) - 10.0)   # bbox的ares
                    # coco中的ares数值是 < w*h 的, 因为它其实是按segmentation的面积算的,所以我-10.0一下...
                    sig_xml_box.append(bbox)
                    # print('bbox', xmin, ymin, xmax - xmin, ymax - ymin, 'id', id, 'cls_id', cat_id)
    images['id'] = id
    # print ('sig_img_box', sig_xml_box)
    return images, sig_xml_box



def txt2list(txtfile):
    f = open(txtfile)
    l = []
    for line in f:
        l.append(line[:-1])
    f.close()
    print(l)
    return l


# voc2007xmls = 'anns'
voc2007xmls = r'D:\Dataset\sar_1.0ship/tmp\Train\Annoations'
# test_txt = 'voc2007/test.txt'
test_txt = r'D:\Dataset\sar_1.0ship/tmp/train/train.txt'
xml_names = txt2list(test_txt)
xmls = []
bboxes = []
ann_js = {}
for ind, xml_name in enumerate(xml_names):
    xmls.append(os.path.join(voc2007xmls, xml_name + '.xml'))
json_name = r'E:\pycharm_workspace\voc2coco-pattern\data/HRSID_annotations/instances_val2017.json'
images = []
for i_index, xml_file in enumerate(xmls):
    image, sig_xml_bbox = getimages(xml_file, i_index)
    images.append(image)
    bboxes.extend(sig_xml_bbox)
ann_js['images'] = images
ann_js['categories'] = categories
annotations = []
for box_ind, box in enumerate(bboxes):
    anno = {}
    anno['image_id'] =  box[-3]
    anno['category_id'] = box[-2]
    anno['bbox'] = box[:-3]
    anno['id'] = box_ind
    anno['area'] = box[-1]
    anno['iscrowd'] = 0
    annotations.append(anno)
ann_js['annotations'] = annotations
json.dump(ann_js, open(json_name, 'w'), indent=4)  # indent=4 更加美观显示

3.json文件

最终就可以得到如下图所示的json文件:
json文件
其中json文件的内容为coco数据集格式的标注,所有标注都在同一个文件夹下:

{
    "images": [
        {
            "file_name": "SARShip29_1770_0000.jpg",
            "width": "640",
            "height": "640",
            "id": 0
        },
        {
            "file_name": "SARShip21_1180_0000.jpg",
            "width": "640",
            "height": "640",
            "id": 1
        },
        {
            "file_name": "SARShip22_1180_1770.jpg",
            "width": "640",
            "height": "640",
            "id": 2
        },
        {
            "file_name": "SARShip15_1770_2360.jpg",
            "width": "640",
            "height": "640",
            "id": 3
        },
        {
            "file_name": "SARShip17_1770_0590.jpg",
            "width": "640",
            "height": "640",
            "id": 4
        },
    "categories": [
        {
            "supercategory": "Ship",
            "name": "Ship",
            "id": 0
        }
    ],
    "annotations": [
        {
            "image_id": 0,
            "category_id": 1,
            "bbox": [
                320,
                391,
                140,
                137
            ],
            "id": 0,
            "area": 19170.0,
            "iscrowd": 0
        },
        {
            "image_id": 1,
            "category_id": 1,
            "bbox": [
                337,
                486,
                36,
                17
            ],
            "id": 1,
            "area": 602.0,
            "iscrowd": 0
        },

这里只展示了部分转换结果。


总结

以上就是今天要讲的内容,本文仅仅简单介绍了AIR-SARShip-1.0数据集的转化,其他三个数据集的转换代码我会在之后几篇文章中逐一讲述。感谢聆听!

你可能感兴趣的:(数据集格式转换,计算机视觉,深度学习,人工智能,目标检测)