First commit
This commit is contained in:
157
gifcreator.py
Normal file
157
gifcreator.py
Normal file
@@ -0,0 +1,157 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
__author__ = "Aleksey Lobanov"
|
||||
__copyright__ = "Copyright 2016, Aleksey Lobanov"
|
||||
__credits__ = ["Aleksey Lobanov"]
|
||||
__license__ = "MIT"
|
||||
__maintainer__ = "Aleksey Lobanov"
|
||||
__email__ = "i@likemath.ru"
|
||||
|
||||
import sys
|
||||
from copy import deepcopy
|
||||
|
||||
import numpy as np
|
||||
|
||||
import keras
|
||||
from keras.models import Sequential
|
||||
from keras.layers import Dense
|
||||
|
||||
import imageio # for gifs
|
||||
|
||||
from PIL import Image, ImageDraw
|
||||
|
||||
from neurallife import nextGen
|
||||
|
||||
|
||||
"""
|
||||
# from original article
|
||||
start_pos = [
|
||||
[0,0,0,0,1,0,1,0,0],
|
||||
[0,1,0,0,1,0,0,1,0],
|
||||
[0,1,1,0,1,1,0,1,0],
|
||||
[1,0,0,1,1,0,0,0,0],
|
||||
[0,1,1,1,0,1,0,1,0],
|
||||
[0,0,1,0,1,0,0,0,0],
|
||||
[0,0,1,1,0,0,1,0,0],
|
||||
[0,1,1,0,1,1,0,0,0],
|
||||
[0,0,0,0,0,0,0,0,0]
|
||||
]
|
||||
"""
|
||||
|
||||
# about 27 original positions
|
||||
start_pos = [
|
||||
[0, 0, 0, 0, 0, 0, 0, 1, 0],
|
||||
[0, 0, 0, 0, 0, 0, 1, 1, 0],
|
||||
[0, 0, 1, 0, 0, 1, 1, 1, 0],
|
||||
[1, 0, 1, 0, 1, 0, 0, 0, 0],
|
||||
[1, 0, 1, 0, 1, 1, 0, 0, 0],
|
||||
[0, 1, 0, 0, 0, 0, 0, 0, 0],
|
||||
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||
[0, 0, 0, 0, 0, 1, 0, 0, 0],
|
||||
[0, 0, 0, 0, 0, 1, 1, 0, 0]
|
||||
]
|
||||
|
||||
|
||||
"""
|
||||
Code for good, long start positions:
|
||||
|
||||
def getBest(max_cnt):
|
||||
cur_max = 0
|
||||
cur_best = None
|
||||
for i in range(max_cnt):
|
||||
cur_field = np.random.randint(2, size=(9,9)).tolist()
|
||||
cur_cnt = getCnt(cur_field)
|
||||
if cur_cnt > cur_max:
|
||||
cur_max = getCnt(cur_field, 200)
|
||||
cur_best = cur_field
|
||||
return (cur_best,cur_max)
|
||||
|
||||
|
||||
def getCnt(pos, max_cnt=100):
|
||||
cnt = 0
|
||||
ker_pred = pos
|
||||
cur_pos = pos
|
||||
while True:
|
||||
cnt += 1
|
||||
ker_pred = nn.predict(np.asarray(ker_pred).reshape((1,1,9,9)))
|
||||
ker_pred = np.rint(ker_pred).astype("int").reshape((9,9)).tolist()
|
||||
|
||||
old_cur_pos = deepcopy(cur_pos)
|
||||
next_gen(cur_pos, len(cur_pos))
|
||||
if np.asarray(old_cur_pos).sum() == np.asarray(cur_pos).sum():
|
||||
break
|
||||
if ker_pred != cur_pos:
|
||||
break
|
||||
if cnt > max_cnt:
|
||||
return 0
|
||||
return cnt
|
||||
"""
|
||||
|
||||
LINE_SIZE = 2
|
||||
SQUARE_SIZE = 18
|
||||
FRAME_COUNT = 30
|
||||
FRAME_DELAY = 0.3 # in seconds
|
||||
|
||||
|
||||
def loadKeras(path):
|
||||
model = keras.models.model_from_json(open(path + '.json').read())
|
||||
model.load_weights(path + '.h5')
|
||||
model.compile(loss='MSE', optimizer='nadam', metrics=[ ])
|
||||
return model
|
||||
|
||||
|
||||
def imageFromList(l):
|
||||
global LINE_SIZE, SQUARE_SIZE
|
||||
height = LINE_SIZE * (len(l) + 1) + SQUARE_SIZE * len(l) # =height
|
||||
width = LINE_SIZE * (len(l[0]) + 1) + SQUARE_SIZE * len(l[0])
|
||||
tmp_img = Image.new('RGB', (width, height), (0, 0, 0))
|
||||
pil_draw = ImageDraw.Draw(tmp_img)
|
||||
for y in range(len(l)):
|
||||
for x in range(len(l[0])):
|
||||
if l[y][x] == 0:
|
||||
pil_draw.rectangle((
|
||||
x * (LINE_SIZE + SQUARE_SIZE) + LINE_SIZE,
|
||||
y * (LINE_SIZE + SQUARE_SIZE) + LINE_SIZE,
|
||||
(x + 1) * (LINE_SIZE + SQUARE_SIZE)-1,
|
||||
(y + 1) * (LINE_SIZE + SQUARE_SIZE)-1,
|
||||
), fill=(255, 255, 255))
|
||||
return tmp_img
|
||||
|
||||
N = 9 # board size
|
||||
|
||||
if __name__ == '__main__':
|
||||
nn = loadKeras(sys.argv[1])
|
||||
nn_frames = []
|
||||
real_frames = []
|
||||
ker_pred = cur_pos = start_pos
|
||||
|
||||
for i in range(FRAME_COUNT):
|
||||
#ker_pred = cur_pos
|
||||
|
||||
nn_frames.append(imageFromList(ker_pred))
|
||||
ker_pred = nn.predict(np.asarray(ker_pred).reshape((1, N**2)))
|
||||
ker_pred = np.rint(ker_pred).astype("int").reshape((N, N)).tolist()
|
||||
|
||||
real_frames.append(imageFromList(cur_pos))
|
||||
old_pos = deepcopy(cur_pos)
|
||||
nextGen(cur_pos, len(start_pos))
|
||||
|
||||
# because need some pause at end
|
||||
#if cur_pos == old_pos:
|
||||
# break
|
||||
width, height = nn_frames[0].size
|
||||
|
||||
imageio.mimsave(
|
||||
'gif_neural.gif',
|
||||
[np.asarray(img.getdata()).reshape((width, height, 3)) for img in nn_frames],
|
||||
fps=1/FRAME_DELAY
|
||||
)
|
||||
imageio.mimsave(
|
||||
'gif_real.gif',
|
||||
[np.asarray(img.getdata()).reshape((width, height, 3)) for img in real_frames],
|
||||
fps=1/FRAME_DELAY
|
||||
)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user