mirror of
https://github.com/THU-MIG/yolov10.git
synced 2025-05-23 05:24:22 +08:00
ultralytics 8.1.34
Inference API robust imgsz checks (#9274)
Signed-off-by: Glenn Jocher <glenn.jocher@ultralytics.com>
This commit is contained in:
parent
dcb953bc41
commit
5be2ffbd13
@ -1,6 +1,6 @@
|
|||||||
# Ultralytics YOLO 🚀, AGPL-3.0 license
|
# Ultralytics YOLO 🚀, AGPL-3.0 license
|
||||||
|
|
||||||
__version__ = "8.1.33"
|
__version__ = "8.1.34"
|
||||||
|
|
||||||
from ultralytics.data.explorer.explorer import Explorer
|
from ultralytics.data.explorer.explorer import Explorer
|
||||||
from ultralytics.models import RTDETR, SAM, YOLO, YOLOWorld
|
from ultralytics.models import RTDETR, SAM, YOLO, YOLOWorld
|
||||||
|
@ -385,10 +385,10 @@ class Results(SimpleClass):
|
|||||||
BGR=True,
|
BGR=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
def summary(self, normalize=False):
|
def summary(self, normalize=False, decimals=5):
|
||||||
"""Convert the results to a summarized format."""
|
"""Convert the results to a summarized format."""
|
||||||
if self.probs is not None:
|
if self.probs is not None:
|
||||||
LOGGER.warning("Warning: Classify task do not support `summary` and `tojson` yet.")
|
LOGGER.warning("Warning: Classify results do not support the `summary()` method yet.")
|
||||||
return
|
return
|
||||||
|
|
||||||
# Create list of detection dictionaries
|
# Create list of detection dictionaries
|
||||||
@ -396,28 +396,38 @@ class Results(SimpleClass):
|
|||||||
data = self.boxes.data.cpu().tolist()
|
data = self.boxes.data.cpu().tolist()
|
||||||
h, w = self.orig_shape if normalize else (1, 1)
|
h, w = self.orig_shape if normalize else (1, 1)
|
||||||
for i, row in enumerate(data): # xyxy, track_id if tracking, conf, class_id
|
for i, row in enumerate(data): # xyxy, track_id if tracking, conf, class_id
|
||||||
box = {"x1": row[0] / w, "y1": row[1] / h, "x2": row[2] / w, "y2": row[3] / h}
|
box = {
|
||||||
conf = row[-2]
|
"x1": round(row[0] / w, decimals),
|
||||||
|
"y1": round(row[1] / h, decimals),
|
||||||
|
"x2": round(row[2] / w, decimals),
|
||||||
|
"y2": round(row[3] / h, decimals),
|
||||||
|
}
|
||||||
|
conf = round(row[-2], decimals)
|
||||||
class_id = int(row[-1])
|
class_id = int(row[-1])
|
||||||
name = self.names[class_id]
|
result = {"name": self.names[class_id], "class": class_id, "confidence": conf, "box": box}
|
||||||
result = {"name": name, "class": class_id, "confidence": conf, "box": box}
|
|
||||||
if self.boxes.is_track:
|
if self.boxes.is_track:
|
||||||
result["track_id"] = int(row[-3]) # track ID
|
result["track_id"] = int(row[-3]) # track ID
|
||||||
if self.masks:
|
if self.masks:
|
||||||
x, y = self.masks.xy[i][:, 0], self.masks.xy[i][:, 1] # numpy array
|
result["segments"] = {
|
||||||
result["segments"] = {"x": (x / w).tolist(), "y": (y / h).tolist()}
|
"x": (self.masks.xy[i][:, 0] / w).round(decimals).tolist(),
|
||||||
|
"y": (self.masks.xy[i][:, 1] / h).round(decimals).tolist(),
|
||||||
|
}
|
||||||
if self.keypoints is not None:
|
if self.keypoints is not None:
|
||||||
x, y, visible = self.keypoints[i].data[0].cpu().unbind(dim=1) # torch Tensor
|
x, y, visible = self.keypoints[i].data[0].cpu().unbind(dim=1) # torch Tensor
|
||||||
result["keypoints"] = {"x": (x / w).tolist(), "y": (y / h).tolist(), "visible": visible.tolist()}
|
result["keypoints"] = {
|
||||||
|
"x": (x / w).numpy().round(decimals).tolist(), # decimals named argument required
|
||||||
|
"y": (y / h).numpy().round(decimals).tolist(),
|
||||||
|
"visible": visible.numpy().round(decimals).tolist(),
|
||||||
|
}
|
||||||
results.append(result)
|
results.append(result)
|
||||||
|
|
||||||
return results
|
return results
|
||||||
|
|
||||||
def tojson(self, normalize=False):
|
def tojson(self, normalize=False, decimals=5):
|
||||||
"""Convert the results to JSON format."""
|
"""Convert the results to JSON format."""
|
||||||
import json
|
import json
|
||||||
|
|
||||||
return json.dumps(self.summary(normalize=normalize), indent=2)
|
return json.dumps(self.summary(normalize=normalize, decimals=decimals), indent=2)
|
||||||
|
|
||||||
|
|
||||||
class Boxes(BaseTensor):
|
class Boxes(BaseTensor):
|
||||||
|
@ -142,6 +142,8 @@ def check_imgsz(imgsz, stride=32, min_dim=1, max_dim=2, floor=0):
|
|||||||
imgsz = [imgsz]
|
imgsz = [imgsz]
|
||||||
elif isinstance(imgsz, (list, tuple)):
|
elif isinstance(imgsz, (list, tuple)):
|
||||||
imgsz = list(imgsz)
|
imgsz = list(imgsz)
|
||||||
|
elif isinstance(imgsz, str): # i.e. '640' or '[640,640]'
|
||||||
|
imgsz = [int(imgsz)] if imgsz.isnumeric() else eval(imgsz)
|
||||||
else:
|
else:
|
||||||
raise TypeError(
|
raise TypeError(
|
||||||
f"'imgsz={imgsz}' is of invalid type {type(imgsz).__name__}. "
|
f"'imgsz={imgsz}' is of invalid type {type(imgsz).__name__}. "
|
||||||
|
Loading…
x
Reference in New Issue
Block a user