python实现提取COCO,VOC数据集中特定的类
1.python提取COCO数据集中特定的类
安装pycocotoolsgithub地址:https://github.com/philferriere/cocoapi
pipinstallgit+https://github.com/philferriere/cocoapi.git#subdirectory=PythonAPI
提取特定的类别如下:
frompycocotools.cocoimportCOCO importos importshutil fromtqdmimporttqdm importskimage.ioasio importmatplotlib.pyplotasplt importcv2 fromPILimportImage,ImageDraw #thepathyouwanttosaveyourresultsforcocotovoc savepath="/media/huanglong/Newsmy/COCO/"#保存提取类的路径,我放在同一路径下 img_dir=savepath+'images/' anno_dir=savepath+'Annotations/' #datasets_list=['train2014','val2014'] datasets_list=['train2014'] classes_names=['person']#coco有80类,这里写要提取类的名字,以person为例 #Storeannotationsandtrain2014/val2014/...inthisfolder dataDir='/media/huanglong/Newsmy/COCO/'#原coco数据集 headstr="""\''' #ifthedirisnotexists,makeit,elsedeleteit defmkr(path): ifos.path.exists(path): shutil.rmtree(path) os.mkdir(path) else: os.mkdir(path) mkr(img_dir) mkr(anno_dir) defid2name(coco): classes=dict() forclsincoco.dataset['categories']: classes[cls['id']]=cls['name'] returnclasses defwrite_xml(anno_path,head,objs,tail): f=open(anno_path,"w") f.write(head) forobjinobjs: f.write(objstr%(obj[0],obj[1],obj[2],obj[3],obj[4])) f.write(tail) defsave_annotations_and_imgs(coco,dataset,filename,objs): #eg:COCO_train2014_000000196610.jpg-->COCO_train2014_000000196610.xml anno_path=anno_dir+filename[:-3]+'xml' img_path=dataDir+dataset+'/'+filename print(img_path) dst_imgpath=img_dir+filename img=cv2.imread(img_path) #if(img.shape[2]==1): #print(filename+"notaRGBimage") #return shutil.copy(img_path,dst_imgpath) head=headstr%(filename,img.shape[1],img.shape[0],img.shape[2]) tail=tailstr write_xml(anno_path,head,objs,tail) defshowimg(coco,dataset,img,classes,cls_id,show=True): globaldataDir I=Image.open('%s/%s/%s'%(dataDir,dataset,img['file_name'])) #通过id,得到注释的信息 annIds=coco.getAnnIds(imgIds=img['id'],catIds=cls_id,iscrowd=None) #print(annIds) anns=coco.loadAnns(annIds) #print(anns) #coco.showAnns(anns) objs=[] foranninanns: class_name=classes[ann['category_id']] ifclass_nameinclasses_names: print(class_name) if'bbox'inann: bbox=ann['bbox'] xmin=int(bbox[0]) ymin=int(bbox[1]) xmax=int(bbox[2]+bbox[0]) ymax=int(bbox[3]+bbox[1]) obj=[class_name,xmin,ymin,xmax,ymax] objs.append(obj) draw=ImageDraw.Draw(I) draw.rectangle([xmin,ymin,xmax,ymax]) ifshow: plt.figure() plt.axis('off') plt.imshow(I) plt.show() returnobjs fordatasetindatasets_list: #./COCO/annotations/instances_train2014.json annFile='{}/annotations/instances_{}.json'.format(dataDir,dataset) #COCOAPIforinitializingannotateddata coco=COCO(annFile) #showallclassesincoco classes=id2name(coco) print(classes) #[1,2,3,4,6,8] classes_ids=coco.getCatIds(catNms=classes_names) print(classes_ids) forclsinclasses_names: #GetIDnumberofthisclass cls_id=coco.getCatIds(catNms=[cls]) img_ids=coco.getImgIds(catIds=cls_id) print(cls,len(img_ids)) #imgIds=img_ids[0:10] forimgIdintqdm(img_ids): img=coco.loadImgs(imgId)[0] filename=img['file_name'] #print(filename) objs=showimg(coco,dataset,img,classes,classes_ids,show=False) print(objs) save_annotations_and_imgs(coco,dataset,filename,objs) VOC %s MyDatabase COCO flickr NULL NULL company %d %d %d 0 """ objstr="""\ """ tailstr='''\
2.将上一步提取的COCO某一类xml转为COCO标准的json文件:
#-*-coding:utf-8-*-
#@Time:2019/8/2710:48
#@Author:Rock
#@File:voc2coco.py
#justforobjectdetection
importxml.etree.ElementTreeasET
importos
importjson
coco=dict()
coco['images']=[]
coco['type']='instances'
coco['annotations']=[]
coco['categories']=[]
category_set=dict()
image_set=set()
category_item_id=0
image_id=0
annotation_id=0
defaddCatItem(name):
globalcategory_item_id
category_item=dict()
category_item['supercategory']='none'
category_item_id+=1
category_item['id']=category_item_id
category_item['name']=name
coco['categories'].append(category_item)
category_set[name]=category_item_id
returncategory_item_id
defaddImgItem(file_name,size):
globalimage_id
iffile_nameisNone:
raiseException('Couldnotfindfilenametaginxmlfile.')
ifsize['width']isNone:
raiseException('Couldnotfindwidthtaginxmlfile.')
ifsize['height']isNone:
raiseException('Couldnotfindheighttaginxmlfile.')
img_id="%04d"%image_id
image_id+=1
image_item=dict()
image_item['id']=int(img_id)
#image_item['id']=image_id
image_item['file_name']=file_name
image_item['width']=size['width']
image_item['height']=size['height']
coco['images'].append(image_item)
image_set.add(file_name)
returnimage_id
defaddAnnoItem(object_name,image_id,category_id,bbox):
globalannotation_id
annotation_item=dict()
annotation_item['segmentation']=[]
seg=[]
#bbox[]isx,y,w,h
#left_top
seg.append(bbox[0])
seg.append(bbox[1])
#left_bottom
seg.append(bbox[0])
seg.append(bbox[1]+bbox[3])
#right_bottom
seg.append(bbox[0]+bbox[2])
seg.append(bbox[1]+bbox[3])
#right_top
seg.append(bbox[0]+bbox[2])
seg.append(bbox[1])
annotation_item['segmentation'].append(seg)
annotation_item['area']=bbox[2]*bbox[3]
annotation_item['iscrowd']=0
annotation_item['ignore']=0
annotation_item['image_id']=image_id
annotation_item['bbox']=bbox
annotation_item['category_id']=category_id
annotation_id+=1
annotation_item['id']=annotation_id
coco['annotations'].append(annotation_item)
defparseXmlFiles(xml_path):
forfinos.listdir(xml_path):
ifnotf.endswith('.xml'):
continue
bndbox=dict()
size=dict()
current_image_id=None
current_category_id=None
file_name=None
size['width']=None
size['height']=None
size['depth']=None
xml_file=os.path.join(xml_path,f)
#print(xml_file)
tree=ET.parse(xml_file)
root=tree.getroot()
ifroot.tag!='annotation':
raiseException('pascalvocxmlrootelementshouldbeannotation,ratherthan{}'.format(root.tag))
#elemis,,,
3.python提取PascalVoc数据集中特定的类
#-*-coding:utf-8-*- #@Function:Thereare20classesinVOCdataset.Ifyouneedtoextractspecificclasses,youcanusethisprogramtoextractthem. importos importshutil ann_filepath='E:/VOCdevkit/VOC2012/Annotations/' img_filepath='E:/VOCdevkit/VOC2012/JPEGImages/' img_savepath='E:TrafficDatasets/JPEGImages/' ann_savepath='E:TrafficDatasets/Annotations/' ifnotos.path.exists(img_savepath): os.mkdir(img_savepath) ifnotos.path.exists(ann_savepath): os.mkdir(ann_savepath) names=locals() classes=['aeroplane','bicycle','bird','boat','bottle', 'bus','car','cat','chair','cow','diningtable', 'dog','horse','motorbike','pottedplant', 'sheep','sofa','train','tvmonitor','person'] forfileinos.listdir(ann_filepath): print(file) fp=open(ann_filepath+'\\'+file)#打开Annotations文件 ann_savefile=ann_savepath+file fp_w=open(ann_savefile,'w') lines=fp.readlines() ind_start=[] ind_end=[] lines_id_start=lines[:] lines_id_end=lines[:] classes1='\t\tbicycle \n' classes2='\t\tbus \n' classes3='\t\tcar \n' classes4='\t\tmotorbike \n' classes5='\t\ttrain \n' #在xml中找到object块,并将其记录下来 while"\t\n"inlines_id_start: a=lines_id_start.index("\t 的行数 lines_id_end[b]="delete" #names中存放所有的object块 i=0 forkinrange(0,len(ind_start)): names['block%d'%k]=[] forjinrange(0,len(classes)): ifclasses[j]inlines[ind_start[i]+1]: a=ind_start[i] foroinrange(ind_end[i]-ind_start[i]+1): names['block%d'%k].append(lines[a+o]) break i+=1 #print(names['block%d'%k]) #xml头 string_start=lines[0:ind_start[0]] #xml尾 if((file[2:4]=='09')|(file[2:4]=='10')|(file[2:4]=='11')): string_end=lines[(len(lines)-11):(len(lines))] else: string_end=[lines[len(lines)-1]] #在给定的类中搜索,若存在则,写入object块信息 a=0 forkinrange(0,len(ind_start)): ifclasses1innames['block%d'%k]: a+=1 string_start+=names['block%d'%k] ifclasses2innames['block%d'%k]: a+=1 string_start+=names['block%d'%k] ifclasses3innames['block%d'%k]: a+=1 string_start+=names['block%d'%k] ifclasses4innames['block%d'%k]: a+=1 string_start+=names['block%d'%k] ifclasses5innames['block%d'%k]: a+=1 string_start+=names['block%d'%k] string_start+=string_end #print(string_start) forcinrange(0,len(string_start)): fp_w.write(string_start[c]) fp_w.close() #如果没有我们寻找的模块,则删除此xml,有的话拷贝图片 ifa==0: os.remove(ann_savepath+file) else: name_img=img_filepath+os.path.splitext(file)[0]+".jpg" shutil.copy(name_img,img_savepath) fp.close()\n") ind_start.append(a)#ind_start是 \n") ind_end.append(b)#ind_end是的行数 lines_id_start[a]="delete" while"\t \n"inlines_id_end: b=lines_id_end.index("\t
以上这篇python实现提取COCO,VOC数据集中特定的类就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。