Moondream logo

Player with Ball Detection

Detect which player is currently holding the basketball in NBA game footage. The base model produces excessive false positives, mistaking many players for having the ball. After RL fine-tuning, Moondream learns that only one player can have the ball, improving its F1 score from 28% to 79%, compared to GPT-5.4's 53%.

F1

BaseGPT-5.4Fine-tuned
MethodRL
Steps60
Training time54 min
Cost$16.89

See it in action

Switch between benchmark examples to compare the base model against the fine-tuned model on the same task.

Prompt

player with the ball

Base Moondream 3 Preview

mIoU 0.085
Basketball game with many players on court

Fine-tuned Moondream 3 Preview

mIoU 0.783+0.698
Basketball game with many players on court
CorrectFalse positive

Perfection in 3 steps

1

Bring examples.

Collect images for the task you want Moondream to learn.

2

Fine-tune.

Teach Moondream with SFT or RL. Pass your data to the API and we handle the rest.

3

Deploy.

Use your model through the API or run it locally with Photon.

What is fine-tuning?

Moondream starts as a general model trained on broad, public information. Fine-tuning makes it great at one specific task by teaching it the products, documents, categories, or internal information that matter to your business.

Who is this for?

This is for teams putting vision AI into production. If you already know the task and need the model to master that job, fine-tuning is how you get there. It is built for teams that need frontier performance at real-time speed.

See the code

Fine-tuning is just a small API loop: format your data, call `train_step`, and the model updates as you go.

See full code
import moondream as md

# Create fine-tune
ft = md.ft(
    api_key="your-api-key",
    name="player with ball detection",
    rank=8,
)

# Hidden boilerplate and data code

requests = (
    (
        example,
        {
            "skill": "detect",
            "image": example["image"],
            "object": "player with the ball?",
            "num_rollouts": 4,
        },
    )
    for example in training_data
)

for context, response in ft.rollout_stream(requests):
    rewards = compute_rewards(context, response)
    ft.train_step([{
        "mode": "rl",
        "request": response["request"],
        "rollouts": response["rollouts"],
        "rewards": rewards,
    }])

Frequently asked questions

Ready to take Moondream to production?

Get started

Start with the docs and run your first experiment in a few API calls.

Start fine-tuning

Need help? We'll build it for you.

We can help define the task, prepare the data, run training, validate results, and hand off a model your team can use.