Inference pytorch C++ with alexnet and cv::imread image
Inference pytorch C++ with alexnet and cv::imread image
我正在尝试使用C++应用程序推断使用alexnet预训练网络的图像分类任务。
我已经成功地推断出一个用python加载网络的狗图像:
alexnet = torchvision.models.alexnet(pretrained=True)
img = Image.open("dog.jpg")
transform = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(
mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225]
)])
img_t = transform(img)
batch_t = torch.unsqueeze(img_t, 0)
alexnet.forward(batch_t)
_, index = torch.max(out, 1)
结果index
是 208,Labrador_retriever,看起来不错。
然后我保存要从C++应用程序加载的网络
example = torch.rand(1, 3, 224, 224)
traced_script_module_alex = torch.jit.trace(alexnet, example)
traced_script_module.save("alexnet.pt")
当我加载到C++时,我得到错误的结果:
cv::Mat img = cv::imread("dog.jpg");
cv::resize(img, img, cv::Size(224, 224), cv::INTER_CUBIC);
// Convert the image and label to a tensor.
torch::Tensor img_tensor = torch::from_blob(img.data, { 1, img.rows, img.cols, 3 }, torch::kByte);
img_tensor = img_tensor.permute({ 0, 3, 1, 2 }); // convert to CxHxW
img_tensor = img_tensor.to(torch::kFloat);
std::vector<torch::jit::IValue> input;
input.push_back(img_tensor);
torch::jit::script::Module module = torch::jit::load("alexnet.pt");
at::Tensor output = module.forward(input).toTensor();
std::cout << output.argmax(1) << 'n';
argmax
是463,桶。 我想我不是在看同一个图像;我错过了什么...?
你的C++代码缺少这部分Python代码:
transform = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(
mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225]
)])
img_t = transform(img)
相关文章:
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 概念中的cv限定符需要表达式参数列表
- 将CHW格式的浮点向量转换为cv::Mat
- 错误的cv::face FacemarkLBF实例化
- 如何检查给定的参数是否为 cv::noArray()?
- 错误:"imread"未在此范围内声明
- 开放 CV 中的动态内存分配,用于视频处理
- 如何在 opencv 中使用 cv::VideoCapture::waitAny()
- Inference pytorch C++ with alexnet and cv::imread image
- OpenCV undefined reference to 'cv::imread(cv::String const&, int)'
- OpenCV:将 ilLoadImage 替换为 cv::imread
- 为什么 cv::imread 在包含 tensorflow 的标头后返回 NULL。
- 与iMread相比,qimage to cv ::垫子转换了奇怪的行为
- cv::imread() 会导致内存损坏
- IplImage的cvLoadImage工作,但cv::imread的cv::Mat不工作
- 如何解决错误:imread不是cv的成员
- 错误:未定义对"cv::imread(std::string const&, int)"的引用
- 未定义的引用 cv::imread(std::string const&, int)
- OpenCV "未定义的引用'cv::imread' 等 C++
- Opencv, undefined reference to 'cv::imread(??cv::String const&???, int)'