Skip to content

Commit 55ac6a7

Browse files
authored
Add OpenVINO inference (ultralytics#6179)
1 parent 448dc44 commit 55ac6a7

File tree

4 files changed

+35
-20
lines changed

4 files changed

+35
-20
lines changed

detect.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
yolov5s.torchscript # TorchScript
1717
yolov5s.onnx # ONNX Runtime or OpenCV DNN with --dnn
1818
yolov5s.mlmodel # CoreML (under development)
19-
yolov5s_openvino_model # OpenVINO (under development)
19+
yolov5s.xml # OpenVINO
2020
yolov5s_saved_model # TensorFlow SavedModel
2121
yolov5s.pb # TensorFlow protobuf
2222
yolov5s.tflite # TensorFlow Lite

export.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,16 @@
2020
$ python path/to/export.py --weights yolov5s.pt --include torchscript onnx coreml openvino saved_model tflite tfjs
2121
2222
Inference:
23-
$ python path/to/detect.py --weights yolov5s.pt
24-
yolov5s.torchscript
25-
yolov5s.onnx
26-
yolov5s.mlmodel (under development)
27-
yolov5s_openvino_model (under development)
28-
yolov5s_saved_model
29-
yolov5s.pb
30-
yolov5s.tflite
31-
yolov5s_edgetpu.tflite
32-
yolov5s.engine
23+
$ python path/to/detect.py --weights yolov5s.pt # PyTorch
24+
yolov5s.torchscript # TorchScript
25+
yolov5s.onnx # ONNX Runtime or OpenCV DNN with --dnn
26+
yolov5s.mlmodel # CoreML (under development)
27+
yolov5s.xml # OpenVINO
28+
yolov5s_saved_model # TensorFlow SavedModel
29+
yolov5s.pb # TensorFlow protobuf
30+
yolov5s.tflite # TensorFlow Lite
31+
yolov5s_edgetpu.tflite # TensorFlow Edge TPU
32+
yolov5s.engine # TensorRT
3333
3434
TensorFlow.js:
3535
$ cd .. && git clone https://github.com/zldrobit/tfjs-yolov5-example.git && cd tfjs-yolov5-example

models/common.py

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,7 @@ def __init__(self, weights='yolov5s.pt', device=None, dnn=False, data=None):
282282
# PyTorch: weights = *.pt
283283
# TorchScript: *.torchscript
284284
# CoreML: *.mlmodel
285+
# OpenVINO: *.xml
285286
# TensorFlow: *_saved_model
286287
# TensorFlow: *.pb
287288
# TensorFlow Lite: *.tflite
@@ -294,31 +295,38 @@ def __init__(self, weights='yolov5s.pt', device=None, dnn=False, data=None):
294295
super().__init__()
295296
w = str(weights[0] if isinstance(weights, list) else weights)
296297
suffix = Path(w).suffix.lower()
297-
suffixes = ['.pt', '.torchscript', '.onnx', '.engine', '.tflite', '.pb', '', '.mlmodel']
298+
suffixes = ['.pt', '.torchscript', '.onnx', '.engine', '.tflite', '.pb', '', '.mlmodel', '.xml']
298299
check_suffix(w, suffixes) # check weights have acceptable suffix
299-
pt, jit, onnx, engine, tflite, pb, saved_model, coreml = (suffix == x for x in suffixes) # backend booleans
300+
pt, jit, onnx, engine, tflite, pb, saved_model, coreml, xml = (suffix == x for x in suffixes) # backends
300301
stride, names = 64, [f'class{i}' for i in range(1000)] # assign defaults
301302
w = attempt_download(w) # download if not local
302303
if data: # data.yaml path (optional)
303304
with open(data, errors='ignore') as f:
304305
names = yaml.safe_load(f)['names'] # class names
305306

306-
if jit: # TorchScript
307+
if pt: # PyTorch
308+
model = attempt_load(weights if isinstance(weights, list) else w, map_location=device)
309+
stride = int(model.stride.max()) # model stride
310+
names = model.module.names if hasattr(model, 'module') else model.names # get class names
311+
self.model = model # explicitly assign for to(), cpu(), cuda(), half()
312+
elif jit: # TorchScript
307313
LOGGER.info(f'Loading {w} for TorchScript inference...')
308314
extra_files = {'config.txt': ''} # model metadata
309315
model = torch.jit.load(w, _extra_files=extra_files)
310316
if extra_files['config.txt']:
311317
d = json.loads(extra_files['config.txt']) # extra_files dict
312318
stride, names = int(d['stride']), d['names']
313-
elif pt: # PyTorch
314-
model = attempt_load(weights if isinstance(weights, list) else w, map_location=device)
315-
stride = int(model.stride.max()) # model stride
316-
names = model.module.names if hasattr(model, 'module') else model.names # get class names
317-
self.model = model # explicitly assign for to(), cpu(), cuda(), half()
318319
elif coreml: # CoreML
319320
LOGGER.info(f'Loading {w} for CoreML inference...')
320321
import coremltools as ct
321322
model = ct.models.MLModel(w)
323+
elif xml: # OpenVINO
324+
LOGGER.info(f'Loading {w} for OpenVINO inference...')
325+
check_requirements(('openvino-dev',)) # requires openvino-dev: https://pypi.org/project/openvino-dev/
326+
import openvino.inference_engine as ie
327+
core = ie.IECore()
328+
network = core.read_network(model=w, weights=Path(w).with_suffix('.bin')) # *.xml, *.bin paths
329+
executable_network = core.load_network(network, device_name='CPU', num_requests=1)
322330
elif dnn: # ONNX OpenCV DNN
323331
LOGGER.info(f'Loading {w} for ONNX OpenCV DNN inference...')
324332
check_requirements(('opencv-python>=4.5.4',))
@@ -403,6 +411,13 @@ def forward(self, im, augment=False, visualize=False, val=False):
403411
y = self.net.forward()
404412
else: # ONNX Runtime
405413
y = self.session.run([self.session.get_outputs()[0].name], {self.session.get_inputs()[0].name: im})[0]
414+
elif self.xml: # OpenVINO
415+
im = im.cpu().numpy() # FP32
416+
desc = self.ie.TensorDesc(precision='FP32', dims=im.shape, layout='NCHW') # Tensor Description
417+
request = self.executable_network.requests[0] # inference request
418+
request.set_blob(blob_name='images', blob=self.ie.Blob(desc, im)) # name=next(iter(request.input_blobs))
419+
request.infer()
420+
y = request.output_blobs['output'].buffer # name=next(iter(request.output_blobs))
406421
elif self.engine: # TensorRT
407422
assert im.shape == self.bindings['images'].shape, (im.shape, self.bindings['images'].shape)
408423
self.binding_addrs['images'] = int(im.data_ptr())

val.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
yolov5s.torchscript # TorchScript
1111
yolov5s.onnx # ONNX Runtime or OpenCV DNN with --dnn
1212
yolov5s.mlmodel # CoreML (under development)
13-
yolov5s_openvino_model # OpenVINO (under development)
13+
yolov5s.xml # OpenVINO
1414
yolov5s_saved_model # TensorFlow SavedModel
1515
yolov5s.pb # TensorFlow protobuf
1616
yolov5s.tflite # TensorFlow Lite

0 commit comments

Comments
 (0)