[docs]classLfwBase(SubsetBase):def__init__(self,path:str,*,subset:Optional[str]=None,ctx:Optional[ImportContext]=None,):ifnotosp.isfile(path):raiseFileNotFoundError(errno.ENOENT,"Can't find annotations file",path)ifnotsubset:subset=osp.basename(osp.dirname(osp.dirname(path)))super().__init__(subset=subset,ctx=ctx)self._dataset_dir=osp.dirname(osp.dirname(osp.dirname(path)))self._annotations_dir=osp.dirname(path)self._images_dir=osp.join(self._dataset_dir,self._subset,LfwPath.IMAGES_DIR)people_file=osp.join(osp.dirname(path),LfwPath.PEOPLE_FILE)self._categories=self._load_categories(people_file)self._items=list(self._load_items(path).values())def_load_categories(self,path):ifhas_meta_file(self._dataset_dir):return{AnnotationType.label:LabelCategories.from_iterable(parse_meta_file(self._dataset_dir).keys())}label_cat=LabelCategories()ifosp.isfile(path):withopen(path,encoding="utf-8")aslabels_file:forlineinlabels_file:objects=line.strip().split("\t")iflen(objects)==2:label_cat.add(objects[0])return{AnnotationType.label:label_cat}def_load_items(self,path):items={}label_categories=self._categories.get(AnnotationType.label)ifosp.isdir(self._images_dir):images={osp.splitext(osp.relpath(p,self._images_dir))[0].replace("\\","/"):pforpinfind_images(self._images_dir,recursive=True)}else:images={}withopen(path,encoding="utf-8")asf:defget_label_id(label_name):ifnotlabel_name:returnNonelabel_id=label_categories.find(label_name)[0]iflabel_idisNone:label_id=label_categories.add(label_name)returnlabel_idforlineinf:pair=line.strip().split("\t")iflen(pair)==1andpair[0]!="":annotations=[]image=pair[0]item_id=pair[0]objects=item_id.split("/")if1<len(objects):label_name=objects[0]label=get_label_id(label_name)iflabelisnotNone:annotations.append(Label(label))item_id=item_id[len(label_name)+1:]ifitem_idnotinitems:image=images.get(item_id)ifimage:image=Image.from_file(path=image)items[item_id]=DatasetItem(id=item_id,subset=self._subset,media=image,annotations=annotations)eliflen(pair)==3:image1,id1=self.get_image_name(pair[0],pair[1])image2,id2=self.get_image_name(pair[0],pair[2])label=get_label_id(pair[0])ifid1notinitems:annotations=[]annotations.append(Label(label))image=images.get(image1)ifimage:image=Image.from_file(path=image)items[id1]=DatasetItem(id=id1,subset=self._subset,media=image,annotations=annotations)ifid2notinitems:annotations=[]annotations.append(Label(label))image=images.get(image2)ifimage:image=Image.from_file(path=image)items[id2]=DatasetItem(id=id2,subset=self._subset,media=image,annotations=annotations)# pairs form a directed graphifnotitems[id1].annotations[0].attributes.get("positive_pairs"):items[id1].annotations[0].attributes["positive_pairs"]=[]items[id1].annotations[0].attributes["positive_pairs"].append(image2)eliflen(pair)==4:image1,id1=self.get_image_name(pair[0],pair[1])ifpair[2]=="-":image2=pair[3]id2=pair[3]else:image2,id2=self.get_image_name(pair[2],pair[3])ifid1notinitems:annotations=[]label=get_label_id(pair[0])annotations.append(Label(label))image=images.get(image1)ifimage:image=Image.from_file(path=image)items[id1]=DatasetItem(id=id1,subset=self._subset,media=image,annotations=annotations)ifid2notinitems:annotations=[]ifpair[2]!="-":label=get_label_id(pair[2])annotations.append(Label(label))image=images.get(image2)ifimage:image=Image.from_file(path=image)items[id2]=DatasetItem(id=id2,subset=self._subset,media=image,annotations=annotations)# pairs form a directed graphifnotitems[id1].annotations[0].attributes.get("negative_pairs"):items[id1].annotations[0].attributes["negative_pairs"]=[]items[id1].annotations[0].attributes["negative_pairs"].append(image2)landmarks_file=osp.join(self._annotations_dir,LfwPath.LANDMARKS_FILE)ifosp.isfile(landmarks_file):withopen(landmarks_file,encoding="utf-8")asf:forlineinf:line=line.split("\t")item_id=osp.splitext(line[0])[0]objects=item_id.split("/")if1<len(objects):label_name=objects[0]label=get_label_id(label_name)iflabelisnotNone:item_id=item_id[len(label_name)+1:]ifitem_idnotinitems:items[item_id]=DatasetItem(id=item_id,subset=self._subset,image=osp.join(self._images_dir,line[0]),)annotations=items[item_id].annotationsannotations.append(Points([float(p)forpinline[1:]],label=label))foranninannotations:self._ann_types.add(ann.type)returnitems
[docs]classLfwExporter(Exporter):DEFAULT_IMAGE_EXT=LfwPath.IMAGE_EXTdef_apply_impl(self):ifself._extractor.media_type()andnotissubclass(self._extractor.media_type(),Image):raiseMediaTypeError("Media type is not an image")os.makedirs(self._save_dir,exist_ok=True)ifself._save_dataset_meta:self._save_meta_file(self._save_dir)forsubset_name,subsetinself._extractor.subsets().items():label_categories=self._extractor.categories()[AnnotationType.label]labels={label.name:0forlabelinlabel_categories}positive_pairs=[]negative_pairs=[]neutral_items=[]landmarks=[]included_items=[]foriteminsubset:anns=[annforanninitem.annotationsifann.type==AnnotationType.label]label,label_name=None,Noneifanns:label=anns[0]label_name=label_categories[anns[0].label].namelabels[label_name]+=1ifself._save_mediaanditem.media:subdir=osp.join(subset_name,LfwPath.IMAGES_DIR)iflabel_name:subdir=osp.join(subdir,label_name)self._save_image(item,subdir=subdir)iflabelisnotNone:person1=label_namenum1=item.idifnum1.startswith(person1):num1=int(num1.replace(person1,"")[1:])curr_item=person1+"/"+str(num1)if"positive_pairs"inlabel.attributes:ifcurr_itemnotinincluded_items:included_items.append(curr_item)forpairinlabel.attributes["positive_pairs"]:search=LfwPath.PATTERN.search(pair)ifsearch:num2=search.groups()[1]num2=int(num2)else:num2=pairifnum2.startswith(person1):num2=num2.replace(person1,"")[1:]curr_item=person1+"/"+str(num2)ifcurr_itemnotinincluded_items:included_items.append(curr_item)positive_pairs.append("%s\t%s\t%s"%(person1,num1,num2))if"negative_pairs"inlabel.attributes:ifcurr_itemnotinincluded_items:included_items.append(curr_item)forpairinlabel.attributes["negative_pairs"]:search=LfwPath.PATTERN.search(pair)curr_item=""ifsearch:person2,num2=search.groups()num2=int(num2)curr_item+=person2+"/"else:person2="-"num2=pairobjects=pair.split("/")if1<len(objects)andobjects[0]inlabels:person2=objects[0]num2=pair.replace(person2,"")[1:]curr_item+=person2+"/"curr_item+=str(num2)ifcurr_itemnotinincluded_items:included_items.append(curr_item)negative_pairs.append("%s\t%s\t%s\t%s"%(person1,num1,person2,num2))if("positive_pairs"notinlabel.attributesand"negative_pairs"notinlabel.attributesandcurr_itemnotinincluded_items):neutral_items.append("%s/%s"%(person1,item.id))included_items.append(curr_item)elifitem.idnotinincluded_items:neutral_items.append(item.id)included_items.append(item.id)item_landmarks=[pforpinitem.annotationsifp.type==AnnotationType.points]forlandmarkinitem_landmarks:landmarks.append("%s\t%s"%(item.id+LfwPath.IMAGE_EXT,"\t".join(str(p)forpinlandmark.points)))annotations_dir=osp.join(self._save_dir,subset_name,LfwPath.ANNOTATION_DIR)pairs_file=osp.join(annotations_dir,LfwPath.PAIRS_FILE)os.makedirs(osp.dirname(pairs_file),exist_ok=True)withopen(pairs_file,"w",encoding="utf-8")asf:f.writelines(["%s\n"%pairforpairinpositive_pairs])f.writelines(["%s\n"%pairforpairinnegative_pairs])f.writelines(["%s\n"%itemforiteminneutral_items])iflandmarks:landmarks_file=osp.join(annotations_dir,LfwPath.LANDMARKS_FILE)withopen(landmarks_file,"w",encoding="utf-8")asf:f.writelines(["%s\n"%landmarkforlandmarkinlandmarks])iflabels:people_file=osp.join(annotations_dir,LfwPath.PEOPLE_FILE)withopen(people_file,"w",encoding="utf-8")asf:f.writelines(["%s\t%d\n"%(label,labels[label])forlabelinlabels])