Skip to content
This repository was archived by the owner on Jul 1, 2024. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 47 additions & 40 deletions examples/classification_sample.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
import tensorflow as tf
import openvino_tensorflow as ovtf
import time
from subprocess import check_output, call
import cv2


def load_graph(model_file):
Expand All @@ -47,37 +47,24 @@ def load_graph(model_file):
return graph


def read_tensor_from_image_file(file_name,
def read_tensor_from_image_file(image_file,
input_height=299,
input_width=299,
input_mean=0,
input_std=255):
input_name = "file_reader"
output_name = "normalized"
file_reader = tf.io.read_file(file_name, input_name)
if file_name.endswith(".png"):
image_reader = tf.image.decode_png(
file_reader, channels=3, name="png_reader")
elif file_name.endswith(".gif"):
image_reader = tf.squeeze(
tf.image.decode_gif(file_reader, name="gif_reader"))
elif file_name.endswith(".bmp"):
image_reader = tf.image.decode_bmp(file_reader, name="bmp_reader")
else:
image_reader = tf.image.decode_jpeg(
file_reader, channels=3, name="jpeg_reader")
float_caster = tf.cast(image_reader, tf.float32)
dims_expander = tf.expand_dims(float_caster, 0)
resized = tf.compat.v1.image.resize_bilinear(dims_expander,
[input_height, input_width])
normalized = tf.divide(tf.subtract(resized, [input_mean]), [input_std])
result = normalized.eval()

assert os.path.exists(image_file), "Could not find image file path"
image = cv2.imread(image_file)
resized = cv2.resize(image, (input_height, input_width))
img = cv2.cvtColor(resized, cv2.COLOR_BGR2RGB)
resized_image = img.astype(np.float32)
normalized_image = (resized_image - input_mean) / input_std
result = np.expand_dims(normalized_image, 0)
return result


def load_labels(label_file):
label = []
assert os.path.exists(label_file), "Could not find label file path"
proto_as_ascii_lines = tf.io.gfile.GFile(label_file).readlines()
for l in proto_as_ascii_lines:
label.append(l.rstrip())
Expand All @@ -97,16 +84,33 @@ def load_labels(label_file):
backend_name = "CPU"

parser = argparse.ArgumentParser()
parser.add_argument("--graph", help="graph/model to be executed")
parser.add_argument("--input_layer", help="name of input layer")
parser.add_argument("--output_layer", help="name of output layer")
parser.add_argument("--labels", help="name of file containing labels")
parser.add_argument("--image", help="image to be processed")
parser.add_argument("--input_height", type=int, help="input height")
parser.add_argument("--input_width", type=int, help="input width")
parser.add_argument("--input_mean", type=int, help="input mean")
parser.add_argument("--input_std", type=int, help="input std")
parser.add_argument("--backend", help="backend option. Default is CPU")
parser.add_argument(
"--graph", help="Optional. Path to graph/model to be executed.")
parser.add_argument("--input_layer", help="Optional. Name of input layer.")
parser.add_argument(
"--output_layer", help="Optional. Name of output layer.")
parser.add_argument(
"--labels", help="Optional. Path to labels mapping file.")
parser.add_argument(
"--image", help="Optional. Input image to be processed. ")
parser.add_argument(
"--input_height",
type=int,
help="Optional. Specify input height value. ")
parser.add_argument(
"--input_width", type=int, help="Optional. Specify input width value.")
parser.add_argument(
"--input_mean", type=int, help="Optioanl. Specify input mean value.")
parser.add_argument(
"--input_std", type=int, help="Optional. Specify input std value.")
parser.add_argument(
"--backend",
help="Optional. Specify the target device to infer on;"
"CPU, GPU, MYRIAD, or VAD-M is acceptable. Default value is CPU.")
parser.add_argument(
"--disable_ovtf",
help="Optional. Disable openvino_tensorflow pass and run on stock TF.",
action='store_true')
args = parser.parse_args()

if args.graph:
Expand Down Expand Up @@ -143,12 +147,15 @@ def load_labels(label_file):
input_operation = graph.get_operation_by_name(input_name)
output_operation = graph.get_operation_by_name(output_name)

#Print list of available backends
print('Available Backends:')
backends_list = ovtf.list_backends()
for backend in backends_list:
print(backend)
ovtf.set_backend(backend_name)
if not args.disable_ovtf:
#Print list of available backends
print('Available Backends:')
backends_list = ovtf.list_backends()
for backend in backends_list:
print(backend)
ovtf.set_backend(backend_name)
else:
ovtf.disable()

# Initialize session and run
config = tf.compat.v1.ConfigProto()
Expand All @@ -169,7 +176,7 @@ def load_labels(label_file):
results = sess.run(output_operation.outputs[0],
{input_operation.outputs[0]: t})
elapsed = time.time() - start
print('Inference time in ms: %f' % (elapsed * 1000))
print('Inference time in ms: %.2f' % (elapsed * 1000))
results = np.squeeze(results)

# print labels
Expand Down
84 changes: 53 additions & 31 deletions examples/classification_sample_video.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,13 +51,11 @@ def read_tensor_from_image_file(frame,
input_width=299,
input_mean=0,
input_std=255):
frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
float_caster = tf.cast(frame, tf.float32)
dims_expander = tf.expand_dims(float_caster, 0)
resized = tf.compat.v1.image.resize_bilinear(dims_expander,
[input_height, input_width])
normalized = tf.divide(tf.subtract(resized, [input_mean]), [input_std])
result = normalized.eval()
resized = cv2.resize(frame, (input_height, input_width))
img = cv2.cvtColor(resized, cv2.COLOR_BGR2RGB)
resized_image = img.astype(np.float32)
normalized_image = (resized_image - input_mean) / input_std
result = np.expand_dims(normalized_image, 0)
return result


Expand Down Expand Up @@ -88,19 +86,35 @@ def load_labels(label_file):
font_thickness = 2

parser = argparse.ArgumentParser()
parser.add_argument("--graph", help="graph/model to be executed")
parser.add_argument("--input_layer", help="name of input layer")
parser.add_argument("--output_layer", help="name of output layer")
parser.add_argument("--labels", help="name of file containing labels")
parser.add_argument(
"--input",
help="input (0 - for camera / absolute video file path) to be processed"
)
parser.add_argument("--input_height", type=int, help="input height")
parser.add_argument("--input_width", type=int, help="input width")
parser.add_argument("--input_mean", type=int, help="input mean")
parser.add_argument("--input_std", type=int, help="input std")
parser.add_argument("--backend", help="backend option. Default is CPU")
"--graph", help="Optional. Path to graph/model to be executed.")
parser.add_argument("--input_layer", help="Optional. Name of input layer.")
parser.add_argument(
"--output_layer", help="Optional. Name of output layer.")
parser.add_argument(
"--labels", help="Optional. Path to labels mapping file.")
parser.add_argument(
"--input", help="Optional. An input video file to process.")
parser.add_argument(
"--input_height",
type=int,
help="Optional. Specify input height value.")
parser.add_argument(
"--input_width", type=int, help="Optional. Specify input width value.")
parser.add_argument(
"--input_mean", type=int, help="Optional. Specify input mean value.")
parser.add_argument(
"--input_std", type=int, help="Optional. Specify input std value.")
parser.add_argument(
"--backend",
help="Optional. Specify the target device to infer on; "
"CPU, GPU, MYRIAD or VAD-M is acceptable. Default value is CPU.")
parser.add_argument(
"--no_show", help="Optional. Don't show output.", action='store_true')
parser.add_argument(
"--disable_ovtf",
help="Optional. Disable openvino_tensorflow pass and run on stock TF.",
action='store_true')
args = parser.parse_args()

