I train a simple classification model by PyTorch and load it by opencv3.3, but it throw exception and say
OpenCV Error: The function/feature is not implemented (Unsupported Lua type) in readObject, file/home/ramsus/Qt/3rdLibs/opencv/modules/dnn/src/torch/torch_importer.cpp,line 797/home/ramsus/Qt/3rdLibs/opencv/modules/dnn/src/torch/torch_importer.cpp:797:error: (-213) Unsupported Lua type in function readObject
Model definition
class conv_block(nn.Module):def __init__(self, in_filter, out_filter, kernel):super(conv_block, self).__init__()self.conv1 = nn.Conv2d(in_filter, out_filter, kernel, 1, (kernel - 1)//2)self.batchnorm = nn.BatchNorm2d(out_filter)self.maxpool = nn.MaxPool2d(2, 2)def forward(self, x):x = self.conv1(x)x = self.batchnorm(x)x = F.relu(x)x = self.maxpool(x)return xclass Net(nn.Module):def __init__(self):super(Net, self).__init__()self.conv1 = conv_block(3, 6, 3)self.conv2 = conv_block(6, 16, 3)self.fc1 = nn.Linear(16 * 8 * 8, 120)self.bn1 = nn.BatchNorm1d(120)self.fc2 = nn.Linear(120, 84)self.bn2 = nn.BatchNorm1d(84)self.fc3 = nn.Linear(84, 10)def forward(self, x):x = self.conv1(x)x = self.conv2(x)x = x.view(x.size()[0], -1)x = F.relu(self.bn1(self.fc1(x)))x = F.relu(self.bn2(self.fc2(x)))x = self.fc3(x)return x
This model use Conv2d, ReLU, BatchNorm2d, MaxPool2d and Linear layer only, every layers are supported by opencv3.3
I save it by state_dict
torch.save(net.state_dict(), 'cifar10_model')
Load it by c++ as
std::string const model_file("/home/some_folder/cifar10_model");std::cout<<"read net from torch"<<std::endl;
dnn::Net net = dnn::readNetFromTorch(model_file);
I guess I save the model with the wrong way, what is the proper way to save the model of PyTorch in order to load using OpenCV? Thanks
Edit :
I use another way to save the model, but it cannot be loaded either
torch.save(net, 'cifar10_model.net')
Is this a bug?Or I am doing something wrong?