Код: Выделить всё
session = onnxruntime.InferenceSession('animesr.onnx')
img = cv2.imread('imgs/naruto.jpg')
ori_h, ori_w, _ = img.shape
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = cv2.resize(img, (512,512))
img = (np.array(img) / 255.0).astype(np.float32)
img = np.transpose(img, (2, 0, 1))
img = np.expand_dims(img, 0)
input_name = session.get_inputs()[0].name
output_name = session.get_outputs()[0].name
input_feed = {input_name: img}
output = session.run([output_name], input_feed)
output = output[0].clip(0, 1) * 255
output = output.astype(np.uint8)
output = np.squeeze(output)
output = np.transpose(output, (1, 2, 0))
output = cv2.cvtColor(output, cv2.COLOR_RGB2BGR)
output = cv2.resize(output, (ori_w*4, ori_h*4))
cv2.imwrite('naruto_animesr.jpg', output)
[img]https://i.sstatic .net/nrb9E.jpg[/img]
А это мои коды на C++:
Код: Выделить всё
Ort::Session session(env, ORT_TSTR(modelPath), sessionOptions);
cv::Mat inputImage = cv::imread(imagePath, cv::IMREAD_COLOR);
// cv::Mat blob = cv::dnn::blobFromImage(inputImage, 1.0/255, cv::Size(512,512), cv::Scalar(), true);
cv::Mat resizedImage;
cv::resize(inputImage, resizedImage, cv::Size(512,512));
cv::Mat floatImage;
resizedImage.convertTo(floatImage, CV_32FC3, 1.0/255.0);
Ort::MemoryInfo memoryInfo = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault);
std::vector inputShape = {1, 3, 512, 512};
Ort::Value inputTensor = Ort::Value::CreateTensor(memoryInfo, (float*) floatImage.data, 3*512*512, inputShape.data(), inputShape.size());
std::vector inputNames = {"input"};
std::vector outputNames = {"output"};
std::vector outputTensor = session.Run(Ort::RunOptions{}, inputNames.data(), &inputTensor, 1, outputNames.data(), outputNames.size());
Ort::TensorTypeAndShapeInfo outputInfo = outputTensor[0].GetTensorTypeAndShapeInfo();
int channels = outputInfo.GetShape()[1]; // 3
int height = outputInfo.GetShape()[2]; // 2048
int width = outputInfo.GetShape()[3]; // 2048
const float* outputData = outputTensor[0].GetTensorMutableData();
cv::Mat outputImage(height, width, CV_32FC(channels), const_cast(outputData));
cv::Mat uint8Image;
outputImage.convertTo(uint8Image, CV_8UC3, 255);
cv::Mat bgrOutput;
cv::cvtColor(uint8Image, bgrOutput, cv::COLOR_RGB2BGR);
cv::imwrite(outputPath, bgrOutput);

и это результат cv::ddn::blobFromImage()

Оба результата — отстой, в отличие от моего результата на Python.
Я думаю, проблема в предварительной обработке изображения в качестве входных данных перед запуском модели и обработке выходных данных в виде cv image, я плохо разбираюсь в операциях с матрицами, таких как преобразование, транспонирование, изменение формы и т. д.
Можете ли вы помочь мне предоставить правильные коды обработки изображений с помощью opencv C++?
Подробнее здесь: https://stackoverflow.com/questions/773 ... cv-using-c