Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
jameslahm committed May 23, 2024
1 parent 182f0b0 commit 1e9a7d6
Show file tree
Hide file tree
Showing 6 changed files with 39 additions and 16 deletions.
20 changes: 14 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,15 +58,23 @@ yolo predict model=yolov10n/s/m/b/l/x.pt
```

## Export


## Latency Measurement


```
# End-to-End ONNX
yolo export model=yolov10n/s/m/b/l/x.pt format=onnx opset=13 simplify
# Predict with ONNX
yolo predict model=yolov10n/s/m/b/l/x.onnx
# End-to-End TensorRT
yolo export model=yolov10n/s/m/b/l/x.pt format=engine half=True simplify opset=13 workspace=16
# Or
trtexec --onnx=onnxs/yolov10n/s/m/b/l/x.onnx --saveEngine=engines/yolov10n/s/m/b/l/x.engine --fp16
# Predict with TensorRT
yolo predict model=yolov10n/s/m/b/l/x.engine
```

## Acknowledgement

The code base is built with [ultralytics](https://github.com/ultralytics/ultralytics)
The code base is built with [ultralytics](https://github.com/ultralytics/ultralytics) and [RT-DETR](https://github.com/lyuwenyu/RT-DETR)

Thanks for the great implementations!

Expand Down
4 changes: 3 additions & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,6 @@ onnx
onnxruntime
pycocotools
PyYAML
scipy
scipy
onnxsim
onnxruntime-gpu
5 changes: 4 additions & 1 deletion ultralytics/engine/exporter.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@
from ultralytics.data.dataset import YOLODataset
from ultralytics.data.utils import check_det_dataset
from ultralytics.nn.autobackend import check_class_names, default_class_names
from ultralytics.nn.modules import C2f, Detect, RTDETRDecoder
from ultralytics.nn.modules import C2f, Detect, RTDETRDecoder, v10Detect
from ultralytics.nn.tasks import DetectionModel, SegmentationModel, WorldModel
from ultralytics.utils import (
ARM64,
Expand Down Expand Up @@ -229,6 +229,9 @@ def __call__(self, model=None):
m.dynamic = self.args.dynamic
m.export = True
m.format = self.args.format
if isinstance(m, v10Detect):
m.max_det = self.args.max_det

elif isinstance(m, C2f) and not any((saved_model, pb, tflite, edgetpu, tfjs)):
# EdgeTPU does not support FlexSplitV while split provides cleaner ONNX graph
m.forward = m.forward_split
Expand Down
11 changes: 7 additions & 4 deletions ultralytics/models/yolov10/predict.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,13 @@ def postprocess(self, preds, img, orig_imgs):
if isinstance(preds, (list, tuple)):
preds = preds[0]

preds = preds.transpose(-1, -2)
bboxes, scores, labels = ops.v10postprocess(preds, self.args.max_det)
bboxes = ops.xywh2xyxy(bboxes)
preds = torch.cat([bboxes, scores.unsqueeze(-1), labels.unsqueeze(-1)], dim=-1)
if preds.shape[-1] == 6:
pass
else:
preds = preds.transpose(-1, -2)
bboxes, scores, labels = ops.v10postprocess(preds, self.args.max_det)
bboxes = ops.xywh2xyxy(bboxes)
preds = torch.cat([bboxes, scores.unsqueeze(-1), labels.unsqueeze(-1)], dim=-1)

mask = preds[..., 4] > self.args.conf

Expand Down
11 changes: 9 additions & 2 deletions ultralytics/nn/modules/head.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
from .transformer import MLP, DeformableTransformerDecoder, DeformableTransformerDecoderLayer
from .utils import bias_init_with_prob, linear_init
import copy
from ultralytics.utils import ops

__all__ = "Detect", "Segment", "Pose", "Classify", "OBB", "RTDETRDecoder"

Expand Down Expand Up @@ -51,7 +52,6 @@ def inference(self, x):
shape = x[0].shape # BCHW
x_cat = torch.cat([xi.view(shape[0], self.no, -1) for xi in x], 2)
if self.dynamic or self.shape != shape:
assert(not self.export)
self.anchors, self.strides = (x.transpose(0, 1) for x in make_anchors(x, self.stride, 0.5))
self.shape = shape

Expand Down Expand Up @@ -501,6 +501,8 @@ def _reset_parameters(self):

class v10Detect(Detect):

max_det = -1

def __init__(self, nc=80, ch=()):
super().__init__(nc, ch)
c3 = max(ch[0], min(self.nc, 100)) # channels
Expand All @@ -515,7 +517,12 @@ def forward(self, x):
one2one = self.forward_feat([xi.detach() for xi in x], self.one2one_cv2, self.one2one_cv3)
if not self.training:
one2one = self.inference(one2one)
return one2one
if not self.export:
return one2one
else:
assert(self.max_det != -1)
boxes, scores, labels = ops.v10postprocess(one2one.permute(0, 2, 1), self.max_det)
return torch.cat([boxes, scores.unsqueeze(-1), labels.unsqueeze(-1)], dim=-1)
else:
one2many = super().forward(x)
return {"one2many": one2many, "one2one": one2one}
Expand Down
4 changes: 2 additions & 2 deletions ultralytics/utils/ops.py
Original file line number Diff line number Diff line change
Expand Up @@ -848,8 +848,8 @@ def clean_str(s):
"""
return re.sub(pattern="[|@#!¡·$€%&()=?¿^*;:,¨´><+]", repl="_", string=s)

def v10postprocess(preds, max_det):
nc = preds.shape[-1] - 4
def v10postprocess(preds, max_det, nc=80):
assert(4 + nc == preds.shape[-1])
boxes, scores = preds.split([4, nc], dim=-1)
max_scores = scores.amax(dim=-1)
max_scores, index = torch.topk(max_scores, max_det, axis=-1)
Expand Down

0 comments on commit 1e9a7d6

Please sign in to comment.