hrsc2016資料集xml格式轉換為yolo格式,附下載連結

李沅洲也發表於2022-04-30

資料集介紹

資料集背景:

HRSC2016資料集

包含27種型別的遙感地物目標
提取自Google Earth
由西北工業大學於2016年釋出
採用oriented bounding boxes(OBB)標註格式

HRSC2016 (Liu et al.,2016)是西北工業大學採集的用於輪船的檢測的資料,包含4個大類19個小類共2976個船隻例項資訊。論文中特別指出他們的資料集是高解析度資料集,解析度介於0.4m和2m之間。資料集所有影像均來自六個著名的港口,包括海上航行的船隻和靠近海岸的船隻,船隻影像的尺寸範圍從300到1500,大多數影像大於1000x600。

資料集類別說明

本資料集中目標為航拍影像下的船隻,包括海上船隻與近岸船隻。作者在對船隻模型進行分類時採用 了高度為3的樹形結構,L1層次為Class、L2層次為category、L3層次為Type,類似生物學的分類觀點,具體表示如下:

image

樣本標註資訊

HRSC2016採用OBB(oriented bounding box)的標註方法,提供了三類標註資訊,包括bounding box、rotated bounding box和pixel-based segmentation,還包括港口、資料來源、拍攝時間等額外資訊,部分資料標註展示如下:

<HRSC_Image>
  <Img_CusType>sealand</Img_CusType>
  <Img_Location>69.040297,33.070036</Img_Location>
  <Img_SizeWidth>1138</Img_SizeWidth>
  <Img_SizeHeight>833</Img_SizeHeight>
  <Img_SizeDepth>3</Img_SizeDepth>
  <Img_Resolution>1.07</Img_Resolution>
  <Img_Resolution_Layer>18</Img_Resolution_Layer>
  <Img_Scale>100</Img_Scale>
  <segmented>0</segmented>
  <Img_Havemask>0</Img_Havemask>
  <Img_Rotation>274d</Img_Rotation>
  <HRSC_Objects>
	<HRSC_Object>
	  <Object_ID>100000008</Object_ID>
	  <Class_ID>100000013</Class_ID>
	  <Object_NO>100000008</Object_NO>
	  <truncated>0</truncated>
	  <difficult>0</difficult>
	  <box_xmin>628</box_xmin>//bounding box座標點
	  <box_ymin>40</box_ymin>
	  <box_xmax>815</box_xmax>
	  <box_ymax>783</box_ymax>
	  <mbox_cx>719.9324</mbox_cx>//旋轉後的左上角座標
	  <mbox_cy>413.0048</mbox_cy>
	  <mbox_w>741.8246</mbox_w>
	  <mbox_h>172.6959</mbox_h>
	  <mbox_ang>1.499893</mbox_ang>//旋轉角度
	  <segmented>0</segmented>
	  <seg_color>
	  </seg_color>
	  <header_x>713</header_x>//船頭部資訊
	  <header_y>777</header_y>
	</HRSC_Object>
  </HRSC_Objects>
</HRSC_Image>

資料影像示例

image

這裡先上程式碼

import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join

sets=[ ('2007', 'test')]

classes = ["ship"]


def convert(size, box):
	dw = 1./size[0]
	dh = 1./size[1]
	x = (box[0] + box[1])/2.0
	y = (box[2] + box[3])/2.0
	w = box[1] - box[0]
	h = box[3] - box[2]
	x = x*dw
	w = w*dw
	y = y*dh
	h = h*dh
	return (x,y,w,h)

def convert_annotation(year, image_id):
	# 轉換這一張圖片的座標表示方式(格式),即讀取xml檔案的內容,計算後存放在txt檔案中
	in_file = open('./data/VOCdevkit/VOC%s/Annotations/%s.xml'%(year, image_id))
	out_file = open('./data/VOCdevkit/VOC%s/labels/%s.txt'%(year, image_id), 'w')
	tree=ET.parse(in_file)
	root = tree.getroot()
	# size = root.find('size')
	w = int(root.find('Img_SizeWidth').text)
	h = int(root.find('Img_SizeHeight').text)

	if root.find('HRSC_Objects'):
		for obj in root.iter('HRSC_Object'):
			difficult = obj.find('difficult').text
			cls = 'ship'
			# cls = obj.find('name').text
			# if cls not in classes or int(difficult) == 1:
			if int(difficult) == 1:
				continue
			cls_id = classes.index(cls)
			# xmlbox = obj.find('bndbox')
			b = (float(obj.find('box_xmin').text), float(obj.find('box_xmax').text), float(obj.find('box_ymin').text), float(obj.find('box_ymax').text))
			bb = convert((w,h), b)
			out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')

wd = getcwd()

for year, image_set in sets:
	if not os.path.exists('./data/VOCdevkit/VOC%s/labels/'%(year)):
		os.makedirs('./data/VOCdevkit/VOC%s/labels/'%(year))
	image_ids = open('./data/VOCdevkit/VOC%s/ImageSets/Main/%s.txt'%(year, image_set)).read().strip().split()
	list_file = open('%s_%s.txt'%(year, image_set), 'w')
	for image_id in image_ids:
		list_file.write('./data/%s/VOCdevkit/VOC%s/JPEGImages/%s.bmp\n'%(wd, year, image_id))
		convert_annotation(year, image_id)
	list_file.close()

以上是hrsc2016資料集xml格式轉換為yolo格式txt檔案

注意路徑問題

資料集3大類27小類,共2,976個目標

這裡是講資料集劃分到只有一類 ship

image size:300 × 300 ~ 1500 × 900
image number:1061 在訓練集、驗證集和測試集中分別包含436、181和444張影像
object number:2976

資料集下載地址 附上鍊接

https://aistudio.baidu.com/aistudio/datasetdetail/54106

本文參考
CSDN博主「Marlowee」的原創文章,遵循CC 4.0 BY-SA版權協議,附上
原文連結:https://blog.csdn.net/weixin_43427721/article/details/122057389

相關文章