
Padim主要是通过CNN网络在一系列正常样本生成特征向量,计算特征向量的多个方差高斯矩阵,获取正常样本的特征数据分布,然后对输入的样本图像,计算它的特征向量与训练生成的特征数据分布之间的马氏距离。从而实现异常检测与定位。

Padim模型训练与导出ONNX格式或者OpenVINO格式支持,请看下面这篇文章。
TensorRT推理步骤
TensorRT相比之前版本C++ SDK更加的简洁与易用,同时支持动态修改输入维度参数。
加载模型与创建执行引擎
this->runtime = createInferRuntime(gLogger);
assert(this->runtime != nullptr);
this->engine = this->runtime->deserializeCudaEngine(trtModelStream, size);
assert(this->engine != nullptr);
this->context = engine->createExecutionContext();
assert(this->context != nullptr);
delete[] trtModelStream;图像预处理与推理
cv::Mat blob = cv::dnn::blobFromImage(image, 1 / 255.0, cv::Size(this->input_w, this->input_h), cv::Scalar(0, 0, 0), true, false);
cudaMemcpyAsync(buffers[0], blob.ptr<float>(), 3 * this->input_h * this->input_w * sizeof(float), cudaMemcpyHostToDevice, stream);
// 推理
context->executeV2(buffers);获取推理输入与输出数据的维度
// 获取输入维度信息
this->input_h = inputDims.d[2];
this->input_w = inputDims.d[3];
printf("inputH : %d, inputW: %d \n", this->input_h, this->input_w);
// 获取输出维度信息
this->output_h = outDims3.d[2];
this->output_w = outDims3.d[3];
std::cout << "out data format: " << this->output_h << "x" << this->output_w << std::endl;代码演示
针对PatchCore、Padim、EfficientAD等异常检测模型,我实现了一个类封装,只要几行代码即可实现异常缺陷检测模型部署,调用代码如下:
std::shared_ptr<AnomalyDetector> detector(new AnomalyDetector());
detector->initConfig("D:/TensorRT-10.8/bin//model.engine", 256, 256, 0.5);
cv::Mat image = cv::imread("D:/python/yolov5-7.0/breaksmall.png");
detector->detect(image);
//cv::imshow("输入图像", image);
cv::waitKey(0);
cv::destroyAllWindows();运行结果如下:

学习TensorRT10
深度学习模型部署开发