Обработка визуального языка с помощью диалогово-ориентированного подхода и Amazon SageMaker JumpStart.
Применение диалогово-ориентированного подхода и Amazon SageMaker JumpStart для обработки визуального языка.
Обработка визуального языка (VLP) находится во внимании генеративного искусственного интеллекта, подталкивающего развитие мультимодального обучения, которое охватывает языковой интеллект, понимание и обработку зрительной информации. Сочетая в себе большие модели языка (LLM) и предварительное обучение контрастным языком-изображением (CLIP) с использованием большого объема данных мультимодальности, визуальные языковые модели (VLM) особенно хорошо справляются с такими задачами, как подпись изображений, обнаружение и сегментация объектов, а также ответы на визуальные вопросы. Их применение охватывает различные области, от медиа-развлечений до медицинской диагностики и контроля качества в производстве.
Основные преимущества VLP включают эффективное использование предварительно обученных VLM и LLM, позволяющих делать предсказания без доработки под конкретную задачу, а также категоризацию изображений на широком спектре при помощи неформального многокруглого диалога. С использованием дополнительного модуля Grounded Segment Anything VLP проявляет умение в визуальном распознавании, при этом обнаружение и сегментация объектов являются особенно заметными. Существует потенциал для дополнительного настройки VLM и LLM с использованием данных, специфичных для конкретной области, с целью повышения точности и снижения галлюцинаций. Однако, как и для других новых технологий, существуют препятствия в управлении сложностью модели, гармонизации различных модальностей и разработке единых метрик оценки.
Благодарность NOMIC для OBELICS, HuggingFaceM4 для IDEFICS, Charles Bensimon для Gradio и Amazon Polly для TTS
В этом посте мы исследуем технические тонкости создания прототипа VLP с использованием Amazon SageMaker JumpStart в сочетании с современными генеративными моделями искусственного интеллекта. Через многокруглые диалоги мы подчеркиваем возможности инструкционно-ориентированной обработки зрительных языков с нулевым шагом и небольшим числом примеров, акцентируя его универсальность и стремясь привлечь интерес широкого мультимодального сообщества. Демонстрационный код реализации доступен в следующем репозитории GitHub.
- Познакомьтесь с Wonder3D новым методом искусственного интеллекта для эффективного создания высокодетализированных текстурированных 3D-моделей на основе изображений с одним ракурсом.
- Как компания Reveal’s Logikcull использовала Amazon Comprehend для обнаружения и замены личной идентифицирующей информации в юридических документах в больших масштабах.
- Расшифровка математики в изображениях Как новый стандарт MathVista превышает границы искусственного интеллекта в визуальном и математическом мышлении
Обзор решения
Предлагаемое решение VLP интегрирует набор передовых модулей генеративного искусственного интеллекта для получения точных мультимодальных выводов. Центральными элементами архитектуры являются настроенные VLM и LLM, оба необходимы для декодирования визуальных и текстовых данных. В основе служит фреймворк TGI, предоставляющий RESTful API для надежной интеграции и легкого доступа. Дополняя нашу аудиовизуальную обработку данных, Whisper ASR также оснащен RESTful API, обеспечивающим простое преобразование речи в текст. Для решения сложных задач, таких как сегментация изображений в текст, мы используем контейниризованный модуль Grounded Segment Anything, сотрудничающий с механизмом Grounded DINO и Segment Anything Model (SAM) для обнаружения и сегментации объектов на основе текста. Система дополнительно оптимизирована с использованием DistilBERT, что улучшает наш процесс диалогового многоклассового классификации. Оркестрирование этих компонентов осуществляется через обработку текстовых цепочек (LangChain), сложный механизм, способный разбирать текстовые или голосовые входы, определять намерения пользователей и методично делегировать подзадачи соответствующим сервисам. Синтез этих операций дает агрегированный вывод, обеспечивая точные и контекстно-ориентированные мультимодальные ответы.
Следующая диаграмма иллюстрирует архитектуру нашего решения VLP с диалоговым управлением.
Инференция генерации текста
Инференция генерации текста (TGI) – это набор инструментов с открытым исходным кодом, разработанный Hugging Face для развертывания LLM и VLM в процессе инференции. Он обеспечивает высокопроизводительную генерацию текста с использованием тензорного параллелизма, модельного параллелизма и динамической пакетизации, поддерживая некоторые ведущие открытые LLM, такие как Falcon и Llama V2, а также VLM, такие как IDEFICS. С использованием последних модулей Hugging Face LLM на Amazon SageMaker, клиенты AWS теперь могут использовать мощь контейнеров глубокого обучения SageMaker (DLC). Это позволяет мгновенное развертывание LLM из хабов Hugging Face через предварительно созданные DLC SageMaker DLC с поддержкой TGI. Эта установка инференции не только обеспечивает исключительную производительность, но и устраняет необходимость в управлении ресурсами GPU. Кроме того, вы получаете преимущества передовых функций, таких как автомасштабирование конечных точек инференции, улучшенная безопасность и встроенное отслеживание модели.
TGI предлагает скорости генерации текста до 100 раз быстрее, чем традиционные методы вывода, и эффективно масштабируется для обработки увеличенных запросов. Его конструкция обеспечивает совместимость с различными LLM и, будучи с открытым исходным кодом, демократизирует передовые функции для технологического сообщества. Универсальность TGI простирается через различные области, улучшая чат-боты, улучшая машинные переводы, суммируя тексты и генерируя разнообразный контент, от поэзии до кода. Таким образом, TGI выступает в качестве всестороннего решения для лиц, стоящих перед задачами генерации текста. TGI реализован на языке Python и использует фреймворк PyTorch. Он является открытым и доступным на GitHub. Он также поддерживает PEFT с QLoRA для более быстрой производительности и логитовой деформации для управления атрибутами генерируемого текста, такими как его длина и многообразие, без изменения основной модели.
Вы можете создать настраиваемый контейнер Docker TGI непосредственно из следующего Dockerfile и затем загрузить контейнерное изображение в Elastic Container Registry (ECR) Amazon для развертывания вывода. См. следующий код:
%%sh# Определение имени образа Docker и имени ресурса контейнера Amazon на ECRcontainer_name="tgi1.03"region=`aws configure get region`account=`aws sts get-caller-identity --query "Account" --output text`full_name="${account}.dkr.ecr.${region}.amazonaws.com/${container_name}:latest"# Получите команду для входа с ECR и выполните ее непосредственноaws ecr get-login-password --region ${region}|docker login --username AWS \ --password-stdin ${account}.dkr.ecr.${region}.amazonaws.com# Построение Docker-изображения TGI локальнодocker build . -f Dockerfile -t ${container_name}docker tag ${container_name} ${full_name}docker push ${full_name}
Пространственный список линейных моделей (LLM) с TGI
В этом посте решение VLP использует LLM в сочетании с LangChain, используя подход цепи мыслей (CoT) для более точной классификации намерений. CoT обрабатывает запросы для определения намерения и запуска связанных с ними подзадач для достижения цели запроса. Llama-2-7b-chat-hf (договор лицензии) является упрощенной версией линейки Llama-2, созданной для контекстов диалога. Вывод Llama-2-7b-chat-hf осуществляется с помощью контейнерного образа TGI, что позволяет использовать его как сервис с поддержкой API.
Для вывода Llama-2-7b-chat-hf рекомендуется использовать g5.2xlarge (24G VRAM) для достижения максимальной производительности. Для приложений, требующих более мощного LLM, модели Llama-v2-13b хорошо подходят для работы с экземпляром g5.12xlarge (96G VRAM). Для моделей Llama-2-70b рассмотрите возможность использования GPU [2xlarge] – 2x Nvidia A100 с использованием квантования bitsandbytes или g5.48xlarge. Следует отметить, что использование квантования bitsandbytes может сократить требуемый объем VRAM GPU для вывода на 50%.
Вы можете использовать SageMaker DLC с ранее описанным контейнерным образом TGI для развертывания Llama-2-7b-chat-hf для вывода (см. следующий код). В качестве альтернативы вы можете быстро развернуть локальный вывод для подтверждения концепции на экземпляре g5.2xlarge с использованием контейнера Docker.
import jsonfrom time import gmtime, strftimefrom sagemaker.huggingface import get_huggingface_llm_image_urifrom sagemaker.huggingface import HuggingFaceModelfrom sagemaker import get_execution_role# Предварительные требования: создайте уникальное имя моделиmodel_name = 'Llama-7b-chat-hf' + strftime("%Y-%m-%d-%H-%M-%S", gmtime())# получение URI образа llm DLC TGI v1.03 предварительно созданного SageMaker llm_image_ecr_uri = get_huggingface_llm_image_uri( "huggingface", version="1.0.3")# Определение параметров модели и конфигурации конечной точкиhf_config = { 'HF_MODEL_ID': "meta-research/Llama-2-7b-chat-hf", # Соответствует model_id на Hugging Face Hub 'SM_NUM_GPUS': json.dumps(number_of_gpu), 'MAX_TOTAL_TOKENS': json.dumps(1024), 'HF_MODEL_QUANTIZE': "bitsandbytes", # Использовать квантование для сокращения требуемого объема VRAM, комментируйте, если это не требуется}# Создание HuggingFaceModel с предварительно созданным контейнером DLC TGIllm_model = HuggingFaceModel( role=get_execution_role(), image_uri=tgi_image_ecr_uri, env=hf_config)# развертывание модельлм = sm_llm_model.deploy( initial_instance_count=1, instance_type="ml.g5.2xlarge", container_startup_health_check_timeout=300, # в секундах. Дайте 5 минут для загрузки модели)# определение входных данных для выводапромпт="""<|prompter|>How to select a right LLM for your generative AI project?<|endoftext|><|assistant|>"""# гиперпараметры для llmpayload = { "inputs": prompt, "parameters": { "best_of": 1, "decoder_input_details": true, "details": true, "do_sample": true, "max_new_tokens": 20, "repetition_penalty": 1.03, "return_full_text": false, "seed": null, "stop": [ "photographer" ], "temperature": 0.5, "top_k": 10, "top_p": 0.95, "truncate": null, "typical_p": 0.95, "watermark": true }, "stream": false}# отправка запроса на выводresponse = llm.predict(payload)
Настройка и настраиваемый LLM
SageMaker JumpStart предлагает множество образцов блокнотов, демонстрирующих использование параметрической оптимизации Fine Tuning (PEFT), включая QLoRA для обучения и настройки LLM. QLoRA поддерживает веса предварительно обученных моделей в статическом состоянии и вводит обучающиеся ранговые матрицы декомпозиции в каждый слой структуры Transformer. Этот метод существенно уменьшает количество обучаемых параметров, необходимых для последующих задач.
В качестве альтернативы вы можете исследовать непосредственную оптимизацию предпочтений(DPO), которая исключает необходимость установки модели вознаграждения, получения образцов во время настройки из LLM или обширной настройки гиперпараметров. Недавние исследования показали, что настройка DPO превосходит RLHF в управлении генерацией настроения и повышении качества сводок и ответов в одиночных разговорах, при этом значительно легче настраивается и обучается. Процесс обучения DPO состоит из трех основных шагов (подробности см. в GitHub репо):
- Выполните контролируемую настройку предварительно обученной базовой LLM, чтобы создать настраиваемый LLM.
- Запустите тренер DPO, используя настроенную модель, чтобы создать модель обучения с подкреплением.
- Объедините адаптеры из DPO в базовую модель LLM для генерации текста вывода.
Вы можете развернуть объединенную модель для вывода, используя контейнерное изображение TGI.
Визуальная языковая модель
Визуальные языковые модели (VLM), объединяющие визуальную и языковую модальности, все чаще проявляют свою эффективность в обобщении, что приводит к различным практическим случаям использования с нулевыми или несколькими образцами с инструкциями. VLM обычно состоит из трех ключевых элементов: кодировщика изображений, кодировщика текста и стратегии объединения информации из двух кодировщиков. Эти ключевые элементы тесно связаны друг с другом, потому что функции потерь разработаны вокруг как архитектуры модели, так и стратегии обучения. Множество современных VLM используют CLIP/ViT (например, OpenCLIP) и LLM (например, Llama-v1) и обучаются на нескольких общедоступных наборах данных, таких как Wikipedia, LAION и Public Multimodal Dataset.
В этой демонстрации использовалась предварительно обученная модель IDEFICS-9b-instruct, разработанная HuggingFaceM4, настраиваемая версия IDEFICS-9b, в соответствии с процедурой обучения, описанной в Flamingo путем объединения двух предварительно обученных моделей (laion/CLIP-ViT-H-14-laion2B-s32B-b79K и huggyllama/llama-7b) с модифицированными блоками Transformer. IDEFICS-9b обучалась на наборах данных OBELIC, Wikipedia, LAION и PMD с общим количеством 150 миллиардов токенов и 1,582 миллиарда изображений с разрешением 224×224 каждое. IDEFICS-9b основывалась на Llama-7b с эффективным размером партии 1,31 миллиона. Затем IDEFICS-9b-instruct была настроена с использованием 6,8 миллиона наборов данных с мультимодальными инструкциями, созданных с помощью генеративного искусственного интеллекта, с размораживанием всех параметров (кодировщика изображений, языковой модели, перекрестных вниманий). Наборы данных для настройки включают данные предварительного обучения с соответствующими коэффициентами выборки: 5,1% пар изображений и текста и 30,7% мультимодальных веб-документов OBELICS.
Программное обеспечение для обучения построено на основе фреймворка Hugging Face Transformers и Accelerate, а также использовались DeepSpeed ZeRO-3 для обучения, WebDataset и Image2DataSets для загрузки данных. Предварительное обучение IDEFICS-9b заняло 350 часов на 128 графических процессорах Nvidia A100, тогда как настройка IDEFICS-9b-instruct заняла 70 часов на 128 графических процессорах Nvidia A100, оба эксперимента проводились на экземплярах AWS p4.24xlarge.
С помощью SageMaker вы можете без проблем развернуть IDEFICS-9b-instruct на экземпляре g5.2xlarge для задач вывода. В следующем коде показано, как запустить настраиваемый контейнер для глубокого обучения, интегрированный с пользовательским образом Docker для TGI:
%%shllm_model='HuggingFaceM4/idefics-9b-instruct'docker_rt_name='idefics-9b-instruct'docker_image_name='tgi1.03'docker run --gpus="1,2,3,4" --shm-size 20g -p 8080:80 --restart unless-stopped --name ${docker_rt_name} ${docker_image_name} --model-id ${llm_model}# Протестируйте LLM API с помощью curlcurl -X 'POST' \ 'http://<hostname_or_ip>:8080/' \ -H 'accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "inputs": "Пользователь:Какое устройство создало эту картинку? Пожалуйста, объясните основное клиническое назначение такой картинки? Можете ли вы написать радиологический отчет на основе этой картинки?<end_of_utterance>", \
"parameters": { "best_of": 1, "decoder_input_details": true, \ "details": true, "do_sample": true, "max_new_tokens": 20, \ "repetition_penalty": 1.03, "return_full_text": false, \ "seed": null, "stop": [ "фотограф" ], \ "temperature": 0.5, "top_k": 10, "top_p": 0.95, \ "truncate": null, "typical_p": 0.95, "watermark": true }, \ "stream": false \ }'
Вы можете настроить IDEFICS или другие VLM, включая Open Flamingo, с использованием своих собственных данных, специфичных для домена, с инструкциями. См. следующий README для подготовки мультимодального набора данных и сценарий настройки для получения дополнительной информации.
Классификация намерений с применением цепи мысли
Картинка стоит тысячи слов, поэтому для VLM требуется руководство для генерации точного заголовка по заданной картинке и вопросу. Мы можем использовать few-shot prompting для обеспечения контекстного обучения, где мы предоставляем демонстрации в промпте, чтобы направить модель на лучшую производительность. Демонстрации служат как условия для последующих примеров, в которых мы хотим, чтобы модель генерировала ответ.
Стандартный метод few-shot prompting хорошо работает для многих задач, но не является идеальным, особенно при работе с более сложными задачами рассуждения. Шаблон few-shot prompting недостаточно для получения надежных ответов. Возможно, поможет разбить проблему на шаги и продемонстрировать их модели. В последнее время chain-of-thought (CoT) prompting стал популярным средством для решения более сложных арифметических, здравого смысла и символического рассуждения.
CoT устраняет ручные усилия с помощью LLM с промптом “Давайте думать шаг за шагом”, чтобы генерировать цепи рассуждения для демонстраций по одной. Однако этот автоматический процесс может все же приводить к ошибкам в созданных цепях. Для смягчения эффектов ошибок важна разнообразность демонстраций. В этом посте предлагается Auto-CoT, которая выбирает вопросы с разнообразием и генерирует цепи рассуждения для создания демонстраций. CoT состоит из двух основных этапов:
- Кластеризация вопросов – Разделение вопросов заданного набора данных на несколько кластеров
- Выбор демонстрации – Выбор представительного вопроса из каждого кластера и генерация его цепи рассуждения с помощью zero-shot CoT с простыми эвристиками
См. следующий фрагмент кода:
from langchain.llms import HuggingFaceTextGenInferencefrom langchain import PromptTemplate, LLMChaininference_server_url_local = <Your_local_url_for_llm_on_tgi:port>llm_local = HuggingFaceTextGenInference( inference_server_url=inference_server_url_local, max_new_tokens=512, top_k=10, top_p=0.95, typical_p=0.95, temperature=0.1, repetition_penalty=1.05, template = """Используйте следующие части контекста, чтобы ответить на вопрос в конце. Если вы не знаете ответа, просто скажите, что не знаете, не пытайтесь придумать ответ. Используйте максимум пятьдесят знаков и формулируйте ответ как можно неприметнее. Подробно перечислите все действия поэтапно. Будьте осторожны, чтобы не повторять формулировки, которые могут повторяться. Это поможет получить точный и подробный ответ. Избегайте повторов для ясности.Вопрос: {question}Ответ: Понять намерение вопроса, а затем разбить {question} на подзадачи поэтапно."""prompt = PromptTemplate( template=template, input_variables= ["question"])llm_chain_local = LLMChain(prompt=prompt, llm=llm_local)llm_chain_local("Можете описать природу этой картинки? Вы считаете ее настоящей?")
Распознавание речи
Решение VLP включает Whisper – модель автоматического распознавания речи (ASR), разработанную OpenAI, для обработки аудио запросов. Whisper легко развертывается с помощью SageMaker JumpStart, используя его шаблон. SageMaker JumpStart, известный своей простой настройкой, высокой производительностью, масштабируемостью и надежностью, идеально подходит для разработчиков, которые стремятся создавать выдающиеся приложения, работающие с голосом. В следующем репозитории GitHub repo показано, как использовать реальное время SageMaker для настройки и хостинга Whisper для мгновенного преобразования аудио в текст, демонстрируя синергию между хостингом SageMaker и генеративными моделями.
Кроме того, вы можете прямо скачать Dockerfile.gpu из GitHub, разработанный ahmetoner, включающий предварительно настроенный RESTful API. Затем вы можете создать Docker-образ и запустить контейнер на GPU-совместимом инстансе Amazon Elastic Compute Cloud (EC2) для быстрого подтверждения концепции. Смотрите следующий код:
%%shdocker_iamge_name = 'whisper-asr-webservice-gpu'docker build -f Dockerfile.gpu -t ${docker_iamge_nam}docker run -d --gpus all -p 8083:9000 --restart unless-stopped -e ASR_MODEL=base ${docker_iamge_nam}curl -X 'POST' \ 'http://<asr_api_hostname>:<port>/asr?task=transcribe&encode=true&output=txt' \ -H 'accept: application/json' \ -H 'Content-Type: multipart/form-data' \ -F 'audio_file=@dgvlp_3_5.mp3;type=audio/mpeg'
В предоставленном примере выбран порт 8083 для хостинга Whisper API с активированными правилами безопасности сети. Чтобы протестировать, направьте веб-браузер по адресу http://<IP_или_имя_хоста>:8083/docs
и выполните POST-запрос к конечной точке ASR. В качестве альтернативы можно выполнить указанную команду или использовать модуль whisper-live для проверки подключения к API.
!pip install whisper-livefrom whisper_live.client import TranscriptionClientclient = TranscriptionClient("<whisper_hostname_или_IP>", 8083, is_multilingual=True, lang="zh", translate=True)client(audio_file_path) # Использование аудио-файлаclient() # Использование микрофона для транскрипции
Многоклассовая классификация текста и извлечение ключевых слов
Многоклассовая классификация играет важную роль в обнаружении объектов и сегментации, связанных с текстовыми подсказками. Модель distilbert-base-uncased-finetuned-sst-2-english является оптимизированной версией DistilBERT-base-uncased, подготовленной на наборе данных Stanford Sentiment Treebank (SST2) компанией Hugging Face. Эта модель достигает точности 91,3% на развивающей выборке, в то время как ее аналог bert-base-uncased имеет точность 92,7%. Фреймворк Hugging Face Hub предоставляет доступ к более чем 1000 предварительно обученным моделям классификации текста. Для тех, кто стремится к улучшенной точности, SageMaker JumpStart предоставляет шаблоны для индивидуальной настройки DistilBERT с использованием настраиваемых аннотированных наборов данных для более точных задач классификации.
import torchfrom transformers import pipelinedef mclass(text_prompt, top_k=3, topics = ['Создание маски', 'Обнаружение объекта', 'Восстановление', 'Сегментация', 'Масштабирование', 'Создание изображения из другого', 'Генерация изображения из текста'], model='distilbert-base-uncased-finetuned-sst-2-english'): device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') # Определение шаблона гипотезы на немецком и потенциальных кандидатов для вывода/противоречия template_de = 'Тема: {}' # Абстракция Pipeline от Hugging Face pipe = pipeline(task='zero-shot-classification', model=model, tokenizer=model, device=device) # Запуск Pipeline с тестовым примером prediction = pipe(text_prompt, topics, hypothesis_template=template_de) # Топ 3 предсказанных темы в режиме zero-shot return zip(prediction['labels'][0:top_k], prediction['scores'][0:top_k])top_3_intend = mclass(text_prompt=user_prompt_str, topics=['Другое', 'Создание маски изображения', 'Сегментация изображений'], top_k=3)
Процесс извлечения ключевых слов использует модуль KeyBERT, который использует встроенные в BERT эмбеддинги для генерации ключевых слов и ключевых фраз, близких к документу — в данном случае, к объектам, указанным в запросе:
# Извлечение ключевых словиз keybert импортируется KeyBERTkw_model = KeyBERT()words_list = kw_model.extract_keywords(docs=<user_prompt_str>, keyphrase_ngram_range=(1,3))
Обнаружение и классификация объектов по текстовым подсказкам
Решение VLP использует обнаружение и сегментацию объектов с помощью анализа семантического значения текста и определения действия и объектов по текстовой подсказке. Grounded-SAM — это пакет с открытым исходным кодом, созданный IDEA-Research для обнаружения и сегментации объектов на основе текстовых входных данных. Он объединяет преимущества Grounding DINO и Segment Anything, чтобы создать очень мощный инструментарий для решения сложных проблем.
На следующей схеме показано, как Grounded-SAM может обнаруживать объекты и выполнять сегментацию экземпляров, основываясь на текстовом вводе.
SAM является надежной моделью сегментации, хотя ей требуются подсказки, такие как ограничивающие рамки или точки, для создания масок объектов высокого качества. Grounding DINO отличается как нулевым детектором, который умело создает коробки и ярлыки высокого качества с использованием свободного текстового ввода. Когда эти две модели объединяются, они обладают удивительной способностью обнаруживать и сегментировать любой объект исключительно по текстовым входам. Был разработан утилитарный скрипт на Python dino_sam_inpainting.py для интеграции методов Grounded-SAM:
!pip install git+https://github.com/facebookresearch/segment-anything.gitimport dino_sam_inpainting as Ddef dino_sam(image_path, text_prompt, text_threshold=0.4, box_threshold=0.5, output_dir='/temp/gradio/outputs'): config_file = 'GroundingDINO/groundingdino/config/GroundingDINO_SwinT_OGC.py' # измените путь к файлу конфигурации модели grounded_checkpoint = './models/groundingdino_swint_ogc.pth' # измените путь к модели sam_checkpoint = './models/sam_vit_h_4b8939.pth' sam_hq_checkpoint = '' # if to use high quality, like sam_hq_vit_h.pth use_sam_hq = '' output_dir = '/tmp/gradio/outputs' device = 'cuda' # создание директории os.makedirs(output_dir, exist_ok=True) # загрузка изображения image_pil, image = D.load_image(image_path) # загрузка модели model = D.load_model(config_file, grounded_checkpoint, device=device) output_file_name = f'{format(os.path.basename(image_path))}' # визуализация исходного изображения image_pil.save(os.path.join(output_dir, output_file_name)) # выполнение модели Grounding DINO boxes_filt, pred_phrases = D.get_grounding_output( model, image, text_prompt, box_threshold, text_threshold, device=device ) # инициализация SAM if use_sam_hq: predictor = D.SamPredictor(D.build_sam_hq(checkpoint=sam_hq_checkpoint).to(device)) else: predictor = D.SamPredictor(D.build_sam(checkpoint=sam_checkpoint).to(device)) image = cv2.imread(image_path) image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) predictor.set_image(image) size = image_pil.size H, W = size[1], size[0] for i in range(boxes_filt.size(0)): boxes_filt[i] = boxes_filt[i] * torch.Tensor([W, H, W, H]) boxes_filt[i][:2] -= boxes_filt[i][2:] / 2 boxes_filt[i][2:] += boxes_filt[i][:2] boxes_filt = boxes_filt.cpu() transformed_boxes = predictor.transform.apply_boxes_torch(boxes_filt, image.shape[:2]).to(device) masks, _, _ = predictor.predict_torch( point_coords = None, point_labels = None, boxes = transformed_boxes.to(device), multimask_output = False, ) # создание выходного изображения plt.figure(figsize=(10, 10)) plt.imshow(image) for mask in masks: D.show_mask(mask.cpu().numpy(), plt.gca(), random_color=True) for box, label in zip(boxes_filt, pred_phrases): D.show_box(box.numpy(), plt.gca(), label) output_file_name = f'{format(os.path.basename(image_path))}' plt.axis('off') plt.savefig( os.path.join(output_dir, f'grounded_sam_{output_file_name}'), bbox_inches="tight", dpi=300, pad_inches=0.0 ) D.save_mask_data(output_dir, masks, boxes_filt, pred_phrases) return f'grounded_sam_{output_file_name}' filename = dino_sam(image_path=<image_path_str>, text_prompt=<object_name_str>, output_dir=<output_image_filename_path_str>, box_threshold=0.5, text_threshold=0.55)
Вы можете выбрать HQ-SAM для обновления SAM для высококачественной сегментации без нулевого шага. Получить дополнительные сведения можно в следующей статье и образце кода на GitHub.
Обработка VLP-процессов
Основная цель обработки VLP-процессов – объединение преимуществ различных моделей, создание сложного рабочего процесса, специализированного для VLP. Важно отметить, что этот подход приоритетно предоставляет интеграцию лучших моделей визуальной, текстовой и голосовой областей. Каждый сегмент этого рабочего процесса является модульным, облегчающим как отдельное использование, так и совместную работу. Кроме того, дизайн обеспечивает гибкость, позволяющую заменить компоненты более продвинутыми моделями, которые скоро появятся, а также поддерживает многопоточность и обработку ошибок с использованием надежной реализации.
Следующая иллюстрация показывает поток данных и компоненты сервиса в рабочем процессе VLP:
В ходе исследования VLP-конвейера мы разработали конвейер, который может обрабатывать текстовые запросы в открытом текстовом формате и обычные голосовые вводы с помощью микрофонов. Обработка аудио обеспечивается Whisper, способным к многоязычному распознаванию и переводу речи. Транскрибированный текст затем направляется в модуль классификации намерений, который определяет семантическую суть запросов. Это работает совместно с двигателем CoT, управляемым LangChain, который разбивает основное намерение на более мелкие подзадачи для получения более подробной информации и генерации. Если из входных данных выводится обработка изображений, то конвейер начинает процесс извлечения ключевых слов, выбирая лучшие N ключевых слов путем перекрестной ссылки на объекты, обнаруженные в исходном изображении. Затем эти ключевые слова поступают в двигатель Grounded-SAM, который генерирует ограничивающие рамки. Эти ограничивающие рамки затем поступают в модель SAM, которая создает точные маски сегментации, указывая каждый уникальный объект в исходном изображении. Завершающим шагом является наложение масок и ограничивающих рамок на исходное изображение, что приводит к обработанному изображению, представленному в виде мультимодального вывода.
Когда входной запрос направлен на интерпретацию изображения, конвейер привлекает LLM для организации подзадач и уточнения запроса с целевыми целями. Затем результат направляется в API VLM вместе с инструкциями для few-shot, URL входного изображения и переформулированным текстовым запросом. В ответе VLM предоставляется текстовый вывод. Конвейер VLP может быть реализован с использованием конвейера рабочих процессов на основе Python или альтернативных утилит оркестрирования. Такие конвейеры работают путем цепочки последовательного набора сложных моделей, что приводит к структурированной процедуре моделирования последовательного. Конвейер интегрируется с двигателем Gradio для демонстрационных целей:
def vlp_text_pipeline(str input_text, str original_image_path, chat_history): intent_class = intent_classification(input_text) key_words = keyword_extraction(input_text) image_caption = vlm(input_text, original_image_path) chat_history.append(image_caption) if intent_class in {поддерживаемые намерения}: object_bounding_box = object_detection(intent_class, key_words, original_image_path) mask_image_path = image_segmentation(object_bounding_box, key_words, original_image_path) chat_history.append(mask_image_path) return chat_history def vlp_voice_pipeline(str audio_file_path, str original_image_path, chat_history): asr_text = whisper_transcrib(audio_file_path) chat_history.append(asr_text, original_image_path, chat_history) return chat_history chat_history = map(vlp_pipelines, input_text, original_image_path, chat_history) \ if (audio_file_path is None) \ else map(vlp_voice_pipelines, original_image_path, chat_history)
Ограничения
Использование предварительно обученных моделей VLM для VLP показало большой потенциал в понимании изображений. Вместе с языковым обнаружением и сегментацией объектов, VLP может создавать полезные выводы с разумным качеством. Однако VLP по-прежнему страдает от неоднородных результатов, упущенных деталей на изображениях и даже возможных галлюцинаций. Кроме того, модели могут порождать фактически некорректный текст и не следует полагаться на них для получения фактически точной информации. Поскольку ни одна из обозначенных предварительно обученных моделей VLM, SAM или LLM не была обучена или настроена для прикладных задач в определенной компоненте, данное решение не предназначено для миссионно-критических задач, которые могут повлиять на средства обеспечения существования или привести к материальным потерям.
С помощью быстрой инженерии модель IDEFICS иногда может распознавать дополнительные детали после подсказки текста; однако результат далек от последовательности и надежности. Она может настойчиво сохранять неточности и может быть неспособной или нежелающей вносить коррективы, даже когда пользователи указывают на них во время разговора. Объединение базовой модели с помощью Swin-ViT и ее слияние с моделями на базе CNN, такими как DualToken-ViT, вместе с обучением с использованием более совершенных моделей, например, Llama-v2, может потенциально решить некоторые из этих ограничений.
Следующие шаги
Решение VLP готово к значительному прогрессу. Впереди нас ожидают несколько ключевых возможностей для развития решений VLP:
- Приоритизировать интеграцию динамических инструкций подсказок и подсказок для обучения с небольшим количеством данных. Эти улучшения позволят получить более точную обратную связь от искусственного интеллекта.
- Команды классификации намерений должны сосредоточить усилия на совершенствовании классификатора для выявления тонких, специфичных для домена намерений из открытых подсказок. Умение понимать точные намерения пользователя будет решающим фактором.
- Реализовать модель агентского дерева мыслей в процессе рассуждения. Эта структура позволит явным образом представить этапы рассуждения для выполнения подзадач.
- Провести пилотные работы по настройке ведущих моделей. Особое значение будет иметь настройка моделей VLM, LLM и SAM для ключевых отраслей и применений.
Благодарность
Авторы выражают свою благодарность Вивеку Мадану и Ашишу Равату за содержательные отзывы и рецензию на этот пост.