Image captioning library combining Florence2, WD14, and VLM for comprehensive image analysis
Project description
capflow
A multi-model image captioning library that combines Florence2, WD14, and Vision Language Models for comprehensive image analysis.
Features
- Florence2: Detailed image captions with conservative generation parameters
- WD14: Danbooru-style tagging for anime and illustrations
- VLM: Async-first verification layer that resolves contradictions between models
- EXIF extraction: Camera, lens, and capture settings metadata
- Auto-resize: Automatically optimizes large images to model-specific resolutions
- Cross-platform support (CUDA, MPS, CPU)
- Optimized prompts for AI image generation (Stable Diffusion, Midjourney, FLUX)
Installation
pip install capflow
Or with uv:
uv add capflow
Quick Start
Note: All models expect images as numpy.ndarray (OpenCV format: HxWx3, BGR).
Async (Recommended)
import os
import cv2
import capflow as cf
# Initialize models (API key required for VLM)
florence2 = cf.Florence2()
wd14 = cf.WD14()
vlm = cf.VLM(api_key=os.getenv("OPENAI_API_KEY"))
# Load image with OpenCV
image = cv2.imread("your_image.jpg")
# Florence2: Detailed caption (sync)
caption = florence2.generate_caption(image, task="more_detailed_caption")
# WD14: Danbooru-style tags (sync)
tags = wd14.generate_tags(image)
# VLM: Verified and enhanced description (async)
description = await vlm.generate_caption(
image,
context=f"Florence2: {caption}\nWD14 Tags: {', '.join(tags)}"
)
# Extract EXIF metadata (sync, requires file path)
exif_data = cf.extract_exif("your_image.jpg")
camera_info = cf.get_camera_info(exif_data)
settings = cf.get_capture_settings(exif_data)
Synchronous
import os
import cv2
import capflow as cf
# Initialize models
florence2 = cf.Florence2()
wd14 = cf.WD14()
vlm = cf.VLM(api_key=os.getenv("OPENAI_API_KEY"))
# Load image with OpenCV
image = cv2.imread("your_image.jpg")
# All synchronous calls
caption = florence2.generate_caption(image, task="more_detailed_caption")
tags = wd14.generate_tags(image)
# Use _sync methods for VLM
description = vlm.generate_caption_sync(
image,
context=f"Florence2: {caption}\nWD14 Tags: {', '.join(tags)}"
)
API Keys
API keys must be passed explicitly from your application:
import os
import capflow as cf
# Pass API key from environment variable
vlm = cf.VLM(api_key=os.getenv("OPENAI_API_KEY"))
# Or pass directly (not recommended for production)
vlm = cf.VLM(api_key="your-api-key")
VLM Async/Sync Methods
VLM provides both async (primary) and sync methods:
# Async methods (recommended)
await vlm.generate_caption(image)
await vlm.generate_caption_with_tags(image, tags)
await vlm.refine_caption(image, draft)
# Sync methods (works even from async context)
vlm.generate_caption_sync(image)
vlm.generate_caption_with_tags_sync(image, tags)
vlm.refine_caption_sync(image, draft)
The _sync methods automatically detect if they're running in an async context and handle it correctly, so they won't raise "event loop already running" errors.
Automatic Image Resizing
All models automatically resize images larger than their optimal size to improve performance and memory efficiency:
- Florence2: Resizes to 768×768px (with padding to preserve aspect ratio)
- WD14: Resizes to 448×448px (with padding to preserve aspect ratio)
- VLM: Resizes to max 2048px on longest edge (no padding, aspect ratio preserved)
Auto-resize is enabled by default but can be disabled:
# Disable auto-resize
florence2 = cf.Florence2(auto_resize=False)
wd14 = cf.WD14(auto_resize=False)
vlm = cf.VLM(auto_resize=False)
# Custom target sizes
florence2 = cf.Florence2(target_size=1024) # Use 1024 instead of 768
wd14 = cf.WD14(target_size=512) # Use 512 instead of 448
vlm = cf.VLM(max_size=4096) # Use 4096 instead of 2048
How It Works
capflow uses a three-stage pipeline:
- WD14: Generates high-confidence tags (e.g.,
1girl,solo,outdoors) - Florence2: Creates detailed natural language captions
- VLM: Examines the image directly and resolves contradictions between WD14 and Florence2, converting tags to natural English
Example
Input: Image of a girl jumping outdoors
WD14 Output:
1girl, solo, dress, outdoors, jumping, motion_blur
Florence2 Output:
A young woman in an orange dress jumping in the air. There are a few people walking around.
VLM Final Output:
A photograph of a single woman mid-air, jumping in a rust-orange dress, barefoot with curly auburn hair,
dynamic extended-arms pose captured with slight motion blur, main subject left-of-center, low-angle wide shot,
foreground white marble steps, manicured hedges and formal garden behind her, large historic white stone
cathedral in the midground, overcast cloudy sky, natural daylight, joyful carefree atmosphere.
Note: VLM correctly identified "solo" from WD14 and ignored Florence2's hallucinated "a few people walking around".
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file capflow-0.3.0.tar.gz.
File metadata
- Download URL: capflow-0.3.0.tar.gz
- Upload date:
- Size: 563.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.8.18
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1b9d34fa32b291697d4414c0cc2c4bf53e34b79e4a5da3a463433910427a8e38
|
|
| MD5 |
e544e45450f716407b5b294073d26145
|
|
| BLAKE2b-256 |
092e10d6b08a275a854e09390de3bea3a2ce065810c15d1ac2913c886b6126ac
|
File details
Details for the file capflow-0.3.0-py3-none-any.whl.
File metadata
- Download URL: capflow-0.3.0-py3-none-any.whl
- Upload date:
- Size: 18.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.8.18
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
02693ce925b8358efff94e33f505922129712afbd1358e0b60ff77562df00bd7
|
|
| MD5 |
f7d58b914513aecc304254d600322791
|
|
| BLAKE2b-256 |
7493911b5b55aa27a9fcd65624963146793c40ba8ca236a0afaa78b4823c6597
|