Результаты YoloV8 не имеют свойств «box», «max»

Я обучил модель 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.")

Вот проблема: возвращаемый объект (переменная прогнозов) не имеет полей, масок, ключевых точек и т. д.

Я думаю, мои вопросы:

  • Почему результат так отличается от документации?
  • Есть ли этап преобразования?

Этот пример кода из документации Ultralytics действителен для текущей версии платформы. Большинство данных результатов хранятся в формате torch.Tensor. Можете ли вы указать точный код, который вы используете? Например, в вашем выводе я вижу переменную «прогнозы», но неясно, откуда она взялась. Кроме того, не могли бы вы предоставить вывод для печати следующих переменных: поля, маски, ключевые точки, пробы, obb? Некоторые из них могут иметь значение «Нет» в зависимости от задачи модели: например, задача обнаружения будет возвращать поля, но не маски, ключевые точки, пробы и кэш.

hanna_liavoshka 29.05.2024 07:30

Спасибо @hanna_liavoshka. Я обновил свой вопрос с помощью кода. Просто чтобы уточнить: переменная предсказаний не имеет полей, ключевых точек, масок и т. д. Она содержит только массив тензорного потока.

Paulo Henrique PH 29.05.2024 07:39

Какая здесь версия Ultralytics? Можете ли вы запустить from ultralytics import YOLO вместо from ultralytics.yolo.engine.model import YOLO?

hanna_liavoshka 29.05.2024 09:10

Привет @hanna_liavoshka. Я попробовала «из ультралитика импорт YOLO», результат тот же. Версин – это Ультралитикс 8.0.0.

Paulo Henrique PH 29.05.2024 10:07
Оптимизация производительности модели: Руководство по настройке гиперпараметров в Python с Keras
Оптимизация производительности модели: Руководство по настройке гиперпараметров в Python с Keras
Настройка гиперпараметров - это процесс выбора наилучшего набора гиперпараметров для модели машинного обучения с целью оптимизации ее...
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Udacity Nanodegree Capstone Project: Классификатор пород собак
Udacity Nanodegree Capstone Project: Классификатор пород собак
Вы можете ознакомиться со скриптами проекта и данными на github .
Определение пород собак с помощью конволюционных нейронных сетей (CNN)
Определение пород собак с помощью конволюционных нейронных сетей (CNN)
В рамках финального проекта Udacity Data Scietist Nanodegree я разработал алгоритм с использованием конволюционных нейронных сетей (CNN) для...
Почему Python - идеальный выбор для проекта AI и ML
Почему Python - идеальный выбор для проекта AI и ML
Блог, которым поделился Harikrishna Kundariya в нашем сообществе Developer Nation Community.
0
4
106
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Судя по комментариям, вы используете старую версию 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 до последней версии, и, как вы и предсказывали, все работает хорошо.

Paulo Henrique PH 30.05.2024 02:24

Другие вопросы по теме