| @@ -0,0 +1,134 @@ | |||
| #from grabCutCrop import cropMask | |||
| from multiprocessing.dummy import Pool as ThreadPool | |||
| import cv2 | |||
| import numpy as np | |||
| import sys | |||
| def cropMask(imageDir,saveDir,imagePath, border): | |||
| interName = saveDir+'grabCut_'+imagePath.replace('/','_')+'.png' | |||
| mask=cv2.imread(interName,0) | |||
| if mask is None or mask.shape[0]==0: | |||
| img = cv2.imread(imageDir+imagePath) | |||
| if img is None: | |||
| print "Could not read: "+imageDir+imagePath | |||
| mask = np.zeros(img.shape[:2],np.uint8) | |||
| bgdModel = np.zeros((1,65),np.float64) | |||
| fgdModel = np.zeros((1,65),np.float64) | |||
| rect = (border,border,img.shape[1]-2*border,img.shape[0]-2*border) #(x,y,w,h) | |||
| cv2.grabCut(img,mask,rect,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_RECT) | |||
| cv2.imwrite(interName,mask) | |||
| mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8') | |||
| revMask = 1-mask2 | |||
| #fix the mask so that there is only one CC | |||
| num, labels, stats, centiods = cv2.connectedComponentsWithStats(revMask, 8, cv2.CV_32S) | |||
| maxLabel=None | |||
| maxSize=0 | |||
| for l in range(1,num): | |||
| if stats[l,cv2.CC_STAT_AREA] > maxSize: | |||
| maxSize = stats[l,cv2.CC_STAT_AREA] | |||
| maxLabel = l | |||
| return (labels!=maxLabel).astype('uint8') | |||
| if len(sys.argv)<5: | |||
| print 'This evalutes using grab cut' | |||
| print 'usage: '+sys.argv[0]+' gtFile.csv imageDir saveIntermDir numThreads' # [reverse]' | |||
| exit(0) | |||
| gtFile=sys.argv[1] | |||
| imageDir=sys.argv[2] | |||
| if imageDir[-1]!='/': | |||
| imageDir+='/' | |||
| saveDir=sys.argv[3] | |||
| if saveDir[-1]!='/': | |||
| saveDir+='/' | |||
| numThreads = int(sys.argv[4]) | |||
| reverse=False | |||
| #if len(sys.argv)>5 and sys.argv[5][0]=='r': | |||
| # reverse=True | |||
| sumIOU=0 | |||
| countIOU=0 | |||
| scale=1 | |||
| print 'eval on '+gtFile | |||
| outFile = gtFile+'_fullgrab.res' | |||
| #numLines=0 | |||
| #try: | |||
| # with open(outFile,'r') as f: | |||
| # numLines = len(f.readlines()) | |||
| #except IOError: | |||
| # numLines=0 | |||
| try: | |||
| out = open(outFile,'a') | |||
| except IOError: | |||
| out = open(outFile,'w') | |||
| def worker(line): | |||
| global imageDir, saveDir, reverse | |||
| try: | |||
| p = line.split(',') | |||
| imagePath = p[0] | |||
| x1 = float(p[1]) | |||
| y1 = float(p[2]) | |||
| x2 = float(p[3]) | |||
| y2 = float(p[4]) | |||
| x3 = float(p[5]) | |||
| y3 = float(p[6]) | |||
| x4 = float(p[7]) | |||
| y4 = float(p[8]) | |||
| if reverse: | |||
| tmpX=x4 | |||
| tmpY=y4 | |||
| x4=x3 | |||
| y4=y3 | |||
| x3=tmpX | |||
| y4=tmpY | |||
| #type = p[9] | |||
| if x1<0: | |||
| return None,None | |||
| #cc+=1 | |||
| #if cc<=numLines: | |||
| # return None, None | |||
| #image = cv2.imread(imageDir+imagePath) | |||
| #if image.shape[0]==0: | |||
| # print 'failed to open '+imageDir+imagePath | |||
| #image = cv2.resize(image,(0,0),None,scale,scale) | |||
| mask = cropMask(imageDir,saveDir,imagePath,5) | |||
| gtMask = np.zeros(mask.shape,np.uint8) | |||
| cv2.fillConvexPoly(gtMask, np.array([[x1,y1], [x2,y2], [x3,y3], [x4,y4]], np.int32), 1, 8) | |||
| intersection = np.sum(mask>Mask) | |||
| union = np.sum(mask|gtMask) | |||
| if float(intersection)/union < 0.6: | |||
| cv2.imwrite(saveDir+"ERR_"+imagePath.replace('/','_')+'.png',mask*255); | |||
| return imagePath, float(intersection)/union | |||
| except: | |||
| print 'Error: ' | |||
| print sys.exc_info() | |||
| with open(gtFile) as f: | |||
| pool = ThreadPool(numThreads) | |||
| results = pool.map(worker, f.readlines()) | |||
| for (imagePath, iou) in results: | |||
| if imagePath is not None: | |||
| sumIOU += iou | |||
| out.write(imagePath+' '+str(iou)+'\n') | |||
| countIOU += 1 | |||
| out.write('mean IOU for '+gtFile+': '+str(sumIOU/countIOU)+'\n') | |||
| out.close() | |||
| print 'mean IOU for '+gtFile+': '+str(sumIOU/countIOU) | |||
| @@ -0,0 +1,179 @@ | |||
| #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() | |||