if args.graph:
Expand Down Expand Up @@ -137,17 +151,22 @@ def load_labels(label_file):
input_operation = graph.get_operation_by_name(input_name)
output_operation = graph.get_operation_by_name(output_name)

#Print list of available backends
print('Available Backends:')
backends_list = ovtf.list_backends()
for backend in backends_list:
print(backend)
ovtf.set_backend(backend_name)
if not args.disable_ovtf:
#Print list of available backends
print('Available Backends:')
backends_list = ovtf.list_backends()
for backend in backends_list:
print(backend)
ovtf.set_backend(backend_name)
else:
ovtf.disable()

#Load the labels
if label_file:
labels = load_labels(label_file)

# Read input video file
assert os.path.exists(input_file), "Could not find input video file path"
cap = cv2.VideoCapture(input_file)

# Initialize session and run
Expand All @@ -156,20 +175,21 @@ def load_labels(label_file):
while cap.isOpened():
ret, frame = cap.read()
if ret is True:
# preprocessing
t = read_tensor_from_image_file(
frame,
input_height=input_height,
input_width=input_width,
input_mean=input_mean,
input_std=input_std)

# Run
# run
start = time.time()
results = sess.run(output_operation.outputs[0],
{input_operation.outputs[0]: t})
elapsed = time.time() - start
fps = 1 / elapsed
print('Inference time in ms: %f' % (elapsed * 1000))
print('Inference time in ms: %.2f' % (elapsed * 1000))
results = np.squeeze(results)

