#from grabCutCrop import cropMask import cv2 import numpy as np import sys def cropMaskNo(imgH,imgW): mask = np.ones((imgH,imgW),np.uint8) return mask def cropMaskPortion(imgH,imgW,xp1,yp1,xp2,yp2,xp3,yp3,xp4,yp4): mask = np.zeros((imgH,imgW),np.uint8) y1 = yp1*imgH x1 = xp1*imgW y2 = yp2*imgH x2 = xp2*imgW y3 = yp3*imgH x3 = xp3*imgW y4 = yp4*imgH x4 = xp4*imgW cv2.fillConvexPoly(mask, np.array([[x1,y1], [x2,y2], [x3,y3], [x4,y4]], np.int32), 1, 8) return mask if len(sys.argv)<3: print('Computes no-crop and mean-crop baselines, generates two files {gtFile}_fullno.res and {gtFile}_fullmean.res') print('usage: '+sys.argv[0]+' gtFile.csv imageDir [mean_x1 mean_y1 mean_x2 mean_y2 mean_x3 mean_y3 mean_x4 mean_y4]') print(' (optional mean box)') exit() gtFile=sys.argv[1] imageDir=sys.argv[2] if imageDir[-1]!='/': imageDir+='/' reverse=False sumIOU_no=0 sumIOU_mean=0 countIOU=0 scale=1 print('eval on '+gtFile) outFile_no = gtFile+'_fullno.res' outFile_mean = gtFile+'_fullmean.res' numLines=0 try: with open(outFile_no,'r') as f: numLines = len(f.readlines()) except IOError: numLines=0 try: out_no = open(outFile_no,'a') except IOError: out_no = open(outFile_no,'w') try: out_mean = open(outFile_mean,'a') except IOError: out_mean = open(outFile_mean,'w') with open(gtFile) as f: cc=0 lines = f.readlines() xp1=0 yp1=0 xp2=0 yp2=0 xp3=0 yp3=0 xp4=0 yp4=0 imgHW={} for line in lines: p = line.split(',') imagePath = p[0] x1 = float(p[1])*scale y1 = float(p[2])*scale x2 = float(p[3])*scale y2 = float(p[4])*scale x3 = float(p[5])*scale y3 = float(p[6])*scale x4 = float(p[7])*scale y4 = float(p[8])*scale if reverse: tmpX=x4 tmpY=y4 x4=x3 y4=y3 x3=tmpX y4=tmpY #type = p[9] if x1<0: continue cc+=1 image = cv2.imread(imageDir+imagePath) imgHW[imagePath]=(int(image.shape[0]*scale),int(image.shape[1]*scale)) xp1 += x1/(image.shape[1]*scale) yp1 += y1/(image.shape[0]*scale) xp2 += x2/(image.shape[1]*scale) yp2 += y2/(image.shape[0]*scale) xp3 += x3/(image.shape[1]*scale) yp3 += y3/(image.shape[0]*scale) xp4 += x4/(image.shape[1]*scale) yp4 += y4/(image.shape[0]*scale) xp1/=cc yp1/=cc xp2/=cc yp2/=cc xp3/=cc yp3/=cc xp4/=cc yp4/=cc if len(sys.argv)>9: xp1=float(sys.argv[3]) yp1=float(sys.argv[4]) xp2=float(sys.argv[5]) yp2=float(sys.argv[6]) xp3=float(sys.argv[7]) yp3=float(sys.argv[8]) xp4=float(sys.argv[9]) yp4=float(sys.argv[10]) else: print(str(xp1)+' '+str(yp1)+' '+str(xp2)+' '+str(yp2)+' '+str(xp3)+' '+str(yp3)+' '+str(xp4)+' '+str(yp4)) cc=0 for line in lines: p = line.split(',') imagePath = p[0] x1 = float(p[1])*scale y1 = float(p[2])*scale x2 = float(p[3])*scale y2 = float(p[4])*scale x3 = float(p[5])*scale y3 = float(p[6])*scale x4 = float(p[7])*scale y4 = float(p[8])*scale if reverse: tmpX=x4 tmpY=y4 x4=x3 y4=y3 x3=tmpX y4=tmpY #type = p[9] if x1<0: continue cc+=1 if cc<=numLines: continue #image = cv2.imread(imageDir+imagePath) hw = imgHW[imagePath] #print hw mask_no = cropMaskNo(hw[0],hw[1]) mask_mean = cropMaskPortion(hw[0],hw[1],xp1,yp1,xp2,yp2,xp3,yp3,xp4,yp4) gtMask = np.zeros(mask_no.shape,np.uint8) cv2.fillConvexPoly(gtMask, np.array([[x1,y1], [x2,y2], [x3,y3], [x4,y4]], np.int32), 1, 8) intersection_no = np.sum(mask_no>Mask) union_no = np.sum(mask_no|gtMask) sumIOU_no += float(intersection_no)/union_no out_no.write(imagePath+' '+str(float(intersection_no)/union_no)+'\n') out_no.flush() intersection_mean = np.sum(mask_mean>Mask) union_mean = np.sum(mask_mean|gtMask) sumIOU_mean += float(intersection_mean)/union_mean out_mean.write(imagePath+' '+str(float(intersection_mean)/union_mean)+'\n') out_mean.flush() countIOU += 1 out_no.write('mean IOU for '+gtFile+': '+str(sumIOU_no/countIOU)+'\n') out_no.close() out_mean.write('mean IOU for '+gtFile+': '+str(sumIOU_mean/countIOU)+'\n') out_mean.close()