mirror of
https://github.com/saymrwulf/onnxruntime.git
synced 2026-06-13 01:09:22 +00:00
* Initial implementation of generating calibration dynamic range table * Initialize validation support for Quantization * Initialize validation support for Quantization (cont.) * Improve validation support for Quantization * Improve validation support for Quantization * Rewrite/Refine for calibration and validation * Rewrite/Refine for calibration and validation (cont.) * Refine code * Refine code * Add data reader for BERT * Add flatbuffers to serialize calibration table * Refine code and add BERT evaluation * Refine the code * minor modification * Add preprocess/postprocess of vision team yolov3 and refine the code * Update annotation * Make bbox cooridates more accurate * Fix bug * Add support of batch processing * Batch processing for model zoo yolov3 * Add batch inference for evaluation * Refine the code * Add README * Add comments * Refine the code for PR * Remove batch support checking in data_reader and refine the code * Refine the code for PR * Refine the code for PR review Co-authored-by: Olivia Jain <oljain@microsoft.com>
136 lines
5.3 KiB
Python
136 lines
5.3 KiB
Python
import os
|
|
import sys
|
|
import numpy as np
|
|
import re
|
|
from PIL import Image
|
|
import cv2
|
|
import pdb
|
|
|
|
def yolov3_preprocess_func(images_folder, height, width, start_index=0, size_limit=0):
|
|
'''
|
|
Loads a batch of images and preprocess them
|
|
parameter images_folder: path to folder storing images
|
|
parameter height: image height in pixels
|
|
parameter width: image width in pixels
|
|
parameter size_limit: number of images to load. Default is 0 which means all images are picked.
|
|
return: list of matrices characterizing multiple images
|
|
'''
|
|
# this function is from yolo3.utils.letterbox_image
|
|
# https://github.com/qqwweee/keras-yolo3/blob/master/yolo3/utils.py
|
|
def letterbox_image(image, size):
|
|
'''resize image with unchanged aspect ratio using padding'''
|
|
iw, ih = image.size
|
|
w, h = size
|
|
scale = min(w/iw, h/ih)
|
|
nw = int(iw*scale)
|
|
nh = int(ih*scale)
|
|
|
|
image = image.resize((nw,nh), Image.BICUBIC)
|
|
new_image = Image.new('RGB', size, (128,128,128))
|
|
new_image.paste(image, ((w-nw)//2, (h-nh)//2))
|
|
return new_image
|
|
|
|
image_names = os.listdir(images_folder)
|
|
if start_index >= len(image_names):
|
|
return np.asanyarray([]), np.asanyarray([]), np.asanyarray([])
|
|
elif size_limit > 0 and len(image_names) >= size_limit:
|
|
end_index = start_index + size_limit
|
|
if end_index > len(image_names):
|
|
end_index = len(image_names)
|
|
|
|
batch_filenames = [image_names[i] for i in range(start_index, end_index)]
|
|
else:
|
|
batch_filenames = image_names
|
|
|
|
|
|
unconcatenated_batch_data = []
|
|
image_size_list = []
|
|
|
|
print(batch_filenames)
|
|
print("size: %s" % str(len(batch_filenames)))
|
|
|
|
for image_name in batch_filenames:
|
|
image_filepath = images_folder + '/' + image_name
|
|
img = Image.open(image_filepath)
|
|
model_image_size = (height, width)
|
|
boxed_image = letterbox_image(img, tuple(reversed(model_image_size)))
|
|
image_data = np.array(boxed_image, dtype='float32')
|
|
image_data /= 255.
|
|
image_data = np.transpose(image_data, [2, 0, 1])
|
|
image_data = np.expand_dims(image_data, 0)
|
|
unconcatenated_batch_data.append(image_data)
|
|
image_size_list.append(np.array([img.size[1], img.size[0]], dtype=np.float32).reshape(1, 2))
|
|
|
|
batch_data = np.concatenate(np.expand_dims(unconcatenated_batch_data, axis=0), axis=0)
|
|
return batch_data, batch_filenames, image_size_list
|
|
|
|
def yolov3_vision_preprocess_func(images_folder, height, width, start_index=0, size_limit=0):
|
|
|
|
def letterbox(img, new_shape=(416, 416), color=(114, 114, 114), auto=True, scaleFill=False, scaleup=True):
|
|
# Resize image to a 32-pixel-multiple rectangle https://github.com/ultralytics/yolov3/issues/232
|
|
shape = img.shape[:2] # current shape [height, width]
|
|
if isinstance(new_shape, int):
|
|
new_shape = (new_shape, new_shape)
|
|
|
|
# Scale ratio (new / old)
|
|
r = min(new_shape[0] / shape[0], new_shape[1] / shape[1])
|
|
if not scaleup: # only scale down, do not scale up (for better test mAP)
|
|
r = min(r, 1.0)
|
|
|
|
# Compute padding
|
|
ratio = r, r # width, height ratios
|
|
new_unpad = int(round(shape[1] * r)), int(round(shape[0] * r))
|
|
dw, dh = new_shape[1] - new_unpad[0], new_shape[0] - new_unpad[1] # wh padding
|
|
if auto: # minimum rectangle
|
|
dw, dh = np.mod(dw, 64), np.mod(dh, 64) # wh padding
|
|
elif scaleFill: # stretch
|
|
dw, dh = 0.0, 0.0
|
|
new_unpad = new_shape
|
|
ratio = new_shape[0] / shape[1], new_shape[1] / shape[0] # width, height ratios
|
|
|
|
dw /= 2 # divide padding into 2 sides
|
|
dh /= 2
|
|
|
|
if shape[::-1] != new_unpad: # resize
|
|
img = cv2.resize(img, new_unpad, interpolation=cv2.INTER_LINEAR)
|
|
top, bottom = int(round(dh - 0.1)), int(round(dh + 0.1))
|
|
left, right = int(round(dw - 0.1)), int(round(dw + 0.1))
|
|
img = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_CONSTANT, value=color) # add border
|
|
return img, ratio, (dw, dh)
|
|
|
|
|
|
|
|
image_names = os.listdir(images_folder)
|
|
if start_index >= len(image_names):
|
|
return np.asanyarray([]), np.asanyarray([]), np.asanyarray([])
|
|
elif size_limit > 0 and len(image_names) >= size_limit:
|
|
end_index = start_index + size_limit
|
|
if end_index > len(image_names):
|
|
end_index = len(image_names)
|
|
|
|
batch_filenames = [image_names[i] for i in range(start_index, end_index)]
|
|
else:
|
|
batch_filenames = image_names
|
|
|
|
|
|
unconcatenated_batch_data = []
|
|
image_size_list = []
|
|
|
|
print(batch_filenames)
|
|
print("size: %s" % str(len(batch_filenames)))
|
|
|
|
for image_name in batch_filenames:
|
|
image_filepath = images_folder + '/' + image_name
|
|
img0 = cv2.imread(image_filepath)
|
|
img = letterbox(img0, new_shape=(height, width), auto = False)[0]
|
|
img = img[:,:,::-1].transpose(2,0,1)
|
|
img = np.expand_dims(img, axis = 0)
|
|
img = np.repeat(img, 1, axis = 0)
|
|
|
|
img = img.astype('float32')/255.0
|
|
|
|
unconcatenated_batch_data.append(img)
|
|
image_size_list.append(img0.shape[0:2]) # img.shape is h, w, c
|
|
|
|
batch_data = np.concatenate(np.expand_dims(unconcatenated_batch_data, axis=0), axis=0)
|
|
return batch_data, batch_filenames, image_size_list
|