Changeset - fad34516870e
[Not reviewed]
default
0 3 0
Laman - 6 years ago 2019-05-07 19:52:46

normed pixel values, normed coordinates
3 files changed with 20 insertions and 12 deletions:
0 comments (0 inline, 0 general)
exp/kerokero/prepare_data.py
Show inline comments
 
@@ -6,39 +6,45 @@ import itertools
 

	
 
import numpy as np
 
import cv2 as cv
 

	
 
sys.path.append("..")
 
sys.path.append("../../src")
 
from annotations import DataFile,computeBoundingBox,Corners
 
from annotations import DataFile,computeBoundingBox,Corners,EPoint
 
from geometry import Line
 
from kerokero.transformation_matrices import getIdentity,getRotation,getTranslation,getScale,getMirroring,getProjection
 

	
 
random.seed(361)
 

	
 

	
 
class Sample:
 
	SIDE=224
 

	
 
	def __init__(self,img,grid):
 
		""":param img: a greyscale image as a 2D np.uint8
 
		:param grid: iterable of 4 EPoints, ie. Corners"""
 
		self.img=img
 
		self.grid=grid
 

	
 
	def transform(self):
 
		""":return: (img, grid), where img is a 2D np.float32 with values in (0,1),
 
		grid [(float) x, (float) y, ...], with x, y in (-1,1)"""
 
		center=self._getCenter()
 
		m=getIdentity()
 
		t1=getTranslation(-center.x,-center.y)
 
		proj=getProjection()
 
		rot=getRotation()
 
		mir=getMirroring()
 
		for mi in [t1,mir,proj,rot]:
 
			m=np.matmul(mi,m)
 
		m=np.matmul(self._computeCrop(m),m)
 
		img=cv.warpPerspective(self.img,m,(self.SIDE,self.SIDE))
 
		img=np.float32(img)/255
 
		grid=Corners(c.transform(m) for c in self.grid)
 
		return (img,list(itertools.chain.from_iterable(grid)))
 
		grid=list(map(lambda p: 2*p/self.SIDE-EPoint(1,1), grid))
 
		return (img,grid,list(itertools.chain.from_iterable(grid)))
 

	
 
	def _getCenter(self):
 
		(a,b,c,d)=self.grid
 
		p=Line.fromPoints(a,c)
 
		q=Line.fromPoints(b,d)
 
		return p.intersect(q)
 
@@ -50,13 +56,13 @@ class Sample:
 
		(left,top,right,bottom)=[random.uniform(0.05,0.2) for i in range(4)]
 
		t2=getTranslation(left*wg-x1, top*hg-y1)
 
		scale=getScale(self.SIDE/(wg*(1+left+right)), self.SIDE/(hg*(1+top+bottom)))
 
		return np.matmul(scale,t2)
 

	
 
	def show(self):
 
		img=np.copy(self.img)
 
		img=cv.cvtColor(self.img,cv.COLOR_GRAY2BGR)
 
		for c in self.grid:
 
			cv.circle(img,(int(c.x),int(c.y)),3,[0,255,0],-1)
 
		show(img)
 

	
 

	
 
def traverseDirs(root):
 
@@ -78,13 +84,14 @@ def harvestDir(path):
 
	boards=annotations["."]
 
	for f in files:
 
		img=cv.imread(f.path)
 
		img=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
 
		for b in boards:
 
			sample=Sample(img,b.grid)
 
			(transformedImg,label)=sample.transform()
 
			(transformedImg,transformedGrid,label)=sample.transform()
 
			# Sample(np.uint8(transformedImg*255),map(lambda c: (c+EPoint(1,1))*Sample.SIDE/2,transformedGrid)).show()
 
			yield (transformedImg,label)
 

	
 

	
 
def loadDataset(root):
 
	testRatio=0.1
 
	trainRatio=1-testRatio
 
@@ -98,14 +105,14 @@ def loadDataset(root):
 
	keys=list(range(n))
 
	random.shuffle(keys)
 
	images=[images[k] for k in keys]
 
	labels=[labels[k] for k in keys]
 
	m=int(n*trainRatio)
 
	return (
 
		(np.uint8(images[:m]),np.float32(labels[:m])),
 
		(np.uint8(images[m:]),np.float32(labels[m:]))
 
		(np.float32(images[:m]),np.float32(labels[:m])),
 
		(np.float32(images[m:]),np.float32(labels[m:]))
 
	)
 

	
 

	
 
def show(img,filename="x"):
 
	cv.imshow(filename,img)
 
	cv.waitKey(0)
exp/kerokero/test.py
Show inline comments
 
@@ -29,10 +29,10 @@ log.info(model.evaluate(testImages.resha
 

	
 
for img in testImages:
 
	label=model.predict(np.reshape(img,(1,224,224,1)))
 
	print(label)
 
	points=[]
 
	for i in range(4):
 
		points.append(EPoint(label[0][i*2],label[0][i*2+1]))
 
		points.append(EPoint((label[0][i*2]+1)*112,(label[0][i*2+1]+1)*112))
 
	corners=Corners(points)
 
	sample=Sample(np.uint8(img),corners)
 
	sample=Sample(np.uint8(img*255),corners)
 
	sample.show()
exp/kerokero/train.py
Show inline comments
 
@@ -82,13 +82,14 @@ with np.load(args.data) as data:
 
	trainLabels=data["trainLabels"]
 
	testImages=data["testImages"]
 
	testLabels=data["testLabels"]
 
log.info("done")
 

	
 
tensorboard = TensorBoard(log_dir=os.path.join(cfg.thisDir,"../logs","{}".format(time())))
 
for i in range(args.initial_epoch//10,args.epochs//10):
 
	model.fit(trainImages.reshape((-1,224,224,1)),trainLabels,epochs=(i+1)*10,initial_epoch=i*10,batch_size=128,validation_split=0.2,callbacks=[tensorboard])
 
	path=args.save_model.format((i+1)*10)
 
BIG_STEP=50
 
for i in range(args.initial_epoch//BIG_STEP,args.epochs//BIG_STEP):
 
	model.fit(trainImages.reshape((-1,224,224,1)),trainLabels,epochs=(i+1)*BIG_STEP,initial_epoch=i*BIG_STEP,batch_size=128,validation_split=0.2,callbacks=[tensorboard])
 
	path=args.save_model.format((i+1)*BIG_STEP)
 
	log.info("saving model...")
 
	model.save(path)
 
	ftp.push(path)
 
	# ftp.push(path)
 
log.info(model.evaluate(testImages.reshape((-1,224,224,1)),testLabels))
0 comments (0 inline, 0 general)