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 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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。