| #!/usr/bin/env python3 |
| """Generate ML model inputs from external images.""" |
| import argparse |
| import os |
| import sys |
| import struct |
| import urllib.request |
| |
| import numpy as np |
| from PIL import Image |
| |
| |
| parser = argparse.ArgumentParser( |
| description='Generate inputs for ML models.') |
| parser.add_argument('--i', dest='input_name', |
| help='Model input image name', required=True) |
| parser.add_argument('--o', dest='output_file', |
| help='Output binary name', required=True) |
| parser.add_argument('--s', dest='input_shape', |
| help='Model input shape (example: "1, 224, 224, 3")', required=True) |
| parser.add_argument('--q', dest='is_quant', action='store_true', |
| help='Indicate it is quant model (default: False)') |
| parser.add_argument('--u', dest='img_url', help='Input image URL') |
| args = parser.parse_args() |
| |
| |
| def write_binary_file(file_path, input, is_quant): |
| with open(file_path, "wb+") as file: |
| for d in input: |
| if is_quant: |
| file.write(struct.pack("<B", d)) |
| else: |
| file.write(struct.pack("<f", d)) |
| |
| |
| def gen_mlmodel_input(input_name, output_file, input_shape, is_quant, img_url): |
| if not os.path.exists(input_name): |
| urllib.request.urlretrieve(img_url, input_name) |
| if len(input_shape) < 3: |
| raise ValueError("Input shape < 3 dimensions") |
| resized_img = Image.open(input_name).resize( |
| (input_shape[1], input_shape[2])) |
| input = np.array(resized_img).reshape(np.prod(input_shape)) |
| if not is_quant: |
| input = 2.0 / 255.0 * input - 1 |
| write_binary_file(output_file, input, is_quant) |
| |
| |
| if __name__ == '__main__': |
| # convert input shape to a list |
| input_shape = [int(x) for x in args.input_shape.split(',')] |
| # remove whitespace in image URL if any |
| img_url = args.img_url.replace(' ', '') |
| gen_mlmodel_input(args.input_name, args.output_file, |
| input_shape, args.is_quant, img_url) |