我正在嘗試使用 opencv 使用 facenet512 進行人臉識別。我使用 tf2onnx 將模型轉換為 onnx 格式。我知道模型的輸入應該是這樣的影像:(160,160,3)。所以我嘗試使用此腳本執行此操作:
void convertDimention(cv::Mat input, cv::Mat &output)
{
vector<cv::Mat> channels(3);
cv::split(input, channels);
int size[3] = { 160, 160, 3 };
cv::Mat M(3, size, CV_32F, cv::Scalar(0));
for (int i = 0; i < size[0]; i ) {
for (int j = 0; j < size[1]; j ) {
for (int k = 0; k < size[2]; k ) {
M.at<float>(i,j,k) = channels[k].at<float>(i,j)/255;
}
}
}
M.copyTo(output);
}
將影像從 (160,160) 轉換為 (160,160,3) 后,我仍然收到此錯誤:
錯誤:(-215:Assertion failed) (int)_numAxes == inputs[0].size() in function 'getMemoryShapes'
完整代碼:
#include <iostream>
#include <opencv2/dnn.hpp>
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <vector>
using namespace std;
void convertDimention(cv::Mat input, cv::Mat &output)
{
vector<cv::Mat> channels(3);
cv::split(input, channels);
int size[3] = { 160, 160, 3 };
cv::Mat M(3, size, CV_32F, cv::Scalar(0));
for (int i = 0; i < size[0]; i ) {
for (int j = 0; j < size[1]; j ) {
for (int k = 0; k < size[2]; k ) {
M.at<float>(i,j,k) = channels[k].at<float>(i,j)/255;
}
}
}
M.copyTo(output);
}
int main()
{
cv::Mat input,input2, output;
input = cv::imread("image.png");
cv::resize(input,input, cv::Size(160,160));
convertDimention(input,input2);
cv::dnn::Net net = cv::dnn::readNetFromONNX("facenet512.onnx");
net.setPreferableBackend(cv::dnn::DNN_BACKEND_CUDA);
net.setPreferableTarget(cv::dnn::DNN_TARGET_CUDA);
cout << input.size << endl;
cout << input2.size << endl;
net.setInput(input2);
output = net.forward();
}
我知道我做錯了(因為我是新手)。有沒有其他方法可以更改尺寸以使其適合模型輸入?
提前致謝。
uj5u.com熱心網友回復:
使用 netron 我能夠可視化模型的輸入:
![錯誤:(-215:Assertion failed) (int)_numAxes == inputs[0].size() in function 'getMemoryShapes'](https://img.uj5u.com/2022/05/10/ea6a67dd860d42958f43202a7d985766.png)
問題的根源在于模型的轉換,我只需要改變它:
model_proto, _ = tf2onnx.convert.from_keras(model, output_path='facenet512.onnx')
對此:
nchw_inputs_list = [model.inputs[0].name] model_proto, _ = tf2onnx.convert.from_keras(model, output_path='facenet512.onnx',inputs_as_nchw=nchw_inputs_list)
我再次檢查了netron,結果是:
![錯誤:(-215:Assertion failed) (int)_numAxes == inputs[0].size() in function 'getMemoryShapes'](https://img.uj5u.com/2022/05/10/5020bd7fdd404f98b59cb0314eb95528.png)
我現在可以使用 cv::dnn::BlobFromImage() 來使用 opencv 中的模型
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/471837.html
上一篇:影像混合:透明黑色區域
