Files
neural-life/gifcreator.py
2016-09-09 17:49:12 +03:00

158 lines
4.0 KiB
Python

#!/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
)