Instructions to use naver-ai/DroneCATS-Cosmos3-Edge-2B with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use naver-ai/DroneCATS-Cosmos3-Edge-2B with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("image-text-to-text", model="naver-ai/DroneCATS-Cosmos3-Edge-2B") messages = [ { "role": "user", "content": [ {"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"}, {"type": "text", "text": "What animal is on the candy?"} ] }, ] pipe(text=messages)# pip install -U transformers accelerate # Load model directly from transformers import AutoProcessor, AutoModelForMultimodalLM processor = AutoProcessor.from_pretrained("naver-ai/DroneCATS-Cosmos3-Edge-2B") model = AutoModelForMultimodalLM.from_pretrained("naver-ai/DroneCATS-Cosmos3-Edge-2B", device_map="auto") messages = [ { "role": "user", "content": [ {"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"}, {"type": "text", "text": "What animal is on the candy?"} ] }, ] inputs = processor.apply_chat_template( messages, add_generation_prompt=True, tokenize=True, return_dict=True, return_tensors="pt", ).to(model.device) outputs = model.generate(**inputs, max_new_tokens=256) print(processor.decode(outputs[0][inputs["input_ids"].shape[-1]:])) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use naver-ai/DroneCATS-Cosmos3-Edge-2B with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "naver-ai/DroneCATS-Cosmos3-Edge-2B" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "naver-ai/DroneCATS-Cosmos3-Edge-2B", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }'Use Docker
docker model run hf.co/naver-ai/DroneCATS-Cosmos3-Edge-2B
- SGLang
How to use naver-ai/DroneCATS-Cosmos3-Edge-2B with SGLang:
Install from pip and serve model
# Install SGLang from pip: pip install sglang # Start the SGLang server: python3 -m sglang.launch_server \ --model-path "naver-ai/DroneCATS-Cosmos3-Edge-2B" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "naver-ai/DroneCATS-Cosmos3-Edge-2B", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }'Use Docker images
docker run --gpus all \ --shm-size 32g \ -p 30000:30000 \ -v ~/.cache/huggingface:/root/.cache/huggingface \ --env "HF_TOKEN=<secret>" \ --ipc=host \ lmsysorg/sglang:latest \ python3 -m sglang.launch_server \ --model-path "naver-ai/DroneCATS-Cosmos3-Edge-2B" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "naver-ai/DroneCATS-Cosmos3-Edge-2B", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }' - Docker Model Runner
How to use naver-ai/DroneCATS-Cosmos3-Edge-2B with Docker Model Runner:
docker model run hf.co/naver-ai/DroneCATS-Cosmos3-Edge-2B
DroneCATS-Cosmos3-Edge-2B
The fine-tuned 2B drone model from DroneCATS. It takes one drone camera frame and a command, and returns one action in JSON.
Usage
Requires transformers>=5.18.0, torch, torchvision and accelerate.
pip install "transformers>=5.18.0" torch torchvision accelerate
import json, math, torch
from huggingface_hub import hf_hub_download
from PIL import Image
from transformers import AutoProcessor, Cosmos3EdgeForConditionalGeneration
repo = "naver-ai/DroneCATS-Cosmos3-Edge-2B"
model = Cosmos3EdgeForConditionalGeneration.from_pretrained(repo, dtype=torch.bfloat16, device_map="auto")
processor = AutoProcessor.from_pretrained(repo)
SYSTEM = open(hf_hub_download(repo, "prompts/system_prompt.txt")).read()
USER = open(hf_hub_download(repo, "prompts/user_prompt.txt")).read()
# Drone frame, at most 640 px wide
image = Image.open(hf_hub_download(repo, "examples/tello_egg_mid.jpg")).convert("RGB")
if image.width > 640:
image = image.resize((640, int(image.height * 640 / image.width)), Image.BOX)
w, h = image.size
# Camera intrinsics
hfov_deg = 56.4 # horizontal FOV of your camera (DJI Tello: 56.4)
k = 1 / (2 * math.tan(math.radians(hfov_deg) / 2))
fx = round(k * w, 2)
camera = json.dumps({"width": w, "height": h, "fx": fx, "fy": fx})
messages = [
{"role": "system", "content": [{"type": "text",
"text": SYSTEM.format(frame_w=w, frame_h=h, quarter_x=w // 4, quarter_y=h // 4)}]},
{"role": "user", "content": [
{"type": "text", "text": USER.format(instruction="go to the egg",
history="(none yet — this is the first step)")},
{"type": "image", "image": image, "camera_aux": camera},
]},
]
text = processor.apply_chat_template(messages, add_generation_prompt=True, tokenize=False,
enable_thinking=False, skip_reasoning=True)
inputs = processor(text=[text], images=[image], return_tensors="pt").to(model.device)
out = model.generate(**inputs, max_new_tokens=128, do_sample=False)
action = json.loads(processor.decode(out[0, inputs["input_ids"].shape[1]:], skip_special_tokens=True))
print(action) # {'action': 'go', 'point': [402, 656], 'depth_m': 3.2}
Use the prompt files as they are. The model was trained on exactly this wording.
Every image needs camera_aux, the JSON string with width, height, fx, fy built above. If it is missing, no error is raised, but the literal <|camera_aux|> placeholder stays in the prompt and the model gets an input it was not trained on.
Output
action |
Example | Meaning |
|---|---|---|
go |
{"action":"go","point":[402,656],"depth_m":3.2} |
Fly toward point, [x, y] on a 0–1000 grid over the image |
rotate |
{"action":"rotate","angle_deg":-90} |
Yaw in place. + = right, − = left |
think |
{"action":"think"} |
Hold for one step and plan in the next reply |
finished |
{"action":"finished"} |
Arrived at the target |
depth_m is in canonical units. Multiply it by k from the code above to get metres forward (Tello: 3.2 × 0.932 ≈ 3.0 m).
For the next step, send the new frame and pass the last actions (up to 5, oldest first) as history:
step 1 of 2: ROTATE angle=-90deg [done, 1.5s]
step 2 of 2: GO x=402 y=656 depth=3.2m [in progress] <- latest
The model only proposes actions. It does not avoid obstacles, so use your own safety layer when flying a real drone.
Training data
Fine-tuned on MAmmoTH-VL and MAmmoTH-VL2 subsets (VisualWebInstruct, LLaVA-CoT-100k), plus drone-action data (DroneCATS-Pilot-54K) built from NYU Depth v2, SUN RGB-D and TartanAir v2 (BSD-3-Clause). See Appendix C of the paper for details.
License
OpenMDW-1.1. Fine-tuned from NVIDIA Cosmos3-Edge.
Citation
@article{park2026dronecats,
title = {Evaluating Multimodal LLMs as Generalist Vision-Language-Action Agents
for Drone Control: Commanding, Approaching, Tracking and Searching},
author = {Park, Jaewoo and Lee, Minyoung and Seo, Sukmin and Yim, Moonbin and
Yoon, Hyunwook and Ryu, Dohoon and Kim, Daehee and Song, Myungseo and
Byun, Jihyuk and Chang, Seunggyu and Kil, Taeho and Kim, Jiseob and
Lee, Bado and Kim, Geewook},
journal = {arXiv preprint arXiv:2609.01404},
year = {2026}
}
- Downloads last month
- 175
Model tree for naver-ai/DroneCATS-Cosmos3-Edge-2B
Base model
nvidia/Cosmos3-Edge