Вот код минимально воспроизводимого примера:
Код: Выделить всё
from ultralytics import YOLO
import torch
import matplotlib.pyplot as plt
import numpy as np
import PIL
print(torch.cuda.is_available())
model = YOLO("YOLO/yolov8x-seg.pt")
image = PIL.Image.open("YOLO/test.png")
results = model(image, verbose=False)
plt.imshow(np.logical_or.reduce(results[0].masks.data.cpu().numpy()).astype(np.uint8)*255)
plt.show()
Вот (правильная) маска из Jupyter Notebook:

и вот результат Скрипт Python:

Вы можете видеть, что результат Python имеет эти странные блоки ближе к краю ограничивающей рамки.
- Код абсолютно одинаков для обеих версий.
- Виртуальная среда Python создается непосредственно из экспорта среды Jupyter (и я дважды проверил: идентичная версия Python и идентичные версии для всех библиотек)
- Одна и та же версия CUDA (12.4).
- Одно и то же оборудование (оба примера выполнялись на одной машине — графический процессор — ноутбук RTX 3070 Ti)
- Обе сети используют одни и те же предварительно обученные веса (доступны для скачивания здесь)
Я также пытался вручную установить точность с плавающей запятой для сценария Python на случай, если это вызвано какой-либо ошибкой точности агрегирования весов сети, но это не помогло тоже не работает.
Я читал, что Anaconda использует IPython, что может привести к другому поведению, но я не знаю, что делать с этой информацией.
Я также не могу просто уменьшить размер ограничивающей рамки, потому что положение и размер этих артефактов в движущемся изображении непредсказуемы. Уменьшение размера ограничительной рамки приводит к тому, что части масок иногда обрезаются.
Кто-нибудь знает, почему это происходит или как это исправить?
Подробнее здесь: https://stackoverflow.com/questions/790 ... gmentation