import os import sys import random import PIL.Image import PIL.ImageDraw import PIL from color_sampler import DataFile finalPosCount=5000 random.seed(361) inputDir=sys.argv[1] outputDir=sys.argv[2] negDir=sys.argv[3] negFiles=os.listdir(negDir) negFiles.sort() annotations=DataFile("annotations.json.gz") posCount=len(annotations) multiple=int(round(finalPosCount/posCount+0.5)) def pickRandom(): file=random.choice(negFiles) return PIL.Image.open(os.path.join(negDir,file)) def cropBackground(bgImg,w,h): (bgw,bgh)=bgImg.size scale=min(bgw/w,bgh/h) if scale<1: # minimal upscale bgImg=bgImg.resize((int(round(bgw/scale+0.5)),int(round(bgh/scale+0.5))),PIL.Image.BICUBIC) scale=1 else: # random downscale r=1+random.random()*(scale-1) bgImg=bgImg.resize((int(bgw/r+0.5),int(bgh/r+0.5)),PIL.Image.BICUBIC) (bgw,bgh)=bgImg.size wRange=bgw-w hRange=bgh-h x=random.randint(0,wRange) y=random.randint(0,hRange) bg=bgImg.crop((x,y,x+w,y+h)) if random.random()<0.5: bg=bg.transpose(PIL.Image.FLIP_LEFT_RIGHT) return bg def extract(image,cornerList,i,filename): img=image.copy() x1=min(p.x for p in cornerList) x2=max(p.x for p in cornerList) y1=min(p.y for p in cornerList) y2=max(p.y for p in cornerList) w=x2-x1 h=y2-y1 bg=cropBackground(pickRandom(),w,h) mask=PIL.Image.new("1",bg.size,255) d=PIL.ImageDraw.Draw(mask) d.polygon([(p.x-x1,p.y-y1) for p in cornerList], fill=0, outline=0) img.paste(bg,(x1,y1),mask=mask) relevantArea=img.crop((x1,y1,x2,y2)) if random.random()<0.5: relevantArea=relevantArea.transpose(PIL.Image.FLIP_LEFT_RIGHT) outputPath=os.path.join(outputDir,filename.replace(".","-{0}.".format(i))) relevantArea.save(outputPath) print(outputPath,1,0,0,x2-x1,y2-y1) for (filename,cornerList) in annotations.items(): path=os.path.join(inputDir, filename) if not os.path.isfile(path): print("{0} not found, ignored".format(path)) continue img=PIL.Image.open(path) for i in range(multiple): extract(img,cornerList,i,filename)