Changeset - d9cf0ed8e7fd
[Not reviewed]
default
0 3 0
Laman - 6 years ago 2019-05-09 17:47:26

Inception transfer learning (failed)
3 files changed with 51 insertions and 22 deletions:
0 comments (0 inline, 0 general)
exp/kerokero/prepare_data.py
Show inline comments
 
@@ -20,7 +20,7 @@ class Sample:
 
	SIDE=224
 

	
 
	def __init__(self,img,grid):
 
		""":param img: a greyscale image as a 2D np.uint8
 
		""":param img: an image as a 3D np.uint8, channels-last
 
		:param grid: iterable of 4 EPoints, ie. Corners"""
 
		self.img=img
 
		self.grid=grid
 
@@ -38,7 +38,7 @@ class Sample:
 
			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
 
		img=cv.cvtColor(img,cv.COLOR_BGR2RGB)
 
		grid=Corners(c.transform(m) for c in self.grid)
 
		grid=list(map(lambda p: 2*p/self.SIDE-EPoint(1,1), grid))
 
		return (img,grid,list(itertools.chain.from_iterable(grid)))
 
@@ -59,7 +59,7 @@ class Sample:
 
		return np.matmul(scale,t2)
 

	
 
	def show(self):
 
		img=cv.cvtColor(self.img,cv.COLOR_GRAY2BGR)
 
		img=np.copy(self.img)
 
		for c in self.grid:
 
			cv.circle(img,(int(c.x),int(c.y)),3,[0,255,0],-1)
 
		show(img)
 
@@ -80,15 +80,15 @@ def traverseDirs(root):
 
def harvestDir(path):
 
	annotations=DataFile(os.path.join(path,"annotations.json.gz"))
 
	imgFilter=lambda f: f.is_file() and re.match(r".*\.(jpg|jpeg|png|gif)$", f.name.lower())
 
	files=sorted(filter(imgFilter,os.scandir(path)),key=lambda f: f.name)
 
	files=sorted(filter(imgFilter,os.scandir(path)),key=lambda f: f.name)[::3]
 
	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)
 
			# sample.show()
 
			(transformedImg,transformedGrid,label)=sample.transform()
 
			# Sample(np.uint8(transformedImg*255),map(lambda c: (c+EPoint(1,1))*Sample.SIDE/2,transformedGrid)).show()
 
			# Sample(transformedImg,map(lambda c: (c+EPoint(1,1))*Sample.SIDE/2,transformedGrid)).show()
 
			yield (transformedImg,label)
 

	
 

	
 
@@ -108,8 +108,8 @@ def loadDataset(root):
 
	labels=[labels[k] for k in keys]
 
	m=int(n*trainRatio)
 
	return (
 
		(np.float32(images[:m]),np.float32(labels[:m])),
 
		(np.float32(images[m:]),np.float32(labels[m:]))
 
		(images[:m],np.float32(labels[:m])),
 
		(images[m:],np.float32(labels[m:]))
 
	)
 

	
 

	
exp/kerokero/test.py
Show inline comments
 
@@ -3,6 +3,7 @@ import logging as log
 

	
 
import numpy as np
 
from keras.models import load_model
 
from keras.applications.inception_v3 import preprocess_input
 

	
 
from prepare_data import loadDataset,Sample
 
from analyzer.epoint import EPoint
 
@@ -16,23 +17,22 @@ parser.add_argument("data")
 
args=parser.parse_args()
 

	
 
model=load_model(args.model)
 
model.summary()
 

	
 
log.info("loading data...")
 
with np.load(args.data) as data:
 
	trainImages=data["trainImages"]
 
	trainLabels=data["trainLabels"]
 
	testImages=data["testImages"]
 
	testLabels=data["testLabels"]
 
log.info("done")
 

	
 
log.info(model.evaluate(testImages.reshape((-1,224,224,1)),testLabels))
 
log.info(model.evaluate(preprocess_input(testImages).reshape((-1,224,224,3)),testLabels))
 

	
 
for img in testImages:
 
	label=model.predict(np.reshape(img,(1,224,224,1)))
 
	label=model.predict(preprocess_input(np.reshape(img,(1,224,224,3))))
 
	print(label)
 
	points=[]
 
	for i in range(4):
 
		points.append(EPoint((label[0][i*2]+1)*112,(label[0][i*2+1]+1)*112))
 
	corners=Corners(points)
 
	sample=Sample(np.uint8(img*255),corners)
 
	sample=Sample(img,corners)
 
	sample.show()
exp/kerokero/train.py
Show inline comments
 
@@ -4,9 +4,11 @@ import argparse
 
import logging as log
 

	
 
import numpy as np
 
from keras.layers import Conv2D,Dropout,Dense,Flatten,MaxPooling2D,BatchNormalization
 
from keras.models import Sequential,load_model
 
from keras.layers import Conv2D,Dropout,Dense,Flatten,MaxPooling2D,GlobalAveragePooling2D,BatchNormalization
 
from keras.models import Sequential,load_model,Model
 
from keras.optimizers import SGD
 
from keras.callbacks import TensorBoard
 
from keras.applications.inception_v3 import InceptionV3,preprocess_input
 

	
 
import config as cfg
 
import ftp
 
@@ -17,6 +19,7 @@ parser.add_argument("--load_model")
 
parser.add_argument("--save_model",default="/tmp/gogo-{0:03}.h5")
 
parser.add_argument("--epochs",type=int,default=100)
 
parser.add_argument("--initial_epoch",type=int,default=0)
 
parser.add_argument("--log_dir",default="/tmp/tflogs")
 
args=parser.parse_args()
 

	
 

	
 
@@ -72,24 +75,50 @@ def createCNN():
 
	return model
 

	
 

	
 
model=createCNN()
 
def createPretrained():
 
	base=InceptionV3(weights="imagenet",include_top=False,input_shape=(224,224,3))
 

	
 
	x=base.output
 
	x=GlobalAveragePooling2D()(x)
 
	x=Dense(1024,activation="relu")(x)
 
	predictions=Dense(8)(x)
 

	
 
	model=Model(inputs=base.input,outputs=predictions)
 
	for layer in base.layers:
 
		layer.trainable=False
 

	
 
	model.compile(optimizer='adam',loss='mse',metrics=['mae','accuracy'])
 
	return model
 

	
 

	
 
if args.load_model:
 
	model=load_model(args.load_model)
 
else:
 
	model=createPretrained()
 

	
 
log.info("loading data...")
 
with np.load(args.data) as data:
 
	trainImages=data["trainImages"]
 
	trainImages=preprocess_input(data["trainImages"])
 
	trainLabels=data["trainLabels"]
 
	testImages=data["testImages"]
 
	testImages=preprocess_input(data["testImages"])
 
	testLabels=data["testLabels"]
 
log.info("done")
 

	
 
tensorboard = TensorBoard(log_dir=os.path.join(cfg.thisDir,"../logs","{}".format(time())))
 
BIG_STEP=50
 
tensorboard = TensorBoard(log_dir=os.path.join(args.log_dir,"{}".format(time())))
 

	
 
if not args.load_model:
 
	model.fit(trainImages.reshape((-1,224,224,3)),trainLabels,epochs=10,batch_size=128,validation_split=0.2,callbacks=[tensorboard])
 
for layer in model.layers[:249]:
 
	layer.trainable = False
 
for layer in model.layers[249:]:
 
	layer.trainable = True
 
model.compile(optimizer=SGD(lr=0.0001,momentum=0.9),loss='mse')
 

	
 
BIG_STEP=20
 
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])
 
	model.fit(trainImages.reshape((-1,224,224,3)),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)
 
log.info(model.evaluate(testImages.reshape((-1,224,224,1)),testLabels))
 
log.info(model.evaluate(testImages.reshape((-1,224,224,3)),testLabels))
0 comments (0 inline, 0 general)