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