Skip to content

Commit fb754b4

Browse files
authored
Merge branch 'openvinotoolkit:master' into master
2 parents 10e4f1e + 86a76a4 commit fb754b4

File tree

132 files changed

+1758
-1205
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

132 files changed

+1758
-1205
lines changed

CONTRIBUTING.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Frameworks supported by the Open Model Zoo:
66
* Caffe\*
77
* TensorFlow\*
88
* PyTorch\* (via conversion to ONNX\*)
9+
* PaddlePaddle\*
910
* MXNet\*
1011

1112
Open Model Zoo also supports models already in the ONNX format.

ci/dependencies.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
1-
openvino_linux: '2021.4.752'
2-
openvino_windows: '2021.4.752'
1+
openvino_linux: '2022.1.0.518'
2+
openvino_windows: '2022.1.0.518'
3+
wheel_linux: '2022.1.0.dev20220117-6152'
4+
wheel_windows: '2022.1.0.dev20220117-6152'

ci/requirements-conversion.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ absl-py==0.13.0
44
# via
55
# tensorboard
66
# tensorflow
7+
astor==0.8.1
8+
# via paddlepaddle
79
astunparse==1.6.3
810
# via tensorflow
911
cachetools==4.2.2
@@ -85,6 +87,9 @@ onnx==1.10.1
8587
# -r tools/model_tools/requirements-pytorch.in
8688
opt-einsum==3.3.0
8789
# via tensorflow
90+
paddlepaddle==2.1.3
91+
# via
92+
# -r tools/model_tools/requirements-paddle.in
8893
pillow==8.3.2
8994
# via torchvision
9095
protobuf==3.17.3

