diff --git a/baselines/grabCutCropEval.py b/baselines/grabCutCropEval.py new file mode 100644 index 0000000..058f1cf --- /dev/null +++ b/baselines/grabCutCropEval.py @@ -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) + + diff --git a/baselines/noCutMeanCutCropEval.py b/baselines/noCutMeanCutCropEval.py new file mode 100644 index 0000000..9d5d445 --- /dev/null +++ b/baselines/noCutMeanCutCropEval.py @@ -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() +