# HG changeset patch # User Laman # Date 2019-06-09 21:10:09 # Node ID db53fefbf5575749d855df0bd59ded908917c029 # Parent d4478db55eec9976c9dc3b2942524b3d681d4235 Hakugen detection module diff --git a/exp/dochi.py b/exp/dochi.py --- a/exp/dochi.py +++ b/exp/dochi.py @@ -3,12 +3,12 @@ import time import argparse import logging as log +import cv2 as cv import numpy as np import keras from keras.models import load_model -from PIL import Image,ImageDraw +from PIL import Image -from epoint import EPoint import exp_config as cfg from kerokero.k_util import averageDistance @@ -16,6 +16,7 @@ keras.losses.averageDistance=averageDist keras.metrics.averageDistance=averageDistance model=load_model(cfg.dochiModel) +SIDE=224 def locateGrid(img): @@ -28,7 +29,7 @@ def locateGrid(img): label=model.predict(np.reshape(npImg,(1,224,224,1))) points=[] for i in range(4): - points.append(EPoint((label[0][i][0]+1)*(width/2),(label[0][i][1]+1)*(height/2))) + points.append([(label[0][i][0]+1)*(width/2),(label[0][i][1]+1)*(height/2)]) t=time.time()-t1 log.info("grid located in {0:.3}s".format(t)) return points @@ -43,7 +44,10 @@ if __name__=="__main__": for image_path in args.input: image=Image.open(image_path) points=locateGrid(image) - drawer=ImageDraw.Draw(image) - for p in points: - drawer.ellipse((p.x-2,p.y-2,p.x+2,p.y+2),fill="#00ff00") - image.save(os.path.join(args.output_dir,os.path.basename(image_path))) + x1=SIDE*0.1 + x2=SIDE*0.9 + destPoints=[(x1,x1),(x1,x2),(x2,x2),(x2,x1)] + m=cv.getPerspectiveTransform(np.float32(points),np.float32(destPoints)) + img=cv.warpPerspective(np.uint8(image),m,(SIDE,SIDE)) + img=cv.cvtColor(img,cv.COLOR_BGR2RGB) + cv.imwrite(os.path.join(args.output_dir,os.path.basename(image_path)),img) diff --git a/exp/exp_config.py b/exp/exp_config.py --- a/exp/exp_config.py +++ b/exp/exp_config.py @@ -13,6 +13,7 @@ INTERACTIVE=False imgDir="/tmp/oneEye" sansaModel=cfg.get("sansaModel") dochiModel=cfg.get("dochiModel") +hakugenModel=cfg.get("hakugenModel") i=1 if not os.path.exists(imgDir): diff --git a/exp/hakugen.py b/exp/hakugen.py new file mode 100644 --- /dev/null +++ b/exp/hakugen.py @@ -0,0 +1,49 @@ +import os +import time +import argparse +import logging as log + +import numpy as np +import keras +from keras.models import load_model +from PIL import Image,ImageDraw + +from epoint import EPoint +import exp_config as cfg +from kerokero.k_util import averageDistance + +keras.losses.averageDistance=averageDistance +keras.metrics.averageDistance=averageDistance + +model=load_model(cfg.hakugenModel) + + +def locateGrid(img): + t1=time.time() + (width,height)=img.size + normedImg=img.convert("L") + npImg=np.array(normedImg.getdata()).reshape((224,224,1)).astype(np.float32) + npImg=npImg/128-1 + + label=model.predict(np.reshape(npImg,(1,224,224,1))) + points=[] + for i in range(4): + points.append(EPoint((label[0][i][0]+1)*(width/2),(label[0][i][1]+1)*(height/2))) + t=time.time()-t1 + log.info("grid located in {0:.3}s".format(t)) + return points + + +if __name__=="__main__": + parser=argparse.ArgumentParser() + parser.add_argument("-i","--input",nargs="+") + parser.add_argument("-o","--output_dir",required=True) + args=parser.parse_args() + + for image_path in args.input: + image=Image.open(image_path) + points=locateGrid(image) + drawer=ImageDraw.Draw(image) + for p in points: + drawer.ellipse((p.x-2,p.y-2,p.x+2,p.y+2),fill="#00ff00") + image.save(os.path.join(args.output_dir,os.path.basename(image_path))) diff --git a/exp/kerokero/prepare_data.py b/exp/kerokero/prepare_data.py --- a/exp/kerokero/prepare_data.py +++ b/exp/kerokero/prepare_data.py @@ -1,6 +1,7 @@ import os import sys import re +import math import random import logging as log @@ -48,6 +49,19 @@ class Sample: grid=list(map(lambda p: list(2*p/self.SIDE-EPoint(1,1)), grid)) return (img,grid) + def rectify(self): + x1=self.SIDE*0.1 + x2=self.SIDE*0.9 + abcd=list(map(list,self.grid)) + destPoints=[(x1,x1),(x1,x2),(x2,x2),(x2,x1)] + abcd_=list(map(list, (EPoint(x,y)+self._createNoise() for (x,y) in destPoints))) + m=cv.getPerspectiveTransform(np.float32(abcd),np.float32(abcd_)) + img=cv.warpPerspective(self.img,m,(self.SIDE,self.SIDE)) + img=np.uint8(img) + grid=Corners(c.transform(m) for c in self.grid) + grid=list(map(lambda p: list(2*p/self.SIDE-EPoint(1,1)), grid)) + return (img,grid) + def _getCenter(self): (a,b,c,d)=self.grid p=Line.fromPoints(a,c) @@ -63,6 +77,11 @@ class Sample: scale=getScale(self.SIDE/(wg*(1+left+right)), self.SIDE/(hg*(1+top+bottom))) return np.matmul(scale,t2) + def _createNoise(self): + alpha=random.uniform(0,math.pi*2) + d=random.uniform(0,self.SIDE*0.05) + return EPoint(math.cos(alpha)*d, math.sin(alpha)*d) + def show(self): img=cv.cvtColor(self.img,cv.COLOR_GRAY2BGR) for c in self.grid: @@ -91,14 +110,15 @@ def harvestDir(path): for f in files: grade=annotations.get(f.name,[Board()])[0].grade Stats.counts[grade]+=1 - if not Board.UNSET