from cv2 import imshow from matplotlib import lines import numpy as np import onnxruntime import cv2 import torch import onnx from basemodel import TextDetBase import onnxsim from models.yolov5.common import Conv from models.yolov5.yolo import Detect import torch.nn as nn import time from seg_dataset import letterbox from utils.yolov5_utils import fuse_conv_and_bn class SiLU(nn.Module): # export-friendly version of nn.SiLU() @staticmethod def forward(x): return x * torch.sigmoid(x) def concate_models(blk_weights, seg_weights, det_weights, save_path): textdetector_dict = dict() textdetector_dict['blk_det'] = torch.load(blk_weights, map_location='cpu') textdetector_dict['text_seg'] = torch.load(seg_weights, map_location='cpu')['weights'] textdetector_dict['text_det'] = torch.load(det_weights, map_location='cpu')['weights'] torch.save(textdetector_dict, save_path) def export_onnx(model, im, file, opset, train=False, simplify=True, dynamic=False, inplace=False): # YOLOv5 ONNX export f = file + '.onnx' for k, m in model.named_modules(): if isinstance(m, Conv): # assign export-friendly activations if isinstance(m.act, nn.SiLU): m.act = SiLU() elif isinstance(m, Detect): m.inplace = inplace m.onnx_dynamic = False torch.onnx.export(model, im, f, verbose=False, opset_version=opset, training=torch.onnx.TrainingMode.TRAINING if train else torch.onnx.TrainingMode.EVAL, do_constant_folding=not train, input_names=['images'], output_names=['blk', 'seg', 'det'], dynamic_axes={'images': {0: 'batch', 2: 'height', 3: 'width'}, # shape(1,3,640,640) 'output': {0: 'batch', 1: 'anchors'} # shape(1,25200,85) } if dynamic else None) # Checks model_onnx = onnx.load(f) # load onnx model onnx.checker.check_model(model_onnx) # check onnx model model_onnx, check = onnxsim.simplify( model_onnx, dynamic_input_shape=dynamic, input_shapes={'images': list(im.shape)} if dynamic else None) assert check, 'assert check failed' onnx.save(model_onnx, f)