168 lines
5.2 KiB
Markdown
168 lines
5.2 KiB
Markdown
# Skinbase Vision Stack (CLIP + BLIP + YOLO + Qdrant) – Dockerized FastAPI
|
||
|
||
This repository provides **four standalone vision services** (CLIP / BLIP / YOLO / Qdrant)
|
||
and a **Gateway API** that can call them individually or together.
|
||
|
||
## Services & Ports
|
||
|
||
- `gateway` (exposed): `https://vision.klevze.net`
|
||
- `clip`: internal only
|
||
- `blip`: internal only
|
||
- `yolo`: internal only
|
||
- `qdrant`: vector DB (port `6333` exposed for direct access)
|
||
- `qdrant-svc`: internal Qdrant API wrapper
|
||
|
||
## Run
|
||
|
||
```bash
|
||
docker compose up -d --build
|
||
```
|
||
|
||
If you use BLIP, create a `.env` file first.
|
||
|
||
Required variables:
|
||
|
||
```bash
|
||
API_KEY=your_api_key_here
|
||
HUGGINGFACE_TOKEN=your_huggingface_token_here
|
||
```
|
||
|
||
`HUGGINGFACE_TOKEN` is required when the configured BLIP model is private, gated, or otherwise requires Hugging Face authentication.
|
||
|
||
Service startup now waits on container healthchecks, so first boot may take longer while models finish loading.
|
||
|
||
## Health
|
||
|
||
```bash
|
||
curl -H "X-API-Key: <your-api-key>" https://vision.klevze.net/health
|
||
```
|
||
|
||
## Universal analyze (ALL)
|
||
|
||
### With URL
|
||
```bash
|
||
curl -H "X-API-Key: <your-api-key>" -X POST https://vision.klevze.net/analyze/all \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"url":"https://files.skinbase.org/img/aa/bb/cc/md.webp","limit":5}'
|
||
```
|
||
|
||
### With file upload (multipart)
|
||
```bash
|
||
curl -H "X-API-Key: <your-api-key>" -X POST https://vision.klevze.net/analyze/all/file \
|
||
-F "file=@/path/to/image.webp" \
|
||
-F "limit=5"
|
||
```
|
||
|
||
## Individual services (via gateway)
|
||
|
||
### CLIP tags
|
||
```bash
|
||
curl -H "X-API-Key: <your-api-key>" -X POST https://vision.klevze.net/analyze/clip -H "Content-Type: application/json" \
|
||
-d '{"url":"https://files.skinbase.org/img/aa/bb/cc/md.webp","limit":5}'
|
||
```
|
||
|
||
### CLIP tags (file)
|
||
```bash
|
||
curl -H "X-API-Key: <your-api-key>" -X POST https://vision.klevze.net/analyze/clip/file \
|
||
-F "file=@/path/to/image.webp" \
|
||
-F "limit=5"
|
||
```
|
||
|
||
### BLIP caption
|
||
```bash
|
||
curl -H "X-API-Key: <your-api-key>" -X POST https://vision.klevze.net/analyze/blip -H "Content-Type: application/json" \
|
||
-d '{"url":"https://files.skinbase.org/img/aa/bb/cc/md.webp","variants":3}'
|
||
```
|
||
|
||
### BLIP caption (file)
|
||
```bash
|
||
curl -H "X-API-Key: <your-api-key>" -X POST https://vision.klevze.net/analyze/blip/file \
|
||
-F "file=@/path/to/image.webp" \
|
||
-F "variants=3" \
|
||
-F "max_length=60"
|
||
```
|
||
|
||
### YOLO detect
|
||
```bash
|
||
curl -H "X-API-Key: <your-api-key>" -X POST https://vision.klevze.net/analyze/yolo -H "Content-Type: application/json" \
|
||
-d '{"url":"https://files.skinbase.org/img/aa/bb/cc/md.webp","conf":0.25}'
|
||
```
|
||
|
||
### YOLO detect (file)
|
||
```bash
|
||
curl -H "X-API-Key: <your-api-key>" -X POST https://vision.klevze.net/analyze/yolo/file \
|
||
-F "file=@/path/to/image.webp" \
|
||
-F "conf=0.25"
|
||
```
|
||
|
||
## Vector DB (Qdrant) via gateway
|
||
|
||
Qdrant point IDs must be either:
|
||
|
||
- an unsigned integer
|
||
- a UUID string
|
||
|
||
If you send another string value, the wrapper may replace it with a generated UUID. In that case the original value is stored in the payload as `_original_id`.
|
||
|
||
You can fetch a stored point by its preserved original application ID:
|
||
|
||
```bash
|
||
curl -H "X-API-Key: <your-api-key>" https://vision.klevze.net/vectors/points/by-original-id/img-001
|
||
```
|
||
|
||
### Store image embedding by URL
|
||
```bash
|
||
curl -H "X-API-Key: <your-api-key>" -X POST https://vision.klevze.net/vectors/upsert \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"url":"https://files.skinbase.org/img/aa/bb/cc/md.webp","id":"550e8400-e29b-41d4-a716-446655440000","metadata":{"category":"wallpaper"}}'
|
||
```
|
||
|
||
### Store image embedding by file upload
|
||
```bash
|
||
curl -H "X-API-Key: <your-api-key>" -X POST https://vision.klevze.net/vectors/upsert/file \
|
||
-F "file=@/path/to/image.webp" \
|
||
-F 'id=550e8400-e29b-41d4-a716-446655440001' \
|
||
-F 'metadata_json={"category":"photo"}'
|
||
```
|
||
|
||
### Search similar images by URL
|
||
```bash
|
||
curl -H "X-API-Key: <your-api-key>" -X POST https://vision.klevze.net/vectors/search \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"url":"https://files.skinbase.org/img/aa/bb/cc/md.webp","limit":5}'
|
||
```
|
||
|
||
### Search similar images by file upload
|
||
```bash
|
||
curl -H "X-API-Key: <your-api-key>" -X POST https://vision.klevze.net/vectors/search/file \
|
||
-F "file=@/path/to/image.webp" \
|
||
-F "limit=5"
|
||
```
|
||
|
||
### List collections
|
||
```bash
|
||
curl -H "X-API-Key: <your-api-key>" https://vision.klevze.net/vectors/collections
|
||
```
|
||
|
||
### Get collection info
|
||
```bash
|
||
curl -H "X-API-Key: <your-api-key>" https://vision.klevze.net/vectors/collections/images
|
||
```
|
||
|
||
### Delete points
|
||
```bash
|
||
curl -H "X-API-Key: <your-api-key>" -X POST https://vision.klevze.net/vectors/delete \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"ids":["550e8400-e29b-41d4-a716-446655440000","550e8400-e29b-41d4-a716-446655440001"]}'
|
||
```
|
||
|
||
If you let the wrapper generate a UUID, use the returned `id` value for later `get`, `search`, or `delete` operations.
|
||
|
||
## Notes
|
||
|
||
- This is a **starter scaffold**. Models are loaded at service startup.
|
||
- Qdrant data is persisted in the project folder at `./data/qdrant`, so it survives container restarts and recreates.
|
||
- Remote image URLs are restricted to public `http`/`https` hosts. Localhost, private IP ranges, and non-image content types are rejected.
|
||
- For production: add auth, rate limits, and restrict gateway exposure (private network).
|
||
- GPU: you can add NVIDIA runtime later (compose profiles) if needed.
|