Я обучил модель YOLOV8 распознавать объекты на перекрестке (например, автомобили, дороги и т. д.). Он работает нормально, и я могу получить результат в виде изображения с сегментированными интересующими объектами.
Однако мне нужно сохранить необработанную геометрию (многоугольники), чтобы позже сохранить ее в текстовом файле.
Я попробовал то, что нашел в документации (https://docs.ultralytics.com/modes/predict/#key-features-of-predict-mode), однако возвращаемый объект не такой, как указано в документации.
Фактически результатом является список чисел тензорного потока:
Вот мой код:
import argparse
import cv2
import numpy as np
from pathlib import Path
from ultralytics.yolo.engine.model import YOLO
# Parse command line arguments
parser = argparse.ArgumentParser()
parser.add_argument('--source', type=str, required=True, help='Source image directory or file')
parser.add_argument('--output', type=str, default='output', help='Output directory')
args = parser.parse_args()
# Create output directory if it doesn't exist
Path(args.output).mkdir(parents=True, exist_ok=True)
# Model path
model_path = r'C:\\_Projects\\best_100img.pt'
# Load your model directly
model = YOLO(model_path)
model.fuse()
# Load image(s)
if Path(args.source).is_dir():
image_paths = list(Path(args.source).rglob('*.tiff'))
else:
image_paths = [args.source]
# Process each image
for image_path in image_paths:
img = cv2.imread(str(image_path))
if img is None:
continue
# Perform inference
predictions = model.predict(image_path, save=True, save_txt=True)
print("Processing complete.")
Вот проблема: возвращаемый объект (переменная прогнозов) не имеет полей, масок, ключевых точек и т. д.
Я думаю, мои вопросы:
Спасибо @hanna_liavoshka. Я обновил свой вопрос с помощью кода. Просто чтобы уточнить: переменная предсказаний не имеет полей, ключевых точек, масок и т. д. Она содержит только массив тензорного потока.
Какая здесь версия Ultralytics? Можете ли вы запустить from ultralytics import YOLO вместо from ultralytics.yolo.engine.model import YOLO?
Привет @hanna_liavoshka. Я попробовала «из ультралитика импорт YOLO», результат тот же. Версин – это Ультралитикс 8.0.0.





Судя по комментариям, вы используете старую версию Ultralytics==8.0.0. Фактически он возвращает результат в виде списка объектов torch.Tensor вместо объекта ultralytics.engine.results.Results, и именно последний имеет такие параметры, как поля, маски, ключевые точки, пробы, obb. Документация соответствует последней версии платформы, 8.2.24 на данный момент, а 8.0.0 — с января 2023 года.
Самый простой способ решить вашу проблему — обновить версию Ultralytics до последней, так вы получите все параметры результатов, описанные в документации.
Если обстоятельства не позволяют вам выполнить это обновление, вам потребуется некоторая постобработка данных с учетом формата возвращаемых результатов из версии 8.0.0.
Результаты задачи ОБНАРУЖЕНИЕ ОБЪЕКТОВ, версия==8.0.0
# for 3 detected objects
[tensor([[2.89000e+02, 7.10000e+01, 1.44000e+03, 5.07000e+02, 8.91113e-01, 2.00000e+00],
[1.26700e+03, 6.00000e+01, 1.68200e+03, 3.19000e+02, 8.31055e-01, 2.00000e+00],
[6.96000e+02, 0.00000e+00, 1.32200e+03, 1.31000e+02, 2.56836e-01, 7.00000e+00]], device='cuda:0')]
# where every array stores 6 values, first 4 are in pixels:
[x_centre, y_centre, box_width, box_height, confidence, class_id]
# for easy manipulation you can run results[0].tolist() and will get the following format:
[[289.0, 71.0, 1440.0, 507.0, 0.89111328125, 2.0],
[1267.0, 60.0, 1682.0, 319.0, 0.8310546875, 2.0],
[696.0, 0.0, 1322.0, 131.0, 0.2568359375, 7.0]]
Результаты задачи СЕГМЕНТАЦИЯ ОБЪЕКТОВ, версия==8.0.0. Будет то же самое, что и для обнаружения, но добавляет второй факел.Тензор с масками сегментации для каждого объекта.
# for 3 detected objects
[[tensor([[1.23000e+02, 8.90000e+01, 4.21000e+02, 2.21000e+02, 2.55216e-01, 7.00000e+00],
[1.26700e+03, 5.80000e+01, 1.68100e+03, 3.17000e+02, 8.04158e-01, 2.00000e+00],
[2.70000e+02, 7.70000e+01, 1.46000e+03, 4.98000e+02, 8.19106e-01, 2.00000e+00]], device='cuda:0'),
tensor([[[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.]],
[[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.]],
[[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.]]], device='cuda:0')]]
Зная формат данных, которые вы получаете от этой старой версии Ultralytics, вы можете легко получить к ним доступ и перевести их в нужный вам формат. Но обновление Ultralytics до последней версии по-прежнему остается лучшим способом наиболее эффективного использования этой платформы.
Установите Ultralytics: https://docs.ultralytics.com/quickstart/
Спасибо @hanna_liavoshka, я обновила YOLO до последней версии, и, как вы и предсказывали, все работает хорошо.
Этот пример кода из документации Ultralytics действителен для текущей версии платформы. Большинство данных результатов хранятся в формате torch.Tensor. Можете ли вы указать точный код, который вы используете? Например, в вашем выводе я вижу переменную «прогнозы», но неясно, откуда она взялась. Кроме того, не могли бы вы предоставить вывод для печати следующих переменных: поля, маски, ключевые точки, пробы, obb? Некоторые из них могут иметь значение «Нет» в зависимости от задачи модели: например, задача обнаружения будет возвращать поля, но не маски, ключевые точки, пробы и кэш.