openvino como um excelente motor de inferência de CPU
Use a versão python api aqui
Você precisa compilar e instalar o openvino antes de usar
https://docs.openvinotoolkit.org/latest/openvino_docs_get_started_get_started_windows.html
Após a instalação, instale diretamente o openvino para instalar a versão python do openvino
Na verdade, a versão python da api também é chamada openvino compilado por c ++, é por isso que você usa a versão python, você também precisa compilar e instalar openvino
Você pode usá-lo a seguir. Você precisa transferir o arquivo de modelo openvino antes de usá-lo. Claro, você não precisa transferi-lo. Openvino suporta leitura onnx
python /opt/intel/openvino_2021/deployment_tools/model_optimizer/mo.py --input_model ctdet_coco_dlav0_512.onnx --output_dir ./ctdet_coco_dlav0_512 --data_type FP16
O modelo onnx é daqui https://download.01.org/opencv/public_models/122019/ctdet_coco_dlav0/
Agora você pode realizar a inferência, primeiro use o arquivo onnx para inferir diretamente
from openvino.inference_engine import IECore
import numpy as np
import cv2
import time
ie = IECore()
model="ctdet_coco_dlav0_512.onnx"
#model="ctdet_coco_dlav0_512/ctdet_coco_dlav0_512.xml"
net = ie.read_network(model=model)
input_blob = next(iter(net.input_info))
out_blob = next(iter(net.outputs))
net.batch_size=16#batchsize
n, c, h, w = net.input_info[input_blob].input_data.shape
print(n, c, h, w)
images = np.ndarray(shape=(n, c, h, w))
for i in range(n):
image = cv2.imread("123.jpg")
if image.shape[:-1] != (h, w):
image = cv2.resize(image, (w, h))
image = image.transpose((2, 0, 1))
images[i] = image
exec_net = ie.load_network(network=net, device_name="CPU")
start=time.time()
res = exec_net.infer(inputs={input_blob: images})
#print(res)
print('infer total time is %.4f s'%(time.time()-start))
resultado da operação:
O tamanho do lote que definimos no código acima é 16, agora tente o resultado do tamanho do lote como 1, basta modificar net.batch_size = 1
Em seguida, use o arquivo transferido por onnx para inferência:
from openvino.inference_engine import IECore
import numpy as np
import cv2
import time
ie = IECore()
#model="ctdet_coco_dlav0_512.onnx"
model="ctdet_coco_dlav0_512/ctdet_coco_dlav0_512.xml"
net = ie.read_network(model=model)
input_blob = next(iter(net.input_info))
out_blob = next(iter(net.outputs))
net.batch_size=16#batchsize
n, c, h, w = net.input_info[input_blob].input_data.shape
print(n, c, h, w)
images = np.ndarray(shape=(n, c, h, w))
for i in range(n):
image = cv2.imread("123.jpg")
if image.shape[:-1] != (h, w):
image = cv2.resize(image, (w, h))
image = image.transpose((2, 0, 1))
images[i] = image
exec_net = ie.load_network(network=net, device_name="CPU")
start=time.time()
res = exec_net.infer(inputs={input_blob: images})
#print(res)
print('infer total time is %.4f s'%(time.time()-start))
resultado da operação
Da mesma forma, o resultado da operação de net.batch_size = 1:
Pode-se descobrir que o tempo de raciocínio usando onnx é basicamente o mesmo que o tempo de raciocínio convertido