将fddb标注转换为VOC格式标注

来源:互联网 发布:手机淘宝已购买生成器 编辑:程序博客网 时间:2024/06/05 17:05

github地址:https://github.com/imistyrain/fddb-windows


fddb是用来评估人脸检测性能事实上的标准,它给出了10折验证椭圆格式的标注,这和faster-rcnn以及SSD等的要求是不一样的,因此需要转换为期望的格式。


难点在于如何得到椭圆的外接矩形,我采用的方法是在全黑图上绘制椭圆标注,然后求取contours,最后取boundingrect实现的。


下面的代码段可以在https://github.com/imistyrain/fddb-windows/blob/master/showannotations/fddbannotation.py找到.

def show_annotations():    for i in range(10):        annotationfilepath=annotationdir+"/FDDB-fold-%0*d-ellipseList.txt"%(2,i+1)        annotationfile=open(annotationfilepath)        while(True):            filename=annotationfile.readline()[:-1]+".jpg"            if not filename:                break            line=annotationfile.readline()            if not line:                break            print filename            facenum=(int)(line)            img=cv2.imread(origimagedir+"/"+filename)            filename=filename.replace('/','_')            cv2.imwrite(imagesdir+"/"+filename,img)            w = img.shape[1]            h = img.shape[0]             labelpath=labelsdir+"/"+filename.replace('/','_')[:-3]+"txt"            labelfile=open(labelpath,'w')               for j in range(facenum):                line=annotationfile.readline().strip().split()                major_axis_radius=(float)(line[0])                minor_axis_radius=(float)(line[1])                angle=(float)(line[2])                center_x=(float)(line[3])                center_y=(float)(line[4])                score=(float)(line[5])                angle = angle / 3.1415926*180                cv2.ellipse(img, ((int)(center_x), (int)(center_y)), ((int)(major_axis_radius), (int)(minor_axis_radius)), angle, 0., 360.,(255, 0, 0))                 if conver2rects:                    mask=np.zeros((img.shape[0],img.shape[1]),dtype=np.uint8)                    cv2.ellipse(mask, ((int)(center_x), (int)(center_y)), ((int)(major_axis_radius), (int)(minor_axis_radius)), angle, 0., 360.,(255, 255, 255))                    #cv2.imshow("mask",mask)                     contours=cv2.findContours(mask,cv2.RETR_LIST,cv2.CHAIN_APPROX_NONE)                    for k in range(len(contours)-2):                        r=cv2.boundingRect(contours[k])                        x_min=r[0]                        y_min=r[1]                        x_max=r[0]+r[2]                        y_max=r[1]+r[3]                        xcenter=r[0]+r[2]/2                        ycenter=r[1]+r[3]/2                        labelline="0"+"\t"+str(xcenter*1.0/w) + '\t' + str(ycenter*1.0/h) + '\t' + str(r[2]*1.0/w) + '\t' + str(r[3]*1.0/h)+ '\n'                        labelfile.write(labelline)                        cv2.rectangle(img,(int(x_min),int(y_min)),(int(x_max),int(y_max)),(0,0,255))            labelfile.close()            cv2.imshow("img",img)            cv2.waitKey(1)