提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
最近一直在做sar舰船图像检测的工作,其中涉及到了一些sar舰船常用的数据集,但大多都是VOC格式的数据集,因为我需要COCO格式,因此需要进行转换。我希望记录下来,能给后来的人提供一些微不足道的帮助。本文介绍了4种常用舰船数据集的转换,在AIR-SARShip 1.0、AIR-SARShip 2.0 、HRSID、SSDD数据集。可直接使用,无需修改!
先简单介绍一下数据集:
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数据集中的每一艘船,都标注有带置信分数的边界框。
其中每一个文本都是一副图像的标注,如下图所示:
目的是将其变为.json
格式,将所有图像的标注放在同一个文件里,因为每种数据集的标注格式不同,我们想把它们转换为统一的coco格式的json文件。
代码如下:
# 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 更加美观显示
最终就可以得到如下图所示的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数据集的转化,其他三个数据集的转换代码我会在之后几篇文章中逐一讲述。感谢聆听!