|
import torch |
|
import axengine as axe |
|
import numpy as np |
|
import math |
|
|
|
def _get_source_mask(src_seq, valid_ratios) -> torch.Tensor: |
|
"""Generate mask for source sequence. |
|
|
|
Args: |
|
src_seq (torch.Tensor): Image sequence. Shape :math:`(N, T, C)`. |
|
valid_ratios (list[float]): The valid ratio of input image. For |
|
example, if the width of the original image is w1 and the width |
|
after padding is w2, then valid_ratio = w1/w2. Source mask is |
|
used to cover the area of the padding region. |
|
|
|
Returns: |
|
Tensor or None: Source mask. Shape :math:`(N, T)`. The region of |
|
padding area are False, and the rest are True. |
|
""" |
|
|
|
N, T, _ = src_seq.size() |
|
mask = None |
|
if len(valid_ratios) > 0: |
|
mask = src_seq.new_zeros((N, T), device=src_seq.device) |
|
for i, valid_ratio in enumerate(valid_ratios): |
|
valid_width = min(T, math.ceil(T * valid_ratio)) |
|
mask[i, :valid_width] = 1 |
|
|
|
return mask |
|
|
|
onnx_bb_encoder = axe.InferenceSession("backbone_encoder.axmodel") |
|
onnx_decoder = axe.InferenceSession("decoder.axmodel") |
|
|
|
input_image = torch.tensor(np.load('input_tensor/input_image.npy')) |
|
out_enc = onnx_bb_encoder.run(["output"], {"input": np.array(input_image.cpu())})[0] |
|
out_enc = torch.tensor(out_enc) |
|
data_samples = None |
|
|
|
N = out_enc.size(0) |
|
|
|
init_target_seq = torch.tensor(np.load('input_tensor/init_target_seq.npy')).to(torch.int32) |
|
outputs = [] |
|
max_seq_len = 25 |
|
for step in range(0, max_seq_len): |
|
valid_ratios = [1.0 for _ in range(out_enc.size(0))] |
|
if data_samples is not None: |
|
valid_ratios = [] |
|
for data_sample in data_samples: |
|
valid_ratios.append(data_sample.get('valid_ratio')) |
|
|
|
src_mask = _get_source_mask(out_enc, valid_ratios) |
|
|
|
step_result = onnx_decoder.run(["output"],{'init_target_seq':np.array(init_target_seq), |
|
'out_enc':np.array(out_enc), |
|
'src_mask':np.array(src_mask), |
|
'step':np.array([step]).astype(np.int32)})[0][0] |
|
step_result = torch.tensor(step_result) |
|
outputs.append(step_result) |
|
_, step_max_index = torch.max(step_result, dim=-1) |
|
init_target_seq[:, step + 1] = step_max_index |
|
outputs = torch.stack(outputs, dim=1) |
|
np.save('output_tensor/outputs.npy',outputs) |
|
|
|
|
|
|
|
|
|
|
|
|