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)) == "._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