Как сделать изображение со сверхвысоким разрешением с помощью onnx и opencv, используя C++?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как сделать изображение со сверхвысоким разрешением с помощью onnx и opencv, используя C++?

Сообщение Anonymous »

У меня есть Animesr.onnx для моего приложения ios/macos со сверхвысоким разрешением, поэтому мне нужно преобразовать коды Python в коды C++. Это мои коды на Python:

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»