use ncnn with pytorch or onnx¶
Here is a practical guide for converting pytorch model to ncnn
resnet18 is used as the example
pytorch to onnx¶
The official pytorch tutorial for exporting onnx model
https://pytorch.org/tutorials/advanced/super_resolution_with_caffe2.html
import torch
import torchvision
import torch.onnx
## An instance of your model
model = torchvision.models.resnet18()
## An example input you would normally provide to your model's forward() method
x = torch.rand(1, 3, 224, 224)
## Export the model
torch_out = torch.onnx._export(model, x, "resnet18.onnx", export_params=True)
simplify onnx model¶
The exported resnet18.onnx model may contains many redundant operators such as Shape, Gather and Unsqueeze that is not supported in ncnn
Shape not supported yet!
Gather not supported yet!
# axis=0
Unsqueeze not supported yet!
# axes 7
Unsqueeze not supported yet!
# axes 7
Fortunately, daquexian developed a handy tool to eliminate them. cheers!
https://github.com/daquexian/onnx-simplifier
python3 -m onnxsim resnet18.onnx resnet18-sim.onnx
onnx to ncnn¶
Finally, you can convert the model to ncnn using tools/onnx2ncnn
onnx2ncnn resnet18-sim.onnx resnet18.param resnet18.bin