Files
MPKFNet/get_fine_dataset.py
T
2026-07-17 18:55:31 +08:00

96 lines
5.0 KiB
Python
Executable File

import xml.dom.minidom
from tqdm import tqdm
from glob import glob
import cv2
import os,argparse
import numpy as np
from jpg import jpg
#xml_files = glob('./temp2/*.xml')
class_name = ["Anser albifrons" ,"Fulica atra" ,"Leucogeranus leucogeranus" ,"Egretta garzetta","Platalea leucorodia" ,"Mergellus albellus" ,"Grus monacha" ,"Tringa ochropus" ,"Numenius arquata" ,"Anser indicus","Anas zonorhyncha","Ardea cinerea","Mareca strepera" ,"Mareca penelope" ,"Tadorna ferruginea","Ardea alba","Numenius madagascariensis" ,"Botaurus stellaris" ,"Ciconia boyciana" ,"Anser fabalis" ,"Recurvirostra avosetta" ,"Podiceps cristatus","Vanellus vanellus" ,"Aythya fuligula" ,"Tringa erythropus","Calidris alpina" ,"Ciconia nigra" ,"Gallinula chloropus","Porphyrio poliocephalus","Larus ridibundus" ,"Anser cygnoides" ,"Charadrius alexandrinusw" ,"Pluvialis squatarola" ,"Grus grus" ,"Anser anser" ,"Pluvialis fulva" ,"Charadrius dubius" ,"Anas crecca","Anas platyrhynchos","Spatula clypeata","Phalacrocorax carbo","Mergus merganser" ,"Tadorna tadorna" ,"Tringa nebulariaw","Bucephala clangula" ,"Gallinago gallinago" ,"Anser erythropus","Cygnus columbianus" ,"Ichthyaetus ichthyaetus","Anas acuta" ,"Ardea intermedia"]
def cv2_crop(im, box):
'''cv2实现类似PIL的裁剪
:param im: 加载好的图像
:param box: 裁剪的矩形,元组(left, upper, right, lower).
'''
return im.copy()[box[1]:box[3], box[0]:box[2], :]
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 VocToFineWithLabel(num_count,root_path,image_T):
xml_files = glob(os.path.join(root_path,"*.xml"))
jpg(os.path.join(root_path.replace("Annotations","JPEGImages")))
txt_lists = []
for xml_file in tqdm(xml_files):
#print(xml_file+" is doing")
DOMTree = xml.dom.minidom.parse(xml_file)
collection = DOMTree.documentElement
#img_name = collection.getElementsByTagName("filename")[0].childNodes[0].data
img_name = xml_file.replace("Annotations","JPEGImages").replace(".xml",".jpg")
objects = collection.getElementsByTagName("object")
#img = cv2.imread(img_name)
img = cv2.imdecode(np.fromfile(img_name,dtype=np.uint8),-1)
#cv2.imwrite(img_name,img)
#img = cv2.imdecode(np.fromfile(img_name,dtype=np.uint8),-1)
# im = Image.open(img_name)
# im.save(img_name, quality=100)
# im = Image.open(img_name)
for object_id in objects:
xmin = object_id.getElementsByTagName('bndbox')[0].getElementsByTagName('xmin')[0].childNodes[0].data
ymin = object_id.getElementsByTagName('bndbox')[0].getElementsByTagName('ymin')[0].childNodes[0].data
xmax = object_id.getElementsByTagName('bndbox')[0].getElementsByTagName('xmax')[0].childNodes[0].data
ymax = object_id.getElementsByTagName('bndbox')[0].getElementsByTagName('ymax')[0].childNodes[0].data
name = "bird"#object_id.getElementsByTagName('name')[0].childNodes[0].data
ratio_x = (3840.0/3840.0)
ratio_y = (2160.0/2160.0)
#print(ratio_x," ",ratio_y)
#print(type(xmin))
#exit()
xmin = int(float(xmin)*ratio_x)
xmax = int(float(xmax)*ratio_x)
ymin = int(float(ymin)*ratio_y)
ymax = int(float(ymax)*ratio_y)
if ((xmax - xmin)<image_T) | ((ymax - ymin)<image_T):
continue
try:
img1 = cv2_crop(img,(xmin, ymin,xmax, ymax))
except:
print(xml_file)
if not os.path.exists(os.path.join(root_path.replace("Annotations","FineDataset_{}".format(str(image_T))),str(name).replace("\t","").strip())):
os.makedirs(os.path.join(root_path.replace("Annotations","FineDataset_{}".format(str(image_T))),str(name).replace("\t","").strip()))
cv2.imwrite(os.path.join(root_path.replace("Annotations","FineDataset_{}".format(str(image_T))),str(name).replace("\t","").strip(),"{}.jpg".format(str(num_count).zfill(5))), img1)
#txt_lists.append(str(name).replace("\t","").strip()+"{}.jpg".format(str(num_count).zfill(5))+" "+str(class_index)+'\n')
#f.write(str(name).replace("\t","").strip().replace(" ","_" )+"_{}.jpg".format(num_count)+" "+str(class_index)+'\n')
num_count += 1
print(num_count)
# for xml_file in tqdm(xml_files):
# os.remove(xml_file)
#os.remove(xml_file)
print(num_count)
if __name__ == '__main__':
print("Starting dealing......")
parser1 = argparse.ArgumentParser(description="GYD")
parser1.add_argument("image_T", default='0001', type=str,
help='Video name.')
parser1.add_argument("root_path", default='5', type=str,
help='Annotations')
args = parser1.parse_args()
num_count = 0
VocToFineWithLabel(num_count, args.root_path, int(args.image_T))