raven / raven_utils /draw.py
Jakub Kwiatkowski
Refactor.
38f87b5
import numpy as np
from funcy import identity
from raven_utils.constant import PROPERTY, TARGET, INPUTS
from raven_utils.decode import decode_target, target_mask
from raven_utils.image import EXIST, COR, draw_images, add_text
from raven_utils.render.rendering import render_panels
from raven_utils.render_ import TYPES, SIZES
from raven_utils.tools import none, is_model, filter_keys
from raven_utils.uitls import get_val_index
def draw_board(images, target=None, predict=None, image=None, desc=None, layout=None, break_=20):
if image != "target" and predict is not None:
image = images[predict:predict + 1]
elif images is None and target is not None:
image = images[target:target + 1]
# image = False to not draw anything
border = [{COR: target - 8, EXIST: list(range(4)) if predict is None else (1, 3)}] + [{COR: p, EXIST: (0, 2)} for p
in none(predict)]
boards = []
boards.append(draw_images(
np.concatenate([images[:8], image[None] if len(image.shape) == 3 else image]) if image is not None else images[
:8]))
if layout == 1:
i = draw_images(images[8:], column=4, border=border)
if break_:
i = np.concatenate([np.zeros([break_, i.shape[1], 1]), i], axis=0)
boards.append(i)
else:
boards.append(
draw_images(np.concatenate([images[8:], predict]) if predict is not None else images[8:], column=4,
border=target - 8))
full_board = draw_images(boards, grid=False)
if desc:
full_board = add_text(full_board, desc)
return full_board
def draw_boards(images, target=None, predict=None,image=None, desc=None, layout=None):
boards = []
for i, im in enumerate(images):
boards.append(draw_board(im, target[i][0] if target is not None else None,
predict[i] if predict is not None else None,
image[i] if image is not None else None,
desc[i] if desc is not None else None, layout=layout))
return boards
def draw_from_generator(generator, predict=None, no=1, indexes=None, layout=1):
data,_ = val_sample(generator, no, indexes)
return draw_raven(data, predict=predict, pre_fn=generator.data.data["inputs"].fn, layout=layout)
def val_sample(generator, no=1, indexes=None):
if indexes is None:
indexes = get_val_index(base=no)
data = generator.data[indexes]
return data, indexes
def render_from_model(data,predict,pre_fn=identity):
data = filter_keys(data, PROPERTY, reverse=True)
if is_model(predict) or str(type(predict)) == "<class 'tensorflow.python.saved_model.load.Loader._recreate_base_user_object.<locals>._UserObject'>":
predict = predict(data)
pro = np.array(target_mask(predict['predict_mask'].numpy()) * predict["predict"].numpy(), dtype=np.int8)
return pre_fn(render_panels(pro, target=False)[None])[0]
def draw_raven(data, predict=None, pre_fn=identity, layout=1):
if is_model(predict):
d = filter_keys(data, PROPERTY, reverse=True)
# tmp change
res = predict(d)
pro = np.array(target_mask(res['mask'].numpy()) * res["predict"].numpy(),dtype=np.int8)
predict = pre_fn(render_panels(pro, target=False)[None])[0]
target = data[TARGET]
target_index = data["index"]
images = data[INPUTS]
# np.equal(res['predict'], pro[:,:102]).sum()
if hasattr(predict, "shape"):
if len(predict.shape) > 3:
# iamges
image = predict
# todo create index and output based on image
predict = None
predict_index = None
elif len(predict.shape) == 3:
image = render_panels(predict, target=False)
# Create index based on predict.
predict_index = None
else:
image = images[predict]
predict_index = predict
predict = target
else:
image = K.gather(images, target_index[:, 0])
predict_index = None
predict = None
# elif not(hasattr(target,"shape") and len(target.shape) > 3):
# if hasattr(target,"shape") and target.shape[-1] == OUTPUT_SIZE:
# pro = target
# predict = render_panels(pro)
# elif hasattr(target,"shape") and target.shape[-1] == FEATURE_NO:
# # pro = target
# pro = np.zeros([no, OUTPUT_SIZE], dtype="int")
# else:
# pro = np.zeros([no, OUTPUT_SIZE], dtype="int")
# # predict = [None] * no
# predict = render_panels(data[TARGET])
image = draw_boards(images, target=target_index, predict=predict_index,image=image, desc=None,
layout=layout)
all_rules = extract_rules(data[PROPERTY])
target_desc = get_desc(target)
if predict is not None:
predict_desc = get_desc(predict)
else:
predict_desc = [None] * len(target_desc)
for a, po, to in zip(all_rules, predict_desc, target_desc):
# fl(predict_desc[-1])
if po is None:
po = [None] * len(to)
for p, t in zip(po, to):
a.extend(
[" ".join([str(i) for i in t])] + (
[" ".join([str(i) for i in p]), ""] if p is not None else []
)
)
# a.extend([""] + [] + [""] + [" ".join(fl(p))])
# image = draw_boards(data[INPUTS],target=data["index"], predict=predict[:no], desc=all_rules, no=no,layer=layer)
return lu([(i, j) for i, j in zip(image, all_rules)])
def extract_rules(data):
all_rules = []
for d in data:
rules = []
for j, rule_group in enumerate(d.findAll("Rule_Group")):
# rules_all.append(rule_group['id'])
for j, rule in enumerate(rule_group.findAll("Rule")):
rules.append(f"{rule['attr']} - {rule['name']}")
rules.append("")
all_rules.append(rules)
return all_rules
def get_desc(target, exist=None, types=TYPES, sizes=SIZES):
decoded = decode_target(target)
exist = decoded[1] if exist is None else exist
taken = np.stack(take(decoded[2], np.array(exist, dtype=bool))).T
figures_no = np.sum(exist, axis=-1)
desc = np.split(taken, np.cumsum(figures_no))[:-1]
# figures_no = np.sum(exist, axis=-1)
# div = np.split(desc, np.cumsum(figures_no))[:-1]
result = []
for pd in desc:
r = []
for p in pd:
r.append([p[0], sizes[p[1]], types[p[2]]])
result.append(r)
return result