# HG changeset patch # User Laman # Date 2018-12-29 12:24:35 # Node ID 3203933cf112aa85ffe7f80f673a6a6082f7628f # Parent 79c410b194c6b70822123d14fe9c3b4c2dcce823 createsamples diff --git a/exp/__init__.py b/exp/__init__.py new file mode 100644 diff --git a/exp/createsamples.py b/exp/createsamples.py new file mode 100644 --- /dev/null +++ b/exp/createsamples.py @@ -0,0 +1,82 @@ +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)