Arcface TensorRT Demo

import tensorrt as trt
import pycuda.driver as cuda
import pycuda.autoinit
import numpy as np
import cv2

def get_engine(engine_path):
    # If a serialized engine exists, use it instead of building an engine.
    print("Reading engine from file {}".format(engine_path))
    with open(engine_path, "rb") as f, trt.Runtime(TRT_LOGGER) as runtime:
        return runtime.deserialize_cuda_engine(f.read())

TRT_LOGGER = trt.Logger()
# engine = get_engine("yolov4_1.trt")

def compute_sim(emb1, emb2):
    from numpy.linalg import norm
    emb1 = emb1.flatten()
    emb2 = emb2.flatten()
    sim = np.dot(emb1, emb2)/(norm(emb1)*norm(emb2))
    return sim


# engine = get_engine("mobilefacenet-res2-6-10-2-dim512/onnx/face_reg_mnet.engine")
# print(engine)
# for binding in engine:
#         size = trt.volume(engine.get_binding_shape(binding)) * 1
#         dims = engine.get_binding_shape(binding)
#         print(size)
#         print(dims)
#         print(binding)
#         print(engine.binding_is_input(binding))
#         dtype = trt.nptype(engine.get_binding_dtype(binding))
#         print("dtype = ", dtype)



engine = get_engine("mobilefacenet-res2-6-10-2-dim512/onnx/face_reg_mnet.engine")
context = engine.create_execution_context()

def get_embedding(img):
    resized = cv2.resize(img, (112, 112), interpolation=cv2.INTER_LINEAR)
    img_in = cv2.cvtColor(resized, cv2.COLOR_BGR2RGB)
    img_in = np.transpose(img_in, (2, 0, 1)).astype(np.float32)
    img_in = np.expand_dims(img_in, axis=0)
    # img_in /= 255.0
    img_in = np.ascontiguousarray(img_in)
    print("Shape of the network input: ", img_in.shape)
    # print(img_in)

    # with get_engine("mobilefacenet-res2-6-10-2-dim512/onnx/face_reg_mnet.engine") as engine, engine.create_execution_context() as context:
    h_input = cuda.pagelocked_empty(trt.volume(context.get_binding_shape(0)), dtype=np.float32)
    h_output = cuda.pagelocked_empty(trt.volume(context.get_binding_shape(1)), dtype=np.float32)

    # Allocate device memory for inputs and outputs.
    d_input = cuda.mem_alloc(h_input.nbytes)
    d_output = cuda.mem_alloc(h_output.nbytes)
    # Create a stream in which to copy inputs/outputs and run inference.
    stream = cuda.Stream()

    # set the host input data
    h_input = img_in

    # print(h_input)
    # Transfer input data to the GPU.
    cuda.memcpy_htod_async(d_input, h_input, stream)
    # Run inference.
    context.execute_async_v2(bindings=[int(d_input), int(d_output)], stream_handle=stream.handle)
    # Transfer predictions back from the GPU.
    cuda.memcpy_dtoh_async(h_output, d_output, stream)
    # Synchronize the stream
    stream.synchronize()
    # Return the host output. 

    # print(h_output)
    return h_output

img1 = cv2.imread("./s_117.jpg")
emb1 = get_embedding(img1)

img2 = cv2.imread("./s_115.jpg")
emb2 = get_embedding(img2)

print(compute_sim(emb1, emb2))

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的TensorRT C++ demo,该demo使用TensorRT推理引擎对MNIST数字进行分类: ```c++ #include <iostream> #include <cmath> #include <fstream> #include <sstream> #include "NvInfer.h" #include "NvInferPlugin.h" #include "NvOnnxParser.h" using namespace nvinfer1; using namespace plugin; int main(int argc, char** argv) { // Load the ONNX model std::string onnx_model_file = "mnist.onnx"; IBuilder* builder = createInferBuilder(gLogger); INetworkDefinition* network = builder->createNetwork(); auto parser = nvonnxparser::createParser(*network, gLogger); parser->parseFromFile(onnx_model_file.c_str(), -1); builder->setMaxBatchSize(1); builder->setMaxWorkspaceSize(1 << 30); // Set the input and output dimensions Dims input_dims = network->getInput(0)->getDimensions(); input_dims.d[0] = 1; // Set batch size to 1 network->getInput(0)->setDimensions(input_dims); network->getOutput(0)->setDimensions(Dims4(1, 10, 1, 1)); // Build the engine ICudaEngine* engine = builder->buildCudaEngine(*network); // Create execution context IExecutionContext* context = engine->createExecutionContext(); // Create input and output buffers void* input_buffer; void* output_buffer; cudaMalloc(&input_buffer, input_dims.numel() * sizeof(float)); cudaMalloc(&output_buffer, 10 * sizeof(float)); // Load the input data float input_data[28 * 28]; std::ifstream input_file("test_input.txt"); std::string line; int i = 0; while (getline(input_file, line)) { std::stringstream ss(line); ss >> input_data[i++]; } // Copy the input data to GPU cudaMemcpy(input_buffer, input_data, input_dims.numel() * sizeof(float), cudaMemcpyHostToDevice); // Run inference context->execute(1, &input_buffer, &output_buffer); // Copy the output back to CPU float output_data[10]; cudaMemcpy(output_data, output_buffer, 10 * sizeof(float), cudaMemcpyDeviceToHost); // Print the output std::cout << "Output: "; for (int i = 0; i < 10; i++) { std::cout << output_data[i] << " "; } std::cout << std::endl; // Clean up cudaFree(input_buffer); cudaFree(output_buffer); context->destroy(); engine->destroy(); network->destroy(); builder->destroy(); parser->destroy(); return 0; } ``` 这个demo将一个MNIST手写数字的28x28像素图像作为输入,输出一个包含10个元素的向量,其中每个元素代表一个数字的概率。在执行这个demo之前,需要先将ONNX模型转换为TensorRT格式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值