@averkoff
Программист

Как исправить аномальное снижение производительности при импорте модуля в Python?

В своём проекте машинного зрения использую модель Segment Anything (далее SAM), с задачей справляется отлично. Но заметил что если в скрипт импортировать библиотеку ultralytics (она необходима для предварительного анализа изображения в помощью YOLOV8) то время работы SAM по поиску сегментов увеличивается в двое, причем достаточно написать import ultralytics, без запуска работы yolov8 и производительность падает. Замеры производились неоднократно, поведение стабильное.
Пробовал воспроизвести это в colab.google.com такого эффекта там не наблюдается - https://colab.research.google.com/drive/1QbDLUj5CU....

Помогите разобраться в чем проблема и как можно избавится от такого поведения?

"""
sam_vit_b_01ec64.pth скачивается по ссылке
===============
https://dl.fbaipublicfiles.com/segment_anything/sam_vit_b_01ec64.pth

Полезные ссылки
===============
SAM - https://github.com/facebookresearch/segment-anything
ultralytics - https://github.com/ultralytics/ultralytics
"""
import time
import cv2
import numpy as np
from segment_anything import sam_model_registry, SamAutomaticMaskGenerator

import ultralytics # <---- включение этой строки роняет производительность

img = np.float32(cv2.imread('2023.12.10 (14_28_54)ishod.jpg'))

sam_checkpoint = "sam_vit_b_01ec64.pth"
model_type = "vit_b"
device = "cpu"

sam = sam_model_registry[model_type](checkpoint=sam_checkpoint)
sam.to(device=device)

mask_generator = SamAutomaticMaskGenerator(
    sam,
    points_per_batch = 8,
    points_per_side = 8,
    pred_iou_thresh = 0.2,
    stability_score_thresh = 0.7
)

time_begin = time.time()
masks = mask_generator.generate(img)
print(time.time() - time_begin, 'sec')
print('Count MASKS', len(masks))


Для запуска этого кода необходимо установить segment-anything и ultralytics:
pip install git+https://github.com/facebookresearch/segment-anything.git
pip install ultralytics

Вот пример замеров времени из консоли импорт включен:
13.004094123840332 sec
Count MASKS 83

Импорт отключен:
4.986778020858765 sec
Count MASKS 83
  • Вопрос задан
  • 94 просмотра
Пригласить эксперта
Ответы на вопрос 2
mayton2019
@mayton2019
Bigdata Engineer
Создай 2 незвависимых процесса. Один пускай работает без ultralytics и передает
результаты следующему процессу через файлы который уже в свою очередь
будет подключать ultralytics.

Современные стеки технологий очень сложны и забагованы и их иногда проще не фиксить
а изолировать и просто принять как данность что они вот так вот работают.
Ответ написан
@averkoff Автор вопроса
Программист
Выяснил вот что, если под Windows или Ubuntu этот скрипт запускать, то такого поведения не наблюдается.
Если разберусь почему под macOS наблюдается ухудшение производительности, напишу сюда.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы