398 lines
12 KiB
Markdown
398 lines
12 KiB
Markdown
# Metadata Structure Reference
|
|
|
|
This document provides a comprehensive reference for the metadata structure used in the Metadata System for ComfyUI. It details the fields, their meanings, and their organization.
|
|
|
|
## Overview
|
|
|
|
The metadata is organized into a structured hierarchy with four main sections:
|
|
|
|
- **basic**: Essential information such as title, description, and keywords
|
|
- **analysis**: Image analysis results including technical and aesthetic measures
|
|
- **ai_info**: AI generation information including model, prompt, and workflow data
|
|
- **regions**: Information about specific regions in the image (faces, objects)
|
|
|
|
## Basic Section
|
|
|
|
The `basic` section contains essential information about the image:
|
|
|
|
```json
|
|
"basic": {
|
|
"title": "Mountain Landscape",
|
|
"description": "AI generated mountain landscape with snow and trees",
|
|
"keywords": ["mountains", "landscape", "snow", "trees", "AI generated"],
|
|
"rating": 4,
|
|
"creator": "John Doe",
|
|
"rights": "Copyright © 2025 John Doe",
|
|
"create_date": "2025-03-15T12:34:56"
|
|
}
|
|
```
|
|
|
|
### Field Descriptions
|
|
|
|
| Field | Type | Description |
|
|
|-------|------|-------------|
|
|
| `title` | String | The title or name of the image |
|
|
| `description` | String | Detailed description or caption for the image |
|
|
| `keywords` | Array | Tags or keywords that describe the image content |
|
|
| `rating` | Integer | User-assigned rating (1-5 stars) |
|
|
| `creator` | String | Name of the image creator or photographer |
|
|
| `rights` | String | Copyright or licensing information |
|
|
| `create_date` | String | Creation date in ISO 8601 format |
|
|
|
|
## Analysis Section
|
|
|
|
The `analysis` section contains image analysis results:
|
|
|
|
```json
|
|
"analysis": {
|
|
"technical": {
|
|
"blur": {
|
|
"score": 0.92,
|
|
"higher_better": true,
|
|
"timestamp": "2025-03-15T12:34:56"
|
|
},
|
|
"noise": {
|
|
"score": 0.08,
|
|
"higher_better": false,
|
|
"timestamp": "2025-03-15T12:34:56"
|
|
},
|
|
"dimensions": {
|
|
"width": 512,
|
|
"height": 512,
|
|
"ratio": 1.0
|
|
},
|
|
"artifacts": {
|
|
"detected": false,
|
|
"score": 0.03
|
|
}
|
|
},
|
|
"aesthetic": {
|
|
"composition": 7.8,
|
|
"color_harmony": 8.2,
|
|
"overall": 7.9,
|
|
"timestamp": "2025-03-15T12:34:56"
|
|
},
|
|
"pyiqa": {
|
|
"niqe": {
|
|
"score": 3.45,
|
|
"higher_better": false,
|
|
"range": [0, 25],
|
|
"timestamp": "2025-03-15T12:34:56"
|
|
},
|
|
"musiq": {
|
|
"score": 78.2,
|
|
"higher_better": true,
|
|
"range": [0, 100],
|
|
"timestamp": "2025-03-15T12:34:56"
|
|
},
|
|
"clipiqa": {
|
|
"score": 0.82,
|
|
"higher_better": true,
|
|
"range": [0, 1],
|
|
"timestamp": "2025-03-15T12:34:56"
|
|
}
|
|
},
|
|
"classification": {
|
|
"style": {
|
|
"value": "photorealistic",
|
|
"confidence": 0.87,
|
|
"timestamp": "2025-03-15T12:34:56"
|
|
},
|
|
"content_type": {
|
|
"value": "landscape",
|
|
"confidence": 0.94,
|
|
"timestamp": "2025-03-15T12:34:56"
|
|
},
|
|
"has_text": {
|
|
"value": false,
|
|
"confidence": 0.98,
|
|
"timestamp": "2025-03-15T12:34:56"
|
|
}
|
|
},
|
|
"eiqa": {
|
|
"color": {
|
|
"dominant_colors": [
|
|
{
|
|
"name": "forest_green",
|
|
"hex": "#228B22",
|
|
"percentage": 0.35
|
|
},
|
|
{
|
|
"name": "snow",
|
|
"hex": "#FFFAFA",
|
|
"percentage": 0.28
|
|
},
|
|
{
|
|
"name": "sky_blue",
|
|
"hex": "#87CEEB",
|
|
"percentage": 0.25
|
|
}
|
|
],
|
|
"harmony": {
|
|
"type": "complementary",
|
|
"score": 0.85,
|
|
"is_harmonious": true
|
|
},
|
|
"characteristics": {
|
|
"temperature": "cool",
|
|
"contrast": "high",
|
|
"saturation": "medium"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Technical Subsection
|
|
|
|
| Field | Type | Description |
|
|
|-------|------|-------------|
|
|
| `blur` | Object | Blur detection metrics |
|
|
| `blur.score` | Number | Blur score (higher values mean sharper for most detectors) |
|
|
| `blur.higher_better` | Boolean | Whether higher score means better quality |
|
|
| `noise` | Object | Noise detection metrics |
|
|
| `noise.score` | Number | Noise score (lower usually better) |
|
|
| `noise.higher_better` | Boolean | Whether higher score means better quality |
|
|
| `dimensions` | Object | Image dimension information |
|
|
| `dimensions.width` | Integer | Image width in pixels |
|
|
| `dimensions.height` | Integer | Image height in pixels |
|
|
| `dimensions.ratio` | Number | Aspect ratio (width/height) |
|
|
|
|
### Aesthetic Subsection
|
|
|
|
| Field | Type | Description |
|
|
|-------|------|-------------|
|
|
| `composition` | Number | Composition quality score (0-10) |
|
|
| `color_harmony` | Number | Color harmony score (0-10) |
|
|
| `overall` | Number | Overall aesthetic score (0-10) |
|
|
|
|
### PyIQA Subsection
|
|
|
|
Contains scores from various Image Quality Assessment (IQA) models:
|
|
|
|
| Field | Type | Description |
|
|
|-------|------|-------------|
|
|
| `niqe` | Object | Natural Image Quality Evaluator scores |
|
|
| `musiq` | Object | Multi-scale Image Quality Transformer scores |
|
|
| `clipiqa` | Object | CLIP-based Image Quality Assessment scores |
|
|
|
|
Each IQA model entry includes:
|
|
- `score`: The quality score
|
|
- `higher_better`: Whether higher scores mean better quality
|
|
- `range`: The score range as [min, max]
|
|
- `timestamp`: When the analysis was performed
|
|
|
|
### Classification Subsection
|
|
|
|
| Field | Type | Description |
|
|
|-------|------|-------------|
|
|
| `style` | Object | Detected image style information |
|
|
| `content_type` | Object | Detected content type |
|
|
| `has_text` | Object | Text detection results |
|
|
|
|
Classification entries include:
|
|
- `value`: The detected classification
|
|
- `confidence`: Confidence score (0-1)
|
|
- `timestamp`: When the classification was performed
|
|
|
|
### EIQA Color Subsection
|
|
|
|
| Field | Type | Description |
|
|
|-------|------|-------------|
|
|
| `dominant_colors` | Array | List of dominant colors in the image |
|
|
| `harmony` | Object | Color harmony analysis |
|
|
| `characteristics` | Object | General color characteristics |
|
|
|
|
## AI Info Section
|
|
|
|
The `ai_info` section contains information about AI generation:
|
|
|
|
```json
|
|
"ai_info": {
|
|
"generation": {
|
|
"model": "stable-diffusion-v1-5",
|
|
"prompt": "majestic mountains with snow caps, trees in foreground, clear blue sky",
|
|
"negative_prompt": "ugly, blurry, low quality, deformed",
|
|
"sampler": "euler_a",
|
|
"steps": 30,
|
|
"cfg_scale": 7.5,
|
|
"seed": 1234567890,
|
|
"width": 512,
|
|
"height": 512,
|
|
"batch_size": 1,
|
|
"loras": [
|
|
{
|
|
"name": "landscape_lora",
|
|
"strength": 0.8
|
|
}
|
|
],
|
|
"timestamp": "2025-03-15T12:34:56"
|
|
},
|
|
"workflow": {
|
|
"nodes": {
|
|
"1": {
|
|
"class_type": "KSampler",
|
|
"inputs": {
|
|
"seed": 1234567890,
|
|
"steps": 30,
|
|
"cfg": 7.5,
|
|
"sampler_name": "euler_a",
|
|
"scheduler": "normal",
|
|
"denoise": 1.0
|
|
}
|
|
},
|
|
"2": {
|
|
"class_type": "CLIPTextEncode",
|
|
"inputs": {
|
|
"text": "majestic mountains with snow caps, trees in foreground, clear blue sky"
|
|
}
|
|
},
|
|
"3": {
|
|
"class_type": "CLIPTextEncode",
|
|
"inputs": {
|
|
"text": "ugly, blurry, low quality, deformed"
|
|
},
|
|
"is_negative": true
|
|
}
|
|
// More nodes...
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Generation Subsection
|
|
|
|
| Field | Type | Description |
|
|
|-------|------|-------------|
|
|
| `model` | String | Base model name/identifier |
|
|
| `prompt` | String | Main generation prompt |
|
|
| `negative_prompt` | String | Negative prompt for undesired elements |
|
|
| `sampler` | String | Sampling algorithm used |
|
|
| `steps` | Integer | Number of sampling steps |
|
|
| `cfg_scale` | Number | Classifier-free guidance scale |
|
|
| `seed` | Number | Generation seed value |
|
|
| `width` | Integer | Generated image width |
|
|
| `height` | Integer | Generated image height |
|
|
| `loras` | Array | LoRA models used in generation |
|
|
|
|
### Workflow Subsection
|
|
|
|
Contains the complete ComfyUI workflow data, including:
|
|
- Node definitions and connections
|
|
- Model parameters and settings
|
|
- Processing pipeline structure
|
|
|
|
This preserves the entire generation process for reproducibility.
|
|
|
|
## Regions Section
|
|
|
|
The `regions` section contains information about specific regions in the image:
|
|
|
|
```json
|
|
"regions": {
|
|
"faces": [
|
|
{
|
|
"type": "Face",
|
|
"name": "Person 1",
|
|
"area": {
|
|
"x": 0.2,
|
|
"y": 0.3,
|
|
"w": 0.1,
|
|
"h": 0.15
|
|
},
|
|
"extensions": {
|
|
"eiqa": {
|
|
"face_analysis": {
|
|
"gender": "female",
|
|
"age": 28,
|
|
"emotion": "happy",
|
|
"scores": {
|
|
"confidence": 0.94,
|
|
"quality": 0.87
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
],
|
|
"areas": [
|
|
{
|
|
"type": "Object",
|
|
"name": "Mountain",
|
|
"area": {
|
|
"x": 0.1,
|
|
"y": 0.2,
|
|
"w": 0.8,
|
|
"h": 0.5
|
|
}
|
|
}
|
|
],
|
|
"summary": {
|
|
"face_count": 1,
|
|
"detector_type": "deepface"
|
|
}
|
|
}
|
|
```
|
|
|
|
### Faces Subsection
|
|
|
|
Contains detected faces with:
|
|
- `type`: Face region type
|
|
- `name`: Face identifier/name
|
|
- `area`: Position and size (normalized 0-1 coordinates)
|
|
- `extensions`: Additional analysis data
|
|
|
|
### Areas Subsection
|
|
|
|
Contains other detected regions with:
|
|
- `type`: Area/object type
|
|
- `name`: Area identifier/name
|
|
- `area`: Position and size (normalized 0-1 coordinates)
|
|
|
|
### Summary Subsection
|
|
|
|
Contains summary statistics about detected regions.
|
|
|
|
## Additional Metadata Formats
|
|
|
|
### XMP Format
|
|
|
|
The metadata system complies with XMP (Extensible Metadata Platform) standards:
|
|
|
|
- **Dublin Core (dc) Namespace**: For basic properties (title, description)
|
|
- **XMP Basic (xmp) Namespace**: For general properties (rating, dates)
|
|
- **MWG Regions (mwg-rs) Namespace**: For face/area information
|
|
- **Custom Namespaces**: For AI and analysis data
|
|
|
|
### Exif Format
|
|
|
|
Embeds metadata in EXIF headers for formats that support it:
|
|
- Title → Exif.Image.ImageDescription
|
|
- Description → Exif.Photo.UserComment
|
|
- Rating → Exif.Image.Rating
|
|
|
|
### IPTC Format
|
|
|
|
Uses IPTC fields for maximum compatibility:
|
|
- Title → Iptc.Application2.ObjectName
|
|
- Description → Iptc.Application2.Caption
|
|
- Keywords → Iptc.Application2.Keywords
|
|
|
|
## Storage Strategy
|
|
|
|
The system uses a multi-target storage approach:
|
|
|
|
1. **Embedded Metadata**: Directly inside image files where supported
|
|
2. **XMP Sidecar Files**: Standard `.xmp` files alongside images
|
|
3. **Text Files**: Both machine-readable and human-readable formats
|
|
4. **Database Storage**: Structured SQLite database for advanced queries
|
|
|
|
This ensures maximum compatibility and accessibility across different workflows and applications.
|
|
|
|
## Schema Evolution
|
|
|
|
The metadata schema is designed for easy extension:
|
|
|
|
- **New Analysis Types**: Can be added under the `analysis` section
|
|
- **New AI Models**: Supported through the flexible `generation` structure
|
|
- **Custom Fields**: Can be added at any level without breaking compatibility |