Closed aimuch closed 2 years ago
code as follows, but export nothing:
weight_path = 'weights/hybridnets.pth' device = 'cuda' if torch.cuda.is_available() else 'cpu' params = Params(os.path.join(Path(__file__).resolve().parent, "projects/bdd100k.yml")) model = HybridNetsBackbone(num_classes=len(params.obj_list), compound_coef=3, ratios=eval(params.anchors_ratios), scales=eval(params.anchors_scales), seg_classes=len(params.seg_list), backbone_name=None) model.load_state_dict(torch.load(weight_path, map_location=device)) model.eval() inputs = torch.randn(1, 3, 384, 640) print("begin to convert onnx") torch.onnx.export(model, inputs, 'HybridNetsBackbone.onnx', verbose=False, opset_version=12, input_names=['images']) print("done")
shell log:
HybridNets/utils/utils.py:673: TracerWarning: torch.from_numpy results are registered as constants in the trace. You can safely ignore this warning if you use this function to create tensors out of constant variables that would be the same every time you call this function. In any other case, this might cause the trace to be incorrect. anchor_boxes = torch.from_numpy(anchor_boxes.astype(dtype)).to(image.device) Warning: Constant folding - Only steps=1 can be constant folded for opset >= 10 onnx::Slice op. Constant folding not applied. Warning: Constant folding - Only steps=1 can be constant folded for opset >= 10 onnx::Slice op. Constant folding not applied. Warning: Constant folding - Only steps=1 can be constant folded for opset >= 10 onnx::Slice op. Constant folding not applied. Warning: Constant folding - Only steps=1 can be constant folded for opset >= 10 onnx::Slice op. Constant folding not applied. Warning: Constant folding - Only steps=1 can be constant folded for opset >= 10 onnx::Slice op. Constant folding not applied. Warning: Constant folding - Only steps=1 can be constant folded for opset >= 10 onnx::Slice op. Constant folding not applied. Warning: Constant folding - Only steps=1 can be constant folded for opset >= 10 onnx::Slice op. Constant folding not applied. Warning: Constant folding - Only steps=1 can be constant folded for opset >= 10 onnx::Slice op. Constant folding not applied. Warning: Constant folding - Only steps=1 can be constant folded for opset >= 10 onnx::Slice op. Constant folding not applied. ... ONNX export failed: Couldn't export Python operator SwishImplementation
Solved: modify backbone.py
class HybridNetsBackbone(nn.Module):
......
if backbone_name:
self.encoder = timm.create_model(backbone_name, pretrained=True, features_only=True, out_indices=(2,3,4)) # P3,P4,P5
else:
# EfficientNet_Pytorch
self.encoder = get_encoder(
'efficientnet-b' + str(self.backbone_compound_coef[compound_coef]),
in_channels=3,
depth=5,
weights='imagenet',
)
# Slove cannot export onnx, added by Andy, 2022-07-01
if onnx_export:
self.encoder.set_swish(memory_efficient=False)
weight_path = 'weights/hybridnets.pth' device = 'cuda' if torch.cuda.is_available() else 'cpu' params = Params(os.path.join(Path(__file__).resolve().parent, "projects/bdd100k.yml")) model = HybridNetsBackbone(num_classes=len(params.obj_list), compound_coef=3, ratios=eval(params.anchors_ratios), scales=eval(params.anchors_scales), seg_classes=len(params.seg_list), backbone_name=None) model.load_state_dict(torch.load(weight_path, map_location=device)) model.eval() inputs = torch.randn(1, 3, 384, 640) print("begin to convert onnx") torch.onnx.export(model, inputs, 'HybridNetsBackbone.onnx', verbose=False, opset_version=12, input_names=['images']) print("done")
Solved: modify backbone.py
class HybridNetsBackbone(nn.Module): ...... if backbone_name: self.encoder = timm.create_model(backbone_name, pretrained=True, features_only=True, out_indices=(2,3,4)) # P3,P4,P5 else: # EfficientNet_Pytorch self.encoder = get_encoder( 'efficientnet-b' + str(self.backbone_compound_coef[compound_coef]), in_channels=3, depth=5, weights='imagenet', ) # Slove cannot export onnx, added by Andy, 2022-07-01 if onnx_export: self.encoder.set_swish(memory_efficient=False)
@aimuch that's great, please feel free to open a pull request if you succeeded
Now, I can export onnx, but snpe cannot support asymmetric pads. So I need to change the backbone to retry.
Encountered Error: ERROR_ASYMMETRIC_PADS_VALUES: Asymmetric pads values is not supported
code as follows, but export nothing:
shell log: