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
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