ci/update-requirements.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ def pc(target, *sources):
8787
pc('ci/requirements-check-basics.txt',
8888
'ci/requirements-check-basics.in', 'ci/requirements-documentation.in')
8989
pc('ci/requirements-conversion.txt',
90-
*(f'tools/model_tools/requirements-{suffix}.in' for suffix in ['pytorch', 'tensorflow']),
90+
*(f'tools/model_tools/requirements-{suffix}.in' for suffix in ['paddle', 'pytorch', 'tensorflow']),
9191
*(openvino_dir / f'deployment_tools/model_optimizer/requirements_{suffix}.txt'
9292
for suffix in ['caffe', 'mxnet', 'onnx', 'tf2']))
9393
pc('ci/requirements-demos.txt',

demos/action_recognition_demo/python/README.md

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ usage: action_recognition_demo.py [-h] -i INPUT [--loop] [-o OUTPUT]
7575
[-limit OUTPUT_LIMIT] -at
7676
{en-de,en-mean,i3d-rgb} -m_en M_ENCODER
7777
[-m_de M_DECODER | --seq DECODER_SEQ_SIZE]
78-
[-l CPU_EXTENSION] [-d DEVICE] [-lb LABELS]
78+
[-d DEVICE] [-lb LABELS]
7979
[--no_show] [-s LABEL_SMOOTHING]
8080
[-u UTILIZATION_MONITORS]
8181
[-r RAW_OUTPUT_MESSAGE]
@@ -101,9 +101,6 @@ Options:
101101
--seq DECODER_SEQ_SIZE
102102
Optional. Length of sequence that decoder takes as
103103
input.
104-
-l CPU_EXTENSION, --cpu_extension CPU_EXTENSION
105-
Optional. For CPU custom layers, if any. Absolute path
106-
to a shared library with the kernels implementation.
107104
-d DEVICE, --device DEVICE
108105
Optional. Specify a target device to infer on. CPU,
109106
GPU, HDDL or MYRIAD is acceptable. The demo will

demos/action_recognition_demo/python/action_recognition_demo.py

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
from argparse import ArgumentParser, SUPPRESS
2121
from os import path
2222

23-
from openvino.inference_engine import IECore, get_version
23+
from openvino.runtime import Core, get_version
2424

2525
from action_recognition_demo.models import IEModel, DummyDecoder
2626
from action_recognition_demo.result_renderer import ResultRenderer
@@ -57,9 +57,6 @@ def build_argparser():
5757
decoder_args.add_argument('--seq', dest='decoder_seq_size',
5858
help='Optional. Length of sequence that decoder takes as input.',
5959
default=16, type=int)
60-
args.add_argument('-l', '--cpu_extension',
61-
help='Optional. For CPU custom layers, if any. Absolute path to a shared library with the '
62-
'kernels implementation.', type=str, default=None)
6360
args.add_argument('-d', '--device',
6461
help='Optional. Specify a target device to infer on. CPU, GPU, HDDL or MYRIAD is '
6562
'acceptable. The demo will look for a suitable plugin for the device specified. '
@@ -88,34 +85,31 @@ def main():
8885

8986
log.info('OpenVINO Inference Engine')
9087
log.info('\tbuild: {}'.format(get_version()))
91-
ie = IECore()
88+
core = Core()
9289

9390
if 'MYRIAD' in args.device:
9491
myriad_config = {'VPU_HW_STAGES_OPTIMIZATION': 'YES'}
95-
ie.set_config(myriad_config, 'MYRIAD')
96-
97-
if args.cpu_extension and 'CPU' in args.device:
98-
ie.add_extension(args.cpu_extension, 'CPU')
92+
core.set_config(myriad_config, 'MYRIAD')
9993

10094
decoder_target_device = 'CPU'
10195
if args.device != 'CPU':
10296
encoder_target_device = args.device
10397
else:
10498
encoder_target_device = decoder_target_device
10599

106-
models = [IEModel(args.m_encoder, ie, encoder_target_device, model_type='Action Recognition Encoder',
100+
models = [IEModel(args.m_encoder, core, encoder_target_device, model_type='Action Recognition Encoder',
107101
num_requests=(3 if args.device == 'MYRIAD' else 1))]
108102

109103
if args.architecture_type == 'en-de':
110104
if args.m_decoder is None:
111105
raise RuntimeError('No decoder for encoder-decoder model type (-m_de) provided')
112-
models.append(IEModel(args.m_decoder, ie, decoder_target_device, model_type='Action Recognition Decoder', num_requests=2))
113-
seq_size = models[1].input_size[1]
106+
models.append(IEModel(args.m_decoder, core, decoder_target_device, model_type='Action Recognition Decoder', num_requests=2))
107+
seq_size = models[1].input_shape[1]
114108
elif args.architecture_type == 'en-mean':
115109
models.append(DummyDecoder(num_requests=2))
116110
seq_size = args.decoder_seq_size
117111
elif args.architecture_type == 'i3d-rgb':
118-
seq_size = models[0].input_size[2]
112+
seq_size = models[0].input_shape[1]
119113

120114
presenter = monitors.Presenter(args.utilization_monitors, 70)
121115
result_presenter = ResultRenderer(no_show=args.no_show, presenter=presenter, output=args.output, limit=args.output_limit, labels=labels,

demos/action_recognition_demo/python/action_recognition_demo/models.py

Lines changed: 26 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
from collections import deque
1818
from itertools import cycle
19+
import sys
1920

2021
import logging as log
2122
import cv2
@@ -42,19 +43,20 @@ def adaptive_resize(frame, dst_size):
4243
return frame
4344
return cv2.resize(frame, (ow, oh))
4445

45-
def preprocess_frame(frame, size=224, crop_size=224):
46+
47+
def preprocess_frame(frame, size=224, crop_size=224, chw_layout=True):
4648
frame = adaptive_resize(frame, size)
4749
frame = center_crop(frame, (crop_size, crop_size))
48-
frame = frame.transpose((2, 0, 1)) # HWC -> CHW
50+
if chw_layout:
51+
frame = frame.transpose((2, 0, 1)) # HWC -> CHW
4952

5053
return frame
5154

5255

5356
class AsyncWrapper:
5457
def __init__(self, ie_model, num_requests):
55-
self.net = ie_model
58+
self.model = ie_model
5659
self.num_requests = num_requests
57-
5860
self._result_ready = False
5961
self._req_ids = cycle(range(num_requests))
6062
self._result_ids = cycle(range(num_requests))
@@ -63,7 +65,7 @@ def __init__(self, ie_model, num_requests):
6365
def infer(self, model_input, frame=None):
6466
"""Schedule current model input to infer, return last result"""
6567
next_req_id = next(self._req_ids)
66-
self.net.async_infer(model_input, next_req_id)
68+
self.model.async_infer(model_input, next_req_id)
6769

6870
last_frame = self._frames[0] if self._frames else frame
6971

@@ -73,41 +75,39 @@ def infer(self, model_input, frame=None):
7375

7476
if self._result_ready:
7577
result_req_id = next(self._result_ids)
76-
result = self.net.wait_request(result_req_id)
78+
result = self.model.wait_request(result_req_id)
7779
return result, last_frame
7880
else:
7981
return None, None
8082

8183

8284
class IEModel:
83-
def __init__(self, model_path, ie_core, target_device, num_requests, model_type, batch_size=1):
85+
def __init__(self, model_path, core, target_device, num_requests, model_type):
8486
log.info('Reading {} model {}'.format(model_type, model_path))
85-
self.net = ie_core.read_network(model_path)
86-
self.net.batch_size = batch_size
87-
assert len(self.net.input_info) == 1, "One input is expected"
88-
assert len(self.net.outputs) == 1, "One output is expected"
89-
90-
self.exec_net = ie_core.load_network(network=self.net, device_name=target_device, num_requests=num_requests)
91-
self.input_name = next(iter(self.net.input_info))
92-
self.output_name = next(iter(self.net.outputs))
93-
self.input_size = self.net.input_info[self.input_name].input_data.shape
94-
self.output_size = self.exec_net.requests[0].output_blobs[self.output_name].buffer.shape
87+
self.model = core.read_model(model_path)
88+
if len(self.model.inputs) != 1:
89+
log.error("Demo supports only models with 1 input")
90+
sys.exit(1)
91+
92+
if len(self.model.outputs) != 1:
93+
log.error("Demo supports only models with 1 output")
94+
sys.exit(1)
95+
96+
self.compiled_model = core.compile_model(self.model, target_device)
97+
self.input_name = self.model.inputs[0].get_any_name()
98+
self.input_shape = self.model.inputs[0].shape
99+
95100
self.num_requests = num_requests
101+
self.infer_requests = [self.compiled_model.create_infer_request() for _ in range(self.num_requests)]
96102
log.info('The {} model {} is loaded to {}'.format(model_type, model_path, target_device))
97103

98-
def infer(self, frame):
99-
input_data = {self.input_name: frame}
100-
infer_result = self.exec_net.infer(input_data)
101-
return infer_result[self.output_name]
102-
103104
def async_infer(self, frame, req_id):
104105
input_data = {self.input_name: frame}
105-
self.exec_net.start_async(request_id=req_id, inputs=input_data)
106-
pass
106+
self.infer_requests[req_id].start_async(inputs=input_data)
107107

108108
def wait_request(self, req_id):
109-
self.exec_net.requests[req_id].wait()
110-
return self.exec_net.requests[req_id].output_blobs[self.output_name].buffer
109+
self.infer_requests[req_id].wait()
110+
return next(iter(self.infer_requests[req_id].results.values()))
111111

112112

113113
class DummyDecoder:
@@ -122,21 +122,6 @@ def _average(model_input):
122122
def async_infer(self, model_input, req_id):
123123
self.requests[req_id] = self._average(model_input)
124124

125-
def infer(self, model_input):
126-
return self._average(model_input)
127-
128125
def wait_request(self, req_id):
129126
assert req_id in self.requests
130127
return self.requests.pop(req_id)
131-
132-
133-
class ActionRecognitionSequential:
134-
def __init__(self, encoder, decoder=None):
135-
self.encoder = encoder
136-
self.decoder = decoder
137-
138-
def infer(self, input):
139-
if self.decoder is not None:
140-
embeddigns = self.encoder.infer(input[0])
141-
decoder_input = embeddigns.reshape(1, 16, 512)
142-
return self.decoder.infer(decoder_input)

demos/action_recognition_demo/python/action_recognition_demo/steps.py

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,13 @@ def run_pipeline(capture, model_type, model, render_fn, raw_output, seq_size=16,
4343
pipeline.print_statistics()
4444

4545

46-
class I3DRGBModelStep(PipelineStep):
46+
def softmax(x, axis=None):
47+
"""Normalizes logits to get confidence values along specified axis"""
48+
exp = np.exp(x)
49+
return exp / np.sum(exp, axis=axis)
50+
4751

52+
class I3DRGBModelStep(PipelineStep):
4853
def __init__(self, model, sequence_size, frame_size, crop_size):
4954
super().__init__()
5055
self.model = model
@@ -57,11 +62,10 @@ def __init__(self, model, sequence_size, frame_size, crop_size):
5762

5863
def process(self, frame):
5964
preprocessed = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
60-
preprocessed = preprocess_frame(preprocessed, self.size, self.crop_size)
65+
preprocessed = preprocess_frame(preprocessed, self.size, self.crop_size, chw_layout=False)
6166
self.input_seq.append(preprocessed)
6267
if len(self.input_seq) == self.sequence_size:
6368
input_blob = np.array(self.input_seq)
64-
input_blob = np.transpose(input_blob, (1, 0, 2, 3))
6569
input_blob = np.expand_dims(input_blob, axis=0)
6670
output, next_frame = self.async_model.infer(input_blob, frame)
6771

@@ -74,7 +78,6 @@ def process(self, frame):
7478

7579

7680
class DataStep(PipelineStep):
77-
7881
def __init__(self, capture):
7982
super().__init__()
8083
self.cap = capture
@@ -93,7 +96,6 @@ def end(self):
9396

9497

9598
class EncoderStep(PipelineStep):
96-
9799
def __init__(self, encoder):
98100
super().__init__()
99101
self.encoder = encoder
@@ -111,7 +113,6 @@ def process(self, frame):
111113

112114

113115
class DecoderStep(PipelineStep):
114-
115116
def __init__(self, decoder, sequence_size=16):
116117
super().__init__()
117118
assert sequence_size > 0
@@ -143,10 +144,6 @@ def process(self, item):
143144
return frame, None, timers
144145

145146

146-
def softmax(x, axis=None):
147-
"""Normalizes logits to get confidence values along specified axis"""
148-
exp = np.exp(x)
149-
return exp / np.sum(exp, axis=axis)
150147

151148

152149
class RenderStep(PipelineStep):

demos/colorization_demo/python/colorization_demo.py

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#!/usr/bin/env python3
22
"""
3-
Copyright (c) 2018-2020 Intel Corporation
3+
Copyright (c) 2018-2021 Intel Corporation
44
55
Licensed under the Apache License, Version 2.0 (the "License");
66
you may not use this file except in compliance with the License.
@@ -15,7 +15,7 @@
1515
limitations under the License.
1616
"""
1717

18-
from openvino.inference_engine import IECore, get_version
18+
from openvino.runtime import Core, get_version
1919
import cv2 as cv
2020
import numpy as np
2121
import logging as log
@@ -60,33 +60,28 @@ def build_arg():
6060
help="Optional. List of monitors to show initially.")
6161
return parser
6262

63-
64-
if __name__ == '__main__':
65-
args = build_arg().parse_args()
66-
63+
def main(args):
6764
cap = open_images_capture(args.input, args.loop)
6865

6966
log.info('OpenVINO Inference Engine')
7067
log.info('\tbuild: {}'.format(get_version()))
71-
ie = IECore()
68+
core = Core()
7269

7370
log.info('Reading model {}'.format(args.model))
74-
load_net = ie.read_network(args.model, args.model.with_suffix(".bin"))
75-
load_net.batch_size = 1
71+
model = core.read_model(args.model, args.model.with_suffix(".bin"))
7672

77-
input_blob = next(iter(load_net.input_info))
78-
input_shape = load_net.input_info[input_blob].input_data.shape
73+
input_tensor_name = 'data_l'
74+
input_shape = model.input(input_tensor_name).shape
7975
assert input_shape[1] == 1, "Expected model input shape with 1 channel"
8076

8177
inputs = {}
82-
for input_name in load_net.input_info:
83-
inputs[input_name] = np.zeros(load_net.input_info[input_name].input_data.shape)
78+
for input in model.inputs:
79+
inputs[input.get_any_name()] = np.zeros(input.shape)
8480

85-
assert len(load_net.outputs) == 1, "Expected number of outputs is equal 1"
86-
output_blob = next(iter(load_net.outputs))
87-
output_shape = load_net.outputs[output_blob].shape
81+
assert len(model.outputs) == 1, "Expected number of outputs is equal 1"
8882

89-
exec_net = ie.load_network(network=load_net, device_name=args.device)
83+
compiled_model = core.compile_model(model, device_name=args.device)
84+
infer_request = compiled_model.create_infer_request()
9085
log.info('The model {} is loaded to {}'.format(args.model, args.device))
9186

9287
_, _, h_in, w_in = input_shape
@@ -118,11 +113,12 @@ def build_arg():
118113
img_rgb = frame.astype(np.float32) / 255
119114
img_lab = cv.cvtColor(img_rgb, cv.COLOR_RGB2Lab)
120115
img_l_rs = cv.resize(img_lab.copy(), (w_in, h_in))[:, :, 0]
121-
inputs[input_blob] = img_l_rs
122116

123-
res = exec_net.infer(inputs=inputs)
117+
inputs[input_tensor_name] = np.expand_dims(img_l_rs, axis=[0, 1])
124118

125-
update_res = np.squeeze(res[output_blob])
119+
res = next(iter(infer_request.infer(inputs).values()))
120+
121+
update_res = np.squeeze(res)
126122

127123
out = update_res.transpose((1, 2, 0))
128124
out = cv.resize(out, (w_orig, h_orig))
@@ -166,3 +162,7 @@ def build_arg():
166162
metrics.log_total()
167163
for rep in presenter.reportMeans():
168164
log.info(rep)
165+
166+
if __name__ == "__main__":
167+
args = build_arg().parse_args()
168+
sys.exit(main(args) or 0)

0 commit comments

Comments
 (0)