# print labels
Expand All @@ -194,10 +214,12 @@ def load_labels(label_file):
print(
"No label file provided. Cannot print classification results"
)
cv2.imshow("results", frame)
if cv2.waitKey(1) & 0XFF == ord('q'):
break
if not args.no_show:
cv2.imshow("results", frame)
if cv2.waitKey(1) & 0XFF == ord('q'):
break
else:
print("Completed")
break
sess.close()
cap.release()
cv2.destroyAllWindows()
73 changes: 48 additions & 25 deletions examples/object_detection_sample.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ def load_graph(model_file):

def letter_box_image(image_path, input_height, input_width,
fill_value) -> np.ndarray:
assert os.path.exists(image_path), "Could not find image path"
image = Image.open(image_path)
height_ratio = float(input_height) / image.size[1]
width_ratio = float(input_width) / image.size[0]
Expand All @@ -67,10 +68,10 @@ def letter_box_image(image_path, input_height, input_width,
return to_return, image


def load_coco_names(file_name):
def load_coco_names(label_file):
names = {}
assert os.path.exists(file_name), "path doesn't exist {0}".format(file_name)
with open(file_name) as f:
assert os.path.exists(label_file), "could not find label file path"
with open(label_file) as f:
for id, name in enumerate(f):
names[id] = name
return names
Expand Down Expand Up @@ -195,27 +196,46 @@ def non_max_suppression(predictions_with_boxes,
iou_threshold = 0.5

parser = argparse.ArgumentParser()
parser.add_argument("--graph", help="graph/model to be executed")
parser.add_argument("--input_layer", help="name of input layer")
parser.add_argument("--output_layer", help="name of output layer")
parser.add_argument("--labels", help="name of file containing labels")
parser.add_argument("--image", help="image to be processed")
parser.add_argument("--input_height", type=int, help="input height")
parser.add_argument("--input_width", type=int, help="input width")
parser.add_argument("--input_mean", type=int, help="input mean")
parser.add_argument("--input_std", type=int, help="input std")
parser.add_argument("--backend", help="name of backend. Default is CPU")
parser.add_argument(
"--graph", help="Optional. Path to graph/model to be executed.")
parser.add_argument("--input_layer", help="Optional. Name of input layer.")
parser.add_argument(
"--output_layer", help="Optional. Name of output layer.")
parser.add_argument(
"--labels", help="Optional. Path to labels mapping file.")
parser.add_argument(
"--image", help="Optional. Input image to be processed.")
parser.add_argument(
"--input_height",
type=int,
help="Optional. Specify input height value.")
parser.add_argument(
"--input_width", type=int, help="Optional. Specify input width value.")
parser.add_argument(
"--input_mean", type=int, help="Optional. Specify input mean value.")
parser.add_argument(
"--input_std", type=int, help="Optional. Specify input std value.")
parser.add_argument(
"--backend",
help="Optional. Specify the target device to infer on;"
"CPU, GPU, MYRIAD, or VAD-M is acceptable. Default value is CPU.")
parser.add_argument(
"--output_dir",
help="Directory that stores updated image."
" Default is directory from where this sample is launched.")
help="Optional. Directory that stores the output"
" image with bounding boxes. Default is directory from where this sample is launched."
)
parser.add_argument(
"--conf_threshold",
type=float,
help="confidence threshold. Default is 0.6")
help="Optional. Specify confidence threshold. Default is 0.6.")
parser.add_argument(
"--iou_threshold", type=float, help="iou threshold. Default is 0.5")

"--iou_threshold",
type=float,
help="Optional. Specify iou threshold. Default is 0.5.")
parser.add_argument(
"--disable_ovtf",
help="Optional. Disable openvino_tensorflow pass and run on stock TF",
action='store_true')
args = parser.parse_args()
if args.graph:
model_file = args.graph
Expand Down Expand Up @@ -265,12 +285,15 @@ def non_max_suppression(predictions_with_boxes,
input_operation = graph.get_operation_by_name(input_name)
output_operation = graph.get_operation_by_name(output_name)

#Print list of available backends
print('Available Backends:')
backends_list = ovtf.list_backends()
for backend in backends_list:
print(backend)
ovtf.set_backend(backend_name)
if not args.disable_ovtf:
#Print list of available backends
print('Available Backends:')
backends_list = ovtf.list_backends()
for backend in backends_list:
print(backend)
ovtf.set_backend(backend_name)
else:
ovtf.disable()

# Initialize session and run
config = tf.compat.v1.ConfigProto()
Expand All @@ -284,7 +307,7 @@ def non_max_suppression(predictions_with_boxes,
detected_boxes = sess.run(output_operation.outputs[0],
{input_operation.outputs[0]: [img_resized]})
elapsed = time.time() - start
print('Inference time in ms: %f' % (elapsed * 1000))
print('Inference time in ms: %.2f' % (elapsed * 1000))

# apply non max suppresion, draw boxes and save updated image
filtered_boxes = non_max_suppression(detected_boxes, conf_threshold,
Expand Down
Loading