Мультимодальная большая модель для беспилотника и базовая практика с Grounding DINO
Мультимодальная большая языковая модель для беспилотника объединяет DeepSeek и мультимодальное открытое распознавание Grounding DINO. Так получается замкнутый цикл от самовосприятия до автономного поведения. Основные технологии:
- Grounding DINO — модель открытого распознавания: она возвращает метки и координаты различных объектов в окружении.
- DeepSeek обрабатывает пользовательский ввод согласно промпту и самостоятельно генерирует код, который может выполнить беспилотник, чтобы решить задачу.
Для руководства достаточно знать основы Python.
Если вы совсем новичок, можно сначала изучить другие руководства Datawhale, например happy-llm.
1. Окружение и основы
1. Windows
2. Python 3.10 или новее
3. torch
4. GroundingDINO
Инструкция по установке: https://github.com/IDEA-Research/GroundingDINO?tab=readme-ov-file
Клонируйте проект GroundingDINO с GitHub:
git clone https://github.com/IDEA-Research/GroundingDINO.git
Перейдите в папку GroundingDINO:
cd GroundingDINO/
Установите необходимые зависимости в этой папке:
pip install -e .
Загрузите предобученные веса модели:
mkdir weights
cd weights
wget -q https://github.com/IDEA-Research/GroundingDINO/releases/download/v0.1.0-alpha/groundingdino_swint_ogc.pth
cd ..
5. Среда AirSim
Среду AirSim можно запустить напрямую через файл House.exe из папки env.
Путь для загрузки: https://huggingface.co/datasets/Datawhale/house_win
Примечание. В исходном материале в папке
code/external-librariesлежат сторонние библиотеки (airsim 1.8.1, msgpack, tornado 4.5.3), которыеrobot_library.pyподключает черезsys.path.append('./external-libraries'). В учебнике эта папка не включена. Установите AirSim-клиент через pip (pip install airsim) и проверьте совместимость версий зависимостей. Тогда строкуsys.path.appendможно удалить.
6. Установка Gradio
Установите Gradio через pip:
pip install --upgrade gradio
2. Общая структура проекта
- Определена библиотека функций беспилотника.
- Большая языковая модель с помощью промпт-инжиниринга описывает задачу и управляет беспилотником для её выполнения.
- Grounding DINO выполняет открытое обнаружение объектов и распознаёт предметы, нужные для задачи.
- Диалог с большой языковой моделью выводится на веб-страницу.
3. Разбор кода
parser = argparse.ArgumentParser()
parser.add_argument("--prompt", type=str, default="prompts.txt")
parser.add_argument("--sysprompt", type=str, default="system_prompts.txt")
args = parser.parse_args()
Библиотека навыков беспилотника и системный промпт импортируются и используются как основа промпт-инжиниринга для большой языковой модели. Функции робота, определённые в файле, такие:
aw.takeoff():взлёт беспилотника.
aw.land():посадка беспилотника.
aw.get_image():получение изображения с фронтальной камеры агента.
aw.get_drone_position():возвращает текущее положение беспилотника в виде списка из трёх чисел с плавающей точкой, соответствующих координатам XYZ.
aw.turn(angle):поворачивает робота на заданный угол в градусах; angle — это угол.
aw.move(distance):перемещает робота прямо вперёд на заданное расстояние в метрах; distance — это расстояние.
aw.ob_objects(obj_name_list):возвращает наблюдаемые в окружении объекты с их названием, углом и расстоянием в виде списка [(имя_объекта1, расстояние, угол), (имя_объекта1, расстояние, угол), ...], где угол указан в градусах, например obj_name_list = ['yellow duck', 'coca cola', 'mirror', 'flower'].
Перед вызовом aw.ob_objects(obj_name_list) нужно сначала выполнить get_image(), чтобы получить информацию об изображении.
Для вызова большой языковой модели DeepSeek используется API. Замените your-key на свой ключ API, его можно получить здесь: https://platform.deepseek.com/api_keys
client = OpenAI(api_key="your-key", base_url="https://api.deepseek.com", http_client=httpx.Client(verify=False))
with open(args.sysprompt, "r", encoding="utf-8") as f:
sysprompt = f.read()
Ниже самый важный код большой языковой модели. Через созданный выше client выполняется вывод модели. В параметре model="deepseek-chat" значение deepseek-chat можно заменить на другую модель DeepSeek.
def ask(prompt):
chat_history.append(
{
"role": "user",
"content": prompt,
}
)
completion = client.chat.completions.create(
model="deepseek-chat",
messages=chat_history,
temperature=0
)
chat_history.append(
{
"role": "assistant",
"content": completion.choices[0].message.content,
}
)
return chat_history[-1]["content"]
Содержимое prompt.txt выглядит так:
Вопрос: можете задать мне уточняющий вопрос, но обязательно обозначьте его как «Вопрос».
Код:
python
здесь выводится команда кода, которая достигает ожидаемой цели.
Причина: после вывода кода нужно объяснить, зачем это сделано.
Видно, что промпт также может ограничивать вывод большой модели. Поскольку вывод уже ограничен, его можно обработать по-своему, с помощью функции extract_python_code.
def extract_python_code(content):
code_blocks = code_block_regex.findall(content)
if code_blocks:
full_code = "\n".join(code_blocks)
if full_code.startswith("python"):
full_code = full_code[7:]
return full_code
else:
return None
Вывод большой модели визуализируется через Gradio.
with gr.Blocks() as demo:
# gr.Markdown("# Мультимодальная большая языковая модель для беспилотника")
gr.Markdown("""
# Мультимодальная большая языковая модель для беспилотника
Мультимодальная большая языковая модель для беспилотника объединяет языковую модель DeepSeek и открытое мультимодальное распознавание Grounding DINO, формируя замкнутый цикл от самовосприятия до автономного поведения.
1. Grounding DINO — модель открытого распознавания: она возвращает метки и координаты различных объектов в окружении.
2. DeepSeek обрабатывает пользовательский ввод согласно промпту и самостоятельно генерирует код, который может выполнить беспилотник, чтобы решить задачу.
""")
with gr.Row():
with gr.Column():
chatbot = gr.Chatbot()
msg = gr.Textbox()
clear = gr.ClearButton([msg, chatbot])
def respond(message, chat_history):
response = ask(message)
bot_message = response
chat_history.append((message, bot_message))
code = extract_python_code(response)
if code is not None:
print("Пожалуйста, подождите, пока я выполню код в AirSim...")
exec(extract_python_code(response))
print("Готово!\n")
# time.sleep(2)
return "", chat_history
msg.submit(respond, [msg, chatbot], [msg, chatbot])
with gr.Column():
img = gr.Image("datawhale.jpg")
image_button = gr.Button("Display")
image_button.click(display_image, inputs=img, outputs=img)
demo.launch()
4. Порядок выполнения
1. Запустите файл house.exe из папки env, чтобы открыть среду
2. Запустите файл main_gradio.py
В терминале появится ссылка, откройте её в браузере:
Running on local URL: http://127.0.0.1:7860
To create a public link,set`share=True`in launch()
3. Введите в терминале команды 1), 2) и 3), чтобы выполнить задачи
1) Взлетай
Вы увидите следующий вывод, и код будет выполнен автоматически.
2) Найди yellow duck и подлети к нему
3) Спасибо
5. Ссылки
- Статья: ChatGPT for Robotics: Design Principles and Model Abilities
- Среда для сравнения: AIStudio — пример полёта беспилотника с помощью большой модели ERNIE (мультимодальная модель восприятия)