Files
aleju--imgaug/checks/check_flip_performance.py
2026-07-13 12:46:08 +08:00

182 lines
6.8 KiB
Python

from __future__ import print_function, division
import timeit
import argparse
import numpy as np
COMMANDS_HORIZONTAL_FLIPS = [
("slice",
"arr2 = arr[:, ::-1, :]; "),
("slice, contig",
"arr2 = arr[:, ::-1, :]; "
"arr2 = np.ascontiguousarray(arr2);"),
("fliplr",
"arr2 = np.fliplr(arr); "),
("fliplr contig",
"arr2 = np.fliplr(arr); "
"arr2 = np.ascontiguousarray(arr2);"),
("cv2",
"arr2 = cv2.flip(arr, 1); "
"arr2 = arr2 if arr2.ndim == 3 else arr2[..., np.newaxis]; "),
("cv2 contig",
"arr2 = cv2.flip(arr, 1); "
"arr2 = arr2 if arr2.ndim == 3 else arr2[..., np.newaxis]; "
"arr2 = np.ascontiguousarray(arr2); "),
("fort cv2",
"arr = np.asfortranarray(arr); "
"arr2 = cv2.flip(arr, 1); "
"arr2 = arr2 if arr2.ndim == 3 else arr2[..., np.newaxis]; "),
("fort cv2 contig",
"arr = np.asfortranarray(arr); "
"arr2 = cv2.flip(arr, 1); "
"arr2 = arr2 if arr2.ndim == 3 else arr2[..., np.newaxis]; "
"arr2 = np.ascontiguousarray(arr2); "),
("cv2_",
"arr = cv2.flip(arr, 1, dst=arr); "
"arr = arr if arr.ndim == 3 else arr[..., np.newaxis]; "),
("cv2_ contig",
"arr = cv2.flip(arr, 1, dst=arr); "
"arr = np.ascontiguousarray(arr); "
"arr = arr if arr.ndim == 3 else arr[..., np.newaxis]; "),
("fort cv2_",
"arr = np.asfortranarray(arr); "
"arr = cv2.flip(arr, 1, dst=arr); "
"arr = arr if arr.ndim == 3 else arr[..., np.newaxis]; "),
("fort cv2_ contig",
"arr = np.asfortranarray(arr); "
"arr = cv2.flip(arr, 1, dst=arr); "
"arr = np.ascontiguousarray(arr); "
"arr = arr if arr.ndim == 3 else arr[..., np.newaxis]; "),
("cv2_ get",
"arr = cv2.flip(arr, 1, dst=arr); "
"arr = arr.get(); "
"arr = arr if arr.ndim == 3 else arr[..., np.newaxis]; "),
("cv2_ get contig",
"arr = cv2.flip(arr, 1, dst=arr); "
"arr = arr.get(); "
"arr = arr if arr.ndim == 3 else arr[..., np.newaxis]; "
"arr = np.ascontiguousarray(arr); "),
("fort cv2_ get",
"arr = np.asfortranarray(arr); "
"arr = cv2.flip(arr, 1, dst=arr); "
"arr = arr.get(); "
"arr = arr if arr.ndim == 3 else arr[..., np.newaxis]; "),
("fort cv2_ get contig",
"arr = np.asfortranarray(arr); "
"arr = cv2.flip(arr, 1, dst=arr); "
"arr = arr.get(); "
"arr = arr if arr.ndim == 3 else arr[..., np.newaxis]; "
"arr = np.ascontiguousarray(arr); ")
]
COMMANDS_VERTICAL_FLIPS = []
for name, command in COMMANDS_HORIZONTAL_FLIPS:
name = name.replace("fliplr", "flipud")
command = command.replace("[:, ::-1, :]", "[::-1, :, :]")
command = command.replace("fliplr", "flipud")
command = command.replace("cv2.flip(arr, 1", "cv2.flip(arr, 0")
COMMANDS_VERTICAL_FLIPS.append((name, command))
def main():
parser = argparse.ArgumentParser(
description="Test performance of horizontal or vertical flip methods")
parser.add_argument("--type", help="horizontal|vertical", required=True)
args = parser.parse_args()
assert args.type in ["horizontal", "vertical"]
commands = (
COMMANDS_HORIZONTAL_FLIPS
if args.type == "horizontal"
else COMMANDS_VERTICAL_FLIPS)
number = 10000
for dt in ["bool",
"uint8", "uint16", "uint32", "uint64",
"int8", "int16", "int32", "int64",
"float16", "float32", "float64", "float128"]:
print("")
print("----------")
print(dt)
print("----------")
last_fliplr_time = None
for command_i_title, commands_i in commands:
try:
# verify that dtype does not change
arr_name = "arr2"
if "arr2" not in commands_i:
arr_name = "arr"
_ = timeit.repeat(
"%s assert %s.dtype.name == '%s', ('Got dtype ' + %s.dtype.name)" % (
commands_i, arr_name, dt, arr_name),
setup="import cv2; "
"import numpy as np; "
"arr = np.ones((224, 224, 3), dtype=np.%s)" % (dt,),
repeat=1, number=1)
times = timeit.repeat(
commands_i,
setup="import cv2; "
"import numpy as np; "
"arr = np.ones((224, 224, 3), dtype=np.%s)" % (dt,),
repeat=number, number=1)
time = np.average(times) * 1000
if command_i_title == "slice, contig":
last_fliplr_time = time
if "cv2" not in command_i_title:
print("{:>20s} {:.5f}ms".format(command_i_title, time))
else:
rel_time = last_fliplr_time / time
print("{:>20s} {:.5f}ms ({:.2f}x)".format(
command_i_title, time, rel_time))
except (AssertionError, AttributeError, TypeError) as exc:
print("{:>20s} Error: {}".format(command_i_title, str(exc)))
# import traceback
# traceback.print_exc()
augs = [
("Add", "iaa.Add(10)"),
("Affine", "iaa.Affine(translate_px={'x': 10})"),
("AverageBlur", "iaa.AverageBlur(3)")
]
for aug_name, aug_command in augs:
print("")
print("==============================")
print("flip method followed by %s" % (aug_name,))
print("==============================")
number = 5000
for command_i_title, commands_i in commands:
dt = "uint8"
try:
arr_name = "arr"
if "arr2" in commands_i:
arr_name = "arr2"
_ = timeit.repeat(
"%s assert %s.dtype.name == '%s', ('Got dtype ' + %s.dtype.name)" % (
commands_i, arr_name, dt, arr_name),
setup="import cv2; "
"import numpy as np; "
"arr = np.ones((224, 224, 3), dtype=np.%s)" % (dt,),
repeat=1, number=1)
times = timeit.repeat(
"%s _ = aug(image=%s);" % (commands_i, arr_name),
setup="import cv2; "
"import numpy as np; "
"import imgaug.augmenters as iaa; "
"arr = np.ones((224, 224, 3), dtype=np.%s); "
"aug = %s" % (dt, aug_command),
repeat=number, number=1)
time = np.average(times) * 1000
print("{:>20s} {:.5f}ms".format(command_i_title, time))
except (AssertionError, AttributeError, TypeError) as exc:
print("{:>20s} Error: {}".format(command_i_title, str(exc)))
if __name__ == "__main__":
main()