🏠 Главная › user guide › mlops models segment anything
{/ Эта страница автоматически передается из навыков SKILL.md с помощью сайта/scripts/generate-skill-docs.py. Редактируйте исходный SKILL.md, а не эту страницу. /}
Сегментируйте любую модель
SAM: нулевая сегментация изображений по точкам, рамкам, маскам.
Ниже приведено полное описание навыков, которые Hermes загружает при его активации. Агент увидит эту инструкцию, когда навыки активны.
Модель сегментации чего угодно (SAM)
Исчерпывающее руководство по использованию модели Segment Anything от Meta AI для нулевой сегментации изображений.
Когда использовать SAM
Используйте SAM, когда:
- Необходимо сегментировать любой объект на изображениях без специального обучения под задачей.
- Стройте интерактивные инструменты, аннотации с подсказками в виде точек/рамок.
- Генерирует обучающие данные для других моделей компьютерного зрения.
- Нужен нулевой перенос на новые изображения доменов.
- Строите конвейеры обнаружения/сегментации объектов
- Обработка медицинских, спутниковых или специализированных изображений.
Ключевые возможности:
- Сегментация с нулевым выстрелом: работает на любом домене изображений без дообучения.
- Гибкие подсказки: точки, ограничивающие рамки или рамки маски.
- Автоматическая сегментация: автоматически все маскирует объекты.
- Высокое качество: обучено на 1,1 миллиарда масок из 11 миллионов изображений.
- Несколько размеров моделей: ViT-B (самая быстрая), ViT-L, ViT-H (самая точная)
- Экспорт в ONNX: развёртывание в браузерах и на периферийных устройствах.
Вместо этого викор альтернативы:
- YOLO/Detectron2: для обнаружения объектов в начале занятий
- Mask2Former: для семантической/панорамной сегментации по категориям.
- GroundingDINO + SAM: для сегментации по текстовому запросу.
- SAM 2: для задач сегментации видео
Быстрый старт
Установка
# Из GitHub
pipinstallgit+https://github.com/facebookresearch/segment-anything.git
# Опциональные зависимости
pipinstallopencv-pythonpycocotoolsmatplotlib
# Или используйте HuggingFace transformers
pipinstalltransformers
importnumpyasnpfromsegment_anythingimportsam_model_registry,SamPredictor# Загрузка моделиsam=sam_model_registry["vit_h"](https://github.com/NousResearch/hermes-agent/blob/main/skills/mlops/models/segment-anything/checkpoint="sam_vit_h_4b8939.pth")sam.to(device="cuda")# Создание предиктораpredictor=SamPredictor(sam)# Установка изображения (вычисляет эмбеддинги один раз)image=cv2.imread("image.jpg")image=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)predictor.set_image(image)# Предсказание с точечными подсказкамиinput_point=np.array([[500,375]])# координаты (x, y)input_label=np.array([1])# 1 = передний план, 0 = фонmasks,scores,logits=predictor.predict(point_coords=input_point,point_labels=input_label,multimask_output=True# Возвращает 3 варианта маски)# Выбор лучшей маскиbest_mask=masks[np.argmax(scores)]
Трансформеры HuggingFace
importtorchfromPILimportImagefromtransformersimportSamModel,SamProcessor# Загрузка модели и процессораmodel=SamModel.from_pretrained("facebook/sam-vit-huge")processor=SamProcessor.from_pretrained("facebook/sam-vit-huge")model.to("cuda")# Обработка изображения с точечной подсказкойimage=Image.open("image.jpg")input_points=[[[450,600]]]# Пакет точекinputs=processor(image,input_points=input_points,return_tensors="pt")inputs={k:v.to("cuda")fork,vininputs.items()}# Генерация масокwithtorch.no_grad():outputs=model(**inputs)# Постобработка масок до исходного размераmasks=processor.image_processor.post_process_masks(outputs.pred_masks.cpu(),inputs["original_sizes"].cpu(),inputs["reshaped_input_sizes"].cpu())
# Одна точка переднего планаinput_point=np.array([[500,375]])input_label=np.array([1])masks,scores,logits=predictor.predict(point_coords=input_point,point_labels=input_label,multimask_output=True)# Несколько точек (передний план + фон)input_points=np.array([[500,375],[600,400],[450,300]])input_labels=np.array([1,1,0])# 2 переднего плана, 1 фонmasks,scores,logits=predictor.predict(point_coords=input_points,point_labels=input_labels,multimask_output=False# Одна маска, когда подсказки чёткие)
# Рамка + точки для точного контроляmasks,scores,logits=predictor.predict(point_coords=np.array([[500,375]]),point_labels=np.array([1]),box=np.array([400,300,700,600]),multimask_output=False)
Итеративное определение
# Первоначальное предсказаниеmasks,scores,logits=predictor.predict(point_coords=np.array([[500,375]]),point_labels=np.array([1]),multimask_output=True)# Уточнение с дополнительной точкой, используя предыдущую маскуmasks,scores,logits=predictor.predict(point_coords=np.array([[500,375],[550,400]]),point_labels=np.array([1,0]),# Добавить фоновую точкуmask_input=logits[np.argmax(scores)][None,:,:],# Использовать лучшую маскуmultimask_output=False)
Автоматическая генерация масок
Базовая автоматическая сегментация
fromsegment_anythingimportSamAutomaticMaskGenerator# Создание генератораmask_generator=SamAutomaticMaskGenerator(sam)# Генерация всех масокmasks=mask_generator.generate(image)# Каждая маска содержит:# - segmentation: бинарная маска# - bbox: [x, y, w, h]# - area: количество пикселей# - predicted_iou: оценка качества# - stability_score: оценка устойчивости# - point_coords: порождающая точка
Настраиваемая генерация
mask_generator=SamAutomaticMaskGenerator(model=sam,points_per_side=32,# Плотность сетки (больше = больше масок)pred_iou_thresh=0.88,# Порог качестваstability_score_thresh=0.95,# Порог устойчивостиcrop_n_layers=1,# Многомасштабные кадрированияcrop_n_points_downscale_factor=2,min_mask_region_area=100,# Удаление крошечных масок)masks=mask_generator.generate(image)
Фильтрация масок
# Сортировка по площади (сначала самые большие)masks=sorted(masks,key=lambdax:x['area'],reverse=True)# Фильтрация по предсказанному IoUhigh_quality=[mforminmasksifm['predicted_iou']>0.9]# Фильтрация по оценке устойчивостиstable_masks=[mforminmasksifm['stability_score']>0.95]
Пакетный вывод
Несколько изображений
# Эффективная обработка нескольких изображенийimages=[cv2.imread(f"image_{i}.jpg")foriinrange(10)]all_masks=[]forimageinimages:predictor.set_image(image)masks,_,_=predictor.predict(point_coords=np.array([[500,375]]),point_labels=np.array([1]),multimask_output=True)all_masks.append(masks)
importonnxruntime# Загрузка ONNX моделиort_session=onnxruntime.InferenceSession("sam_onnx.onnx")# Запуск вывода (эмбеддинги изображения вычисляются отдельно)masks=ort_session.run(None,{"image_embeddings":image_embeddings,"point_coords":point_coords,"point_labels":point_labels,"mask_input":np.zeros((1,1,256,256),dtype=np.float32),"has_mask_input":np.array([0],dtype=np.float32),"orig_im_size":np.array([h,w],dtype=np.float32)})
Типовые рабочие процессы
Рабочий процесс 1: Аннотации инструментов
importcv2# Загрузка моделиpredictor=SamPredictor(sam)predictor.set_image(image)defon_click(event,x,y,flags,param):ifevent==cv2.EVENT_LBUTTONDOWN:# Точка переднего планаmasks,scores,_=predictor.predict(point_coords=np.array([[x,y]]),point_labels=np.array([1]),multimask_output=True)# Отображение лучшей маскиdisplay_mask(masks[np.argmax(scores)])
Рабочий процесс 2: Извлечение объекта
defextract_object(image,point):"""Извлекает объект в точке с прозрачным фоном."""predictor.set_image(image)masks,scores,_=predictor.predict(point_coords=np.array([point]),point_labels=np.array([1]),multimask_output=True)best_mask=masks[np.argmax(scores)]# Создание RGBA выводаrgba=np.zeros((image.shape[0],image.shape[1],4),dtype=np.uint8)rgba[:,:,:3]=imagergba[:,:,3]=best_mask*255returnrgba
Рабочий процесс 3: Сегментация медицинских изображений
# Обработка медицинских изображений (оттенки серого в RGB)medical_image=cv2.imread("scan.png",cv2.IMREAD_GRAYSCALE)rgb_image=cv2.cvtColor(medical_image,cv2.COLOR_GRAY2RGB)predictor.set_image(rgb_image)# Сегментация области интересаmasks,scores,_=predictor.predict(box=np.array([x1,y1,x2,y2]),# Ограничивающая рамка ROImultimask_output=True)
Формат
Структура данных маскирует
# Вывод SamAutomaticMaskGenerator{"segmentation":np.ndarray,# H×W бинарная маска"bbox":[x,y,w,h],# Ограничивающая рамка"area":int,# Количество пикселей"predicted_iou":float,# Оценка качества 0-1"stability_score":float,# Оценка устойчивости 0-1"crop_box":[x,y,w,h],# Область кадрирования генерации"point_coords":[[x,y]],# Входная точка}
Формат COCO RLE
frompycocotoolsimportmaskasmask_utils# Кодирование маски в RLErle=mask_utils.encode(np.asfortranarray(mask.astype(np.uint8)))rle["counts"]=rle["counts"].decode("utf-8")# Декодирование RLE в маскуdecoded_mask=mask_utils.decode(rle)
Оптимизация производительности
Память GPU
# Используйте меньшую модель для ограниченной VRAMsam=sam_model_registry["vit_b"](https://github.com/NousResearch/hermes-agent/blob/main/skills/mlops/models/segment-anything/checkpoint="sam_vit_b_01ec64.pth")# Обрабатывайте изображения пакетами# Очищайте кэш CUDA между большими пакетамиtorch.cuda.empty_cache()
Оптимизация скорости
# Используйте половинную точностьsam=sam.half()# Уменьшите количество точек для автоматической генерацииmask_generator=SamAutomaticMaskGenerator(model=sam,points_per_side=16,# По умолчанию 32)# Используйте ONNX для развёртывания# Экспортируйте с --return-single-mask для более быстрого вывода
Частные проблемы
Проблема
Решение
Не хватает памяти
Используйте модель ViT-B, уменьшите размер изображения
Медленный вывод
Используйте ViT-B, уменьшите Points_per_side
Плохое качество маски
посмотрите другие подсказки, воспользуйтесь рамкой + точки