elksmmx 1 неделя назад
Родитель
Сommit
e648f6cd82

+ 0 - 161
examples/find knowledge/embed_images.py

@@ -1,161 +0,0 @@
-#!/usr/bin/env python3
-"""
-将features_visualization.html中的所有图片转换为base64编码,生成可独立分享的HTML文件
-"""
-
-import base64
-import os
-import json
-from pathlib import Path
-
-def image_to_base64(image_path):
-    """将图片文件转换为base64编码的data URI"""
-    try:
-        with open(image_path, 'rb') as f:
-            image_data = f.read()
-        b64_data = base64.b64encode(image_data).decode('utf-8')
-
-        # 根据文件扩展名确定MIME类型
-        ext = Path(image_path).suffix.lower()
-        mime_types = {
-            '.jpg': 'image/jpeg',
-            '.jpeg': 'image/jpeg',
-            '.png': 'image/png',
-            '.gif': 'image/gif',
-            '.webp': 'image/webp'
-        }
-        mime_type = mime_types.get(ext, 'image/jpeg')
-
-        return f"data:{mime_type};base64,{b64_data}"
-    except Exception as e:
-        print(f"Error converting {image_path}: {e}")
-        return None
-
-def main():
-    base_dir = Path(__file__).parent
-
-    # 读取原始HTML文件
-    html_file = base_dir / 'features_visualization.html'
-    with open(html_file, 'r', encoding='utf-8') as f:
-        html_content = f.read()
-
-    # 创建图片映射字典
-    image_map = {}
-
-    # 1. 转换原始图片 (input/*.jpg)
-    print("Converting original images...")
-    input_dir = base_dir / 'input'
-    for i in range(1, 10):
-        img_name = f"img_{i}"
-        img_path = input_dir / f"{img_name}.jpg"
-        if img_path.exists():
-            b64_uri = image_to_base64(img_path)
-            if b64_uri:
-                image_map[f"./input/{img_name}.jpg"] = b64_uri
-                print(f"  ✓ {img_name}.jpg")
-
-    # 2. 转换特征图片 (output/features/*/*.png)
-    print("\nConverting feature images...")
-    features_dir = base_dir / 'output' / 'features'
-    dimensions = [
-        'openpose_skeleton',
-        'depth_map',
-        'lineart_edge',
-        'color_palette',
-        'bokeh_mask',
-        'semantic_segmentation',
-        'color_distribution'
-    ]
-
-    for dim in dimensions:
-        dim_dir = features_dir / dim
-        if dim_dir.exists():
-            print(f"  {dim}:")
-            for i in range(1, 10):
-                img_name = f"img_{i}"
-                img_path = dim_dir / f"{img_name}.png"
-                if img_path.exists():
-                    b64_uri = image_to_base64(img_path)
-                    if b64_uri:
-                        image_map[f"./output/features/{dim}/{img_name}.png"] = b64_uri
-                        print(f"    ✓ {img_name}.png")
-
-    # 3. 替换HTML中的图片路径为base64
-    print(f"\nTotal images converted: {len(image_map)}")
-    print("\nGenerating embedded HTML...")
-
-    # 创建JavaScript对象来存储base64图片
-    js_image_map = "const imageMap = " + json.dumps(image_map, indent=2, ensure_ascii=False) + ";\n\n"
-
-    # 在HTML中插入imageMap并修改图片加载逻辑
-    # 找到 <script> 标签的位置
-    script_start = html_content.find('<script>')
-    if script_start == -1:
-        print("Error: Could not find <script> tag")
-        return
-
-    script_start += len('<script>')
-
-    # 插入imageMap定义
-    html_content = html_content[:script_start] + "\n        " + js_image_map + html_content[script_start:]
-
-    # 修改图片路径使用逻辑 - 添加辅助函数
-    helper_function = """        // 获取图片路径(优先使用base64,否则使用原路径)
-        function getImageSrc(path) {
-            return imageMap[path] || path;
-        }
-
-"""
-
-    script_start = html_content.find('<script>')
-    script_start += len('<script>')
-    script_start = html_content.find('const imageMap', script_start)
-    script_start = html_content.find('\n\n', script_start) + 2
-
-    html_content = html_content[:script_start] + helper_function + html_content[script_start:]
-
-    # 替换所有的图片src设置
-    replacements = [
-        # 原始图片
-        ("card.onclick = () => openModal(`${basePath}/input/${imgName}.jpg`);",
-         "card.onclick = () => openModal(getImageSrc(`${basePath}/input/${imgName}.jpg`));"),
-
-        ("<img src=\"${basePath}/input/${imgName}.jpg\"",
-         "<img src=\"${getImageSrc(`${basePath}/input/${imgName}.jpg`)}\""),
-
-        # 特征图片
-        ("img.src = featurePath;",
-         "img.src = getImageSrc(featurePath);"),
-
-        ("img.onclick = () => openModal(featurePath, imgName);",
-         "img.onclick = () => openModal(getImageSrc(featurePath), imgName);"),
-
-        # color_palette特殊处理
-        ("img.src = `${basePath}/input/${imgName}.jpg`;",
-         "img.src = getImageSrc(`${basePath}/input/${imgName}.jpg`);"),
-
-        # modal中的图片
-        ("modalOriginal.src = `${basePath}/input/${imgName}.jpg`;",
-         "modalOriginal.src = getImageSrc(`${basePath}/input/${imgName}.jpg`);"),
-
-        ("modalFeature.src = imagePath;",
-         "modalFeature.src = imagePath;"),  # imagePath已经是处理过的
-
-        ("modalOriginal.src = imagePath;",
-         "modalOriginal.src = imagePath;"),  # imagePath已经是处理过的
-    ]
-
-    for old, new in replacements:
-        html_content = html_content.replace(old, new)
-
-    # 保存新的HTML文件
-    output_file = base_dir / 'features_visualization_embedded.html'
-    with open(output_file, 'w', encoding='utf-8') as f:
-        f.write(html_content)
-
-    print(f"\n✅ Successfully created: {output_file}")
-    print(f"📦 File size: {len(html_content) / 1024 / 1024:.2f} MB")
-    print("\n这个HTML文件现在可以独立分享,不需要附带图片文件夹。")
-
-if __name__ == '__main__':
-    main()

+ 0 - 335
examples/find knowledge/extract_features.py

@@ -1,335 +0,0 @@
-"""
-多模态特征提取脚本
-针对"户外白裙写生少女"图片组,提取以下维度:
-1. openpose_skeleton - 人体姿态骨架(OpenPose)
-2. depth_map - 深度图(MiDaS)
-3. lineart_edge - 线稿/边缘图(Lineart)
-4. color_palette - 色彩调色板(ColorThief + 自定义)
-5. bokeh_mask - 景深虚化遮罩(基于深度图推导)
-6. semantic_segmentation - 语义分割(基于颜色聚类)
-7. color_distribution - 色彩分布向量(HSV直方图)
-"""
-
-import os
-import json
-import warnings
-warnings.filterwarnings('ignore')
-
-import numpy as np
-from PIL import Image
-import cv2
-from colorthief import ColorThief
-
-# 设置工作目录
-WORKDIR = os.path.dirname(os.path.abspath(__file__))
-INPUT_DIR = os.path.join(WORKDIR, 'input')
-OUTPUT_DIR = os.path.join(WORKDIR, 'output', 'features')
-
-print("=== 开始多模态特征提取 ===")
-print(f"工作目录: {WORKDIR}")
-
-# ============================================================
-# 维度1: OpenPose 人体姿态骨架
-# ============================================================
-def extract_openpose(img_path, output_path):
-    """提取人体姿态骨架图"""
-    from controlnet_aux import OpenposeDetector
-    detector = OpenposeDetector.from_pretrained('lllyasviel/ControlNet')
-    img = Image.open(img_path)
-    result = detector(img, hand_and_face=True)
-    result.save(output_path)
-    print(f"  OpenPose saved: {output_path}")
-    return True
-
-# ============================================================
-# 维度2: MiDaS 深度图
-# ============================================================
-def extract_depth(img_path, output_path, npy_path=None):
-    """提取深度图"""
-    from controlnet_aux import MidasDetector
-    detector = MidasDetector.from_pretrained('lllyasviel/Annotators')
-    img = Image.open(img_path)
-    result = detector(img)
-    result.save(output_path)
-    print(f"  Depth map saved: {output_path}")
-    return True
-
-# ============================================================
-# 维度3: Lineart 线稿
-# ============================================================
-def extract_lineart(img_path, output_path):
-    """提取线稿"""
-    from controlnet_aux import LineartDetector
-    detector = LineartDetector.from_pretrained('lllyasviel/Annotators')
-    img = Image.open(img_path)
-    result = detector(img, coarse=False)
-    result.save(output_path)
-    print(f"  Lineart saved: {output_path}")
-    return True
-
-# ============================================================
-# 维度4: 色彩调色板
-# ============================================================
-def extract_color_palette(img_path, output_path_json, output_path_png, n_colors=8):
-    """提取主色调调色板"""
-    # 使用ColorThief提取主色
-    ct = ColorThief(img_path)
-    palette = ct.get_palette(color_count=n_colors, quality=1)
-    
-    # 生成调色板可视化图
-    palette_img = np.zeros((100, n_colors * 100, 3), dtype=np.uint8)
-    for i, color in enumerate(palette):
-        palette_img[:, i*100:(i+1)*100] = color
-    
-    cv2.imwrite(output_path_png, cv2.cvtColor(palette_img, cv2.COLOR_RGB2BGR))
-    
-    # 保存JSON
-    palette_data = {
-        "colors": [{"r": c[0], "g": c[1], "b": c[2], 
-                    "hex": "#{:02x}{:02x}{:02x}".format(c[0], c[1], c[2])} 
-                   for c in palette],
-        "dominant_color": {"r": palette[0][0], "g": palette[0][1], "b": palette[0][2],
-                           "hex": "#{:02x}{:02x}{:02x}".format(palette[0][0], palette[0][1], palette[0][2])}
-    }
-    with open(output_path_json, 'w') as f:
-        json.dump(palette_data, f, indent=2, ensure_ascii=False)
-    
-    print(f"  Color palette saved: {output_path_png}")
-    return palette_data
-
-# ============================================================
-# 维度5: 景深虚化遮罩(Bokeh Mask)
-# ============================================================
-def extract_bokeh_mask(img_path, depth_path, output_path):
-    """
-    基于深度图推导景深虚化遮罩
-    亮区=近景清晰区域,暗区=远景虚化区域
-    """
-    img = cv2.imread(img_path)
-    depth = cv2.imread(depth_path, cv2.IMREAD_GRAYSCALE)
-    
-    if depth is None:
-        print(f"  Warning: depth map not found for {img_path}")
-        return False
-    
-    # 深度图归一化 - 调整到原图尺寸
-    h_orig, w_orig = img.shape[:2]
-    depth = cv2.resize(depth, (w_orig, h_orig), interpolation=cv2.INTER_LINEAR)
-    depth_norm = depth.astype(np.float32) / 255.0
-    
-    # 计算局部清晰度(拉普拉斯方差)
-    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
-    laplacian = cv2.Laplacian(gray, cv2.CV_64F)
-    
-    # 用高斯模糊计算局部清晰度图
-    blur_map = np.abs(laplacian)
-    blur_map = cv2.GaussianBlur(blur_map.astype(np.float32), (51, 51), 0)
-    blur_map = (blur_map - blur_map.min()) / (blur_map.max() - blur_map.min() + 1e-8)
-    
-    # 结合深度图和清晰度图生成bokeh mask
-    # 近景(深度值高)且清晰 = 主体区域
-    bokeh_mask = (blur_map * 0.6 + depth_norm * 0.4) * 255
-    bokeh_mask = bokeh_mask.astype(np.uint8)
-    
-    cv2.imwrite(output_path, bokeh_mask)
-    print(f"  Bokeh mask saved: {output_path}")
-    return True
-
-# ============================================================
-# 维度6: 语义分割(基于颜色聚类)
-# ============================================================
-def extract_semantic_segmentation(img_path, output_path, n_segments=6):
-    """
-    基于颜色聚类的语义分割
-    针对本图片组的特点:白裙/绿背景/调色板/画布
-    """
-    from sklearn.cluster import KMeans
-    
-    img = cv2.imread(img_path)
-    img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
-    
-    # 转换到LAB颜色空间(更符合人眼感知)
-    img_lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
-    
-    h, w = img.shape[:2]
-    # 加入位置信息(x, y坐标)以增强空间连续性
-    y_coords, x_coords = np.mgrid[0:h, 0:w]
-    y_norm = y_coords.astype(np.float32) / h * 30  # 位置权重
-    x_norm = x_coords.astype(np.float32) / w * 30
-    
-    # 特征向量:LAB颜色 + 位置
-    features = np.column_stack([
-        img_lab.reshape(-1, 3).astype(np.float32),
-        y_norm.reshape(-1, 1),
-        x_norm.reshape(-1, 1)
-    ])
-    
-    # K-means聚类
-    kmeans = KMeans(n_clusters=n_segments, random_state=42, n_init=3)
-    labels = kmeans.fit_predict(features)
-    labels = labels.reshape(h, w)
-    
-    # 生成彩色分割图
-    colors = [
-        [255, 255, 255],  # 白色 - 白裙
-        [34, 139, 34],    # 绿色 - 背景草地
-        [101, 67, 33],    # 棕色 - 调色板/画架
-        [135, 206, 235],  # 天蓝 - 天空/远景
-        [255, 218, 185],  # 肤色 - 人物皮肤
-        [200, 200, 200],  # 灰色 - 画布
-    ]
-    
-    seg_img = np.zeros((h, w, 3), dtype=np.uint8)
-    for i in range(n_segments):
-        mask = labels == i
-        # 找到该聚类的平均颜色
-        cluster_color = kmeans.cluster_centers_[i][:3]
-        # 转回RGB
-        cluster_lab = np.uint8([[cluster_color]])
-        cluster_rgb = cv2.cvtColor(cluster_lab, cv2.COLOR_LAB2RGB)[0][0]
-        seg_img[mask] = cluster_rgb
-    
-    cv2.imwrite(output_path, cv2.cvtColor(seg_img, cv2.COLOR_RGB2BGR))
-    print(f"  Segmentation saved: {output_path}")
-    return True
-
-# ============================================================
-# 维度7: 色彩分布向量(HSV直方图)
-# ============================================================
-def extract_color_distribution(img_path, output_path_json, output_path_png):
-    """
-    提取HSV色彩分布向量
-    捕捉图片的整体色调特征
-    """
-    img = cv2.imread(img_path)
-    img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
-    
-    # 计算HSV直方图
-    h_hist = cv2.calcHist([img_hsv], [0], None, [36], [0, 180])  # 色相
-    s_hist = cv2.calcHist([img_hsv], [1], None, [32], [0, 256])  # 饱和度
-    v_hist = cv2.calcHist([img_hsv], [2], None, [32], [0, 256])  # 明度
-    
-    # 归一化
-    h_hist = h_hist.flatten() / h_hist.sum()
-    s_hist = s_hist.flatten() / s_hist.sum()
-    v_hist = v_hist.flatten() / v_hist.sum()
-    
-    # 计算统计特征
-    h, w = img.shape[:2]
-    total_pixels = h * w
-    
-    # 白色像素比例(白裙特征)
-    white_mask = (img_hsv[:,:,1] < 30) & (img_hsv[:,:,2] > 200)
-    white_ratio = white_mask.sum() / total_pixels
-    
-    # 绿色像素比例(背景特征)
-    green_mask = (img_hsv[:,:,0] >= 35) & (img_hsv[:,:,0] <= 85) & (img_hsv[:,:,1] > 50)
-    green_ratio = green_mask.sum() / total_pixels
-    
-    # 平均亮度
-    mean_brightness = img_hsv[:,:,2].mean() / 255.0
-    
-    # 平均饱和度
-    mean_saturation = img_hsv[:,:,1].mean() / 255.0
-    
-    data = {
-        "h_histogram": h_hist.tolist(),
-        "s_histogram": s_hist.tolist(),
-        "v_histogram": v_hist.tolist(),
-        "statistics": {
-            "white_ratio": float(white_ratio),
-            "green_ratio": float(green_ratio),
-            "mean_brightness": float(mean_brightness),
-            "mean_saturation": float(mean_saturation)
-        }
-    }
-    
-    with open(output_path_json, 'w') as f:
-        json.dump(data, f, indent=2)
-    
-    # 生成可视化图
-    fig_h = 200
-    fig_w = 600
-    vis = np.ones((fig_h, fig_w, 3), dtype=np.uint8) * 240
-    
-    # 绘制色相直方图(彩色)
-    bar_w = fig_w // 36
-    for i, val in enumerate(h_hist):
-        bar_h = int(val * (fig_h - 20))
-        hue = int(i * 5)  # 0-180
-        color_hsv = np.uint8([[[hue, 200, 200]]])
-        color_rgb = cv2.cvtColor(color_hsv, cv2.COLOR_HSV2BGR)[0][0]
-        x1 = i * bar_w
-        x2 = x1 + bar_w - 1
-        y1 = fig_h - bar_h - 10
-        y2 = fig_h - 10
-        cv2.rectangle(vis, (x1, y1), (x2, y2), color_rgb.tolist(), -1)
-    
-    cv2.imwrite(output_path_png, vis)
-    print(f"  Color distribution saved: {output_path_png}")
-    return data
-
-
-# ============================================================
-# 主执行流程
-# ============================================================
-print("\n--- 加载检测器 ---")
-from controlnet_aux import OpenposeDetector, MidasDetector, LineartDetector
-
-print("Loading OpenPose...")
-openpose_detector = OpenposeDetector.from_pretrained('lllyasviel/ControlNet')
-print("Loading MiDaS...")
-midas_detector = MidasDetector.from_pretrained('lllyasviel/Annotators')
-print("Loading Lineart...")
-lineart_detector = LineartDetector.from_pretrained('lllyasviel/Annotators')
-print("All detectors loaded!")
-
-# 处理每张图片
-for i in range(1, 10):
-    img_name = f"img_{i}"
-    img_path = os.path.join(INPUT_DIR, f"{img_name}.jpg")
-    
-    print(f"\n=== 处理 {img_name} ===")
-    
-    # 1. OpenPose
-    openpose_path = os.path.join(OUTPUT_DIR, 'openpose_skeleton', f"{img_name}.png")
-    img = Image.open(img_path)
-    result = openpose_detector(img, hand_and_face=True)
-    result.save(openpose_path)
-    print(f"  [1/7] OpenPose: {openpose_path}")
-    
-    # 2. Depth Map
-    depth_path = os.path.join(OUTPUT_DIR, 'depth_map', f"{img_name}.png")
-    result = midas_detector(img)
-    result.save(depth_path)
-    print(f"  [2/7] Depth: {depth_path}")
-    
-    # 3. Lineart
-    lineart_path = os.path.join(OUTPUT_DIR, 'lineart_edge', f"{img_name}.png")
-    result = lineart_detector(img, coarse=False)
-    result.save(lineart_path)
-    print(f"  [3/7] Lineart: {lineart_path}")
-    
-    # 4. Color Palette
-    palette_json = os.path.join(OUTPUT_DIR, 'color_palette', f"{img_name}.json")
-    palette_png = os.path.join(OUTPUT_DIR, 'color_palette', f"{img_name}.png")
-    extract_color_palette(img_path, palette_json, palette_png, n_colors=8)
-    print(f"  [4/7] Color Palette: {palette_png}")
-    
-    # 5. Bokeh Mask
-    bokeh_path = os.path.join(OUTPUT_DIR, 'bokeh_mask', f"{img_name}.png")
-    extract_bokeh_mask(img_path, depth_path, bokeh_path)
-    print(f"  [5/7] Bokeh Mask: {bokeh_path}")
-    
-    # 6. Semantic Segmentation
-    seg_path = os.path.join(OUTPUT_DIR, 'semantic_segmentation', f"{img_name}.png")
-    extract_semantic_segmentation(img_path, seg_path, n_segments=6)
-    print(f"  [6/7] Segmentation: {seg_path}")
-    
-    # 7. Color Distribution
-    dist_json = os.path.join(OUTPUT_DIR, 'color_distribution', f"{img_name}.json")
-    dist_png = os.path.join(OUTPUT_DIR, 'color_distribution', f"{img_name}.png")
-    extract_color_distribution(img_path, dist_json, dist_png)
-    print(f"  [7/7] Color Distribution: {dist_png}")
-
-print("\n=== 所有特征提取完成 ===")

+ 0 - 2797
examples/find knowledge/features_visualization.html

@@ -1,2797 +0,0 @@
-<!DOCTYPE html>
-<html lang="zh-CN">
-<head>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <title>写生油画 - 多模态特征可视化</title>
-    <style>
-        * {
-            margin: 0;
-            padding: 0;
-            box-sizing: border-box;
-        }
-
-        body {
-            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;
-            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-            color: #333;
-            line-height: 1.6;
-            padding: 20px;
-        }
-
-        .container {
-            max-width: 1400px;
-            margin: 0 auto;
-            background: white;
-            border-radius: 20px;
-            box-shadow: 0 20px 60px rgba(0,0,0,0.3);
-            overflow: hidden;
-        }
-
-        header {
-            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-            color: white;
-            padding: 40px;
-            text-align: center;
-        }
-
-        header h1 {
-            font-size: 2.5em;
-            margin-bottom: 10px;
-            text-shadow: 2px 2px 4px rgba(0,0,0,0.2);
-        }
-
-        header p {
-            font-size: 1.1em;
-            opacity: 0.9;
-        }
-
-        .stats {
-            display: grid;
-            grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
-            gap: 20px;
-            padding: 30px 40px;
-            background: #f8f9fa;
-            border-bottom: 2px solid #e9ecef;
-        }
-
-        .stat-card {
-            background: white;
-            padding: 20px;
-            border-radius: 10px;
-            text-align: center;
-            box-shadow: 0 2px 10px rgba(0,0,0,0.1);
-            transition: transform 0.3s;
-        }
-
-        .stat-card:hover {
-            transform: translateY(-5px);
-        }
-
-        .stat-number {
-            font-size: 2.5em;
-            font-weight: bold;
-            color: #667eea;
-            display: block;
-        }
-
-        .stat-label {
-            color: #666;
-            font-size: 0.9em;
-            margin-top: 5px;
-        }
-
-        .content {
-            padding: 40px;
-        }
-
-        .section {
-            margin-bottom: 50px;
-        }
-
-        .section-title {
-            font-size: 2em;
-            color: #667eea;
-            margin-bottom: 20px;
-            padding-bottom: 10px;
-            border-bottom: 3px solid #667eea;
-        }
-
-        .images-grid {
-            display: grid;
-            grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
-            gap: 20px;
-            margin-top: 30px;
-        }
-
-        .image-card {
-            background: #f8f9fa;
-            border-radius: 10px;
-            overflow: hidden;
-            box-shadow: 0 4px 15px rgba(0,0,0,0.1);
-            transition: all 0.3s;
-            cursor: pointer;
-        }
-
-        .image-card:hover {
-            transform: translateY(-5px);
-            box-shadow: 0 8px 25px rgba(0,0,0,0.15);
-        }
-
-        .image-card img {
-            width: 100%;
-            height: 200px;
-            object-fit: cover;
-            display: block;
-        }
-
-        .image-info {
-            padding: 15px;
-        }
-
-        .image-name {
-            font-weight: bold;
-            font-size: 1.1em;
-            color: #333;
-            margin-bottom: 8px;
-        }
-
-        .image-clusters {
-            font-size: 0.85em;
-            color: #666;
-        }
-
-        .cluster-tag {
-            display: inline-block;
-            background: #e7f3ff;
-            color: #0066cc;
-            padding: 3px 8px;
-            border-radius: 4px;
-            margin: 2px;
-            font-size: 0.85em;
-        }
-
-        .dimensions-grid {
-            display: grid;
-            gap: 30px;
-            margin-top: 30px;
-        }
-
-        .dimension-card {
-            background: #f8f9fa;
-            border-radius: 15px;
-            padding: 30px;
-            box-shadow: 0 4px 15px rgba(0,0,0,0.1);
-        }
-
-        .dimension-header {
-            display: flex;
-            justify-content: space-between;
-            align-items: center;
-            margin-bottom: 20px;
-            cursor: pointer;
-            user-select: none;
-        }
-
-        .dimension-title {
-            font-size: 1.5em;
-            font-weight: bold;
-            color: #667eea;
-        }
-
-        .toggle-btn {
-            background: #667eea;
-            color: white;
-            border: none;
-            padding: 8px 20px;
-            border-radius: 20px;
-            cursor: pointer;
-            font-size: 0.9em;
-            transition: all 0.3s;
-        }
-
-        .toggle-btn:hover {
-            background: #5568d3;
-        }
-
-        .dimension-description {
-            background: white;
-            padding: 20px;
-            border-radius: 10px;
-            margin-bottom: 20px;
-            line-height: 1.8;
-        }
-
-        .dimension-meta {
-            display: grid;
-            grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
-            gap: 15px;
-            margin-bottom: 20px;
-        }
-
-        .meta-item {
-            background: white;
-            padding: 15px;
-            border-radius: 8px;
-        }
-
-        .meta-label {
-            font-weight: bold;
-            color: #667eea;
-            font-size: 0.9em;
-            margin-bottom: 5px;
-        }
-
-        .meta-value {
-            color: #333;
-            font-size: 0.95em;
-        }
-
-        .dimension-content {
-            display: block;
-            margin-top: 20px;
-        }
-
-        .dimension-content.active {
-            display: block;
-        }
-
-        .feature-images-grid {
-            display: grid;
-            grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
-            gap: 15px;
-            margin-top: 20px;
-        }
-
-        .feature-image-card {
-            background: white;
-            border-radius: 8px;
-            overflow: hidden;
-            box-shadow: 0 2px 10px rgba(0,0,0,0.1);
-            cursor: pointer;
-            transition: all 0.3s;
-        }
-
-        .feature-image-card:hover {
-            transform: scale(1.05);
-            box-shadow: 0 4px 20px rgba(0,0,0,0.15);
-        }
-
-        .feature-image-card img {
-            width: 100%;
-            height: 150px;
-            object-fit: cover;
-            display: block;
-        }
-
-        .feature-image-label {
-            padding: 10px;
-            text-align: center;
-            font-size: 0.9em;
-            font-weight: bold;
-            color: #333;
-        }
-
-        .modal {
-            display: none;
-            position: fixed;
-            z-index: 1000;
-            left: 0;
-            top: 0;
-            width: 100%;
-            height: 100%;
-            background: rgba(0,0,0,0.9);
-            justify-content: center;
-            align-items: center;
-        }
-
-        .modal.active {
-            display: flex;
-        }
-
-        .modal-content {
-            max-width: 90%;
-            max-height: 90%;
-            position: relative;
-        }
-
-        .modal-content-wrapper {
-            max-width: 95%;
-            max-height: 90vh;
-            position: relative;
-        }
-
-        .modal-images {
-            display: flex;
-            gap: 20px;
-            align-items: flex-start;
-            justify-content: center;
-            flex-wrap: wrap;
-        }
-
-        .modal-image-container {
-            display: flex;
-            flex-direction: column;
-            align-items: center;
-            max-width: 45%;
-            min-width: 400px;
-        }
-
-        .modal-image-title {
-            color: white;
-            font-size: 1.2em;
-            font-weight: bold;
-            margin-bottom: 10px;
-            text-align: center;
-        }
-
-        .modal-image-container img {
-            max-width: 100%;
-            max-height: 80vh;
-            object-fit: contain;
-            border-radius: 10px;
-            box-shadow: 0 4px 20px rgba(0,0,0,0.5);
-        }
-
-        #featureImageContainer.hidden {
-            display: none;
-        }
-
-        @media (max-width: 1200px) {
-            .modal-image-container {
-                max-width: 90%;
-                min-width: 300px;
-            }
-        }
-
-
-        .modal-content img {
-            max-width: 100%;
-            max-height: 90vh;
-            object-fit: contain;
-            border-radius: 10px;
-        }
-
-        .modal-close {
-            position: absolute;
-            top: -40px;
-            right: 0;
-            color: white;
-            font-size: 40px;
-            font-weight: bold;
-            cursor: pointer;
-            background: none;
-            border: none;
-            padding: 0 10px;
-        }
-
-        .modal-close:hover {
-            color: #667eea;
-        }
-
-        .color-palette-display {
-            display: flex;
-            gap: 5px;
-            margin-top: 10px;
-            height: 40px;
-        }
-
-        .color-block {
-            flex: 1;
-            border-radius: 4px;
-            position: relative;
-            cursor: pointer;
-            transition: transform 0.2s;
-        }
-
-        .color-block:hover {
-            transform: scale(1.1);
-        }
-
-        .color-block::after {
-            content: attr(data-hex);
-            position: absolute;
-            bottom: -25px;
-            left: 50%;
-            transform: translateX(-50%);
-            font-size: 0.7em;
-            color: #666;
-            white-space: nowrap;
-        }
-
-        .hsv-stats {
-            display: grid;
-            grid-template-columns: repeat(4, 1fr);
-            gap: 10px;
-            margin-top: 15px;
-        }
-
-        .hsv-stat {
-            background: white;
-            padding: 10px;
-            border-radius: 6px;
-            text-align: center;
-        }
-
-        .hsv-stat-label {
-            font-size: 0.8em;
-            color: #666;
-            margin-bottom: 5px;
-        }
-
-        .hsv-stat-value {
-            font-size: 1.2em;
-            font-weight: bold;
-            color: #667eea;
-        }
-
-        .cluster-info {
-            background: #e7f3ff;
-            padding: 15px;
-            border-radius: 8px;
-            margin-top: 15px;
-        }
-
-        .cluster-info h4 {
-            color: #0066cc;
-            margin-bottom: 10px;
-        }
-
-        .cluster-list {
-            display: flex;
-            flex-wrap: wrap;
-            gap: 10px;
-        }
-
-        .cluster-badge {
-            background: white;
-            padding: 8px 15px;
-            border-radius: 20px;
-            font-size: 0.9em;
-            color: #333;
-            box-shadow: 0 2px 5px rgba(0,0,0,0.1);
-        }
-
-        .detail-toggle {
-            background: white;
-            padding: 15px;
-            border-radius: 8px;
-            margin-top: 15px;
-            cursor: pointer;
-            user-select: none;
-            transition: all 0.3s;
-            border: 2px solid #e9ecef;
-        }
-
-        .detail-toggle:hover {
-            border-color: #667eea;
-            background: #f8f9fa;
-        }
-
-        .detail-toggle-header {
-            display: flex;
-            justify-content: space-between;
-            align-items: center;
-            font-weight: bold;
-            color: #667eea;
-        }
-
-        .detail-toggle-icon {
-            font-size: 1.2em;
-            transition: transform 0.3s;
-        }
-
-        .detail-toggle-icon.expanded {
-            transform: rotate(180deg);
-        }
-
-        .detail-toggle-content {
-            display: none;
-            margin-top: 15px;
-            padding-top: 15px;
-            border-top: 1px solid #e9ecef;
-        }
-
-        .detail-toggle-content.active {
-            display: block;
-        }
-
-        .detail-section {
-            background: #f8f9fa;
-            padding: 15px;
-            border-radius: 8px;
-            margin-bottom: 10px;
-        }
-
-        .detail-section h4 {
-            color: #667eea;
-            margin-bottom: 10px;
-            font-size: 1em;
-        }
-
-        .detail-section ul {
-            margin: 0;
-            padding-left: 20px;
-            line-height: 1.8;
-        }
-
-        .detail-section p {
-            margin: 0;
-            line-height: 1.8;
-        }
-
-        .io-container {
-            display: grid;
-            grid-template-columns: 1fr 1fr;
-            gap: 20px;
-            margin-top: 20px;
-        }
-
-        .input-box, .output-box {
-            background: white;
-            border: 2px solid #e9ecef;
-            border-radius: 12px;
-            padding: 20px;
-        }
-
-        .input-box {
-            border-color: #667eea;
-        }
-
-        .output-box {
-            border-color: #28a745;
-        }
-
-        .box-title {
-            font-size: 1.2em;
-            font-weight: bold;
-            margin-bottom: 15px;
-            padding-bottom: 10px;
-            border-bottom: 2px solid;
-        }
-
-        .input-box .box-title {
-            color: #667eea;
-            border-bottom-color: #667eea;
-        }
-
-        .output-box .box-title {
-            color: #28a745;
-            border-bottom-color: #28a745;
-        }
-
-        @media (max-width: 1024px) {
-            .io-container {
-                grid-template-columns: 1fr;
-            }
-        }
-
-        .overview-section {
-            padding: 40px;
-            background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
-        }
-
-        .overview-title {
-            font-size: 2em;
-            color: #667eea;
-            margin-bottom: 30px;
-            text-align: center;
-            font-weight: bold;
-        }
-
-        .overview-grid {
-            display: grid;
-            grid-template-columns: 1fr 1fr;
-            gap: 30px;
-            margin-bottom: 20px;
-        }
-
-        .overview-box {
-            background: white;
-            border-radius: 15px;
-            padding: 25px;
-            box-shadow: 0 4px 15px rgba(0,0,0,0.1);
-        }
-
-        .overview-box h3 {
-            color: #667eea;
-            font-size: 1.3em;
-            margin-bottom: 20px;
-            padding-bottom: 10px;
-            border-bottom: 2px solid #667eea;
-        }
-
-        .cluster-overview-item {
-            background: #f8f9fa;
-            padding: 15px;
-            border-radius: 8px;
-            margin-bottom: 12px;
-            border-left: 4px solid #667eea;
-        }
-
-        .cluster-overview-title {
-            font-weight: bold;
-            color: #333;
-            font-size: 1.05em;
-            margin-bottom: 5px;
-        }
-
-        .cluster-overview-meta {
-            font-size: 0.9em;
-            color: #666;
-        }
-
-        .cluster-overview-meta span {
-            display: inline-block;
-            margin-right: 15px;
-        }
-
-        .dimension-overview-item {
-            background: #f8f9fa;
-            padding: 15px;
-            border-radius: 8px;
-            margin-bottom: 12px;
-            border-left: 4px solid #28a745;
-        }
-
-        .dimension-overview-title {
-            font-weight: bold;
-            color: #333;
-            font-size: 1.05em;
-            margin-bottom: 8px;
-        }
-
-        .dimension-overview-clusters {
-            display: flex;
-            flex-wrap: wrap;
-            gap: 8px;
-            margin-top: 8px;
-        }
-
-        .mini-cluster-tag {
-            background: #e7f3ff;
-            color: #0066cc;
-            padding: 4px 10px;
-            border-radius: 12px;
-            font-size: 0.85em;
-        }
-
-        @media (max-width: 1024px) {
-            .overview-grid {
-                grid-template-columns: 1fr;
-            }
-        }
-
-    </style>
-</head>
-<body>
-    <div class="container">
-        <header>
-            <h1>写生油画 - 多模态特征可视化</h1>
-            <p>从图片中提取的可逆特征空间分析</p>
-        </header>
-
-        <div class="stats">
-            <div class="stat-card">
-                <span class="stat-number">9</span>
-                <span class="stat-label">原始图片</span>
-            </div>
-            <div class="stat-card">
-                <span class="stat-number">7</span>
-                <span class="stat-label">特征维度</span>
-            </div>
-            <div class="stat-card">
-                <span class="stat-number">6</span>
-                <span class="stat-label">亮点聚类</span>
-            </div>
-            <div class="stat-card">
-                <span class="stat-number">63</span>
-                <span class="stat-label">特征图片</span>
-            </div>
-        </div>
-
-        <!-- 总览区域 -->
-        <div class="overview-section">
-            <h2 class="overview-title">📊 亮点与特征维度总览</h2>
-            <div class="overview-grid">
-                <!-- 左侧:亮点聚类 -->
-                <div class="overview-box">
-                    <h3>🎯 亮点聚类(6个)</h3>
-                    <div id="clusterOverview"></div>
-                </div>
-
-                <!-- 右侧:特征维度 -->
-                <div class="overview-box">
-                    <h3>🎨 特征维度(7个)</h3>
-                    <div id="dimensionOverview"></div>
-                </div>
-            </div>
-        </div>
-
-        <div class="content">
-            <!-- 原始图片展示 -->
-            <div class="section">
-                <h2 class="section-title">📷 原始图片</h2>
-                <div class="images-grid" id="originalImages"></div>
-            </div>
-
-            <!-- 特征维度展示 -->
-            <div class="section">
-                <h2 class="section-title">🎨 多模态特征维度</h2>
-                <div class="dimensions-grid" id="dimensionsContainer"></div>
-            </div>
-        </div>
-    </div>
-
-    <!-- 图片放大模态框 -->
-    <div class="modal" id="imageModal">
-        <div class="modal-content-wrapper">
-            <button class="modal-close" onclick="closeModal()">&times;</button>
-            <div class="modal-images">
-                <div class="modal-image-container">
-                    <div class="modal-image-title">原图</div>
-                    <img id="modalOriginalImage" src="" alt="原图">
-                </div>
-                <div class="modal-image-container" id="featureImageContainer">
-                    <div class="modal-image-title">特征图</div>
-                    <img id="modalFeatureImage" src="" alt="特征图">
-                </div>
-            </div>
-        </div>
-    </div>
-
-    <script>
-        // 数据加载
-        const mappingData = {
-  "post_name": "写生油画",
-  "total_images": 9,
-  "total_features": 7,
-  "feature_dimensions": [
-    "openpose_skeleton",
-    "depth_map",
-    "lineart_edge",
-    "color_palette",
-    "bokeh_mask",
-    "semantic_segmentation",
-    "color_distribution"
-  ],
-  "cluster_overview": {
-    "cluster_1": {
-      "聚类主题": "优雅的白裙画者",
-      "亮点类型": "实质",
-      "图片数量": 9,
-      "图片列表": [
-        "img_1",
-        "img_2",
-        "img_3",
-        "img_4",
-        "img_5",
-        "img_6",
-        "img_7",
-        "img_8",
-        "img_9"
-      ],
-      "对应特征维度": [
-        "openpose_skeleton",
-        "lineart_edge",
-        "semantic_segmentation"
-      ]
-    },
-    "cluster_2": {
-      "聚类主题": "充满艺术气息的写生道具",
-      "亮点类型": "实质",
-      "图片数量": 7,
-      "图片列表": [
-        "img_1",
-        "img_4",
-        "img_5",
-        "img_6",
-        "img_7",
-        "img_8",
-        "img_9"
-      ],
-      "对应特征维度": [
-        "lineart_edge",
-        "color_palette"
-      ]
-    },
-    "cluster_3": {
-      "聚类主题": "清新自然的绿白配色",
-      "亮点类型": "形式",
-      "图片数量": 5,
-      "图片列表": [
-        "img_1",
-        "img_4",
-        "img_5",
-        "img_7",
-        "img_8"
-      ],
-      "对应特征维度": [
-        "color_palette",
-        "semantic_segmentation",
-        "color_distribution"
-      ]
-    },
-    "cluster_4": {
-      "聚类主题": "虚实呼应的画中画结构",
-      "亮点类型": "形式",
-      "图片数量": 3,
-      "图片列表": [
-        "img_1",
-        "img_2",
-        "img_3"
-      ],
-      "对应特征维度": [
-        "depth_map",
-        "bokeh_mask",
-        "color_distribution"
-      ]
-    },
-    "cluster_5": {
-      "聚类主题": "唯美梦幻的光影氛围",
-      "亮点类型": "形式",
-      "图片数量": 3,
-      "图片列表": [
-        "img_2",
-        "img_3",
-        "img_7"
-      ],
-      "对应特征维度": [
-        "depth_map",
-        "semantic_segmentation"
-      ]
-    },
-    "cluster_6": {
-      "聚类主题": "巧妙的摄影构图视角",
-      "亮点类型": "形式",
-      "图片数量": 4,
-      "图片列表": [
-        "img_4",
-        "img_5",
-        "img_6",
-        "img_9"
-      ],
-      "对应特征维度": [
-        "openpose_skeleton"
-      ]
-    }
-  },
-  "image_overview": {
-    "img_1": {
-      "active_clusters": {
-        "cluster_1": {
-          "聚类主题": "优雅的白裙画者",
-          "亮点类型": "实质",
-          "合并结论": "优雅的白裙侧背影"
-        },
-        "cluster_2": {
-          "聚类主题": "充满艺术气息的写生道具",
-          "亮点类型": "实质",
-          "合并结论": "充满艺术气息的写生道具"
-        },
-        "cluster_3": {
-          "聚类主题": "清新自然的绿白配色",
-          "亮点类型": "形式",
-          "合并结论": "清新治愈的绿白配色"
-        },
-        "cluster_4": {
-          "聚类主题": "虚实呼应的画中画结构",
-          "亮点类型": "形式",
-          "合并结论": "虚实呼应的画中画结构"
-        }
-      },
-      "features": {
-        "openpose_skeleton": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_1.png",
-          "exists": true
-        },
-        "depth_map": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_1.png",
-          "exists": true
-        },
-        "lineart_edge": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_1.png",
-          "exists": true
-        },
-        "color_palette": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_1.png",
-          "exists": true,
-          "json_data": {
-            "dominant_color": [
-              70,
-              95,
-              62
-            ],
-            "palette": [
-              [
-                72,
-                98,
-                60
-              ],
-              [
-                150,
-                172,
-                181
-              ],
-              [
-                193,
-                201,
-                206
-              ],
-              [
-                147,
-                146,
-                132
-              ],
-              [
-                24,
-                30,
-                24
-              ],
-              [
-                101,
-                133,
-                133
-              ],
-              [
-                147,
-                182,
-                140
-              ]
-            ],
-            "palette_hex": [
-              "#48623c",
-              "#96acb5",
-              "#c1c9ce",
-              "#939284",
-              "#181e18",
-              "#658585",
-              "#93b68c"
-            ]
-          }
-        },
-        "bokeh_mask": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_1.png",
-          "exists": true
-        },
-        "semantic_segmentation": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_1.png",
-          "exists": true
-        },
-        "color_distribution": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_1.png",
-          "exists": true,
-          "json_data": {
-            "hist_h": [
-              0.02299436368048191,
-              0.045076314359903336,
-              0.011987491510808468,
-              0.013310426846146584,
-              0.21862855553627014,
-              0.25030627846717834,
-              0.1314917802810669,
-              0.0352347306907177,
-              0.02485457994043827,
-              0.11076493561267853,
-              0.12063290178775787,
-              0.005362520460039377,
-              0.002378838136792183,
-              0.0013802022440358996,
-              0.0007515507168136537,
-              0.0009613157017156482,
-              0.0014381129294633865,
-              0.0024451136123389006
-            ],
-            "hist_s": [
-              0.09791071712970734,
-              0.23805883526802063,
-              0.23730599880218506,
-              0.33129745721817017,
-              0.08900406956672668,
-              0.006134661380201578,
-              0.0002496589731890708,
-              3.860705692204647e-05
-            ],
-            "hist_v": [
-              0.025200756266713142,
-              0.17062132060527802,
-              0.1783987134695053,
-              0.13612976670265198,
-              0.24666756391525269,
-              0.14068475365638733,
-              0.07682546973228455,
-              0.025471650063991547
-            ],
-            "white_ratio": 0.0239,
-            "green_ratio": 0.6277,
-            "mean_brightness": 0.4702,
-            "mean_saturation": 0.3217,
-            "h_bins": 18,
-            "s_bins": 8,
-            "v_bins": 8
-          }
-        }
-      },
-      "hsv_summary": {
-        "white_ratio": 0.0239,
-        "green_ratio": 0.6277,
-        "mean_brightness": 0.4702,
-        "mean_saturation": 0.3217
-      }
-    },
-    "img_2": {
-      "active_clusters": {
-        "cluster_1": {
-          "聚类主题": "优雅的白裙画者",
-          "亮点类型": "实质",
-          "合并结论": "优雅的白裙背影"
-        },
-        "cluster_4": {
-          "聚类主题": "虚实呼应的画中画结构",
-          "亮点类型": "形式",
-          "合并结论": "虚实呼应的叙事构图"
-        },
-        "cluster_5": {
-          "聚类主题": "唯美梦幻的光影氛围",
-          "亮点类型": "形式",
-          "合并结论": "柔美的逆光氛围"
-        }
-      },
-      "features": {
-        "openpose_skeleton": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_2.png",
-          "exists": true
-        },
-        "depth_map": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_2.png",
-          "exists": true
-        },
-        "lineart_edge": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_2.png",
-          "exists": true
-        },
-        "color_palette": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_2.png",
-          "exists": true,
-          "json_data": {
-            "dominant_color": [
-              138,
-              156,
-              105
-            ],
-            "palette": [
-              [
-                138,
-                156,
-                104
-              ],
-              [
-                219,
-                227,
-                227
-              ],
-              [
-                75,
-                69,
-                55
-              ],
-              [
-                209,
-                194,
-                154
-              ],
-              [
-                72,
-                95,
-                77
-              ],
-              [
-                111,
-                171,
-                189
-              ],
-              [
-                182,
-                212,
-                170
-              ]
-            ],
-            "palette_hex": [
-              "#8a9c68",
-              "#dbe3e3",
-              "#4b4537",
-              "#d1c29a",
-              "#485f4d",
-              "#6fabbd",
-              "#b6d4aa"
-            ]
-          }
-        },
-        "bokeh_mask": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_2.png",
-          "exists": true
-        },
-        "semantic_segmentation": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_2.png",
-          "exists": true
-        },
-        "color_distribution": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_2.png",
-          "exists": true,
-          "json_data": {
-            "hist_h": [
-              0.0732845589518547,
-              0.15593840181827545,
-              0.12949064373970032,
-              0.12419310957193375,
-              0.23567485809326172,
-              0.03178519010543823,
-              0.03388284146785736,
-              0.010717319324612617,
-              0.01433801744133234,
-              0.10481687635183334,
-              0.07486487179994583,
-              0.002149126259610057,
-              0.0011041618417948484,
-              0.0023498828522861004,
-              0.0006904228939674795,
-              0.0003197951300535351,
-              0.003116233041509986,
-              0.0012836846290156245
-            ],
-            "hist_s": [
-              0.28900665044784546,
-              0.2196548581123352,
-              0.2457796037197113,
-              0.18217319250106812,
-              0.05714680999517441,
-              0.004347797948867083,
-              0.0018428434850648046,
-              4.8258822062052786e-05
-            ],
-            "hist_v": [
-              0.0,
-              0.01885053887963295,
-              0.12125833332538605,
-              0.09530602395534515,
-              0.10405567288398743,
-              0.2533491551876068,
-              0.15230870246887207,
-              0.25487157702445984
-            ],
-            "white_ratio": 0.2392,
-            "green_ratio": 0.3379,
-            "mean_brightness": 0.6831,
-            "mean_saturation": 0.2485,
-            "h_bins": 18,
-            "s_bins": 8,
-            "v_bins": 8
-          }
-        }
-      },
-      "hsv_summary": {
-        "white_ratio": 0.2392,
-        "green_ratio": 0.3379,
-        "mean_brightness": 0.6831,
-        "mean_saturation": 0.2485
-      }
-    },
-    "img_3": {
-      "active_clusters": {
-        "cluster_1": {
-          "聚类主题": "优雅的白裙画者",
-          "亮点类型": "实质",
-          "合并结论": "纯净优雅的白裙背影"
-        },
-        "cluster_4": {
-          "聚类主题": "虚实呼应的画中画结构",
-          "亮点类型": "形式",
-          "合并结论": "虚实呼应的画中画构图"
-        },
-        "cluster_5": {
-          "聚类主题": "唯美梦幻的光影氛围",
-          "亮点类型": "形式",
-          "合并结论": "梦幻森系的自然光影"
-        }
-      },
-      "features": {
-        "openpose_skeleton": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_3.png",
-          "exists": true
-        },
-        "depth_map": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_3.png",
-          "exists": true
-        },
-        "lineart_edge": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_3.png",
-          "exists": true
-        },
-        "color_palette": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_3.png",
-          "exists": true,
-          "json_data": {
-            "dominant_color": [
-              129,
-              149,
-              88
-            ],
-            "palette": [
-              [
-                226,
-                235,
-                234
-              ],
-              [
-                126,
-                145,
-                86
-              ],
-              [
-                78,
-                74,
-                55
-              ],
-              [
-                210,
-                200,
-                155
-              ],
-              [
-                144,
-                169,
-                158
-              ],
-              [
-                171,
-                205,
-                110
-              ],
-              [
-                66,
-                97,
-                55
-              ]
-            ],
-            "palette_hex": [
-              "#e2ebea",
-              "#7e9156",
-              "#4e4a37",
-              "#d2c89b",
-              "#90a99e",
-              "#abcd6e",
-              "#426137"
-            ]
-          }
-        },
-        "bokeh_mask": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_3.png",
-          "exists": true
-        },
-        "semantic_segmentation": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_3.png",
-          "exists": true
-        },
-        "color_distribution": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_3.png",
-          "exists": true,
-          "json_data": {
-            "hist_h": [
-              0.08796747028827667,
-              0.07544205337762833,
-              0.14689534902572632,
-              0.12777456641197205,
-              0.3085463047027588,
-              0.0542680099606514,
-              0.022549094632267952,
-              0.014717653393745422,
-              0.011737189255654812,
-              0.08198659121990204,
-              0.05702970176935196,
-              0.0014998841797932982,
-              0.003399351378902793,
-              0.0004800144233740866,
-              0.0002187733189202845,
-              0.0010964404791593552,
-              0.0006859187269583344,
-              0.0037056340370327234
-            ],
-            "hist_s": [
-              0.22554758191108704,
-              0.21504710614681244,
-              0.20258988440036774,
-              0.20314133167266846,
-              0.1272115409374237,
-              0.023029109463095665,
-              0.003271948080509901,
-              0.00016150619194377214
-            ],
-            "hist_v": [
-              0.0,
-              0.006298741325736046,
-              0.07633130252361298,
-              0.1305510550737381,
-              0.1652330607175827,
-              0.20487864315509796,
-              0.15114469826221466,
-              0.265562504529953
-            ],
-            "white_ratio": 0.1947,
-            "green_ratio": 0.4209,
-            "mean_brightness": 0.6935,
-            "mean_saturation": 0.2881,
-            "h_bins": 18,
-            "s_bins": 8,
-            "v_bins": 8
-          }
-        }
-      },
-      "hsv_summary": {
-        "white_ratio": 0.1947,
-        "green_ratio": 0.4209,
-        "mean_brightness": 0.6935,
-        "mean_saturation": 0.2881
-      }
-    },
-    "img_4": {
-      "active_clusters": {
-        "cluster_1": {
-          "聚类主题": "优雅的白裙画者",
-          "亮点类型": "实质",
-          "合并结论": "纯净的白裙画者形象"
-        },
-        "cluster_2": {
-          "聚类主题": "充满艺术气息的写生道具",
-          "亮点类型": "实质",
-          "合并结论": "充满艺术感的写生道具"
-        },
-        "cluster_3": {
-          "聚类主题": "清新自然的绿白配色",
-          "亮点类型": "形式",
-          "合并结论": "清新自然的绿白配色"
-        },
-        "cluster_6": {
-          "聚类主题": "巧妙的摄影构图视角",
-          "亮点类型": "形式",
-          "合并结论": "均衡的左右呼应构图"
-        }
-      },
-      "features": {
-        "openpose_skeleton": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_4.png",
-          "exists": true
-        },
-        "depth_map": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_4.png",
-          "exists": true
-        },
-        "lineart_edge": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_4.png",
-          "exists": true
-        },
-        "color_palette": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_4.png",
-          "exists": true,
-          "json_data": {
-            "dominant_color": [
-              116,
-              118,
-              72
-            ],
-            "palette": [
-              [
-                112,
-                116,
-                67
-              ],
-              [
-                216,
-                213,
-                203
-              ],
-              [
-                181,
-                196,
-                191
-              ],
-              [
-                161,
-                151,
-                129
-              ],
-              [
-                158,
-                169,
-                175
-              ],
-              [
-                35,
-                46,
-                31
-              ],
-              [
-                60,
-                47,
-                34
-              ]
-            ],
-            "palette_hex": [
-              "#707443",
-              "#d8d5cb",
-              "#b5c4bf",
-              "#a19781",
-              "#9ea9af",
-              "#232e1f",
-              "#3c2f22"
-            ]
-          }
-        },
-        "bokeh_mask": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_4.png",
-          "exists": true
-        },
-        "semantic_segmentation": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_4.png",
-          "exists": true
-        },
-        "color_distribution": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_4.png",
-          "exists": true,
-          "json_data": {
-            "hist_h": [
-              0.021759580820798874,
-              0.14858633279800415,
-              0.21194759011268616,
-              0.2254870980978012,
-              0.2172277569770813,
-              0.009835791774094105,
-              0.007799269165843725,
-              0.010793889872729778,
-              0.02440738119184971,
-              0.07726301997900009,
-              0.03628162667155266,
-              0.0028279670514166355,
-              0.0010674850782379508,
-              0.000593261793255806,
-              0.00036226288648322225,
-              0.0005269863177090883,
-              0.0009741847752593458,
-              0.0022585128899663687
-            ],
-            "hist_s": [
-              0.17237728834152222,
-              0.09118407964706421,
-              0.1611233353614807,
-              0.3682836592197418,
-              0.15807917714118958,
-              0.03790698200464249,
-              0.009977350942790508,
-              0.00106812862213701
-            ],
-            "hist_v": [
-              0.005347077269107103,
-              0.039011143147945404,
-              0.10711270570755005,
-              0.2906358540058136,
-              0.2130337357521057,
-              0.13399480283260345,
-              0.10851671546697617,
-              0.1023479551076889
-            ],
-            "white_ratio": 0.1343,
-            "green_ratio": 0.3067,
-            "mean_brightness": 0.5639,
-            "mean_saturation": 0.3606,
-            "h_bins": 18,
-            "s_bins": 8,
-            "v_bins": 8
-          }
-        }
-      },
-      "hsv_summary": {
-        "white_ratio": 0.1343,
-        "green_ratio": 0.3067,
-        "mean_brightness": 0.5639,
-        "mean_saturation": 0.3606
-      }
-    },
-    "img_5": {
-      "active_clusters": {
-        "cluster_1": {
-          "聚类主题": "优雅的白裙画者",
-          "亮点类型": "实质",
-          "合并结论": "洁白柔顺的衣物褶皱"
-        },
-        "cluster_2": {
-          "聚类主题": "充满艺术气息的写生道具",
-          "亮点类型": "实质",
-          "合并结论": "斑斓厚重的油彩肌理"
-        },
-        "cluster_3": {
-          "聚类主题": "清新自然的绿白配色",
-          "亮点类型": "形式",
-          "合并结论": "清新高雅的色彩构成"
-        },
-        "cluster_6": {
-          "聚类主题": "巧妙的摄影构图视角",
-          "亮点类型": "形式",
-          "合并结论": "突出动作的局部构图"
-        }
-      },
-      "features": {
-        "openpose_skeleton": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_5.png",
-          "exists": true
-        },
-        "depth_map": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_5.png",
-          "exists": true
-        },
-        "lineart_edge": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_5.png",
-          "exists": true
-        },
-        "color_palette": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_5.png",
-          "exists": true,
-          "json_data": {
-            "dominant_color": [
-              49,
-              91,
-              54
-            ],
-            "palette": [
-              [
-                49,
-                91,
-                54
-              ],
-              [
-                209,
-                214,
-                216
-              ],
-              [
-                104,
-                75,
-                64
-              ],
-              [
-                118,
-                120,
-                71
-              ],
-              [
-                108,
-                147,
-                169
-              ],
-              [
-                163,
-                137,
-                133
-              ],
-              [
-                37,
-                190,
-                206
-              ]
-            ],
-            "palette_hex": [
-              "#315b36",
-              "#d1d6d8",
-              "#684b40",
-              "#767847",
-              "#6c93a9",
-              "#a38985",
-              "#25bece"
-            ]
-          }
-        },
-        "bokeh_mask": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_5.png",
-          "exists": true
-        },
-        "semantic_segmentation": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_5.png",
-          "exists": true
-        },
-        "color_distribution": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_5.png",
-          "exists": true,
-          "json_data": {
-            "hist_h": [
-              0.06531541794538498,
-              0.09025493264198303,
-              0.014375980943441391,
-              0.011843358166515827,
-              0.12692134082317352,
-              0.15304480493068695,
-              0.014180372469127178,
-              0.024089517071843147,
-              0.06461405754089355,
-              0.11568476259708405,
-              0.20321017503738403,
-              0.044057730585336685,
-              0.016082413494586945,
-              0.010450930334627628,
-              0.004185648635029793,
-              0.006949913688004017,
-              0.015166782774031162,
-              0.019571848213672638
-            ],
-            "hist_s": [
-              0.3696361780166626,
-              0.1519850492477417,
-              0.05476089194417,
-              0.10194257646799088,
-              0.17193330824375153,
-              0.104984812438488,
-              0.03291315957903862,
-              0.011844001710414886
-            ],
-            "hist_v": [
-              0.011543510481715202,
-              0.01847798191010952,
-              0.18232890963554382,
-              0.1763029843568802,
-              0.05641070008277893,
-              0.07998481392860413,
-              0.20172573626041412,
-              0.2732253670692444
-            ],
-            "white_ratio": 0.2872,
-            "green_ratio": 0.3239,
-            "mean_brightness": 0.6478,
-            "mean_saturation": 0.3156,
-            "h_bins": 18,
-            "s_bins": 8,
-            "v_bins": 8
-          }
-        }
-      },
-      "hsv_summary": {
-        "white_ratio": 0.2872,
-        "green_ratio": 0.3239,
-        "mean_brightness": 0.6478,
-        "mean_saturation": 0.3156
-      }
-    },
-    "img_6": {
-      "active_clusters": {
-        "cluster_1": {
-          "聚类主题": "优雅的白裙画者",
-          "亮点类型": "实质",
-          "合并结论": "精致的侧颜与配饰"
-        },
-        "cluster_2": {
-          "聚类主题": "充满艺术气息的写生道具",
-          "亮点类型": "实质",
-          "合并结论": "高对比的斑斓调色盘"
-        },
-        "cluster_6": {
-          "聚类主题": "巧妙的摄影构图视角",
-          "亮点类型": "形式",
-          "合并结论": "沉浸式的过肩构图"
-        }
-      },
-      "features": {
-        "openpose_skeleton": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_6.png",
-          "exists": true
-        },
-        "depth_map": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_6.png",
-          "exists": true
-        },
-        "lineart_edge": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_6.png",
-          "exists": true
-        },
-        "color_palette": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_6.png",
-          "exists": true,
-          "json_data": {
-            "dominant_color": [
-              104,
-              143,
-              148
-            ],
-            "palette": [
-              [
-                125,
-                145,
-                148
-              ],
-              [
-                202,
-                204,
-                212
-              ],
-              [
-                47,
-                47,
-                38
-              ],
-              [
-                27,
-                134,
-                147
-              ],
-              [
-                153,
-                189,
-                218
-              ],
-              [
-                72,
-                62,
-                75
-              ],
-              [
-                168,
-                204,
-                201
-              ]
-            ],
-            "palette_hex": [
-              "#7d9194",
-              "#caccd4",
-              "#2f2f26",
-              "#1b8693",
-              "#99bdda",
-              "#483e4b",
-              "#a8ccc9"
-            ]
-          }
-        },
-        "bokeh_mask": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_6.png",
-          "exists": true
-        },
-        "semantic_segmentation": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_6.png",
-          "exists": true
-        },
-        "color_distribution": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_6.png",
-          "exists": true,
-          "json_data": {
-            "hist_h": [
-              0.1566610038280487,
-              0.04552222415804863,
-              0.011773865669965744,
-              0.021885696798563004,
-              0.046773094683885574,
-              0.0223541297018528,
-              0.03028852306306362,
-              0.03333976864814758,
-              0.05309435725212097,
-              0.1629861295223236,
-              0.3142968416213989,
-              0.018021130934357643,
-              0.006420996971428394,
-              0.0047917794436216354,
-              0.0050942013040184975,
-              0.01143412385135889,
-              0.020818213000893593,
-              0.0344439297914505
-            ],
-            "hist_s": [
-              0.130146324634552,
-              0.3402388393878937,
-              0.22351619601249695,
-              0.09706779569387436,
-              0.07324466854333878,
-              0.04026523232460022,
-              0.04923300817608833,
-              0.04628793150186539
-            ],
-            "hist_v": [
-              0.020250044763088226,
-              0.11473309993743896,
-              0.055246055126190186,
-              0.05642228573560715,
-              0.21779786050319672,
-              0.23236235976219177,
-              0.18257728219032288,
-              0.12061101943254471
-            ],
-            "white_ratio": 0.0506,
-            "green_ratio": 0.1604,
-            "mean_brightness": 0.6068,
-            "mean_saturation": 0.3338,
-            "h_bins": 18,
-            "s_bins": 8,
-            "v_bins": 8
-          }
-        }
-      },
-      "hsv_summary": {
-        "white_ratio": 0.0506,
-        "green_ratio": 0.1604,
-        "mean_brightness": 0.6068,
-        "mean_saturation": 0.3338
-      }
-    },
-    "img_7": {
-      "active_clusters": {
-        "cluster_1": {
-          "聚类主题": "优雅的白裙画者",
-          "亮点类型": "实质",
-          "合并结论": "恬静柔美的侧颜特写"
-        },
-        "cluster_2": {
-          "聚类主题": "充满艺术气息的写生道具",
-          "亮点类型": "实质",
-          "合并结论": "洁白玫瑰的互动点缀"
-        },
-        "cluster_3": {
-          "聚类主题": "清新自然的绿白配色",
-          "亮点类型": "形式",
-          "合并结论": "清新的白绿配色调"
-        },
-        "cluster_5": {
-          "聚类主题": "唯美梦幻的光影氛围",
-          "亮点类型": "形式",
-          "合并结论": "充满空气感的柔光氛围"
-        }
-      },
-      "features": {
-        "openpose_skeleton": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_7.png",
-          "exists": true
-        },
-        "depth_map": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_7.png",
-          "exists": true
-        },
-        "lineart_edge": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_7.png",
-          "exists": true
-        },
-        "color_palette": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_7.png",
-          "exists": true,
-          "json_data": {
-            "dominant_color": [
-              83,
-              101,
-              72
-            ],
-            "palette": [
-              [
-                71,
-                96,
-                59
-              ],
-              [
-                171,
-                189,
-                204
-              ],
-              [
-                133,
-                151,
-                169
-              ],
-              [
-                31,
-                27,
-                27
-              ],
-              [
-                129,
-                122,
-                125
-              ],
-              [
-                159,
-                139,
-                141
-              ],
-              [
-                120,
-                100,
-                94
-              ]
-            ],
-            "palette_hex": [
-              "#47603b",
-              "#abbdcc",
-              "#8597a9",
-              "#1f1b1b",
-              "#817a7d",
-              "#9f8b8d",
-              "#78645e"
-            ]
-          }
-        },
-        "bokeh_mask": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_7.png",
-          "exists": true
-        },
-        "semantic_segmentation": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_7.png",
-          "exists": true
-        },
-        "color_distribution": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_7.png",
-          "exists": true,
-          "json_data": {
-            "hist_h": [
-              0.07843989133834839,
-              0.10234537720680237,
-              0.015606259927153587,
-              0.0037384501192718744,
-              0.16384771466255188,
-              0.21072953939437866,
-              0.022516923025250435,
-              0.020746145397424698,
-              0.010117623023688793,
-              0.011814403347671032,
-              0.1484299749135971,
-              0.046803977340459824,
-              0.01757650636136532,
-              0.014380485750734806,
-              0.014578024856746197,
-              0.0272745992988348,
-              0.03201361373066902,
-              0.05904048681259155
-            ],
-            "hist_s": [
-              0.17181169986724854,
-              0.1873188614845276,
-              0.18251743912696838,
-              0.37122422456741333,
-              0.08246918022632599,
-              0.00416184077039361,
-              0.00048580547445453703,
-              1.0938666491711047e-05
-            ],
-            "hist_v": [
-              0.0927245020866394,
-              0.09700087457895279,
-              0.13095127046108246,
-              0.36870384216308594,
-              0.11066005378961563,
-              0.08380112051963806,
-              0.11162008345127106,
-              0.004538259468972683
-            ],
-            "white_ratio": 0.0235,
-            "green_ratio": 0.4193,
-            "mean_brightness": 0.4381,
-            "mean_saturation": 0.3139,
-            "h_bins": 18,
-            "s_bins": 8,
-            "v_bins": 8
-          }
-        }
-      },
-      "hsv_summary": {
-        "white_ratio": 0.0235,
-        "green_ratio": 0.4193,
-        "mean_brightness": 0.4381,
-        "mean_saturation": 0.3139
-      }
-    },
-    "img_8": {
-      "active_clusters": {
-        "cluster_1": {
-          "聚类主题": "优雅的白裙画者",
-          "亮点类型": "实质",
-          "合并结论": "优雅的写生人物"
-        },
-        "cluster_2": {
-          "聚类主题": "充满艺术气息的写生道具",
-          "亮点类型": "实质",
-          "合并结论": "木质画架与调色盘"
-        },
-        "cluster_3": {
-          "聚类主题": "清新自然的绿白配色",
-          "亮点类型": "形式",
-          "合并结论": "清新的绿白配色"
-        }
-      },
-      "features": {
-        "openpose_skeleton": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_8.png",
-          "exists": true
-        },
-        "depth_map": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_8.png",
-          "exists": true
-        },
-        "lineart_edge": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_8.png",
-          "exists": true
-        },
-        "color_palette": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_8.png",
-          "exists": true,
-          "json_data": {
-            "dominant_color": [
-              47,
-              62,
-              44
-            ],
-            "palette": [
-              [
-                206,
-                204,
-                201
-              ],
-              [
-                44,
-                60,
-                42
-              ],
-              [
-                94,
-                139,
-                90
-              ],
-              [
-                131,
-                183,
-                185
-              ],
-              [
-                110,
-                149,
-                166
-              ],
-              [
-                121,
-                103,
-                88
-              ],
-              [
-                86,
-                104,
-                112
-              ]
-            ],
-            "palette_hex": [
-              "#ceccc9",
-              "#2c3c2a",
-              "#5e8b5a",
-              "#83b7b9",
-              "#6e95a6",
-              "#796758",
-              "#566870"
-            ]
-          }
-        },
-        "bokeh_mask": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_8.png",
-          "exists": true
-        },
-        "semantic_segmentation": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_8.png",
-          "exists": true
-        },
-        "color_distribution": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_8.png",
-          "exists": true,
-          "json_data": {
-            "hist_h": [
-              0.016288960352540016,
-              0.05812549963593483,
-              0.028123311698436737,
-              0.03650747612118721,
-              0.08802022784948349,
-              0.3297860026359558,
-              0.1963168829679489,
-              0.07496525347232819,
-              0.027654234319925308,
-              0.04496306553483009,
-              0.08410611748695374,
-              0.005293027497828007,
-              0.00219545466825366,
-              0.0010121483355760574,
-              0.0006923532346263528,
-              0.0009973490377888083,
-              0.0018737291684374213,
-              0.003078912850469351
-            ],
-            "hist_s": [
-              0.10442758351564407,
-              0.14612577855587006,
-              0.3257077932357788,
-              0.283027708530426,
-              0.10212274640798569,
-              0.030628908425569534,
-              0.006496280897408724,
-              0.0014632074162364006
-            ],
-            "hist_v": [
-              0.09568823873996735,
-              0.23660850524902344,
-              0.241120383143425,
-              0.10031850636005402,
-              0.18116876482963562,
-              0.026423312723636627,
-              0.05741770192980766,
-              0.061254601925611496
-            ],
-            "white_ratio": 0.0714,
-            "green_ratio": 0.7117,
-            "mean_brightness": 0.3933,
-            "mean_saturation": 0.3447,
-            "h_bins": 18,
-            "s_bins": 8,
-            "v_bins": 8
-          }
-        }
-      },
-      "hsv_summary": {
-        "white_ratio": 0.0714,
-        "green_ratio": 0.7117,
-        "mean_brightness": 0.3933,
-        "mean_saturation": 0.3447
-      }
-    },
-    "img_9": {
-      "active_clusters": {
-        "cluster_1": {
-          "聚类主题": "优雅的白裙画者",
-          "亮点类型": "实质",
-          "合并结论": "一袭白裙的优雅背影"
-        },
-        "cluster_2": {
-          "聚类主题": "充满艺术气息的写生道具",
-          "亮点类型": "实质",
-          "合并结论": "伫立草坪的木质画架"
-        },
-        "cluster_6": {
-          "聚类主题": "巧妙的摄影构图视角",
-          "亮点类型": "形式",
-          "合并结论": "自然垂落的树枝框景"
-        }
-      },
-      "features": {
-        "openpose_skeleton": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_9.png",
-          "exists": true
-        },
-        "depth_map": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_9.png",
-          "exists": true
-        },
-        "lineart_edge": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_9.png",
-          "exists": true
-        },
-        "color_palette": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_9.png",
-          "exists": true,
-          "json_data": {
-            "dominant_color": [
-              119,
-              139,
-              81
-            ],
-            "palette": [
-              [
-                228,
-                235,
-                239
-              ],
-              [
-                120,
-                140,
-                81
-              ],
-              [
-                213,
-                206,
-                152
-              ],
-              [
-                50,
-                53,
-                37
-              ],
-              [
-                160,
-                176,
-                162
-              ],
-              [
-                47,
-                87,
-                70
-              ],
-              [
-                180,
-                204,
-                117
-              ]
-            ],
-            "palette_hex": [
-              "#e4ebef",
-              "#788c51",
-              "#d5ce98",
-              "#323525",
-              "#a0b0a2",
-              "#2f5746",
-              "#b4cc75"
-            ]
-          }
-        },
-        "bokeh_mask": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_9.png",
-          "exists": true
-        },
-        "semantic_segmentation": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_9.png",
-          "exists": true
-        },
-        "color_distribution": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_9.png",
-          "exists": true,
-          "json_data": {
-            "hist_h": [
-              0.012288626283407211,
-              0.04225928336381912,
-              0.09236609935760498,
-              0.1584002524614334,
-              0.24352367222309113,
-              0.04621071740984917,
-              0.02858530916273594,
-              0.028737805783748627,
-              0.024914421141147614,
-              0.06194116175174713,
-              0.052537769079208374,
-              0.004524746909737587,
-              0.005542686674743891,
-              0.1909305602312088,
-              0.0033851955085992813,
-              0.0011099529219791293,
-              0.001967029646039009,
-              0.0007747149793431163
-            ],
-            "hist_s": [
-              0.3372262120246887,
-              0.15812550485134125,
-              0.1551109254360199,
-              0.21685005724430084,
-              0.10838223248720169,
-              0.02103441208600998,
-              0.0029714566189795732,
-              0.00029920469387434423
-            ],
-            "hist_v": [
-              0.0014799372293055058,
-              0.03709237277507782,
-              0.06861117482185364,
-              0.10374681651592255,
-              0.1604354828596115,
-              0.18214423954486847,
-              0.11757586151361465,
-              0.3289141058921814
-            ],
-            "white_ratio": 0.307,
-            "green_ratio": 0.3654,
-            "mean_brightness": 0.7022,
-            "mean_saturation": 0.2595,
-            "h_bins": 18,
-            "s_bins": 8,
-            "v_bins": 8
-          }
-        }
-      },
-      "hsv_summary": {
-        "white_ratio": 0.307,
-        "green_ratio": 0.3654,
-        "mean_brightness": 0.7022,
-        "mean_saturation": 0.2595
-      }
-    }
-  },
-  "feature_dimension_details": {
-    "openpose_skeleton": {
-      "名称": "OpenPose 人体骨架图",
-      "描述": "使用 lllyasviel/ControlNet OpenposeDetector 提取的人体关键点骨架图,包含身体18个关键点(头部、肩膀、肘部、手腕、髋部、膝盖、脚踝等)",
-      "工具": "controlnet_aux.OpenposeDetector (lllyasviel/ControlNet)",
-      "格式": "PNG RGB图像,黑色背景+彩色骨架线",
-      "生成模型用途": "ControlNet OpenPose条件控制 - 精确控制人物姿态、站立/跪坐/侧身/背影等",
-      "对应亮点": [
-        "cluster_1",
-        "cluster_6"
-      ]
-    },
-    "depth_map": {
-      "名称": "MiDaS 深度图",
-      "描述": "使用 lllyasviel/Annotators MidasDetector 提取的单目深度估计图,灰度值表示相对深度(亮=近,暗=远)",
-      "工具": "controlnet_aux.MidasDetector (lllyasviel/Annotators)",
-      "格式": "PNG 灰度图像",
-      "生成模型用途": "ControlNet Depth条件控制 - 控制场景空间层次、前景/背景分离、景深效果",
-      "对应亮点": [
-        "cluster_4",
-        "cluster_5"
-      ]
-    },
-    "lineart_edge": {
-      "名称": "Lineart 线稿图",
-      "描述": "使用 lllyasviel/Annotators LineartDetector 提取的精细线稿,保留服装褶皱、画架结构、人物轮廓等细节",
-      "工具": "controlnet_aux.LineartDetector (lllyasviel/Annotators)",
-      "格式": "PNG 灰度图像(白线黑底)",
-      "生成模型用途": "ControlNet Lineart条件控制 - 控制服装褶皱、画架结构、整体构图轮廓",
-      "对应亮点": [
-        "cluster_1",
-        "cluster_2"
-      ]
-    },
-    "color_palette": {
-      "名称": "ColorThief 色彩调色板",
-      "描述": "使用 ColorThief 从图片提取的主色调和8色调色板,以RGB色块图和JSON格式存储",
-      "工具": "colorthief.ColorThief",
-      "格式": "PNG 色块图 (640×80) + JSON {dominant_color, palette, palette_hex}",
-      "生成模型用途": "Stable Diffusion color palette条件 / IP-Adapter颜色参考 - 精确控制整体色调",
-      "对应亮点": [
-        "cluster_3",
-        "cluster_2"
-      ]
-    },
-    "bokeh_mask": {
-      "名称": "Bokeh 虚化遮罩",
-      "描述": "基于MiDaS深度图生成的虚化区域遮罩,亮区=清晰(主体),暗区=虚化(背景),量化大光圈散景效果",
-      "工具": "自定义算法 (MiDaS深度图归一化)",
-      "格式": "PNG 灰度图像 (0=完全虚化, 255=完全清晰)",
-      "生成模型用途": "ControlNet Blur/Depth条件 / 后处理散景合成 - 控制虚化程度和区域",
-      "对应亮点": [
-        "cluster_4"
-      ]
-    },
-    "semantic_segmentation": {
-      "名称": "KMeans 语义分割图",
-      "描述": "在LAB色彩空间使用KMeans(k=6)聚类的语义分割图,区分白裙/草地/画架/天空/皮肤/其他区域",
-      "工具": "sklearn.cluster.KMeans (LAB色彩空间, k=6)",
-      "格式": "PNG RGB彩色分割图,固定颜色编码: 白=白裙, 绿=草地, 棕=画架, 蓝=天空, 肤=皮肤, 灰=其他",
-      "生成模型用途": "ControlNet Segmentation条件 - 控制各区域的空间布局和比例",
-      "对应亮点": [
-        "cluster_1",
-        "cluster_3",
-        "cluster_5"
-      ]
-    },
-    "color_distribution": {
-      "名称": "HSV 色彩分布直方图",
-      "描述": "在HSV色彩空间计算的色相/饱和度/明度分布直方图,量化白色比例、绿色比例、平均亮度等关键指标",
-      "工具": "OpenCV cv2.calcHist (HSV空间, H:18bins, S:8bins, V:8bins)",
-      "格式": "PNG 直方图可视化 + JSON {hist_h, hist_s, hist_v, white_ratio, green_ratio, mean_brightness, mean_saturation}",
-      "生成模型用途": "色彩条件控制向量 / 后处理色调调整参考 - 量化白绿配色比例",
-      "对应亮点": [
-        "cluster_3",
-        "cluster_4"
-      ]
-    }
-  }
-};
-
-
-
-        // 维度详细信息
-        const dimensionDetails = {
-            "openpose_skeleton": {
-                        "来源亮点": [
-                                    "cluster_1(优雅的白裙画者):骨架图直接编码人物站立/跪坐/侧身/背影等姿态",
-                                    "cluster_6(巧妙的摄影构图视角):骨架位置反映人物在画面中的构图位置"
-                        ],
-                        "制作表特征": [
-                                    "人物姿态(评分0.80~0.95)→ 骨架关键点位置",
-                                    "人物朝向(评分0.78~0.90)→ 骨架朝向方向",
-                                    "人物动作(评分0.88~0.94)→ 手臂/手腕关键点"
-                        ],
-                        "输出文件": "9个PNG骨架图(黑色背景+彩色骨架线,1080×1439)"
-            },
-            "depth_map": {
-                        "来源亮点": [
-                                    "cluster_4(虚实呼应的画中画结构):深度图区分前景画架/人物与背景草地",
-                                    "cluster_5(唯美梦幻的光影氛围):深度梯度反映景深程度,支持大光圈散景效果"
-                        ],
-                        "制作表特征": [
-                                    "画面清晰度(评分0.60~0.75)→ 深度梯度",
-                                    "前后关系(评分0.78)→ 深度分层"
-                        ],
-                        "输出文件": "9个PNG灰度深度图(亮=近,暗=远,1080×1439)"
-            },
-            "lineart_edge": {
-                        "来源亮点": [
-                                    "cluster_1(优雅的白裙画者):白裙褶皱轮廓、发型线条",
-                                    "cluster_2(充满艺术气息的写生道具):画架结构、调色板轮廓的精细线稿"
-                        ],
-                        "制作表特征": [
-                                    "服装款式(评分0.82~0.85)→ 裙摆褶皱线稿",
-                                    "人物完整性(评分0.65)→ 全身轮廓线稿"
-                        ],
-                        "输出文件": "9个PNG线稿图(白线黑底,1080×1439)"
-            },
-            "color_palette": {
-                        "来源亮点": [
-                                    "cluster_3(清新自然的绿白配色):调色板精确捕获白色和绿色的具体色值",
-                                    "cluster_2(充满艺术气息的写生道具):调色板上的油画颜料颜色"
-                        ],
-                        "制作表特征": [
-                                    "色彩搭配(评分0.75~0.88)→ 主色调和调色板",
-                                    "色彩饱和度 → 调色板色值"
-                        ],
-                        "输出文件": "9个PNG色块图(640×80) + 9个JSON文件(包含dominant_color, palette, palette_hex)"
-            },
-            "bokeh_mask": {
-                        "来源亮点": [
-                                    "cluster_4(虚实呼应的画中画结构):遮罩区分清晰的主体区域和虚化的背景区域"
-                        ],
-                        "制作表特征": [
-                                    "画面清晰度 → 清晰度权重分布",
-                                    "虚实对比 → 遮罩梯度"
-                        ],
-                        "输出文件": "9个PNG灰度遮罩(0=完全虚化,255=完全清晰,1080×1439)"
-            },
-            "semantic_segmentation": {
-                        "来源亮点": [
-                                    "cluster_1(优雅的白裙画者):白色区域精确定位白裙范围",
-                                    "cluster_3(清新自然的绿白配色):绿色/白色区域比例量化配色",
-                                    "cluster_5(唯美梦幻的光影氛围):分割图反映画布区域与现实场景的空间关系"
-                        ],
-                        "制作表特征": [
-                                    "区域分布 → 白裙/草地/画架/天空/皮肤/其他的空间布局",
-                                    "色彩区域比例 → 各区域占比"
-                        ],
-                        "输出文件": "9个PNG彩色分割图(固定颜色编码:白=白裙,绿=草地,棕=画架,蓝=天空,肤=皮肤,灰=其他,1080×1439)"
-            },
-            "color_distribution": {
-                        "来源亮点": [
-                                    "cluster_3(清新自然的绿白配色):white_ratio和green_ratio量化白绿配色比例",
-                                    "cluster_4(虚实呼应的画中画结构):mean_brightness反映整体光照水平"
-                        ],
-                        "制作表特征": [
-                                    "色彩分布 → HSV直方图向量",
-                                    "白色比例(S<30且V>200)→ white_ratio",
-                                    "绿色比例(H∈[35,85]且S>40)→ green_ratio",
-                                    "整体亮度(V通道均值/255)→ mean_brightness",
-                                    "整体饱和度(S通道均值/255)→ mean_saturation"
-                        ],
-                        "输出文件": "9个PNG直方图可视化(1200×300) + 9个JSON文件(包含hist_h, hist_s, hist_v, white_ratio, green_ratio, mean_brightness, mean_saturation)"
-            }
-};\
-
-        // 图片路径配置
-        const basePath = '.';
-
-        // 渲染总览区域
-        function renderOverview() {
-            // 渲染亮点聚类总览
-            const clusterContainer = document.getElementById('clusterOverview');
-            const clusters = mappingData.cluster_overview;
-
-            Object.keys(clusters).forEach(clusterId => {
-                const cluster = clusters[clusterId];
-                const item = document.createElement('div');
-                item.className = 'cluster-overview-item';
-
-                item.innerHTML = `
-                    <div class="cluster-overview-title">${cluster.聚类主题}</div>
-                    <div class="cluster-overview-meta">
-                        <span>📌 ${cluster.亮点类型}</span>
-                        <span>🖼️ ${cluster.图片数量}张图片</span>
-                    </div>
-                `;
-
-                clusterContainer.appendChild(item);
-            });
-
-            // 渲染特征维度总览
-            const dimensionContainer = document.getElementById('dimensionOverview');
-            const dimensions = mappingData.feature_dimension_details;
-
-            Object.keys(dimensions).forEach(dimKey => {
-                const dim = dimensions[dimKey];
-                const item = document.createElement('div');
-                item.className = 'dimension-overview-item';
-
-                // 获取对应的聚类标签
-                const clusterTags = dim.对应亮点.map(cId => {
-                    const cluster = mappingData.cluster_overview[cId];
-                    return `<span class="mini-cluster-tag">${cluster.聚类主题}</span>`;
-                }).join('');
-
-                item.innerHTML = `
-                    <div class="dimension-overview-title">${dim.名称}</div>
-                    <div class="dimension-overview-clusters">${clusterTags}</div>
-                `;
-
-                dimensionContainer.appendChild(item);
-            });
-        }
-
-        // 渲染原始图片
-        function renderOriginalImages() {
-            const container = document.getElementById('originalImages');
-            const images = Object.keys(mappingData.image_overview);
-            
-            images.forEach(imgName => {
-                const imgData = mappingData.image_overview[imgName];
-                const card = document.createElement('div');
-                card.className = 'image-card';
-                card.onclick = () => openModal(`${basePath}/input/${imgName}.jpg`);
-                
-                const clusters = Object.values(imgData.active_clusters);
-                const clusterTags = clusters.map(c => 
-                    `<span class="cluster-tag">${c.聚类主题}</span>`
-                ).join('');
-                
-                const hsvInfo = imgData.hsv_summary;
-                
-                card.innerHTML = `
-                    <img src="${basePath}/input/${imgName}.jpg" alt="${imgName}" loading="lazy">
-                    <div class="image-info">
-                        <div class="image-name">${imgName}</div>
-                        <div class="image-clusters">${clusterTags}</div>
-                        <div style="margin-top: 10px; font-size: 0.85em; color: #666;">
-                            <div>🟢 绿色: ${(hsvInfo.green_ratio * 100).toFixed(1)}%</div>
-                            <div>⚪ 白色: ${(hsvInfo.white_ratio * 100).toFixed(1)}%</div>
-                            <div>💡 亮度: ${(hsvInfo.mean_brightness * 100).toFixed(1)}%</div>
-                        </div>
-                    </div>
-                `;
-                
-                container.appendChild(card);
-                
-                // 默认加载图片
-<!--                const grid = document.getElementById(`grid-${dimKey}`);-->
-<!--                loadDimensionImages(dimKey, grid);-->
-            });
-        }
-        
-        // 渲染特征维度
-        function renderDimensions() {
-            const container = document.getElementById('dimensionsContainer');
-            const dimensions = mappingData.feature_dimension_details;
-            
-            Object.keys(dimensions).forEach(dimKey => {
-                const dim = dimensions[dimKey];
-                const card = document.createElement('div');
-                card.className = 'dimension-card';
-                card.id = `dim-${dimKey}`;
-                
-                // 获取对应的聚类信息
-                const clusters = dim.对应亮点.map(cId => {
-                    const cluster = mappingData.cluster_overview[cId];
-                    return `<span class="cluster-badge">${cluster.聚类主题} (${cluster.亮点类型})</span>`;
-                }).join('');
-                
-                card.innerHTML = `
-                    <div class="dimension-header" onclick="toggleDimension('${dimKey}')">
-                        <div class="dimension-title">${dim.名称}</div>
-                        <button class="toggle-btn">展开查看</button>
-                    </div>
-                    
-                    <div class="dimension-description" style="cursor: pointer;" onclick="toggleDetails('${dimKey}')">
-                        <strong>📝 描述:</strong>${dim.描述}
-                        <span style="float: right; color: #667eea; font-size: 0.9em;">
-                            <span id="toggle-text-${dimKey}">▼ 展开工具信息</span>
-                        </span>
-                    </div>
-                    
-                    <div class="detail-toggle-content" id="details-${dimKey}" style="margin-top: 15px;">
-                        <div class="dimension-meta" style="grid-template-columns: repeat(3, 1fr);">
-                            <div class="meta-item">
-                                <div class="meta-label">🛠️ 提取工具</div>
-                                <div class="meta-value">${dim.工具}</div>
-                            </div>
-                            <div class="meta-item">
-                                <div class="meta-label">📄 格式</div>
-                                <div class="meta-value">${dim.格式}</div>
-                            </div>
-                            <div class="meta-item">
-                                <div class="meta-label">🎯 生成模型用途</div>
-                                <div class="meta-value">${dim.生成模型用途}</div>
-                            </div>
-                        </div>
-                    </div>
-
-                    <div class="io-container">
-                        <div class="input-box">
-                            <div class="box-title">📥 输入</div>
-                            <div class="detail-section">
-                                <h4>📍 来源亮点</h4>
-                                <ul>
-                                    ${dimensionDetails[dimKey]['来源亮点'].map(item => '<li>' + item + '</li>').join('')}
-                                </ul>
-                            </div>
-                            <div class="detail-section">
-                                <h4>🎯 制作表特征对应</h4>
-                                <ul>
-                                    ${dimensionDetails[dimKey]['制作表特征'].map(item => '<li>' + item + '</li>').join('')}
-                                </ul>
-                            </div>
-                        </div>
-
-                        <div class="output-box">
-                            <div class="box-title">📤 输出</div>
-                            <div class="detail-section">
-                                <h4>📦 输出文件</h4>
-                                <p>${dimensionDetails[dimKey]['输出文件']}</p>
-                            </div>
-                            <div class="dimension-content" id="content-${dimKey}">
-                                <div class="feature-images-grid" id="grid-${dimKey}"></div>
-                            </div>
-                        </div>
-                    </div>
-                `;
-                
-                container.appendChild(card);
-                
-                // 默认加载图片
-                const grid = document.getElementById(`grid-${dimKey}`);
-                loadDimensionImages(dimKey, grid);
-            });
-        }
-        
-        // 切换维度展开/收起
-        function toggleDimension(dimKey) {
-            const content = document.getElementById(`content-${dimKey}`);
-            const btn = document.querySelector(`#dim-${dimKey} .toggle-btn`);
-            
-            if (content.style.display === 'none') {
-                content.style.display = 'block';
-                btn.textContent = '收起';
-            } else {
-                content.style.display = 'none';
-                btn.textContent = '展开查看';
-            }
-        }
-        
-
-        // 切换详细信息展开/收起
-        function toggleDetails(dimKey) {
-            const detailsContent = document.getElementById(`details-${dimKey}`);
-            const toggleText = document.getElementById(`toggle-text-${dimKey}`);
-            
-            if (detailsContent.classList.contains('active')) {
-                detailsContent.classList.remove('active');
-                toggleText.textContent = '▼ 展开工具信息';
-            } else {
-                detailsContent.classList.add('active');
-                toggleText.textContent = '▲ 收起工具信息';
-            }
-        }
-        
-        // 加载维度图片
-        function loadDimensionImages(dimKey, grid) {
-            const images = Object.keys(mappingData.image_overview);
-            
-            images.forEach(imgName => {
-                const imgData = mappingData.image_overview[imgName];
-                const featurePath = `${basePath}/output/features/${dimKey}/${imgName}.png`;
-                
-                const card = document.createElement('div');
-                card.className = 'feature-image-card';
-                
-                // 创建图片元素
-                const img = document.createElement('img');
-                img.src = featurePath;
-                img.alt = imgName;
-                img.loading = 'lazy';
-                img.style.cursor = 'pointer';
-                img.onclick = () => openModal(featurePath, imgName);
-                card.appendChild(img);
-                
-                // 创建标签
-                const label = document.createElement('div');
-                label.className = 'feature-image-label';
-                label.textContent = imgName;
-                card.appendChild(label);
-                
-                // 特殊处理:color_palette 和 color_distribution 有额外信息
-                if (dimKey === 'color_palette' && imgData.features.color_palette.json_data) {
-                    const palette = imgData.features.color_palette.json_data;
-                    
-                    // 替换图片为原图
-                    img.src = `${basePath}/input/${imgName}.jpg`;
-                    
-                    // 添加色彩调色板
-                    const paletteDiv = document.createElement('div');
-                    paletteDiv.className = 'color-palette-display';
-                    paletteDiv.style.padding = '10px';
-                    
-                    palette.palette_hex.forEach(hex => {
-                        const colorBlock = document.createElement('div');
-                        colorBlock.className = 'color-block';
-                        colorBlock.style.background = hex;
-                        colorBlock.setAttribute('data-hex', hex);
-                        paletteDiv.appendChild(colorBlock);
-                    });
-                    
-                    card.appendChild(paletteDiv);
-                } else if (dimKey === 'color_distribution' && imgData.features.color_distribution.json_data) {
-                    const hsv = imgData.features.color_distribution.json_data;
-                    const hsvDiv = document.createElement('div');
-                    hsvDiv.className = 'hsv-stats';
-                    hsvDiv.style.padding = '10px';
-                    
-                    const stats = [
-                        { label: '绿色', value: (hsv.green_ratio * 100).toFixed(1) + '%' },
-                        { label: '白色', value: (hsv.white_ratio * 100).toFixed(1) + '%' },
-                        { label: '亮度', value: (hsv.mean_brightness * 100).toFixed(0) + '%' },
-                        { label: '饱和度', value: (hsv.mean_saturation * 100).toFixed(0) + '%' }
-                    ];
-                    
-                    stats.forEach(stat => {
-                        const statDiv = document.createElement('div');
-                        statDiv.className = 'hsv-stat';
-                        
-                        const statLabel = document.createElement('div');
-                        statLabel.className = 'hsv-stat-label';
-                        statLabel.textContent = stat.label;
-                        
-                        const statValue = document.createElement('div');
-                        statValue.className = 'hsv-stat-value';
-                        statValue.textContent = stat.value;
-                        
-                        statDiv.appendChild(statLabel);
-                        statDiv.appendChild(statValue);
-                        hsvDiv.appendChild(statDiv);
-                    });
-                    
-                    card.appendChild(hsvDiv);
-                }
-                
-                grid.appendChild(card);
-            });
-        }
-        
-        // 打开图片模态框
-        function openModal(imagePath, imgName = null) {
-            const modal = document.getElementById('imageModal');
-            const modalOriginal = document.getElementById('modalOriginalImage');
-            const modalFeature = document.getElementById('modalFeatureImage');
-            const featureContainer = document.getElementById('featureImageContainer');
-            
-            modal.classList.add('active');
-            
-            if (imgName) {
-                // 显示原图和特征图对比
-                modalOriginal.src = `${basePath}/input/${imgName}.jpg`;
-                modalFeature.src = imagePath;
-                featureContainer.classList.remove('hidden');
-            } else {
-                // 只显示原图
-                modalOriginal.src = imagePath;
-                featureContainer.classList.add('hidden');
-            }
-        }
-        
-        // 关闭模态框
-        function closeModal() {
-            const modal = document.getElementById('imageModal');
-            modal.classList.remove('active');
-        }
-        
-        // 点击模态框背景关闭
-        document.getElementById('imageModal').addEventListener('click', function(e) {
-            if (e.target === this) {
-                closeModal();
-            }
-        });
-        
-        // ESC键关闭模态框
-        document.addEventListener('keydown', function(e) {
-            if (e.key === 'Escape') {
-                closeModal();
-            }
-        });
-        
-        // 页面加载完成后渲染
-        document.addEventListener('DOMContentLoaded', function() {
-            renderOverview();
-            renderOriginalImages();
-            renderDimensions();
-        });
-    </script>
-</body>
-</html>

Разница между файлами не показана из-за своего большого размера
+ 0 - 630
examples/find knowledge/features_visualization_embedded.html


+ 0 - 2584
examples/find knowledge/features_visualization_副本.html

@@ -1,2584 +0,0 @@
-<!DOCTYPE html>
-<html lang="zh-CN">
-<head>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <title>写生油画 - 多模态特征可视化</title>
-    <style>
-        * {
-            margin: 0;
-            padding: 0;
-            box-sizing: border-box;
-        }
-
-        body {
-            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;
-            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-            color: #333;
-            line-height: 1.6;
-            padding: 20px;
-        }
-
-        .container {
-            max-width: 1400px;
-            margin: 0 auto;
-            background: white;
-            border-radius: 20px;
-            box-shadow: 0 20px 60px rgba(0,0,0,0.3);
-            overflow: hidden;
-        }
-
-        header {
-            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-            color: white;
-            padding: 40px;
-            text-align: center;
-        }
-
-        header h1 {
-            font-size: 2.5em;
-            margin-bottom: 10px;
-            text-shadow: 2px 2px 4px rgba(0,0,0,0.2);
-        }
-
-        header p {
-            font-size: 1.1em;
-            opacity: 0.9;
-        }
-
-        .stats {
-            display: grid;
-            grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
-            gap: 20px;
-            padding: 30px 40px;
-            background: #f8f9fa;
-            border-bottom: 2px solid #e9ecef;
-        }
-
-        .stat-card {
-            background: white;
-            padding: 20px;
-            border-radius: 10px;
-            text-align: center;
-            box-shadow: 0 2px 10px rgba(0,0,0,0.1);
-            transition: transform 0.3s;
-        }
-
-        .stat-card:hover {
-            transform: translateY(-5px);
-        }
-
-        .stat-number {
-            font-size: 2.5em;
-            font-weight: bold;
-            color: #667eea;
-            display: block;
-        }
-
-        .stat-label {
-            color: #666;
-            font-size: 0.9em;
-            margin-top: 5px;
-        }
-
-        .content {
-            padding: 40px;
-        }
-
-        .section {
-            margin-bottom: 50px;
-        }
-
-        .section-title {
-            font-size: 2em;
-            color: #667eea;
-            margin-bottom: 20px;
-            padding-bottom: 10px;
-            border-bottom: 3px solid #667eea;
-        }
-
-        .images-grid {
-            display: grid;
-            grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
-            gap: 20px;
-            margin-top: 30px;
-        }
-
-        .image-card {
-            background: #f8f9fa;
-            border-radius: 10px;
-            overflow: hidden;
-            box-shadow: 0 4px 15px rgba(0,0,0,0.1);
-            transition: all 0.3s;
-            cursor: pointer;
-        }
-
-        .image-card:hover {
-            transform: translateY(-5px);
-            box-shadow: 0 8px 25px rgba(0,0,0,0.15);
-        }
-
-        .image-card img {
-            width: 100%;
-            height: 200px;
-            object-fit: cover;
-            display: block;
-        }
-
-        .image-info {
-            padding: 15px;
-        }
-
-        .image-name {
-            font-weight: bold;
-            font-size: 1.1em;
-            color: #333;
-            margin-bottom: 8px;
-        }
-
-        .image-clusters {
-            font-size: 0.85em;
-            color: #666;
-        }
-
-        .cluster-tag {
-            display: inline-block;
-            background: #e7f3ff;
-            color: #0066cc;
-            padding: 3px 8px;
-            border-radius: 4px;
-            margin: 2px;
-            font-size: 0.85em;
-        }
-
-        .dimensions-grid {
-            display: grid;
-            gap: 30px;
-            margin-top: 30px;
-        }
-
-        .dimension-card {
-            background: #f8f9fa;
-            border-radius: 15px;
-            padding: 30px;
-            box-shadow: 0 4px 15px rgba(0,0,0,0.1);
-        }
-
-        .dimension-header {
-            display: flex;
-            justify-content: space-between;
-            align-items: center;
-            margin-bottom: 20px;
-            cursor: pointer;
-            user-select: none;
-        }
-
-        .dimension-title {
-            font-size: 1.5em;
-            font-weight: bold;
-            color: #667eea;
-        }
-
-        .toggle-btn {
-            background: #667eea;
-            color: white;
-            border: none;
-            padding: 8px 20px;
-            border-radius: 20px;
-            cursor: pointer;
-            font-size: 0.9em;
-            transition: all 0.3s;
-        }
-
-        .toggle-btn:hover {
-            background: #5568d3;
-        }
-
-        .dimension-description {
-            background: white;
-            padding: 20px;
-            border-radius: 10px;
-            margin-bottom: 20px;
-            line-height: 1.8;
-        }
-
-        .dimension-meta {
-            display: grid;
-            grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
-            gap: 15px;
-            margin-bottom: 20px;
-        }
-
-        .meta-item {
-            background: white;
-            padding: 15px;
-            border-radius: 8px;
-        }
-
-        .meta-label {
-            font-weight: bold;
-            color: #667eea;
-            font-size: 0.9em;
-            margin-bottom: 5px;
-        }
-
-        .meta-value {
-            color: #333;
-            font-size: 0.95em;
-        }
-
-        .dimension-content {
-            display: block;
-            margin-top: 20px;
-        }
-
-        .dimension-content.active {
-            display: block;
-        }
-
-        .feature-images-grid {
-            display: grid;
-            grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
-            gap: 15px;
-            margin-top: 20px;
-        }
-
-        .feature-image-card {
-            background: white;
-            border-radius: 8px;
-            overflow: hidden;
-            box-shadow: 0 2px 10px rgba(0,0,0,0.1);
-            cursor: pointer;
-            transition: all 0.3s;
-        }
-
-        .feature-image-card:hover {
-            transform: scale(1.05);
-            box-shadow: 0 4px 20px rgba(0,0,0,0.15);
-        }
-
-        .feature-image-card img {
-            width: 100%;
-            height: 150px;
-            object-fit: cover;
-            display: block;
-        }
-
-        .feature-image-label {
-            padding: 10px;
-            text-align: center;
-            font-size: 0.9em;
-            font-weight: bold;
-            color: #333;
-        }
-
-        .modal {
-            display: none;
-            position: fixed;
-            z-index: 1000;
-            left: 0;
-            top: 0;
-            width: 100%;
-            height: 100%;
-            background: rgba(0,0,0,0.9);
-            justify-content: center;
-            align-items: center;
-        }
-
-        .modal.active {
-            display: flex;
-        }
-
-        .modal-content {
-            max-width: 90%;
-            max-height: 90%;
-            position: relative;
-        }
-
-        .modal-content-wrapper {
-            max-width: 95%;
-            max-height: 90vh;
-            position: relative;
-        }
-
-        .modal-images {
-            display: flex;
-            gap: 20px;
-            align-items: flex-start;
-            justify-content: center;
-            flex-wrap: wrap;
-        }
-
-        .modal-image-container {
-            display: flex;
-            flex-direction: column;
-            align-items: center;
-            max-width: 45%;
-            min-width: 400px;
-        }
-
-        .modal-image-title {
-            color: white;
-            font-size: 1.2em;
-            font-weight: bold;
-            margin-bottom: 10px;
-            text-align: center;
-        }
-
-        .modal-image-container img {
-            max-width: 100%;
-            max-height: 80vh;
-            object-fit: contain;
-            border-radius: 10px;
-            box-shadow: 0 4px 20px rgba(0,0,0,0.5);
-        }
-
-        #featureImageContainer.hidden {
-            display: none;
-        }
-
-        @media (max-width: 1200px) {
-            .modal-image-container {
-                max-width: 90%;
-                min-width: 300px;
-            }
-        }
-
-
-        .modal-content img {
-            max-width: 100%;
-            max-height: 90vh;
-            object-fit: contain;
-            border-radius: 10px;
-        }
-
-        .modal-close {
-            position: absolute;
-            top: -40px;
-            right: 0;
-            color: white;
-            font-size: 40px;
-            font-weight: bold;
-            cursor: pointer;
-            background: none;
-            border: none;
-            padding: 0 10px;
-        }
-
-        .modal-close:hover {
-            color: #667eea;
-        }
-
-        .color-palette-display {
-            display: flex;
-            gap: 5px;
-            margin-top: 10px;
-            height: 40px;
-        }
-
-        .color-block {
-            flex: 1;
-            border-radius: 4px;
-            position: relative;
-            cursor: pointer;
-            transition: transform 0.2s;
-        }
-
-        .color-block:hover {
-            transform: scale(1.1);
-        }
-
-        .color-block::after {
-            content: attr(data-hex);
-            position: absolute;
-            bottom: -25px;
-            left: 50%;
-            transform: translateX(-50%);
-            font-size: 0.7em;
-            color: #666;
-            white-space: nowrap;
-        }
-
-        .hsv-stats {
-            display: grid;
-            grid-template-columns: repeat(4, 1fr);
-            gap: 10px;
-            margin-top: 15px;
-        }
-
-        .hsv-stat {
-            background: white;
-            padding: 10px;
-            border-radius: 6px;
-            text-align: center;
-        }
-
-        .hsv-stat-label {
-            font-size: 0.8em;
-            color: #666;
-            margin-bottom: 5px;
-        }
-
-        .hsv-stat-value {
-            font-size: 1.2em;
-            font-weight: bold;
-            color: #667eea;
-        }
-
-        .cluster-info {
-            background: #e7f3ff;
-            padding: 15px;
-            border-radius: 8px;
-            margin-top: 15px;
-        }
-
-        .cluster-info h4 {
-            color: #0066cc;
-            margin-bottom: 10px;
-        }
-
-        .cluster-list {
-            display: flex;
-            flex-wrap: wrap;
-            gap: 10px;
-        }
-
-        .cluster-badge {
-            background: white;
-            padding: 8px 15px;
-            border-radius: 20px;
-            font-size: 0.9em;
-            color: #333;
-            box-shadow: 0 2px 5px rgba(0,0,0,0.1);
-        }
-
-        .detail-toggle {
-            background: white;
-            padding: 15px;
-            border-radius: 8px;
-            margin-top: 15px;
-            cursor: pointer;
-            user-select: none;
-            transition: all 0.3s;
-            border: 2px solid #e9ecef;
-        }
-
-        .detail-toggle:hover {
-            border-color: #667eea;
-            background: #f8f9fa;
-        }
-
-        .detail-toggle-header {
-            display: flex;
-            justify-content: space-between;
-            align-items: center;
-            font-weight: bold;
-            color: #667eea;
-        }
-
-        .detail-toggle-icon {
-            font-size: 1.2em;
-            transition: transform 0.3s;
-        }
-
-        .detail-toggle-icon.expanded {
-            transform: rotate(180deg);
-        }
-
-        .detail-toggle-content {
-            display: none;
-            margin-top: 15px;
-            padding-top: 15px;
-            border-top: 1px solid #e9ecef;
-        }
-
-        .detail-toggle-content.active {
-            display: block;
-        }
-
-        .detail-section {
-            background: #f8f9fa;
-            padding: 15px;
-            border-radius: 8px;
-            margin-bottom: 10px;
-        }
-
-        .detail-section h4 {
-            color: #667eea;
-            margin-bottom: 10px;
-            font-size: 1em;
-        }
-
-        .detail-section ul {
-            margin: 0;
-            padding-left: 20px;
-            line-height: 1.8;
-        }
-
-        .detail-section p {
-            margin: 0;
-            line-height: 1.8;
-        }
-
-    </style>
-</head>
-<body>
-    <div class="container">
-        <header>
-            <h1>写生油画 - 多模态特征可视化</h1>
-            <p>从图片中提取的可逆特征空间分析</p>
-        </header>
-
-        <div class="stats">
-            <div class="stat-card">
-                <span class="stat-number">9</span>
-                <span class="stat-label">原始图片</span>
-            </div>
-            <div class="stat-card">
-                <span class="stat-number">7</span>
-                <span class="stat-label">特征维度</span>
-            </div>
-            <div class="stat-card">
-                <span class="stat-number">6</span>
-                <span class="stat-label">亮点聚类</span>
-            </div>
-            <div class="stat-card">
-                <span class="stat-number">63</span>
-                <span class="stat-label">特征图片</span>
-            </div>
-        </div>
-
-        <div class="content">
-            <!-- 原始图片展示 -->
-            <div class="section">
-                <h2 class="section-title">📷 原始图片</h2>
-                <div class="images-grid" id="originalImages"></div>
-            </div>
-
-            <!-- 特征维度展示 -->
-            <div class="section">
-                <h2 class="section-title">🎨 多模态特征维度</h2>
-                <div class="dimensions-grid" id="dimensionsContainer"></div>
-            </div>
-        </div>
-    </div>
-
-    <!-- 图片放大模态框 -->
-    <div class="modal" id="imageModal">
-        <div class="modal-content-wrapper">
-            <button class="modal-close" onclick="closeModal()">&times;</button>
-            <div class="modal-images">
-                <div class="modal-image-container">
-                    <div class="modal-image-title">原图</div>
-                    <img id="modalOriginalImage" src="" alt="原图">
-                </div>
-                <div class="modal-image-container" id="featureImageContainer">
-                    <div class="modal-image-title">特征图</div>
-                    <img id="modalFeatureImage" src="" alt="特征图">
-                </div>
-            </div>
-        </div>
-    </div>
-
-    <script>
-        // 数据加载
-        const mappingData = {
-  "post_name": "写生油画",
-  "total_images": 9,
-  "total_features": 7,
-  "feature_dimensions": [
-    "openpose_skeleton",
-    "depth_map",
-    "lineart_edge",
-    "color_palette",
-    "bokeh_mask",
-    "semantic_segmentation",
-    "color_distribution"
-  ],
-  "cluster_overview": {
-    "cluster_1": {
-      "聚类主题": "优雅的白裙画者",
-      "亮点类型": "实质",
-      "图片数量": 9,
-      "图片列表": [
-        "img_1",
-        "img_2",
-        "img_3",
-        "img_4",
-        "img_5",
-        "img_6",
-        "img_7",
-        "img_8",
-        "img_9"
-      ],
-      "对应特征维度": [
-        "openpose_skeleton",
-        "lineart_edge",
-        "semantic_segmentation"
-      ]
-    },
-    "cluster_2": {
-      "聚类主题": "充满艺术气息的写生道具",
-      "亮点类型": "实质",
-      "图片数量": 7,
-      "图片列表": [
-        "img_1",
-        "img_4",
-        "img_5",
-        "img_6",
-        "img_7",
-        "img_8",
-        "img_9"
-      ],
-      "对应特征维度": [
-        "lineart_edge",
-        "color_palette"
-      ]
-    },
-    "cluster_3": {
-      "聚类主题": "清新自然的绿白配色",
-      "亮点类型": "形式",
-      "图片数量": 5,
-      "图片列表": [
-        "img_1",
-        "img_4",
-        "img_5",
-        "img_7",
-        "img_8"
-      ],
-      "对应特征维度": [
-        "color_palette",
-        "semantic_segmentation",
-        "color_distribution"
-      ]
-    },
-    "cluster_4": {
-      "聚类主题": "虚实呼应的画中画结构",
-      "亮点类型": "形式",
-      "图片数量": 3,
-      "图片列表": [
-        "img_1",
-        "img_2",
-        "img_3"
-      ],
-      "对应特征维度": [
-        "depth_map",
-        "bokeh_mask",
-        "color_distribution"
-      ]
-    },
-    "cluster_5": {
-      "聚类主题": "唯美梦幻的光影氛围",
-      "亮点类型": "形式",
-      "图片数量": 3,
-      "图片列表": [
-        "img_2",
-        "img_3",
-        "img_7"
-      ],
-      "对应特征维度": [
-        "depth_map",
-        "semantic_segmentation"
-      ]
-    },
-    "cluster_6": {
-      "聚类主题": "巧妙的摄影构图视角",
-      "亮点类型": "形式",
-      "图片数量": 4,
-      "图片列表": [
-        "img_4",
-        "img_5",
-        "img_6",
-        "img_9"
-      ],
-      "对应特征维度": [
-        "openpose_skeleton"
-      ]
-    }
-  },
-  "image_overview": {
-    "img_1": {
-      "active_clusters": {
-        "cluster_1": {
-          "聚类主题": "优雅的白裙画者",
-          "亮点类型": "实质",
-          "合并结论": "优雅的白裙侧背影"
-        },
-        "cluster_2": {
-          "聚类主题": "充满艺术气息的写生道具",
-          "亮点类型": "实质",
-          "合并结论": "充满艺术气息的写生道具"
-        },
-        "cluster_3": {
-          "聚类主题": "清新自然的绿白配色",
-          "亮点类型": "形式",
-          "合并结论": "清新治愈的绿白配色"
-        },
-        "cluster_4": {
-          "聚类主题": "虚实呼应的画中画结构",
-          "亮点类型": "形式",
-          "合并结论": "虚实呼应的画中画结构"
-        }
-      },
-      "features": {
-        "openpose_skeleton": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_1.png",
-          "exists": true
-        },
-        "depth_map": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_1.png",
-          "exists": true
-        },
-        "lineart_edge": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_1.png",
-          "exists": true
-        },
-        "color_palette": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_1.png",
-          "exists": true,
-          "json_data": {
-            "dominant_color": [
-              70,
-              95,
-              62
-            ],
-            "palette": [
-              [
-                72,
-                98,
-                60
-              ],
-              [
-                150,
-                172,
-                181
-              ],
-              [
-                193,
-                201,
-                206
-              ],
-              [
-                147,
-                146,
-                132
-              ],
-              [
-                24,
-                30,
-                24
-              ],
-              [
-                101,
-                133,
-                133
-              ],
-              [
-                147,
-                182,
-                140
-              ]
-            ],
-            "palette_hex": [
-              "#48623c",
-              "#96acb5",
-              "#c1c9ce",
-              "#939284",
-              "#181e18",
-              "#658585",
-              "#93b68c"
-            ]
-          }
-        },
-        "bokeh_mask": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_1.png",
-          "exists": true
-        },
-        "semantic_segmentation": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_1.png",
-          "exists": true
-        },
-        "color_distribution": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_1.png",
-          "exists": true,
-          "json_data": {
-            "hist_h": [
-              0.02299436368048191,
-              0.045076314359903336,
-              0.011987491510808468,
-              0.013310426846146584,
-              0.21862855553627014,
-              0.25030627846717834,
-              0.1314917802810669,
-              0.0352347306907177,
-              0.02485457994043827,
-              0.11076493561267853,
-              0.12063290178775787,
-              0.005362520460039377,
-              0.002378838136792183,
-              0.0013802022440358996,
-              0.0007515507168136537,
-              0.0009613157017156482,
-              0.0014381129294633865,
-              0.0024451136123389006
-            ],
-            "hist_s": [
-              0.09791071712970734,
-              0.23805883526802063,
-              0.23730599880218506,
-              0.33129745721817017,
-              0.08900406956672668,
-              0.006134661380201578,
-              0.0002496589731890708,
-              3.860705692204647e-05
-            ],
-            "hist_v": [
-              0.025200756266713142,
-              0.17062132060527802,
-              0.1783987134695053,
-              0.13612976670265198,
-              0.24666756391525269,
-              0.14068475365638733,
-              0.07682546973228455,
-              0.025471650063991547
-            ],
-            "white_ratio": 0.0239,
-            "green_ratio": 0.6277,
-            "mean_brightness": 0.4702,
-            "mean_saturation": 0.3217,
-            "h_bins": 18,
-            "s_bins": 8,
-            "v_bins": 8
-          }
-        }
-      },
-      "hsv_summary": {
-        "white_ratio": 0.0239,
-        "green_ratio": 0.6277,
-        "mean_brightness": 0.4702,
-        "mean_saturation": 0.3217
-      }
-    },
-    "img_2": {
-      "active_clusters": {
-        "cluster_1": {
-          "聚类主题": "优雅的白裙画者",
-          "亮点类型": "实质",
-          "合并结论": "优雅的白裙背影"
-        },
-        "cluster_4": {
-          "聚类主题": "虚实呼应的画中画结构",
-          "亮点类型": "形式",
-          "合并结论": "虚实呼应的叙事构图"
-        },
-        "cluster_5": {
-          "聚类主题": "唯美梦幻的光影氛围",
-          "亮点类型": "形式",
-          "合并结论": "柔美的逆光氛围"
-        }
-      },
-      "features": {
-        "openpose_skeleton": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_2.png",
-          "exists": true
-        },
-        "depth_map": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_2.png",
-          "exists": true
-        },
-        "lineart_edge": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_2.png",
-          "exists": true
-        },
-        "color_palette": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_2.png",
-          "exists": true,
-          "json_data": {
-            "dominant_color": [
-              138,
-              156,
-              105
-            ],
-            "palette": [
-              [
-                138,
-                156,
-                104
-              ],
-              [
-                219,
-                227,
-                227
-              ],
-              [
-                75,
-                69,
-                55
-              ],
-              [
-                209,
-                194,
-                154
-              ],
-              [
-                72,
-                95,
-                77
-              ],
-              [
-                111,
-                171,
-                189
-              ],
-              [
-                182,
-                212,
-                170
-              ]
-            ],
-            "palette_hex": [
-              "#8a9c68",
-              "#dbe3e3",
-              "#4b4537",
-              "#d1c29a",
-              "#485f4d",
-              "#6fabbd",
-              "#b6d4aa"
-            ]
-          }
-        },
-        "bokeh_mask": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_2.png",
-          "exists": true
-        },
-        "semantic_segmentation": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_2.png",
-          "exists": true
-        },
-        "color_distribution": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_2.png",
-          "exists": true,
-          "json_data": {
-            "hist_h": [
-              0.0732845589518547,
-              0.15593840181827545,
-              0.12949064373970032,
-              0.12419310957193375,
-              0.23567485809326172,
-              0.03178519010543823,
-              0.03388284146785736,
-              0.010717319324612617,
-              0.01433801744133234,
-              0.10481687635183334,
-              0.07486487179994583,
-              0.002149126259610057,
-              0.0011041618417948484,
-              0.0023498828522861004,
-              0.0006904228939674795,
-              0.0003197951300535351,
-              0.003116233041509986,
-              0.0012836846290156245
-            ],
-            "hist_s": [
-              0.28900665044784546,
-              0.2196548581123352,
-              0.2457796037197113,
-              0.18217319250106812,
-              0.05714680999517441,
-              0.004347797948867083,
-              0.0018428434850648046,
-              4.8258822062052786e-05
-            ],
-            "hist_v": [
-              0.0,
-              0.01885053887963295,
-              0.12125833332538605,
-              0.09530602395534515,
-              0.10405567288398743,
-              0.2533491551876068,
-              0.15230870246887207,
-              0.25487157702445984
-            ],
-            "white_ratio": 0.2392,
-            "green_ratio": 0.3379,
-            "mean_brightness": 0.6831,
-            "mean_saturation": 0.2485,
-            "h_bins": 18,
-            "s_bins": 8,
-            "v_bins": 8
-          }
-        }
-      },
-      "hsv_summary": {
-        "white_ratio": 0.2392,
-        "green_ratio": 0.3379,
-        "mean_brightness": 0.6831,
-        "mean_saturation": 0.2485
-      }
-    },
-    "img_3": {
-      "active_clusters": {
-        "cluster_1": {
-          "聚类主题": "优雅的白裙画者",
-          "亮点类型": "实质",
-          "合并结论": "纯净优雅的白裙背影"
-        },
-        "cluster_4": {
-          "聚类主题": "虚实呼应的画中画结构",
-          "亮点类型": "形式",
-          "合并结论": "虚实呼应的画中画构图"
-        },
-        "cluster_5": {
-          "聚类主题": "唯美梦幻的光影氛围",
-          "亮点类型": "形式",
-          "合并结论": "梦幻森系的自然光影"
-        }
-      },
-      "features": {
-        "openpose_skeleton": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_3.png",
-          "exists": true
-        },
-        "depth_map": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_3.png",
-          "exists": true
-        },
-        "lineart_edge": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_3.png",
-          "exists": true
-        },
-        "color_palette": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_3.png",
-          "exists": true,
-          "json_data": {
-            "dominant_color": [
-              129,
-              149,
-              88
-            ],
-            "palette": [
-              [
-                226,
-                235,
-                234
-              ],
-              [
-                126,
-                145,
-                86
-              ],
-              [
-                78,
-                74,
-                55
-              ],
-              [
-                210,
-                200,
-                155
-              ],
-              [
-                144,
-                169,
-                158
-              ],
-              [
-                171,
-                205,
-                110
-              ],
-              [
-                66,
-                97,
-                55
-              ]
-            ],
-            "palette_hex": [
-              "#e2ebea",
-              "#7e9156",
-              "#4e4a37",
-              "#d2c89b",
-              "#90a99e",
-              "#abcd6e",
-              "#426137"
-            ]
-          }
-        },
-        "bokeh_mask": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_3.png",
-          "exists": true
-        },
-        "semantic_segmentation": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_3.png",
-          "exists": true
-        },
-        "color_distribution": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_3.png",
-          "exists": true,
-          "json_data": {
-            "hist_h": [
-              0.08796747028827667,
-              0.07544205337762833,
-              0.14689534902572632,
-              0.12777456641197205,
-              0.3085463047027588,
-              0.0542680099606514,
-              0.022549094632267952,
-              0.014717653393745422,
-              0.011737189255654812,
-              0.08198659121990204,
-              0.05702970176935196,
-              0.0014998841797932982,
-              0.003399351378902793,
-              0.0004800144233740866,
-              0.0002187733189202845,
-              0.0010964404791593552,
-              0.0006859187269583344,
-              0.0037056340370327234
-            ],
-            "hist_s": [
-              0.22554758191108704,
-              0.21504710614681244,
-              0.20258988440036774,
-              0.20314133167266846,
-              0.1272115409374237,
-              0.023029109463095665,
-              0.003271948080509901,
-              0.00016150619194377214
-            ],
-            "hist_v": [
-              0.0,
-              0.006298741325736046,
-              0.07633130252361298,
-              0.1305510550737381,
-              0.1652330607175827,
-              0.20487864315509796,
-              0.15114469826221466,
-              0.265562504529953
-            ],
-            "white_ratio": 0.1947,
-            "green_ratio": 0.4209,
-            "mean_brightness": 0.6935,
-            "mean_saturation": 0.2881,
-            "h_bins": 18,
-            "s_bins": 8,
-            "v_bins": 8
-          }
-        }
-      },
-      "hsv_summary": {
-        "white_ratio": 0.1947,
-        "green_ratio": 0.4209,
-        "mean_brightness": 0.6935,
-        "mean_saturation": 0.2881
-      }
-    },
-    "img_4": {
-      "active_clusters": {
-        "cluster_1": {
-          "聚类主题": "优雅的白裙画者",
-          "亮点类型": "实质",
-          "合并结论": "纯净的白裙画者形象"
-        },
-        "cluster_2": {
-          "聚类主题": "充满艺术气息的写生道具",
-          "亮点类型": "实质",
-          "合并结论": "充满艺术感的写生道具"
-        },
-        "cluster_3": {
-          "聚类主题": "清新自然的绿白配色",
-          "亮点类型": "形式",
-          "合并结论": "清新自然的绿白配色"
-        },
-        "cluster_6": {
-          "聚类主题": "巧妙的摄影构图视角",
-          "亮点类型": "形式",
-          "合并结论": "均衡的左右呼应构图"
-        }
-      },
-      "features": {
-        "openpose_skeleton": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_4.png",
-          "exists": true
-        },
-        "depth_map": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_4.png",
-          "exists": true
-        },
-        "lineart_edge": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_4.png",
-          "exists": true
-        },
-        "color_palette": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_4.png",
-          "exists": true,
-          "json_data": {
-            "dominant_color": [
-              116,
-              118,
-              72
-            ],
-            "palette": [
-              [
-                112,
-                116,
-                67
-              ],
-              [
-                216,
-                213,
-                203
-              ],
-              [
-                181,
-                196,
-                191
-              ],
-              [
-                161,
-                151,
-                129
-              ],
-              [
-                158,
-                169,
-                175
-              ],
-              [
-                35,
-                46,
-                31
-              ],
-              [
-                60,
-                47,
-                34
-              ]
-            ],
-            "palette_hex": [
-              "#707443",
-              "#d8d5cb",
-              "#b5c4bf",
-              "#a19781",
-              "#9ea9af",
-              "#232e1f",
-              "#3c2f22"
-            ]
-          }
-        },
-        "bokeh_mask": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_4.png",
-          "exists": true
-        },
-        "semantic_segmentation": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_4.png",
-          "exists": true
-        },
-        "color_distribution": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_4.png",
-          "exists": true,
-          "json_data": {
-            "hist_h": [
-              0.021759580820798874,
-              0.14858633279800415,
-              0.21194759011268616,
-              0.2254870980978012,
-              0.2172277569770813,
-              0.009835791774094105,
-              0.007799269165843725,
-              0.010793889872729778,
-              0.02440738119184971,
-              0.07726301997900009,
-              0.03628162667155266,
-              0.0028279670514166355,
-              0.0010674850782379508,
-              0.000593261793255806,
-              0.00036226288648322225,
-              0.0005269863177090883,
-              0.0009741847752593458,
-              0.0022585128899663687
-            ],
-            "hist_s": [
-              0.17237728834152222,
-              0.09118407964706421,
-              0.1611233353614807,
-              0.3682836592197418,
-              0.15807917714118958,
-              0.03790698200464249,
-              0.009977350942790508,
-              0.00106812862213701
-            ],
-            "hist_v": [
-              0.005347077269107103,
-              0.039011143147945404,
-              0.10711270570755005,
-              0.2906358540058136,
-              0.2130337357521057,
-              0.13399480283260345,
-              0.10851671546697617,
-              0.1023479551076889
-            ],
-            "white_ratio": 0.1343,
-            "green_ratio": 0.3067,
-            "mean_brightness": 0.5639,
-            "mean_saturation": 0.3606,
-            "h_bins": 18,
-            "s_bins": 8,
-            "v_bins": 8
-          }
-        }
-      },
-      "hsv_summary": {
-        "white_ratio": 0.1343,
-        "green_ratio": 0.3067,
-        "mean_brightness": 0.5639,
-        "mean_saturation": 0.3606
-      }
-    },
-    "img_5": {
-      "active_clusters": {
-        "cluster_1": {
-          "聚类主题": "优雅的白裙画者",
-          "亮点类型": "实质",
-          "合并结论": "洁白柔顺的衣物褶皱"
-        },
-        "cluster_2": {
-          "聚类主题": "充满艺术气息的写生道具",
-          "亮点类型": "实质",
-          "合并结论": "斑斓厚重的油彩肌理"
-        },
-        "cluster_3": {
-          "聚类主题": "清新自然的绿白配色",
-          "亮点类型": "形式",
-          "合并结论": "清新高雅的色彩构成"
-        },
-        "cluster_6": {
-          "聚类主题": "巧妙的摄影构图视角",
-          "亮点类型": "形式",
-          "合并结论": "突出动作的局部构图"
-        }
-      },
-      "features": {
-        "openpose_skeleton": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_5.png",
-          "exists": true
-        },
-        "depth_map": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_5.png",
-          "exists": true
-        },
-        "lineart_edge": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_5.png",
-          "exists": true
-        },
-        "color_palette": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_5.png",
-          "exists": true,
-          "json_data": {
-            "dominant_color": [
-              49,
-              91,
-              54
-            ],
-            "palette": [
-              [
-                49,
-                91,
-                54
-              ],
-              [
-                209,
-                214,
-                216
-              ],
-              [
-                104,
-                75,
-                64
-              ],
-              [
-                118,
-                120,
-                71
-              ],
-              [
-                108,
-                147,
-                169
-              ],
-              [
-                163,
-                137,
-                133
-              ],
-              [
-                37,
-                190,
-                206
-              ]
-            ],
-            "palette_hex": [
-              "#315b36",
-              "#d1d6d8",
-              "#684b40",
-              "#767847",
-              "#6c93a9",
-              "#a38985",
-              "#25bece"
-            ]
-          }
-        },
-        "bokeh_mask": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_5.png",
-          "exists": true
-        },
-        "semantic_segmentation": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_5.png",
-          "exists": true
-        },
-        "color_distribution": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_5.png",
-          "exists": true,
-          "json_data": {
-            "hist_h": [
-              0.06531541794538498,
-              0.09025493264198303,
-              0.014375980943441391,
-              0.011843358166515827,
-              0.12692134082317352,
-              0.15304480493068695,
-              0.014180372469127178,
-              0.024089517071843147,
-              0.06461405754089355,
-              0.11568476259708405,
-              0.20321017503738403,
-              0.044057730585336685,
-              0.016082413494586945,
-              0.010450930334627628,
-              0.004185648635029793,
-              0.006949913688004017,
-              0.015166782774031162,
-              0.019571848213672638
-            ],
-            "hist_s": [
-              0.3696361780166626,
-              0.1519850492477417,
-              0.05476089194417,
-              0.10194257646799088,
-              0.17193330824375153,
-              0.104984812438488,
-              0.03291315957903862,
-              0.011844001710414886
-            ],
-            "hist_v": [
-              0.011543510481715202,
-              0.01847798191010952,
-              0.18232890963554382,
-              0.1763029843568802,
-              0.05641070008277893,
-              0.07998481392860413,
-              0.20172573626041412,
-              0.2732253670692444
-            ],
-            "white_ratio": 0.2872,
-            "green_ratio": 0.3239,
-            "mean_brightness": 0.6478,
-            "mean_saturation": 0.3156,
-            "h_bins": 18,
-            "s_bins": 8,
-            "v_bins": 8
-          }
-        }
-      },
-      "hsv_summary": {
-        "white_ratio": 0.2872,
-        "green_ratio": 0.3239,
-        "mean_brightness": 0.6478,
-        "mean_saturation": 0.3156
-      }
-    },
-    "img_6": {
-      "active_clusters": {
-        "cluster_1": {
-          "聚类主题": "优雅的白裙画者",
-          "亮点类型": "实质",
-          "合并结论": "精致的侧颜与配饰"
-        },
-        "cluster_2": {
-          "聚类主题": "充满艺术气息的写生道具",
-          "亮点类型": "实质",
-          "合并结论": "高对比的斑斓调色盘"
-        },
-        "cluster_6": {
-          "聚类主题": "巧妙的摄影构图视角",
-          "亮点类型": "形式",
-          "合并结论": "沉浸式的过肩构图"
-        }
-      },
-      "features": {
-        "openpose_skeleton": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_6.png",
-          "exists": true
-        },
-        "depth_map": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_6.png",
-          "exists": true
-        },
-        "lineart_edge": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_6.png",
-          "exists": true
-        },
-        "color_palette": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_6.png",
-          "exists": true,
-          "json_data": {
-            "dominant_color": [
-              104,
-              143,
-              148
-            ],
-            "palette": [
-              [
-                125,
-                145,
-                148
-              ],
-              [
-                202,
-                204,
-                212
-              ],
-              [
-                47,
-                47,
-                38
-              ],
-              [
-                27,
-                134,
-                147
-              ],
-              [
-                153,
-                189,
-                218
-              ],
-              [
-                72,
-                62,
-                75
-              ],
-              [
-                168,
-                204,
-                201
-              ]
-            ],
-            "palette_hex": [
-              "#7d9194",
-              "#caccd4",
-              "#2f2f26",
-              "#1b8693",
-              "#99bdda",
-              "#483e4b",
-              "#a8ccc9"
-            ]
-          }
-        },
-        "bokeh_mask": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_6.png",
-          "exists": true
-        },
-        "semantic_segmentation": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_6.png",
-          "exists": true
-        },
-        "color_distribution": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_6.png",
-          "exists": true,
-          "json_data": {
-            "hist_h": [
-              0.1566610038280487,
-              0.04552222415804863,
-              0.011773865669965744,
-              0.021885696798563004,
-              0.046773094683885574,
-              0.0223541297018528,
-              0.03028852306306362,
-              0.03333976864814758,
-              0.05309435725212097,
-              0.1629861295223236,
-              0.3142968416213989,
-              0.018021130934357643,
-              0.006420996971428394,
-              0.0047917794436216354,
-              0.0050942013040184975,
-              0.01143412385135889,
-              0.020818213000893593,
-              0.0344439297914505
-            ],
-            "hist_s": [
-              0.130146324634552,
-              0.3402388393878937,
-              0.22351619601249695,
-              0.09706779569387436,
-              0.07324466854333878,
-              0.04026523232460022,
-              0.04923300817608833,
-              0.04628793150186539
-            ],
-            "hist_v": [
-              0.020250044763088226,
-              0.11473309993743896,
-              0.055246055126190186,
-              0.05642228573560715,
-              0.21779786050319672,
-              0.23236235976219177,
-              0.18257728219032288,
-              0.12061101943254471
-            ],
-            "white_ratio": 0.0506,
-            "green_ratio": 0.1604,
-            "mean_brightness": 0.6068,
-            "mean_saturation": 0.3338,
-            "h_bins": 18,
-            "s_bins": 8,
-            "v_bins": 8
-          }
-        }
-      },
-      "hsv_summary": {
-        "white_ratio": 0.0506,
-        "green_ratio": 0.1604,
-        "mean_brightness": 0.6068,
-        "mean_saturation": 0.3338
-      }
-    },
-    "img_7": {
-      "active_clusters": {
-        "cluster_1": {
-          "聚类主题": "优雅的白裙画者",
-          "亮点类型": "实质",
-          "合并结论": "恬静柔美的侧颜特写"
-        },
-        "cluster_2": {
-          "聚类主题": "充满艺术气息的写生道具",
-          "亮点类型": "实质",
-          "合并结论": "洁白玫瑰的互动点缀"
-        },
-        "cluster_3": {
-          "聚类主题": "清新自然的绿白配色",
-          "亮点类型": "形式",
-          "合并结论": "清新的白绿配色调"
-        },
-        "cluster_5": {
-          "聚类主题": "唯美梦幻的光影氛围",
-          "亮点类型": "形式",
-          "合并结论": "充满空气感的柔光氛围"
-        }
-      },
-      "features": {
-        "openpose_skeleton": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_7.png",
-          "exists": true
-        },
-        "depth_map": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_7.png",
-          "exists": true
-        },
-        "lineart_edge": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_7.png",
-          "exists": true
-        },
-        "color_palette": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_7.png",
-          "exists": true,
-          "json_data": {
-            "dominant_color": [
-              83,
-              101,
-              72
-            ],
-            "palette": [
-              [
-                71,
-                96,
-                59
-              ],
-              [
-                171,
-                189,
-                204
-              ],
-              [
-                133,
-                151,
-                169
-              ],
-              [
-                31,
-                27,
-                27
-              ],
-              [
-                129,
-                122,
-                125
-              ],
-              [
-                159,
-                139,
-                141
-              ],
-              [
-                120,
-                100,
-                94
-              ]
-            ],
-            "palette_hex": [
-              "#47603b",
-              "#abbdcc",
-              "#8597a9",
-              "#1f1b1b",
-              "#817a7d",
-              "#9f8b8d",
-              "#78645e"
-            ]
-          }
-        },
-        "bokeh_mask": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_7.png",
-          "exists": true
-        },
-        "semantic_segmentation": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_7.png",
-          "exists": true
-        },
-        "color_distribution": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_7.png",
-          "exists": true,
-          "json_data": {
-            "hist_h": [
-              0.07843989133834839,
-              0.10234537720680237,
-              0.015606259927153587,
-              0.0037384501192718744,
-              0.16384771466255188,
-              0.21072953939437866,
-              0.022516923025250435,
-              0.020746145397424698,
-              0.010117623023688793,
-              0.011814403347671032,
-              0.1484299749135971,
-              0.046803977340459824,
-              0.01757650636136532,
-              0.014380485750734806,
-              0.014578024856746197,
-              0.0272745992988348,
-              0.03201361373066902,
-              0.05904048681259155
-            ],
-            "hist_s": [
-              0.17181169986724854,
-              0.1873188614845276,
-              0.18251743912696838,
-              0.37122422456741333,
-              0.08246918022632599,
-              0.00416184077039361,
-              0.00048580547445453703,
-              1.0938666491711047e-05
-            ],
-            "hist_v": [
-              0.0927245020866394,
-              0.09700087457895279,
-              0.13095127046108246,
-              0.36870384216308594,
-              0.11066005378961563,
-              0.08380112051963806,
-              0.11162008345127106,
-              0.004538259468972683
-            ],
-            "white_ratio": 0.0235,
-            "green_ratio": 0.4193,
-            "mean_brightness": 0.4381,
-            "mean_saturation": 0.3139,
-            "h_bins": 18,
-            "s_bins": 8,
-            "v_bins": 8
-          }
-        }
-      },
-      "hsv_summary": {
-        "white_ratio": 0.0235,
-        "green_ratio": 0.4193,
-        "mean_brightness": 0.4381,
-        "mean_saturation": 0.3139
-      }
-    },
-    "img_8": {
-      "active_clusters": {
-        "cluster_1": {
-          "聚类主题": "优雅的白裙画者",
-          "亮点类型": "实质",
-          "合并结论": "优雅的写生人物"
-        },
-        "cluster_2": {
-          "聚类主题": "充满艺术气息的写生道具",
-          "亮点类型": "实质",
-          "合并结论": "木质画架与调色盘"
-        },
-        "cluster_3": {
-          "聚类主题": "清新自然的绿白配色",
-          "亮点类型": "形式",
-          "合并结论": "清新的绿白配色"
-        }
-      },
-      "features": {
-        "openpose_skeleton": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_8.png",
-          "exists": true
-        },
-        "depth_map": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_8.png",
-          "exists": true
-        },
-        "lineart_edge": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_8.png",
-          "exists": true
-        },
-        "color_palette": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_8.png",
-          "exists": true,
-          "json_data": {
-            "dominant_color": [
-              47,
-              62,
-              44
-            ],
-            "palette": [
-              [
-                206,
-                204,
-                201
-              ],
-              [
-                44,
-                60,
-                42
-              ],
-              [
-                94,
-                139,
-                90
-              ],
-              [
-                131,
-                183,
-                185
-              ],
-              [
-                110,
-                149,
-                166
-              ],
-              [
-                121,
-                103,
-                88
-              ],
-              [
-                86,
-                104,
-                112
-              ]
-            ],
-            "palette_hex": [
-              "#ceccc9",
-              "#2c3c2a",
-              "#5e8b5a",
-              "#83b7b9",
-              "#6e95a6",
-              "#796758",
-              "#566870"
-            ]
-          }
-        },
-        "bokeh_mask": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_8.png",
-          "exists": true
-        },
-        "semantic_segmentation": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_8.png",
-          "exists": true
-        },
-        "color_distribution": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_8.png",
-          "exists": true,
-          "json_data": {
-            "hist_h": [
-              0.016288960352540016,
-              0.05812549963593483,
-              0.028123311698436737,
-              0.03650747612118721,
-              0.08802022784948349,
-              0.3297860026359558,
-              0.1963168829679489,
-              0.07496525347232819,
-              0.027654234319925308,
-              0.04496306553483009,
-              0.08410611748695374,
-              0.005293027497828007,
-              0.00219545466825366,
-              0.0010121483355760574,
-              0.0006923532346263528,
-              0.0009973490377888083,
-              0.0018737291684374213,
-              0.003078912850469351
-            ],
-            "hist_s": [
-              0.10442758351564407,
-              0.14612577855587006,
-              0.3257077932357788,
-              0.283027708530426,
-              0.10212274640798569,
-              0.030628908425569534,
-              0.006496280897408724,
-              0.0014632074162364006
-            ],
-            "hist_v": [
-              0.09568823873996735,
-              0.23660850524902344,
-              0.241120383143425,
-              0.10031850636005402,
-              0.18116876482963562,
-              0.026423312723636627,
-              0.05741770192980766,
-              0.061254601925611496
-            ],
-            "white_ratio": 0.0714,
-            "green_ratio": 0.7117,
-            "mean_brightness": 0.3933,
-            "mean_saturation": 0.3447,
-            "h_bins": 18,
-            "s_bins": 8,
-            "v_bins": 8
-          }
-        }
-      },
-      "hsv_summary": {
-        "white_ratio": 0.0714,
-        "green_ratio": 0.7117,
-        "mean_brightness": 0.3933,
-        "mean_saturation": 0.3447
-      }
-    },
-    "img_9": {
-      "active_clusters": {
-        "cluster_1": {
-          "聚类主题": "优雅的白裙画者",
-          "亮点类型": "实质",
-          "合并结论": "一袭白裙的优雅背影"
-        },
-        "cluster_2": {
-          "聚类主题": "充满艺术气息的写生道具",
-          "亮点类型": "实质",
-          "合并结论": "伫立草坪的木质画架"
-        },
-        "cluster_6": {
-          "聚类主题": "巧妙的摄影构图视角",
-          "亮点类型": "形式",
-          "合并结论": "自然垂落的树枝框景"
-        }
-      },
-      "features": {
-        "openpose_skeleton": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_9.png",
-          "exists": true
-        },
-        "depth_map": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_9.png",
-          "exists": true
-        },
-        "lineart_edge": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_9.png",
-          "exists": true
-        },
-        "color_palette": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_9.png",
-          "exists": true,
-          "json_data": {
-            "dominant_color": [
-              119,
-              139,
-              81
-            ],
-            "palette": [
-              [
-                228,
-                235,
-                239
-              ],
-              [
-                120,
-                140,
-                81
-              ],
-              [
-                213,
-                206,
-                152
-              ],
-              [
-                50,
-                53,
-                37
-              ],
-              [
-                160,
-                176,
-                162
-              ],
-              [
-                47,
-                87,
-                70
-              ],
-              [
-                180,
-                204,
-                117
-              ]
-            ],
-            "palette_hex": [
-              "#e4ebef",
-              "#788c51",
-              "#d5ce98",
-              "#323525",
-              "#a0b0a2",
-              "#2f5746",
-              "#b4cc75"
-            ]
-          }
-        },
-        "bokeh_mask": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_9.png",
-          "exists": true
-        },
-        "semantic_segmentation": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_9.png",
-          "exists": true
-        },
-        "color_distribution": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_9.png",
-          "exists": true,
-          "json_data": {
-            "hist_h": [
-              0.012288626283407211,
-              0.04225928336381912,
-              0.09236609935760498,
-              0.1584002524614334,
-              0.24352367222309113,
-              0.04621071740984917,
-              0.02858530916273594,
-              0.028737805783748627,
-              0.024914421141147614,
-              0.06194116175174713,
-              0.052537769079208374,
-              0.004524746909737587,
-              0.005542686674743891,
-              0.1909305602312088,
-              0.0033851955085992813,
-              0.0011099529219791293,
-              0.001967029646039009,
-              0.0007747149793431163
-            ],
-            "hist_s": [
-              0.3372262120246887,
-              0.15812550485134125,
-              0.1551109254360199,
-              0.21685005724430084,
-              0.10838223248720169,
-              0.02103441208600998,
-              0.0029714566189795732,
-              0.00029920469387434423
-            ],
-            "hist_v": [
-              0.0014799372293055058,
-              0.03709237277507782,
-              0.06861117482185364,
-              0.10374681651592255,
-              0.1604354828596115,
-              0.18214423954486847,
-              0.11757586151361465,
-              0.3289141058921814
-            ],
-            "white_ratio": 0.307,
-            "green_ratio": 0.3654,
-            "mean_brightness": 0.7022,
-            "mean_saturation": 0.2595,
-            "h_bins": 18,
-            "s_bins": 8,
-            "v_bins": 8
-          }
-        }
-      },
-      "hsv_summary": {
-        "white_ratio": 0.307,
-        "green_ratio": 0.3654,
-        "mean_brightness": 0.7022,
-        "mean_saturation": 0.2595
-      }
-    }
-  },
-  "feature_dimension_details": {
-    "openpose_skeleton": {
-      "名称": "OpenPose 人体骨架图",
-      "描述": "使用 lllyasviel/ControlNet OpenposeDetector 提取的人体关键点骨架图,包含身体18个关键点(头部、肩膀、肘部、手腕、髋部、膝盖、脚踝等)",
-      "工具": "controlnet_aux.OpenposeDetector (lllyasviel/ControlNet)",
-      "格式": "PNG RGB图像,黑色背景+彩色骨架线",
-      "生成模型用途": "ControlNet OpenPose条件控制 - 精确控制人物姿态、站立/跪坐/侧身/背影等",
-      "对应亮点": [
-        "cluster_1",
-        "cluster_6"
-      ]
-    },
-    "depth_map": {
-      "名称": "MiDaS 深度图",
-      "描述": "使用 lllyasviel/Annotators MidasDetector 提取的单目深度估计图,灰度值表示相对深度(亮=近,暗=远)",
-      "工具": "controlnet_aux.MidasDetector (lllyasviel/Annotators)",
-      "格式": "PNG 灰度图像",
-      "生成模型用途": "ControlNet Depth条件控制 - 控制场景空间层次、前景/背景分离、景深效果",
-      "对应亮点": [
-        "cluster_4",
-        "cluster_5"
-      ]
-    },
-    "lineart_edge": {
-      "名称": "Lineart 线稿图",
-      "描述": "使用 lllyasviel/Annotators LineartDetector 提取的精细线稿,保留服装褶皱、画架结构、人物轮廓等细节",
-      "工具": "controlnet_aux.LineartDetector (lllyasviel/Annotators)",
-      "格式": "PNG 灰度图像(白线黑底)",
-      "生成模型用途": "ControlNet Lineart条件控制 - 控制服装褶皱、画架结构、整体构图轮廓",
-      "对应亮点": [
-        "cluster_1",
-        "cluster_2"
-      ]
-    },
-    "color_palette": {
-      "名称": "ColorThief 色彩调色板",
-      "描述": "使用 ColorThief 从图片提取的主色调和8色调色板,以RGB色块图和JSON格式存储",
-      "工具": "colorthief.ColorThief",
-      "格式": "PNG 色块图 (640×80) + JSON {dominant_color, palette, palette_hex}",
-      "生成模型用途": "Stable Diffusion color palette条件 / IP-Adapter颜色参考 - 精确控制整体色调",
-      "对应亮点": [
-        "cluster_3",
-        "cluster_2"
-      ]
-    },
-    "bokeh_mask": {
-      "名称": "Bokeh 虚化遮罩",
-      "描述": "基于MiDaS深度图生成的虚化区域遮罩,亮区=清晰(主体),暗区=虚化(背景),量化大光圈散景效果",
-      "工具": "自定义算法 (MiDaS深度图归一化)",
-      "格式": "PNG 灰度图像 (0=完全虚化, 255=完全清晰)",
-      "生成模型用途": "ControlNet Blur/Depth条件 / 后处理散景合成 - 控制虚化程度和区域",
-      "对应亮点": [
-        "cluster_4"
-      ]
-    },
-    "semantic_segmentation": {
-      "名称": "KMeans 语义分割图",
-      "描述": "在LAB色彩空间使用KMeans(k=6)聚类的语义分割图,区分白裙/草地/画架/天空/皮肤/其他区域",
-      "工具": "sklearn.cluster.KMeans (LAB色彩空间, k=6)",
-      "格式": "PNG RGB彩色分割图,固定颜色编码: 白=白裙, 绿=草地, 棕=画架, 蓝=天空, 肤=皮肤, 灰=其他",
-      "生成模型用途": "ControlNet Segmentation条件 - 控制各区域的空间布局和比例",
-      "对应亮点": [
-        "cluster_1",
-        "cluster_3",
-        "cluster_5"
-      ]
-    },
-    "color_distribution": {
-      "名称": "HSV 色彩分布直方图",
-      "描述": "在HSV色彩空间计算的色相/饱和度/明度分布直方图,量化白色比例、绿色比例、平均亮度等关键指标",
-      "工具": "OpenCV cv2.calcHist (HSV空间, H:18bins, S:8bins, V:8bins)",
-      "格式": "PNG 直方图可视化 + JSON {hist_h, hist_s, hist_v, white_ratio, green_ratio, mean_brightness, mean_saturation}",
-      "生成模型用途": "色彩条件控制向量 / 后处理色调调整参考 - 量化白绿配色比例",
-      "对应亮点": [
-        "cluster_3",
-        "cluster_4"
-      ]
-    }
-  }
-};
-
-
-
-        // 维度详细信息
-        const dimensionDetails = {
-            "openpose_skeleton": {
-                        "来源亮点": [
-                                    "cluster_1(优雅的白裙画者):骨架图直接编码人物站立/跪坐/侧身/背影等姿态",
-                                    "cluster_6(巧妙的摄影构图视角):骨架位置反映人物在画面中的构图位置"
-                        ],
-                        "制作表特征": [
-                                    "人物姿态(评分0.80~0.95)→ 骨架关键点位置",
-                                    "人物朝向(评分0.78~0.90)→ 骨架朝向方向",
-                                    "人物动作(评分0.88~0.94)→ 手臂/手腕关键点"
-                        ],
-                        "输出文件": "9个PNG骨架图(黑色背景+彩色骨架线,1080×1439)"
-            },
-            "depth_map": {
-                        "来源亮点": [
-                                    "cluster_4(虚实呼应的画中画结构):深度图区分前景画架/人物与背景草地",
-                                    "cluster_5(唯美梦幻的光影氛围):深度梯度反映景深程度,支持大光圈散景效果"
-                        ],
-                        "制作表特征": [
-                                    "画面清晰度(评分0.60~0.75)→ 深度梯度",
-                                    "前后关系(评分0.78)→ 深度分层"
-                        ],
-                        "输出文件": "9个PNG灰度深度图(亮=近,暗=远,1080×1439)"
-            },
-            "lineart_edge": {
-                        "来源亮点": [
-                                    "cluster_1(优雅的白裙画者):白裙褶皱轮廓、发型线条",
-                                    "cluster_2(充满艺术气息的写生道具):画架结构、调色板轮廓的精细线稿"
-                        ],
-                        "制作表特征": [
-                                    "服装款式(评分0.82~0.85)→ 裙摆褶皱线稿",
-                                    "人物完整性(评分0.65)→ 全身轮廓线稿"
-                        ],
-                        "输出文件": "9个PNG线稿图(白线黑底,1080×1439)"
-            },
-            "color_palette": {
-                        "来源亮点": [
-                                    "cluster_3(清新自然的绿白配色):调色板精确捕获白色和绿色的具体色值",
-                                    "cluster_2(充满艺术气息的写生道具):调色板上的油画颜料颜色"
-                        ],
-                        "制作表特征": [
-                                    "色彩搭配(评分0.75~0.88)→ 主色调和调色板",
-                                    "色彩饱和度 → 调色板色值"
-                        ],
-                        "输出文件": "9个PNG色块图(640×80) + 9个JSON文件(包含dominant_color, palette, palette_hex)"
-            },
-            "bokeh_mask": {
-                        "来源亮点": [
-                                    "cluster_4(虚实呼应的画中画结构):遮罩区分清晰的主体区域和虚化的背景区域"
-                        ],
-                        "制作表特征": [
-                                    "画面清晰度 → 清晰度权重分布",
-                                    "虚实对比 → 遮罩梯度"
-                        ],
-                        "输出文件": "9个PNG灰度遮罩(0=完全虚化,255=完全清晰,1080×1439)"
-            },
-            "semantic_segmentation": {
-                        "来源亮点": [
-                                    "cluster_1(优雅的白裙画者):白色区域精确定位白裙范围",
-                                    "cluster_3(清新自然的绿白配色):绿色/白色区域比例量化配色",
-                                    "cluster_5(唯美梦幻的光影氛围):分割图反映画布区域与现实场景的空间关系"
-                        ],
-                        "制作表特征": [
-                                    "区域分布 → 白裙/草地/画架/天空/皮肤/其他的空间布局",
-                                    "色彩区域比例 → 各区域占比"
-                        ],
-                        "输出文件": "9个PNG彩色分割图(固定颜色编码:白=白裙,绿=草地,棕=画架,蓝=天空,肤=皮肤,灰=其他,1080×1439)"
-            },
-            "color_distribution": {
-                        "来源亮点": [
-                                    "cluster_3(清新自然的绿白配色):white_ratio和green_ratio量化白绿配色比例",
-                                    "cluster_4(虚实呼应的画中画结构):mean_brightness反映整体光照水平"
-                        ],
-                        "制作表特征": [
-                                    "色彩分布 → HSV直方图向量",
-                                    "白色比例(S<30且V>200)→ white_ratio",
-                                    "绿色比例(H∈[35,85]且S>40)→ green_ratio",
-                                    "整体亮度(V通道均值/255)→ mean_brightness",
-                                    "整体饱和度(S通道均值/255)→ mean_saturation"
-                        ],
-                        "输出文件": "9个PNG直方图可视化(1200×300) + 9个JSON文件(包含hist_h, hist_s, hist_v, white_ratio, green_ratio, mean_brightness, mean_saturation)"
-            }
-};
-        
-        // 图片路径配置
-        const basePath = '.';
-        
-        // 渲染原始图片
-        function renderOriginalImages() {
-            const container = document.getElementById('originalImages');
-            const images = Object.keys(mappingData.image_overview);
-            
-            images.forEach(imgName => {
-                const imgData = mappingData.image_overview[imgName];
-                const card = document.createElement('div');
-                card.className = 'image-card';
-                card.onclick = () => openModal(`${basePath}/input/${imgName}.jpg`);
-                
-                const clusters = Object.values(imgData.active_clusters);
-                const clusterTags = clusters.map(c => 
-                    `<span class="cluster-tag">${c.聚类主题}</span>`
-                ).join('');
-                
-                const hsvInfo = imgData.hsv_summary;
-                
-                card.innerHTML = `
-                    <img src="${basePath}/input/${imgName}.jpg" alt="${imgName}" loading="lazy">
-                    <div class="image-info">
-                        <div class="image-name">${imgName}</div>
-                        <div class="image-clusters">${clusterTags}</div>
-                        <div style="margin-top: 10px; font-size: 0.85em; color: #666;">
-                            <div>🟢 绿色: ${(hsvInfo.green_ratio * 100).toFixed(1)}%</div>
-                            <div>⚪ 白色: ${(hsvInfo.white_ratio * 100).toFixed(1)}%</div>
-                            <div>💡 亮度: ${(hsvInfo.mean_brightness * 100).toFixed(1)}%</div>
-                        </div>
-                    </div>
-                `;
-                
-                container.appendChild(card);
-                
-                // 默认加载图片
-<!--                const grid = document.getElementById(`grid-${dimKey}`);-->
-<!--                loadDimensionImages(dimKey, grid);-->
-            });
-        }
-        
-        // 渲染特征维度
-        function renderDimensions() {
-            const container = document.getElementById('dimensionsContainer');
-            const dimensions = mappingData.feature_dimension_details;
-            
-            Object.keys(dimensions).forEach(dimKey => {
-                const dim = dimensions[dimKey];
-                const card = document.createElement('div');
-                card.className = 'dimension-card';
-                card.id = `dim-${dimKey}`;
-                
-                // 获取对应的聚类信息
-                const clusters = dim.对应亮点.map(cId => {
-                    const cluster = mappingData.cluster_overview[cId];
-                    return `<span class="cluster-badge">${cluster.聚类主题} (${cluster.亮点类型})</span>`;
-                }).join('');
-                
-                card.innerHTML = `
-                    <div class="dimension-header" onclick="toggleDimension('${dimKey}')">
-                        <div class="dimension-title">${dim.名称}</div>
-                        <button class="toggle-btn">展开查看</button>
-                    </div>
-                    
-                    <div class="dimension-description" style="cursor: pointer;" onclick="toggleDetails('${dimKey}')">
-                        <strong>📝 描述:</strong>${dim.描述}
-                        <span style="float: right; color: #667eea; font-size: 0.9em;">
-                            <span id="toggle-text-${dimKey}">▼ 展开工具信息</span>
-                        </span>
-                    </div>
-                    
-                    <div class="detail-toggle-content" id="details-${dimKey}" style="margin-top: 15px;">
-                        <div class="dimension-meta" style="grid-template-columns: repeat(3, 1fr);">
-                            <div class="meta-item">
-                                <div class="meta-label">🛠️ 提取工具</div>
-                                <div class="meta-value">${dim.工具}</div>
-                            </div>
-                            <div class="meta-item">
-                                <div class="meta-label">📄 格式</div>
-                                <div class="meta-value">${dim.格式}</div>
-                            </div>
-                            <div class="meta-item">
-                                <div class="meta-label">🎯 生成模型用途</div>
-                                <div class="meta-value">${dim.生成模型用途}</div>
-                            </div>
-                        </div>
-                    </div>
-                    
-                    <div style="margin-top: 20px;">
-                        <div class="detail-section">
-                            <h4>📍 来源亮点</h4>
-                            <ul>
-                                ${dimensionDetails[dimKey]['来源亮点'].map(item => '<li>' + item + '</li>').join('')}
-                            </ul>
-                        </div>
-                        <div class="detail-section">
-                            <h4>🎯 制作表特征对应</h4>
-                            <ul>
-                                ${dimensionDetails[dimKey]['制作表特征'].map(item => '<li>' + item + '</li>').join('')}
-                            </ul>
-                        </div>
-                        <div class="detail-section">
-                            <h4>📦 输出文件</h4>
-                            <p>${dimensionDetails[dimKey]['输出文件']}</p>
-                        </div>
-                    </div>
-                    
-                    <div class="dimension-content" id="content-${dimKey}">
-                        <div class="feature-images-grid" id="grid-${dimKey}"></div>
-                    </div>
-                `;
-                
-                container.appendChild(card);
-                
-                // 默认加载图片
-                const grid = document.getElementById(`grid-${dimKey}`);
-                loadDimensionImages(dimKey, grid);
-            });
-        }
-        
-        // 切换维度展开/收起
-        function toggleDimension(dimKey) {
-            const content = document.getElementById(`content-${dimKey}`);
-            const btn = document.querySelector(`#dim-${dimKey} .toggle-btn`);
-            
-            if (content.style.display === 'none') {
-                content.style.display = 'block';
-                btn.textContent = '收起';
-            } else {
-                content.style.display = 'none';
-                btn.textContent = '展开查看';
-            }
-        }
-        
-
-        // 切换详细信息展开/收起
-        function toggleDetails(dimKey) {
-            const detailsContent = document.getElementById(`details-${dimKey}`);
-            const toggleText = document.getElementById(`toggle-text-${dimKey}`);
-            
-            if (detailsContent.classList.contains('active')) {
-                detailsContent.classList.remove('active');
-                toggleText.textContent = '▼ 展开工具信息';
-            } else {
-                detailsContent.classList.add('active');
-                toggleText.textContent = '▲ 收起工具信息';
-            }
-        }
-        
-        // 加载维度图片
-        function loadDimensionImages(dimKey, grid) {
-            const images = Object.keys(mappingData.image_overview);
-            
-            images.forEach(imgName => {
-                const imgData = mappingData.image_overview[imgName];
-                const featurePath = `${basePath}/output/features/${dimKey}/${imgName}.png`;
-                
-                const card = document.createElement('div');
-                card.className = 'feature-image-card';
-                
-                // 创建图片元素
-                const img = document.createElement('img');
-                img.src = featurePath;
-                img.alt = imgName;
-                img.loading = 'lazy';
-                img.style.cursor = 'pointer';
-                img.onclick = () => openModal(featurePath, imgName);
-                card.appendChild(img);
-                
-                // 创建标签
-                const label = document.createElement('div');
-                label.className = 'feature-image-label';
-                label.textContent = imgName;
-                card.appendChild(label);
-                
-                // 特殊处理:color_palette 和 color_distribution 有额外信息
-                if (dimKey === 'color_palette' && imgData.features.color_palette.json_data) {
-                    const palette = imgData.features.color_palette.json_data;
-                    
-                    // 替换图片为原图
-                    img.src = `${basePath}/input/${imgName}.jpg`;
-                    
-                    // 添加色彩调色板
-                    const paletteDiv = document.createElement('div');
-                    paletteDiv.className = 'color-palette-display';
-                    paletteDiv.style.padding = '10px';
-                    
-                    palette.palette_hex.forEach(hex => {
-                        const colorBlock = document.createElement('div');
-                        colorBlock.className = 'color-block';
-                        colorBlock.style.background = hex;
-                        colorBlock.setAttribute('data-hex', hex);
-                        paletteDiv.appendChild(colorBlock);
-                    });
-                    
-                    card.appendChild(paletteDiv);
-                } else if (dimKey === 'color_distribution' && imgData.features.color_distribution.json_data) {
-                    const hsv = imgData.features.color_distribution.json_data;
-                    const hsvDiv = document.createElement('div');
-                    hsvDiv.className = 'hsv-stats';
-                    hsvDiv.style.padding = '10px';
-                    
-                    const stats = [
-                        { label: '绿色', value: (hsv.green_ratio * 100).toFixed(1) + '%' },
-                        { label: '白色', value: (hsv.white_ratio * 100).toFixed(1) + '%' },
-                        { label: '亮度', value: (hsv.mean_brightness * 100).toFixed(0) + '%' },
-                        { label: '饱和度', value: (hsv.mean_saturation * 100).toFixed(0) + '%' }
-                    ];
-                    
-                    stats.forEach(stat => {
-                        const statDiv = document.createElement('div');
-                        statDiv.className = 'hsv-stat';
-                        
-                        const statLabel = document.createElement('div');
-                        statLabel.className = 'hsv-stat-label';
-                        statLabel.textContent = stat.label;
-                        
-                        const statValue = document.createElement('div');
-                        statValue.className = 'hsv-stat-value';
-                        statValue.textContent = stat.value;
-                        
-                        statDiv.appendChild(statLabel);
-                        statDiv.appendChild(statValue);
-                        hsvDiv.appendChild(statDiv);
-                    });
-                    
-                    card.appendChild(hsvDiv);
-                }
-                
-                grid.appendChild(card);
-            });
-        }
-        
-        // 打开图片模态框
-        function openModal(imagePath, imgName = null) {
-            const modal = document.getElementById('imageModal');
-            const modalOriginal = document.getElementById('modalOriginalImage');
-            const modalFeature = document.getElementById('modalFeatureImage');
-            const featureContainer = document.getElementById('featureImageContainer');
-            
-            modal.classList.add('active');
-            
-            if (imgName) {
-                // 显示原图和特征图对比
-                modalOriginal.src = `${basePath}/input/${imgName}.jpg`;
-                modalFeature.src = imagePath;
-                featureContainer.classList.remove('hidden');
-            } else {
-                // 只显示原图
-                modalOriginal.src = imagePath;
-                featureContainer.classList.add('hidden');
-            }
-        }
-        
-        // 关闭模态框
-        function closeModal() {
-            const modal = document.getElementById('imageModal');
-            modal.classList.remove('active');
-        }
-        
-        // 点击模态框背景关闭
-        document.getElementById('imageModal').addEventListener('click', function(e) {
-            if (e.target === this) {
-                closeModal();
-            }
-        });
-        
-        // ESC键关闭模态框
-        document.addEventListener('keydown', function(e) {
-            if (e.key === 'Escape') {
-                closeModal();
-            }
-        });
-        
-        // 页面加载完成后渲染
-        document.addEventListener('DOMContentLoaded', function() {
-            renderOriginalImages();
-            renderDimensions();
-        });
-    </script>
-</body>
-</html>

+ 0 - 405
examples/find knowledge/generate_mappings.py

@@ -1,405 +0,0 @@
-"""
-生成每个特征维度的 mapping.json 文件
-记录特征与制作表的对应关系
-"""
-
-import os
-import json
-
-WORKDIR = os.path.dirname(os.path.abspath(__file__))
-OUTPUT_DIR = os.path.join(WORKDIR, 'output', 'features')
-
-# 读取所有制作表数据
-all_data = {}
-for i in range(1, 10):
-    with open(os.path.join(WORKDIR, 'input', f'写生油画__img_{i}_合并评分.json'), 'r', encoding='utf-8') as f:
-        all_data[f'img_{i}'] = json.load(f)
-
-# 读取亮点数据
-with open(os.path.join(WORKDIR, 'input', '写生油画__post_highlight_简化版.json'), 'r', encoding='utf-8') as f:
-    highlights = json.load(f)
-
-# ============================================================
-# 1. OpenPose 骨架 - mapping
-# ============================================================
-openpose_mapping = {
-    "dimension": "openpose_skeleton",
-    "description": "人体姿态骨架图,使用OpenPose提取关节点坐标,捕捉人物的站姿、跪姿、侧身等姿态",
-    "tool": "controlnet_aux.OpenposeDetector (lllyasviel/ControlNet)",
-    "format": "PNG (黑底彩色骨架图)",
-    "highlight_clusters": ["cluster_1 (优雅的白裙写生少女)", "cluster_6 (引导视线的构图技巧)"],
-    "mappings": []
-}
-
-# 每张图片的骨架对应关系
-pose_info = {
-    "img_1": {"段落": "段落1.1", "段落名称": "人物", "姿态描述": "侧身背对镜头,站立作画,右手持笔,左手持调色板"},
-    "img_2": {"段落": "段落2.1", "段落名称": "人物", "姿态描述": "背对镜头,站立作画,逆光轮廓"},
-    "img_3": {"段落": "段落3.1", "段落名称": "人物", "姿态描述": "背对镜头,跪坐在草地上作画"},
-    "img_4": {"段落": "段落4.1", "段落名称": "人物", "姿态描述": "侧身面对镜头,站立,右手持笔上举,左手持调色板"},
-    "img_5": {"段落": "段落5.1", "段落名称": "人物", "姿态描述": "近景,上半身,左手持调色板特写"},
-    "img_6": {"段落": "段落6.1", "段落名称": "人物", "姿态描述": "侧身背对,过肩视角,右手持笔作画"},
-    "img_7": {"段落": "段落7.1", "段落名称": "人物", "姿态描述": "侧脸特写,双手捧玫瑰花,闭眼闻花"},
-    "img_8": {"段落": "段落8.1", "段落名称": "人物", "姿态描述": "侧身面对镜头,站立作画"},
-    "img_9": {"段落": "段落9.1", "段落名称": "人物", "姿态描述": "背对镜头,远景,全身站立作画"},
-}
-
-for img_name, info in pose_info.items():
-    # 找到对应段落的评分
-    img_data = all_data[img_name][0]
-    
-    # 找到人物段落的形式评分
-    person_score = 0
-    for sub in img_data.get('子段落', []):
-        if '人物' in sub.get('名称', ''):
-            person_score = sub.get('形式', {}).get('评分详情', {}).get('combined_score', 0)
-            break
-    
-    openpose_mapping["mappings"].append({
-        "图片": img_name,
-        "特征文件": f"{img_name}.png",
-        "段落ID": info["段落"],
-        "段落名称": info["段落名称"],
-        "维度": "实质",
-        "特征路径": f"子段落.{info['段落']}.形式",
-        "具体特征": "拍摄角度 / 构图",
-        "姿态描述": info["姿态描述"],
-        "亮点关联": "cluster_1 (优雅的白裙写生少女) / cluster_6 (引导视线的构图技巧)",
-        "参考评分": person_score
-    })
-
-with open(os.path.join(OUTPUT_DIR, 'openpose_skeleton', 'mapping.json'), 'w', encoding='utf-8') as f:
-    json.dump(openpose_mapping, f, indent=2, ensure_ascii=False)
-print("openpose_skeleton/mapping.json 生成完成")
-
-# ============================================================
-# 2. Depth Map - mapping
-# ============================================================
-depth_mapping = {
-    "dimension": "depth_map",
-    "description": "深度图,使用MiDaS提取场景空间深度信息,捕捉前景人物/画架与背景草地/树木的层次关系",
-    "tool": "controlnet_aux.MidasDetector (lllyasviel/Annotators)",
-    "format": "PNG (灰度深度图,亮=近,暗=远)",
-    "highlight_clusters": ["cluster_4 (唯美梦幻的光影与景深)", "cluster_3 (清新雅致的白绿配色)"],
-    "mappings": []
-}
-
-depth_info = {
-    "img_1": {"段落": "段落1", "段落名称": "户外绘画场景", "景深特征": "中景,人物/画架在前景,绿色树木在远景,轻微虚化"},
-    "img_2": {"段落": "段落2", "段落名称": "户外绘画场景", "景深特征": "逆光,背景强烈虚化,人物轮廓光,梦幻散景"},
-    "img_3": {"段落": "段落3", "段落名称": "户外绘画场景", "景深特征": "跪姿,人物低于正常视角,背景建筑远景"},
-    "img_4": {"段落": "段落4", "段落名称": "户外绘画场景", "景深特征": "侧前方视角,人物与画架同一景深平面"},
-    "img_5": {"段落": "段落5", "段落名称": "户外绘画场景", "景深特征": "近景特写,调色板在最近景,背景极度虚化"},
-    "img_6": {"段落": "段落6", "段落名称": "户外绘画场景", "景深特征": "特写,极浅景深,背景完全虚化"},
-    "img_7": {"段落": "段落7", "段落名称": "人物与玫瑰花", "景深特征": "侧脸特写,玫瑰花在最近景,背景草地虚化"},
-    "img_8": {"段落": "段落8", "段落名称": "户外绘画场景", "景深特征": "中景,人物与画架在前景,背景树木虚化"},
-    "img_9": {"段落": "段落9", "段落名称": "户外绘画场景", "景深特征": "远景,人物较小,背景建筑和树木可见"},
-}
-
-for img_name, info in depth_info.items():
-    depth_mapping["mappings"].append({
-        "图片": img_name,
-        "特征文件": f"{img_name}.png",
-        "段落ID": info["段落"],
-        "段落名称": info["段落名称"],
-        "维度": "形式",
-        "特征路径": f"形式.清晰度 / 段落关系.段内关系.景深",
-        "具体特征": "清晰度 / 景深",
-        "景深描述": info["景深特征"],
-        "亮点关联": "cluster_4 (唯美梦幻的光影与景深)",
-        "参考评分": all_data[img_name][0].get('形式', {}).get('清晰度', {}).get('评分详情', {}).get('combined_score', 0)
-    })
-
-with open(os.path.join(OUTPUT_DIR, 'depth_map', 'mapping.json'), 'w', encoding='utf-8') as f:
-    json.dump(depth_mapping, f, indent=2, ensure_ascii=False)
-print("depth_map/mapping.json 生成完成")
-
-# ============================================================
-# 3. Lineart Edge - mapping
-# ============================================================
-lineart_mapping = {
-    "dimension": "lineart_edge",
-    "description": "线稿/边缘图,使用Lineart检测器提取图像轮廓线条,捕捉人物轮廓、服装褶皱、画架结构等",
-    "tool": "controlnet_aux.LineartDetector (lllyasviel/Annotators)",
-    "format": "PNG (白底黑线线稿图)",
-    "highlight_clusters": ["cluster_1 (优雅的白裙写生少女)", "cluster_2_props (构建叙事的写生道具)"],
-    "mappings": []
-}
-
-lineart_info = {
-    "img_1": {
-        "段落": "段落1.1.2", "段落名称": "身体", "维度": "形式",
-        "特征": "服装款式", "描述": "白色长裙轮廓线,袖子宽松,腰部收紧,裙摆飘逸,背部系带细节"
-    },
-    "img_2": {
-        "段落": "段落2.1.2", "段落名称": "身体", "维度": "形式",
-        "特征": "服装款式", "描述": "白色长裙轮廓,V字露背设计,A字裙摆,逆光轮廓光"
-    },
-    "img_3": {
-        "段落": "段落3.1.2", "段落名称": "身体", "维度": "形式",
-        "特征": "服装款式", "描述": "跪坐姿态下白裙轮廓,裙摆自然垂坠,背部V字系带"
-    },
-    "img_4": {
-        "段落": "段落4.2", "段落名称": "画架", "维度": "形式",
-        "特征": "构图", "描述": "画架三脚架结构线条,画布矩形轮廓,人物与画架的空间线条关系"
-    },
-    "img_5": {
-        "段落": "段落5.1.3", "段落名称": "调色板", "维度": "实质",
-        "特征": "颜色", "描述": "调色板轮廓,颜料堆积纹理线条,手部握持姿态"
-    },
-    "img_6": {
-        "段落": "段落6.2.1", "段落名称": "画布", "维度": "实质",
-        "特征": "笔触", "描述": "画布上油画笔触线条,颜料堆叠纹理,画框轮廓"
-    },
-    "img_7": {
-        "段落": "段落7.2.1", "段落名称": "花朵", "维度": "实质",
-        "特征": "清晰度", "描述": "玫瑰花瓣层叠轮廓,花瓣边缘线条,茎叶结构"
-    },
-    "img_8": {
-        "段落": "段落8.1.2", "段落名称": "身体", "维度": "形式",
-        "特征": "服装款式", "描述": "白色长裙轮廓,侧身姿态线条,手持画笔动作"
-    },
-    "img_9": {
-        "段落": "段落9.1.2", "段落名称": "身体", "维度": "形式",
-        "特征": "服装款式", "描述": "远景全身白裙轮廓,露背设计,裙摆及地"
-    },
-}
-
-for img_name, info in lineart_info.items():
-    lineart_mapping["mappings"].append({
-        "图片": img_name,
-        "特征文件": f"{img_name}.png",
-        "段落ID": info["段落"],
-        "段落名称": info["段落名称"],
-        "维度": info["维度"],
-        "特征路径": f"子段落.{info['段落']}.形式.{info['特征']}",
-        "具体特征": info["特征"],
-        "线稿描述": info["描述"],
-        "亮点关联": "cluster_1 (优雅的白裙写生少女) / cluster_2_props (写生道具)"
-    })
-
-with open(os.path.join(OUTPUT_DIR, 'lineart_edge', 'mapping.json'), 'w', encoding='utf-8') as f:
-    json.dump(lineart_mapping, f, indent=2, ensure_ascii=False)
-print("lineart_edge/mapping.json 生成完成")
-
-# ============================================================
-# 4. Color Palette - mapping
-# ============================================================
-color_palette_mapping = {
-    "dimension": "color_palette",
-    "description": "主色调调色板,使用ColorThief提取图片的8个主要颜色,捕捉白绿配色、调色板颜料色彩等",
-    "tool": "colorthief (Python库)",
-    "format": "PNG (色块可视化) + JSON (颜色数值)",
-    "highlight_clusters": ["cluster_3 (清新雅致的白绿配色)", "cluster_2_texture (斑斓厚重的油画颜料)"],
-    "mappings": []
-}
-
-palette_info = {
-    "img_1": {
-        "段落": "段落1", "段落名称": "户外绘画场景", "维度": "形式",
-        "特征": "色彩饱和度", "描述": "主色:纯白(白裙)、草绿(背景)、深棕(调色板)、多彩颜料色"
-    },
-    "img_2": {
-        "段落": "段落2", "段落名称": "户外绘画场景", "维度": "形式",
-        "特征": "色彩饱和度", "描述": "逆光色调:暖黄光晕、白色、绿色,整体偏暖"
-    },
-    "img_3": {
-        "段落": "段落3", "段落名称": "户外绘画场景", "维度": "形式",
-        "特征": "色彩饱和度", "描述": "白绿配色,远景建筑灰色,整体清新"
-    },
-    "img_4": {
-        "段落": "段落4", "段落名称": "户外绘画场景", "维度": "形式",
-        "特征": "色彩饱和度", "描述": "明亮自然光,白裙纯白,绿色鲜艳,调色板多彩"
-    },
-    "img_5": {
-        "段落": "段落5.1.3", "段落名称": "调色板", "维度": "实质",
-        "特征": "颜色", "描述": "调色板颜料色:深绿、浅绿、蓝、红、黄、白、紫、黑等10+种颜色"
-    },
-    "img_6": {
-        "段落": "段落6.2.1", "段落名称": "画布", "维度": "实质",
-        "特征": "色彩", "描述": "画布油画色:绿色、蓝色为主,夹杂白、黄、紫、棕,颜料堆叠"
-    },
-    "img_7": {
-        "段落": "段落7", "段落名称": "人物与玫瑰花", "维度": "形式",
-        "特征": "色彩饱和度", "描述": "白玫瑰纯白、肤色米白、绿色背景,整体清新淡雅"
-    },
-    "img_8": {
-        "段落": "段落8", "段落名称": "户外绘画场景", "维度": "形式",
-        "特征": "色彩饱和度", "描述": "白绿配色,光线均匀,整体明亮清新"
-    },
-    "img_9": {
-        "段落": "段落9", "段落名称": "户外绘画场景", "维度": "形式",
-        "特征": "色彩饱和度", "描述": "远景色调,绿色鲜艳,白裙洁净,远处建筑浅灰"
-    },
-}
-
-for img_name, info in palette_info.items():
-    color_palette_mapping["mappings"].append({
-        "图片": img_name,
-        "特征文件_PNG": f"{img_name}.png",
-        "特征文件_JSON": f"{img_name}.json",
-        "段落ID": info["段落"],
-        "段落名称": info["段落名称"],
-        "维度": info["维度"],
-        "特征路径": f"形式.{info['特征']}",
-        "具体特征": info["特征"],
-        "色彩描述": info["描述"],
-        "亮点关联": "cluster_3 (清新雅致的白绿配色) / cluster_2_texture (斑斓厚重的油画颜料)"
-    })
-
-with open(os.path.join(OUTPUT_DIR, 'color_palette', 'mapping.json'), 'w', encoding='utf-8') as f:
-    json.dump(color_palette_mapping, f, indent=2, ensure_ascii=False)
-print("color_palette/mapping.json 生成完成")
-
-# ============================================================
-# 5. Bokeh Mask - mapping
-# ============================================================
-bokeh_mapping = {
-    "dimension": "bokeh_mask",
-    "description": "景深虚化遮罩,基于深度图和清晰度分析推导,捕捉大光圈浅景深效果,区分清晰主体与虚化背景",
-    "tool": "自定义算法 (MiDaS深度图 + 拉普拉斯清晰度)",
-    "format": "PNG (灰度遮罩,亮=清晰主体,暗=虚化背景)",
-    "highlight_clusters": ["cluster_4 (唯美梦幻的光影与景深)"],
-    "mappings": []
-}
-
-bokeh_info = {
-    "img_1": {"段落": "段落1.3", "段落名称": "背景", "维度": "形式", "特征": "清晰度", "描述": "背景树木轻微虚化,人物/画架清晰"},
-    "img_2": {"段落": "段落2.3", "段落名称": "背景", "维度": "形式", "特征": "光照", "描述": "逆光强烈虚化,背景散景(Bokeh)效果明显,光斑圆形"},
-    "img_3": {"段落": "段落3.3", "段落名称": "背景", "维度": "形式", "特征": "清晰度", "描述": "背景建筑和树木虚化,人物清晰"},
-    "img_4": {"段落": "段落4.3", "段落名称": "背景", "维度": "形式", "特征": "清晰度", "描述": "背景树木虚化,人物与画架清晰"},
-    "img_5": {"段落": "段落5.3", "段落名称": "背景", "维度": "形式", "特征": "清晰度", "描述": "背景极度虚化,调色板和手部清晰"},
-    "img_6": {"段落": "段落6.3", "段落名称": "背景", "维度": "形式", "特征": "清晰度", "描述": "背景完全虚化,极浅景深,人物和画布清晰"},
-    "img_7": {"段落": "段落7.3", "段落名称": "背景", "维度": "形式", "特征": "清晰度", "描述": "背景草地虚化,人物侧脸和玫瑰花清晰"},
-    "img_8": {"段落": "段落8.3", "段落名称": "背景", "维度": "形式", "特征": "清晰度", "描述": "背景树木虚化,人物和画架清晰"},
-    "img_9": {"段落": "段落9.3", "段落名称": "背景", "维度": "形式", "特征": "清晰度", "描述": "远景,整体清晰度较高,背景建筑可见"},
-}
-
-for img_name, info in bokeh_info.items():
-    bokeh_mapping["mappings"].append({
-        "图片": img_name,
-        "特征文件": f"{img_name}.png",
-        "段落ID": info["段落"],
-        "段落名称": info["段落名称"],
-        "维度": info["维度"],
-        "特征路径": f"子段落.{info['段落']}.形式.{info['特征']}",
-        "具体特征": info["特征"],
-        "景深描述": info["描述"],
-        "亮点关联": "cluster_4 (唯美梦幻的光影与景深)"
-    })
-
-with open(os.path.join(OUTPUT_DIR, 'bokeh_mask', 'mapping.json'), 'w', encoding='utf-8') as f:
-    json.dump(bokeh_mapping, f, indent=2, ensure_ascii=False)
-print("bokeh_mask/mapping.json 生成完成")
-
-# ============================================================
-# 6. Semantic Segmentation - mapping
-# ============================================================
-seg_mapping = {
-    "dimension": "semantic_segmentation",
-    "description": "语义分割图,基于颜色聚类将图像分割为主要语义区域:白裙人物/绿色背景/调色板/画架/画布/皮肤",
-    "tool": "sklearn.KMeans + OpenCV (LAB颜色空间聚类)",
-    "format": "PNG (彩色分割图,不同颜色代表不同语义区域)",
-    "highlight_clusters": ["cluster_1 (优雅的白裙写生少女)", "cluster_3 (清新雅致的白绿配色)", "cluster_5 (虚实呼应的画中画结构)"],
-    "mappings": []
-}
-
-seg_info = {
-    "img_1": {
-        "段落": "段落1", "段落名称": "户外绘画场景", "维度": "形式",
-        "特征": "构图", "描述": "分割区域:白裙人物(右侧60%)、绿色背景(左上40%)、画架(左侧)、画布(中央)"
-    },
-    "img_2": {
-        "段落": "段落2", "段落名称": "户外绘画场景", "维度": "形式",
-        "特征": "构图", "描述": "分割区域:人物背影(中央)、逆光背景(上方亮区)、绿色草地(下方)"
-    },
-    "img_3": {
-        "段落": "段落3", "段落名称": "户外绘画场景", "维度": "形式",
-        "特征": "构图", "描述": "分割区域:跪坐人物(右侧)、画架(中央)、草地(前景)、树木+建筑(背景)"
-    },
-    "img_4": {
-        "段落": "段落4", "段落名称": "户外绘画场景", "维度": "形式",
-        "特征": "构图", "描述": "分割区域:侧身人物(右侧)、空白画布(左侧)、绿色背景(上方)"
-    },
-    "img_5": {
-        "段落": "段落5.1.3", "段落名称": "调色板", "维度": "实质",
-        "特征": "颜色", "描述": "分割区域:白色服装(大面积)、多彩调色板(中央)、绿色背景(下方)"
-    },
-    "img_6": {
-        "段落": "段落6.2.1", "段落名称": "画布", "维度": "实质",
-        "特征": "内容主题", "描述": "分割区域:人物背部(右侧)、油画画布(中央左侧)、虚化绿色背景"
-    },
-    "img_7": {
-        "段落": "段落7", "段落名称": "人物与玫瑰花", "维度": "实质",
-        "特征": "花朵颜色", "描述": "分割区域:人物侧脸(右侧)、白色玫瑰(中央)、绿色虚化背景"
-    },
-    "img_8": {
-        "段落": "段落8", "段落名称": "户外绘画场景", "维度": "形式",
-        "特征": "构图", "描述": "分割区域:侧身人物(右侧)、空白画布(左侧)、绿色背景(上方)"
-    },
-    "img_9": {
-        "段落": "段落9", "段落名称": "户外绘画场景", "维度": "形式",
-        "特征": "构图", "描述": "分割区域:远景人物(右侧小)、画架(右侧)、大面积草地(左侧)、树木+建筑(背景)"
-    },
-}
-
-for img_name, info in seg_info.items():
-    seg_mapping["mappings"].append({
-        "图片": img_name,
-        "特征文件": f"{img_name}.png",
-        "段落ID": info["段落"],
-        "段落名称": info["段落名称"],
-        "维度": info["维度"],
-        "特征路径": f"形式.{info['特征']}",
-        "具体特征": info["特征"],
-        "分割描述": info["描述"],
-        "亮点关联": "cluster_1 / cluster_3 / cluster_5"
-    })
-
-with open(os.path.join(OUTPUT_DIR, 'semantic_segmentation', 'mapping.json'), 'w', encoding='utf-8') as f:
-    json.dump(seg_mapping, f, indent=2, ensure_ascii=False)
-print("semantic_segmentation/mapping.json 生成完成")
-
-# ============================================================
-# 7. Color Distribution - mapping
-# ============================================================
-dist_mapping = {
-    "dimension": "color_distribution",
-    "description": "HSV色彩分布向量,包含色相/饱和度/明度直方图及统计特征,量化白绿配色比例、整体亮度等",
-    "tool": "OpenCV calcHist (HSV颜色空间)",
-    "format": "JSON (数值向量) + PNG (色相直方图可视化)",
-    "highlight_clusters": ["cluster_3 (清新雅致的白绿配色)", "cluster_4 (唯美梦幻的光影与景深)"],
-    "mappings": []
-}
-
-dist_info = {
-    "img_1": {"段落": "段落1", "特征": "色彩饱和度", "描述": "白色比例高(白裙),绿色比例高(背景),中等亮度"},
-    "img_2": {"段落": "段落2", "特征": "光照", "描述": "逆光高亮,整体亮度偏高,暖黄色调"},
-    "img_3": {"段落": "段落3", "特征": "色彩饱和度", "描述": "白绿配色,整体清新,远景建筑降低饱和度"},
-    "img_4": {"段落": "段落4", "特征": "色彩饱和度", "描述": "明亮自然光,高饱和度绿色,白色纯净"},
-    "img_5": {"段落": "段落5.1.3", "特征": "颜色种类", "描述": "调色板多色,绿色主导,白色服装大面积"},
-    "img_6": {"段落": "段落6.2.1", "特征": "色彩", "描述": "画布绿蓝色调,背景虚化绿色,整体饱和度高"},
-    "img_7": {"段落": "段落7", "特征": "色彩饱和度", "描述": "白色主导(玫瑰+服装),绿色背景,整体淡雅"},
-    "img_8": {"段落": "段落8", "特征": "色彩饱和度", "描述": "白绿配色,光线均匀,整体明亮"},
-    "img_9": {"段落": "段落9", "特征": "色彩饱和度", "描述": "远景色调,绿色鲜艳,白色洁净,整体清新"},
-}
-
-for img_name, info in dist_info.items():
-    dist_mapping["mappings"].append({
-        "图片": img_name,
-        "特征文件_JSON": f"{img_name}.json",
-        "特征文件_PNG": f"{img_name}.png",
-        "段落ID": info["段落"],
-        "段落名称": "户外绘画场景",
-        "维度": "形式",
-        "特征路径": f"形式.{info['特征']}",
-        "具体特征": info["特征"],
-        "色彩描述": info["描述"],
-        "亮点关联": "cluster_3 (清新雅致的白绿配色)"
-    })
-
-with open(os.path.join(OUTPUT_DIR, 'color_distribution', 'mapping.json'), 'w', encoding='utf-8') as f:
-    json.dump(dist_mapping, f, indent=2, ensure_ascii=False)
-print("color_distribution/mapping.json 生成完成")
-
-print("\n=== 所有 mapping.json 生成完成 ===")

+ 0 - 216
examples/find knowledge/knowledge/cluster_feature_analysis.md

@@ -1,216 +0,0 @@
-# 聚类-特征深度分析报告
-
-> 写生油画系列 | 6个聚类 × 7个特征维度
-
----
-
-## cluster_1:优雅的白裙画者(实质)
-
-**涉及图片**:全部9张  
-**对应特征**:openpose_skeleton(主)、lineart_edge(主)、semantic_segmentation(辅)
-
-### 各图片亮点结论
-
-| 图片 | 合并结论 | 姿态特征 |
-|------|---------|---------|
-| img_1 | 优雅的白裙侧背影 | 侧身站立,手持调色盘,微倾 |
-| img_2 | 优雅的白裙背影 | 背对镜头站立,长发披肩 |
-| img_3 | 纯净优雅的白裙背影 | 跪坐蹲姿,背对镜头 |
-| img_4 | 优雅的白裙侧影 | 侧身站立,专注作画 |
-| img_5 | 优雅的白裙画者 | 站立,手持画笔 |
-| img_6 | 优雅的白裙画者 | 站立,侧身 |
-| img_7 | 优雅的白裙画者 | 站立,背影 |
-| img_8 | 优雅的白裙画者 | 站立,专注 |
-| img_9 | 优雅的白裙画者 | 站立,侧身 |
-
-### 关键形式特征评分(img_1示例)
-
-| 形式特征 | 描述 | combined_score |
-|---------|------|---------------|
-| 人物动作 | 挥笔作画,手持调色盘 | 0.94 |
-| 人物姿态 | 侧身站立,身体微倾 | 0.92 |
-| 服装款式 | 飘逸宽松连衣裙 | 0.83 |
-| 人物朝向 | 侧背向 | 0.78 |
-| 发型 | 披肩长发 | 0.65 |
-
-### 特征提取策略
-
-**OpenPose骨架图**:
-- 捕获18个关键点:头部、双肩、双肘、双腕、髋部、双膝、双踝
-- 站立姿态:关键点垂直分布,重心在双脚
-- 跪坐姿态(img_3):膝盖关键点接近地面,髋部降低
-- 手持画笔:手腕关键点位置和角度
-
-**Lineart线稿图**:
-- 白裙褶皱:裙摆的垂坠线条和褶皱细节
-- 发型轮廓:长发的飘逸线条
-- 露背设计(img_3):背部轮廓线
-
----
-
-## cluster_2:充满艺术气息的写生道具(实质)
-
-**涉及图片**:img_1, img_4, img_5, img_6, img_7, img_8, img_9  
-**对应特征**:lineart_edge(主)、color_palette(辅)
-
-### 道具类型分析
-
-| 图片 | 主要道具 | 特征重点 |
-|------|---------|---------|
-| img_1 | 画架+油画+调色板+画笔 | 完整写生装备 |
-| img_4 | 画架+油画 | 画架结构 |
-| img_5 | 画架+油画+调色板 | 油画颜料质感 |
-| img_6 | 画架+油画 | 画架与人物关系 |
-| img_7 | 画架+油画 | 画架结构 |
-| img_8 | 画架+油画 | 画架结构 |
-| img_9 | 画架+油画 | 画架结构 |
-
-### 特征提取策略
-
-**Lineart线稿图**:
-- 画架结构:三脚架的几何线条
-- 画布边框:矩形轮廓
-- 调色板形状:不规则多边形轮廓
-- 画笔细节:细长线条
-
-**ColorThief调色板**:
-- 捕获调色板上的油画颜料颜色
-- 多色混合的颜料质感通过调色板色彩体现
-
----
-
-## cluster_3:清新自然的绿白配色(形式)
-
-**涉及图片**:img_1, img_4, img_5, img_7, img_8  
-**对应特征**:color_palette(主)、color_distribution(主)、semantic_segmentation(辅)
-
-### 色彩量化数据
-
-| 图片 | 白色比例 | 绿色比例 | 平均亮度 | 主色HEX |
-|------|---------|---------|---------|---------|
-| img_1 | 2.4% | 62.8% | 0.470 | #48623c |
-| img_4 | 13.4% | 30.7% | 0.564 | #707443 |
-| img_5 | 28.7% | 32.4% | 0.648 | #315b36 |
-| img_7 | 2.4% | 41.9% | 0.438 | #47603b |
-| img_8 | 7.1% | 71.2% | 0.393 | #ceccc9 |
-
-**平均值**:白色=10.8%,绿色=47.8%,亮度=0.503
-
-### 色彩特征说明
-
-- **img_1**:绿色占主导(62.8%),白裙比例较低但形成强对比
-- **img_5**:白色比例最高(28.7%),光线充足
-- **img_8**:绿色比例最高(71.2%),深绿色草地背景
-- **img_4**:绿白比例较均衡,整体色调偏暗
-
-### 特征提取策略
-
-**HSV色彩分布**:
-- white_ratio:精确量化白色(白裙+天空)比例
-- green_ratio:精确量化绿色(草地+树木)比例
-- 两者之和反映"绿白配色"的纯粹度
-
-**ColorThief调色板**:
-- 8色调色板捕获主要色彩
-- palette_hex提供可直接用于生成模型的颜色参考
-
----
-
-## cluster_4:虚实呼应的画中画结构(形式)
-
-**涉及图片**:img_1, img_2, img_3  
-**对应特征**:depth_map(主)、bokeh_mask(主)、color_distribution(辅)
-
-### 画中画结构分析
-
-| 图片 | 画中画特征 | 深度层次 |
-|------|---------|---------|
-| img_1 | 画架上的油画与现实草地对应 | 前景人物+画架,中景草地,远景树木 |
-| img_2 | 画架上的风景画与背景呼应 | 前景人物,中景画架,远景虚化 |
-| img_3 | 跪坐画者与画架上的作品 | 前景人物,中景画架,背景草地 |
-
-### 深度特征说明
-
-**MiDaS深度图**:
-- 近景(人物/画架):高亮度值(接近255)
-- 中景(草地):中等亮度值
-- 远景(树木/天空):低亮度值(接近0)
-- 深度梯度反映"虚实"的空间层次
-
-**Bokeh遮罩**:
-- 基于深度图归一化生成
-- 高值区域(白色)=清晰的主体
-- 低值区域(黑色)=虚化的背景
-- 直接量化"虚实呼应"的程度
-
----
-
-## cluster_5:唯美梦幻的光影氛围(形式)
-
-**涉及图片**:img_2, img_3, img_7  
-**对应特征**:depth_map(主)、semantic_segmentation(辅)
-
-### 光影特征分析
-
-| 图片 | 光照特征 | 亮度 | 饱和度 |
-|------|---------|------|-------|
-| img_2 | 柔和自然光,背景虚化 | 0.683 | 中等 |
-| img_3 | 逆光/侧光,草地反光 | 0.694 | 中等 |
-| img_7 | 自然光,阴影丰富 | 0.438 | 低 |
-
-### 特征提取策略
-
-**MiDaS深度图**:
-- 景深程度:深度梯度越大,景深越浅
-- 虚化背景:远景深度值低,对应虚化区域
-
-**语义分割图**:
-- 光照区域:高亮度聚类(白色/浅色区域)
-- 阴影区域:低亮度聚类(深色区域)
-- 光影分布反映"唯美梦幻"的氛围
-
----
-
-## cluster_6:巧妙的摄影构图视角(形式)
-
-**涉及图片**:img_4, img_5, img_6, img_9  
-**对应特征**:openpose_skeleton(主)
-
-### 构图特征分析
-
-| 图片 | 拍摄视角 | 景别 | 人物位置 |
-|------|---------|------|---------|
-| img_4 | 平视,侧面 | 中景 | 画面中央偏右 |
-| img_5 | 平视,侧后 | 中景 | 画面中央 |
-| img_6 | 平视,侧面 | 中景 | 画面左侧 |
-| img_9 | 平视,侧后 | 中景 | 画面中央偏左 |
-
-### 特征提取策略
-
-**OpenPose骨架图**:
-- 骨架在画面中的位置 → 人物构图位置
-- 骨架朝向 → 拍摄视角(正面/侧面/背面)
-- 骨架完整性 → 景别(全身/半身/特写)
-- 骨架大小 → 人物在画面中的占比
-
----
-
-## 特征维度覆盖度矩阵
-
-| 图片 | cluster_1 | cluster_2 | cluster_3 | cluster_4 | cluster_5 | cluster_6 |
-|------|-----------|-----------|-----------|-----------|-----------|-----------|
-| img_1 | ✅ | ✅ | ✅ | ✅ | - | - |
-| img_2 | ✅ | - | - | ✅ | ✅ | - |
-| img_3 | ✅ | - | - | ✅ | ✅ | - |
-| img_4 | ✅ | ✅ | ✅ | - | - | ✅ |
-| img_5 | ✅ | ✅ | ✅ | - | - | ✅ |
-| img_6 | ✅ | ✅ | - | - | - | ✅ |
-| img_7 | ✅ | ✅ | ✅ | - | ✅ | - |
-| img_8 | ✅ | ✅ | ✅ | - | - | - |
-| img_9 | ✅ | ✅ | - | - | - | ✅ |
-
-**覆盖统计**:
-- img_1:4个聚类(最丰富)
-- img_2, img_3:3个聚类
-- img_4, img_5:3个聚类
-- img_6, img_7, img_8, img_9:2个聚类

+ 0 - 340
examples/find knowledge/knowledge/feature_extraction_report.md

@@ -1,340 +0,0 @@
-# 写生油画系列 - 多模态特征提取研究报告
-
-> 生成时间:2025年  
-> 数据集:写生油画(9张图片,1080×1439 RGB)  
-> 主题:户外草地白裙写生少女
-
----
-
-## 一、任务概述
-
-### 1.1 核心目标
-
-从9张"户外白裙写生少女"图片中提取多模态特征,构建**可逆特征空间**,支持后续生成模型(Stable Diffusion + ControlNet)还原图片。
-
-**核心约束**:
-- ❌ 不能保存图片本身,只能保存提取的特征
-- ✅ 特征必须是生成模型友好的控制信号(非纯文字描述)
-- ✅ 特征需与制作表(合并评分JSON)对应到具体段落/实质/形式/特征
-
-### 1.2 数据结构
-
-**输入**:
-- 9张图片:`data/写生油画/images/img_1~img_9.jpg`
-- 合并评分JSON:`output/写生油画/final_score/20260302_012649_final/写生油画__img_N_合并评分.json`
-- 亮点JSON:`output/写生油画/post_highlight/20260302_012917_post_highlight/写生油画__post_highlight.json`
-
-**输出**:
-- 特征文件:`output/写生油画/features/<维度名>/img_N.png`
-- 映射文件:`output/写生油画/features/<维度名>/mapping.json`
-- 总览文件:`output/写生油画/features/overview_mapping.json`
-
----
-
-## 二、亮点聚类分析
-
-从亮点JSON中提取的6个聚类:
-
-| 聚类ID | 主题 | 类型 | 涉及图片 |
-|--------|------|------|---------|
-| cluster_1 | 优雅的白裙画者 | 实质 | 全部9张 |
-| cluster_2 | 充满艺术气息的写生道具 | 实质 | img_1,4,5,6,7,8,9 |
-| cluster_3 | 清新自然的绿白配色 | 形式 | img_1,4,5,7,8 |
-| cluster_4 | 虚实呼应的画中画结构 | 形式 | img_1,2,3 |
-| cluster_5 | 唯美梦幻的光影氛围 | 形式 | img_2,3,7 |
-| cluster_6 | 巧妙的摄影构图视角 | 形式 | img_4,5,6,9 |
-
----
-
-## 三、特征提取方案
-
-### 3.1 特征维度总览
-
-| # | 维度 | 工具 | 格式 | 对应聚类 |
-|---|------|------|------|---------|
-| 1 | openpose_skeleton | OpenposeDetector | PNG骨架图 | cluster_1, cluster_6 |
-| 2 | depth_map | MidasDetector | PNG灰度深度图 | cluster_4, cluster_5 |
-| 3 | lineart_edge | LineartDetector | PNG线稿图 | cluster_1, cluster_2 |
-| 4 | color_palette | ColorThief | PNG色块+JSON | cluster_3, cluster_2 |
-| 5 | bokeh_mask | 自定义(MiDaS深度归一化) | PNG灰度遮罩 | cluster_4 |
-| 6 | semantic_segmentation | sklearn KMeans(LAB) | PNG彩色分割图 | cluster_1,3,5 |
-| 7 | color_distribution | OpenCV calcHist(HSV) | JSON向量+PNG | cluster_3, cluster_4 |
-
-**总计**:9张图片 × 7维度 = **63个特征文件**
-
-### 3.2 各维度详细说明
-
-#### 维度1:OpenPose 骨架图 (openpose_skeleton)
-
-**工具**:`controlnet_aux.OpenposeDetector` (lllyasviel/ControlNet)  
-**格式**:PNG RGB图像,黑色背景+彩色骨架线,分辨率1080×1439  
-**生成模型用途**:ControlNet OpenPose条件控制,精确控制人物姿态
-
-**对应亮点**:
-- **cluster_1(优雅的白裙画者)**:骨架图直接编码人物站立/跪坐/侧身/背影等姿态,是还原"优雅姿态"的核心控制信号
-- **cluster_6(巧妙的摄影构图视角)**:骨架位置反映人物在画面中的构图位置
-
-**关键形式特征对应**:
-- `人物姿态`(评分0.80~0.95)→ 骨架关键点位置
-- `人物朝向`(评分0.78~0.90)→ 骨架朝向方向
-- `人物动作`(评分0.88~0.94)→ 手臂/手腕关键点
-
-#### 维度2:MiDaS 深度图 (depth_map)
-
-**工具**:`controlnet_aux.MidasDetector` (lllyasviel/Annotators)  
-**格式**:PNG灰度图像,亮=近,暗=远,分辨率1080×1439  
-**生成模型用途**:ControlNet Depth条件控制,控制场景空间层次
-
-**对应亮点**:
-- **cluster_4(虚实呼应的画中画结构)**:深度图区分前景画架/人物与背景草地,支持"画中画"的空间层次还原
-- **cluster_5(唯美梦幻的光影氛围)**:深度梯度反映景深程度,支持大光圈散景效果
-
-**关键形式特征对应**:
-- `画面清晰度`(评分0.60~0.75)→ 深度梯度
-- `前后关系`(评分0.78)→ 深度分层
-
-#### 维度3:Lineart 线稿图 (lineart_edge)
-
-**工具**:`controlnet_aux.LineartDetector` (lllyasviel/Annotators)  
-**格式**:PNG灰度图像(白线黑底),分辨率1080×1439  
-**生成模型用途**:ControlNet Lineart条件控制,控制服装褶皱和画架结构
-
-**对应亮点**:
-- **cluster_1(优雅的白裙画者)**:白裙褶皱轮廓、发型线条是人物形象的核心线稿信息
-- **cluster_2(充满艺术气息的写生道具)**:画架结构、调色板轮廓的精细线稿
-
-**关键形式特征对应**:
-- `服装款式`(评分0.82~0.85)→ 裙摆褶皱线稿
-- `人物完整性`(评分0.65)→ 全身轮廓线稿
-
-#### 维度4:色彩调色板 (color_palette)
-
-**工具**:`colorthief.ColorThief`  
-**格式**:PNG色块图(640×80) + JSON{dominant_color, palette, palette_hex}  
-**生成模型用途**:IP-Adapter颜色参考 / SD色彩条件控制
-
-**对应亮点**:
-- **cluster_3(清新自然的绿白配色)**:调色板精确捕获白色和绿色的具体色值
-- **cluster_2(充满艺术气息的写生道具)**:调色板上的油画颜料颜色
-
-**各图片主色调**:
-
-| 图片 | 主色HEX | 白色比例 | 绿色比例 |
-|------|---------|---------|---------|
-| img_1 | #48623c | 2.4% | 62.8% |
-| img_2 | #8a9c68 | 23.9% | 33.8% |
-| img_3 | #e2ebea | 19.5% | 42.1% |
-| img_4 | #707443 | 13.4% | 30.7% |
-| img_5 | #315b36 | 28.7% | 32.4% |
-| img_6 | #7d9194 | 5.1% | 16.0% |
-| img_7 | #47603b | 2.4% | 41.9% |
-| img_8 | #ceccc9 | 7.1% | 71.2% |
-| img_9 | #e4ebef | 30.7% | 36.5% |
-
-#### 维度5:Bokeh 虚化遮罩 (bokeh_mask)
-
-**工具**:自定义算法(MiDaS深度图归一化)  
-**格式**:PNG灰度图像(0=完全虚化,255=完全清晰),分辨率1080×1439  
-**生成模型用途**:后处理散景合成 / ControlNet Blur条件
-
-**对应亮点**:
-- **cluster_4(虚实呼应的画中画结构)**:遮罩区分清晰的主体区域和虚化的背景区域,直接支持"虚实呼应"效果的还原
-
-**算法说明**:
-1. 读取MiDaS深度图(已在维度2中生成)
-2. 将深度值归一化为[0,1]作为清晰度权重
-3. 高斯平滑(σ=21)消除边缘噪声
-4. 输出为灰度PNG
-
-#### 维度6:语义分割图 (semantic_segmentation)
-
-**工具**:`sklearn.cluster.KMeans`(LAB色彩空间,k=6)  
-**格式**:PNG RGB彩色分割图,固定颜色编码  
-**生成模型用途**:ControlNet Segmentation条件控制
-
-**颜色编码**:
-- 🟤 白色 → 白裙/亮区
-- 🟢 绿色 → 草地/植被
-- 🟫 棕色 → 画架/木质结构
-- 🔵 天蓝 → 天空/远景
-- 🟡 肤色 → 人物皮肤
-- ⚫ 灰色 → 其他
-
-**对应亮点**:
-- **cluster_1(优雅的白裙画者)**:白色区域精确定位白裙范围
-- **cluster_3(清新自然的绿白配色)**:绿色/白色区域比例量化配色
-- **cluster_5(唯美梦幻的光影氛围)**:分割图反映画布区域与现实场景的空间关系
-
-#### 维度7:HSV 色彩分布 (color_distribution)
-
-**工具**:`OpenCV cv2.calcHist`(HSV空间,H:18bins,S:8bins,V:8bins)  
-**格式**:PNG直方图可视化(1200×300) + JSON{hist_h, hist_s, hist_v, white_ratio, green_ratio, mean_brightness, mean_saturation}  
-**生成模型用途**:色彩条件控制向量 / 后处理色调调整参考
-
-**对应亮点**:
-- **cluster_3(清新自然的绿白配色)**:white_ratio和green_ratio量化白绿配色比例
-- **cluster_4(虚实呼应的画中画结构)**:mean_brightness反映整体光照水平
-
-**关键指标说明**:
-- `white_ratio`:S<30且V>200的像素比例(白色判定)
-- `green_ratio`:H∈[35,85]且S>40的像素比例(绿色判定)
-- `mean_brightness`:V通道均值/255(整体亮度)
-- `mean_saturation`:S通道均值/255(整体饱和度)
-
----
-
-## 四、可逆特征空间设计
-
-### 4.1 特征组合策略
-
-对于每张图片,7个特征维度形成完整的控制信号组合:
-
-```
-图片还原 = ControlNet(
-    openpose=骨架图,      # 控制人物姿态
-    depth=深度图,          # 控制空间层次
-    lineart=线稿图,        # 控制轮廓细节
-    seg=分割图,            # 控制区域布局
-    bokeh=虚化遮罩,        # 控制景深效果
-) + IP-Adapter(
-    color_palette=调色板,  # 控制整体色调
-) + Prompt(
-    hsv_stats=色彩分布     # 辅助色彩描述
-)
-```
-
-### 4.2 聚类-特征对应矩阵
-
-| 聚类 | openpose | depth | lineart | color_palette | bokeh | seg | hsv |
-|------|----------|-------|---------|---------------|-------|-----|-----|
-| cluster_1(白裙画者)| ✅主要 | - | ✅主要 | - | - | ✅辅助 | - |
-| cluster_2(写生道具)| - | - | ✅主要 | ✅辅助 | - | - | - |
-| cluster_3(绿白配色)| - | - | - | ✅主要 | - | ✅辅助 | ✅主要 |
-| cluster_4(画中画)| - | ✅主要 | - | - | ✅主要 | - | ✅辅助 |
-| cluster_5(光影氛围)| - | ✅主要 | - | - | - | ✅辅助 | - |
-| cluster_6(构图视角)| ✅主要 | - | - | - | - | - | - |
-
-### 4.3 特征可逆性分析
-
-| 特征维度 | 可逆性 | 说明 |
-|---------|--------|------|
-| openpose_skeleton | ⭐⭐⭐⭐⭐ | ControlNet OpenPose是最成熟的姿态控制方案 |
-| depth_map | ⭐⭐⭐⭐ | ControlNet Depth可精确控制空间层次 |
-| lineart_edge | ⭐⭐⭐⭐⭐ | ControlNet Lineart对轮廓还原度极高 |
-| color_palette | ⭐⭐⭐⭐ | IP-Adapter可有效迁移色调风格 |
-| bokeh_mask | ⭐⭐⭐ | 需后处理合成,依赖深度图质量 |
-| semantic_segmentation | ⭐⭐⭐⭐ | ControlNet Seg可控制区域布局 |
-| color_distribution | ⭐⭐⭐ | 辅助描述,需结合其他特征使用 |
-
----
-
-## 五、文件结构
-
-```
-output/写生油画/features/
-├── overview_mapping.json          # 总览映射(所有维度汇总)
-├── openpose_skeleton/
-│   ├── img_1.png ~ img_9.png     # 骨架图
-│   └── mapping.json              # 维度映射
-├── depth_map/
-│   ├── img_1.png ~ img_9.png     # 深度图
-│   └── mapping.json
-├── lineart_edge/
-│   ├── img_1.png ~ img_9.png     # 线稿图
-│   └── mapping.json
-├── color_palette/
-│   ├── img_1.png ~ img_9.png     # 色块图
-│   ├── img_1.json ~ img_9.json   # 色彩数据
-│   └── mapping.json
-├── bokeh_mask/
-│   ├── img_1.png ~ img_9.png     # 虚化遮罩
-│   └── mapping.json
-├── semantic_segmentation/
-│   ├── img_1.png ~ img_9.png     # 分割图
-│   └── mapping.json
-└── color_distribution/
-    ├── img_1.png ~ img_9.png     # 直方图可视化
-    ├── img_1.json ~ img_9.json   # 分布数据
-    └── mapping.json
-```
-
----
-
-## 六、关键技术决策
-
-1. **OpenPose** 选择原因:人物姿态(站立/跪坐/侧身/背影)是cluster_1和cluster_6的核心,骨架图是生成模型最标准的姿态控制信号,评分最高的形式特征(人物姿态0.80~0.95)直接对应骨架关键点
-
-2. **MiDaS深度图** 选择原因:cluster_4明确提到"虚实呼应"的空间层次,cluster_5强调"唯美梦幻"的景深效果,深度图是ControlNet景深控制的标准输入
-
-3. **Lineart** 选择原因:白裙褶皱轮廓(服装款式评分0.82~0.85)、画架结构是cluster_1和cluster_2的核心视觉元素,线稿图保留了最精细的轮廓信息
-
-4. **ColorThief调色板** 选择原因:cluster_3(白绿配色)和cluster_2(调色板颜料)需要精确的颜色表示,ColorThief的主色提取算法对自然场景色彩最准确
-
-5. **Bokeh Mask** 选择原因:cluster_4专门强调"虚实呼应",需要独立的虚化区域遮罩来量化和还原散景效果,基于深度图生成保证了物理一致性
-
-6. **语义分割** 选择原因:cluster_5(光影氛围)需要区分画布区域与现实场景区域,cluster_3需要量化白色/绿色区域比例,KMeans在LAB空间的聚类对颜色感知最准确
-
-7. **HSV色彩分布** 选择原因:量化白色/绿色比例(cluster_3的核心指标),提供可计算的色彩控制向量,white_ratio和green_ratio是cluster_3"清新自然的绿白配色"的直接量化
-
----
-
-## 七、后续使用指南
-
-### 7.1 读取特征文件
-
-```python
-import json
-from PIL import Image
-
-# 读取总览映射
-with open("output/写生油画/features/overview_mapping.json") as f:
-    overview = json.load(f)
-
-# 读取单张图片的所有特征
-img_name = "img_1"
-img_features = overview["image_overview"][img_name]["features"]
-
-# 加载骨架图
-skeleton = Image.open(img_features["openpose_skeleton"]["file"])
-# 加载深度图
-depth = Image.open(img_features["depth_map"]["file"])
-# 读取色彩分布数据
-hsv_data = img_features["color_distribution"]["json_data"]
-white_ratio = hsv_data["white_ratio"]  # 白色比例
-green_ratio = hsv_data["green_ratio"]  # 绿色比例
-```
-
-### 7.2 ControlNet 生成示例
-
-```python
-# 使用多个ControlNet条件还原图片
-from diffusers import StableDiffusionControlNetPipeline, ControlNetModel
-
-# 加载多个ControlNet
-controlnets = [
-    ControlNetModel.from_pretrained("lllyasviel/sd-controlnet-openpose"),
-    ControlNetModel.from_pretrained("lllyasviel/sd-controlnet-depth"),
-    ControlNetModel.from_pretrained("lllyasviel/sd-controlnet-lineart"),
-]
-
-# 条件图像
-condition_images = [skeleton, depth, lineart]
-
-# 生成
-result = pipe(
-    prompt="a girl in white dress painting outdoors in a green meadow, elegant pose, bokeh background",
-    image=condition_images,
-    controlnet_conditioning_scale=[0.8, 0.6, 0.7],
-)
-```
-
-### 7.3 按聚类查询特征
-
-```python
-# 查询 cluster_3(绿白配色)涉及的图片和对应特征
-cluster_info = overview["cluster_overview"]["cluster_3"]
-for img_name in cluster_info["图片列表"]:
-    img_data = overview["image_overview"][img_name]
-    hsv = img_data["hsv_summary"]
-    print(f"{img_name}: 白={hsv['white_ratio']:.1%}, 绿={hsv['green_ratio']:.1%}")
-```

+ 0 - 1629
examples/find knowledge/overview_mapping.json

@@ -1,1629 +0,0 @@
-{
-  "post_name": "写生油画",
-  "total_images": 9,
-  "total_features": 7,
-  "feature_dimensions": [
-    "openpose_skeleton",
-    "depth_map",
-    "lineart_edge",
-    "color_palette",
-    "bokeh_mask",
-    "semantic_segmentation",
-    "color_distribution"
-  ],
-  "cluster_overview": {
-    "cluster_1": {
-      "聚类主题": "优雅的白裙画者",
-      "亮点类型": "实质",
-      "图片数量": 9,
-      "图片列表": [
-        "img_1",
-        "img_2",
-        "img_3",
-        "img_4",
-        "img_5",
-        "img_6",
-        "img_7",
-        "img_8",
-        "img_9"
-      ],
-      "对应特征维度": [
-        "openpose_skeleton",
-        "lineart_edge",
-        "semantic_segmentation"
-      ]
-    },
-    "cluster_2": {
-      "聚类主题": "充满艺术气息的写生道具",
-      "亮点类型": "实质",
-      "图片数量": 7,
-      "图片列表": [
-        "img_1",
-        "img_4",
-        "img_5",
-        "img_6",
-        "img_7",
-        "img_8",
-        "img_9"
-      ],
-      "对应特征维度": [
-        "lineart_edge",
-        "color_palette"
-      ]
-    },
-    "cluster_3": {
-      "聚类主题": "清新自然的绿白配色",
-      "亮点类型": "形式",
-      "图片数量": 5,
-      "图片列表": [
-        "img_1",
-        "img_4",
-        "img_5",
-        "img_7",
-        "img_8"
-      ],
-      "对应特征维度": [
-        "color_palette",
-        "semantic_segmentation",
-        "color_distribution"
-      ]
-    },
-    "cluster_4": {
-      "聚类主题": "虚实呼应的画中画结构",
-      "亮点类型": "形式",
-      "图片数量": 3,
-      "图片列表": [
-        "img_1",
-        "img_2",
-        "img_3"
-      ],
-      "对应特征维度": [
-        "depth_map",
-        "bokeh_mask",
-        "color_distribution"
-      ]
-    },
-    "cluster_5": {
-      "聚类主题": "唯美梦幻的光影氛围",
-      "亮点类型": "形式",
-      "图片数量": 3,
-      "图片列表": [
-        "img_2",
-        "img_3",
-        "img_7"
-      ],
-      "对应特征维度": [
-        "depth_map",
-        "semantic_segmentation"
-      ]
-    },
-    "cluster_6": {
-      "聚类主题": "巧妙的摄影构图视角",
-      "亮点类型": "形式",
-      "图片数量": 4,
-      "图片列表": [
-        "img_4",
-        "img_5",
-        "img_6",
-        "img_9"
-      ],
-      "对应特征维度": [
-        "openpose_skeleton"
-      ]
-    }
-  },
-  "image_overview": {
-    "img_1": {
-      "active_clusters": {
-        "cluster_1": {
-          "聚类主题": "优雅的白裙画者",
-          "亮点类型": "实质",
-          "合并结论": "优雅的白裙侧背影"
-        },
-        "cluster_2": {
-          "聚类主题": "充满艺术气息的写生道具",
-          "亮点类型": "实质",
-          "合并结论": "充满艺术气息的写生道具"
-        },
-        "cluster_3": {
-          "聚类主题": "清新自然的绿白配色",
-          "亮点类型": "形式",
-          "合并结论": "清新治愈的绿白配色"
-        },
-        "cluster_4": {
-          "聚类主题": "虚实呼应的画中画结构",
-          "亮点类型": "形式",
-          "合并结论": "虚实呼应的画中画结构"
-        }
-      },
-      "features": {
-        "openpose_skeleton": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_1.png",
-          "exists": true
-        },
-        "depth_map": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_1.png",
-          "exists": true
-        },
-        "lineart_edge": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_1.png",
-          "exists": true
-        },
-        "color_palette": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_1.png",
-          "exists": true,
-          "json_data": {
-            "dominant_color": [
-              70,
-              95,
-              62
-            ],
-            "palette": [
-              [
-                72,
-                98,
-                60
-              ],
-              [
-                150,
-                172,
-                181
-              ],
-              [
-                193,
-                201,
-                206
-              ],
-              [
-                147,
-                146,
-                132
-              ],
-              [
-                24,
-                30,
-                24
-              ],
-              [
-                101,
-                133,
-                133
-              ],
-              [
-                147,
-                182,
-                140
-              ]
-            ],
-            "palette_hex": [
-              "#48623c",
-              "#96acb5",
-              "#c1c9ce",
-              "#939284",
-              "#181e18",
-              "#658585",
-              "#93b68c"
-            ]
-          }
-        },
-        "bokeh_mask": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_1.png",
-          "exists": true
-        },
-        "semantic_segmentation": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_1.png",
-          "exists": true
-        },
-        "color_distribution": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_1.png",
-          "exists": true,
-          "json_data": {
-            "hist_h": [
-              0.02299436368048191,
-              0.045076314359903336,
-              0.011987491510808468,
-              0.013310426846146584,
-              0.21862855553627014,
-              0.25030627846717834,
-              0.1314917802810669,
-              0.0352347306907177,
-              0.02485457994043827,
-              0.11076493561267853,
-              0.12063290178775787,
-              0.005362520460039377,
-              0.002378838136792183,
-              0.0013802022440358996,
-              0.0007515507168136537,
-              0.0009613157017156482,
-              0.0014381129294633865,
-              0.0024451136123389006
-            ],
-            "hist_s": [
-              0.09791071712970734,
-              0.23805883526802063,
-              0.23730599880218506,
-              0.33129745721817017,
-              0.08900406956672668,
-              0.006134661380201578,
-              0.0002496589731890708,
-              3.860705692204647e-05
-            ],
-            "hist_v": [
-              0.025200756266713142,
-              0.17062132060527802,
-              0.1783987134695053,
-              0.13612976670265198,
-              0.24666756391525269,
-              0.14068475365638733,
-              0.07682546973228455,
-              0.025471650063991547
-            ],
-            "white_ratio": 0.0239,
-            "green_ratio": 0.6277,
-            "mean_brightness": 0.4702,
-            "mean_saturation": 0.3217,
-            "h_bins": 18,
-            "s_bins": 8,
-            "v_bins": 8
-          }
-        }
-      },
-      "hsv_summary": {
-        "white_ratio": 0.0239,
-        "green_ratio": 0.6277,
-        "mean_brightness": 0.4702,
-        "mean_saturation": 0.3217
-      }
-    },
-    "img_2": {
-      "active_clusters": {
-        "cluster_1": {
-          "聚类主题": "优雅的白裙画者",
-          "亮点类型": "实质",
-          "合并结论": "优雅的白裙背影"
-        },
-        "cluster_4": {
-          "聚类主题": "虚实呼应的画中画结构",
-          "亮点类型": "形式",
-          "合并结论": "虚实呼应的叙事构图"
-        },
-        "cluster_5": {
-          "聚类主题": "唯美梦幻的光影氛围",
-          "亮点类型": "形式",
-          "合并结论": "柔美的逆光氛围"
-        }
-      },
-      "features": {
-        "openpose_skeleton": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_2.png",
-          "exists": true
-        },
-        "depth_map": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_2.png",
-          "exists": true
-        },
-        "lineart_edge": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_2.png",
-          "exists": true
-        },
-        "color_palette": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_2.png",
-          "exists": true,
-          "json_data": {
-            "dominant_color": [
-              138,
-              156,
-              105
-            ],
-            "palette": [
-              [
-                138,
-                156,
-                104
-              ],
-              [
-                219,
-                227,
-                227
-              ],
-              [
-                75,
-                69,
-                55
-              ],
-              [
-                209,
-                194,
-                154
-              ],
-              [
-                72,
-                95,
-                77
-              ],
-              [
-                111,
-                171,
-                189
-              ],
-              [
-                182,
-                212,
-                170
-              ]
-            ],
-            "palette_hex": [
-              "#8a9c68",
-              "#dbe3e3",
-              "#4b4537",
-              "#d1c29a",
-              "#485f4d",
-              "#6fabbd",
-              "#b6d4aa"
-            ]
-          }
-        },
-        "bokeh_mask": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_2.png",
-          "exists": true
-        },
-        "semantic_segmentation": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_2.png",
-          "exists": true
-        },
-        "color_distribution": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_2.png",
-          "exists": true,
-          "json_data": {
-            "hist_h": [
-              0.0732845589518547,
-              0.15593840181827545,
-              0.12949064373970032,
-              0.12419310957193375,
-              0.23567485809326172,
-              0.03178519010543823,
-              0.03388284146785736,
-              0.010717319324612617,
-              0.01433801744133234,
-              0.10481687635183334,
-              0.07486487179994583,
-              0.002149126259610057,
-              0.0011041618417948484,
-              0.0023498828522861004,
-              0.0006904228939674795,
-              0.0003197951300535351,
-              0.003116233041509986,
-              0.0012836846290156245
-            ],
-            "hist_s": [
-              0.28900665044784546,
-              0.2196548581123352,
-              0.2457796037197113,
-              0.18217319250106812,
-              0.05714680999517441,
-              0.004347797948867083,
-              0.0018428434850648046,
-              4.8258822062052786e-05
-            ],
-            "hist_v": [
-              0.0,
-              0.01885053887963295,
-              0.12125833332538605,
-              0.09530602395534515,
-              0.10405567288398743,
-              0.2533491551876068,
-              0.15230870246887207,
-              0.25487157702445984
-            ],
-            "white_ratio": 0.2392,
-            "green_ratio": 0.3379,
-            "mean_brightness": 0.6831,
-            "mean_saturation": 0.2485,
-            "h_bins": 18,
-            "s_bins": 8,
-            "v_bins": 8
-          }
-        }
-      },
-      "hsv_summary": {
-        "white_ratio": 0.2392,
-        "green_ratio": 0.3379,
-        "mean_brightness": 0.6831,
-        "mean_saturation": 0.2485
-      }
-    },
-    "img_3": {
-      "active_clusters": {
-        "cluster_1": {
-          "聚类主题": "优雅的白裙画者",
-          "亮点类型": "实质",
-          "合并结论": "纯净优雅的白裙背影"
-        },
-        "cluster_4": {
-          "聚类主题": "虚实呼应的画中画结构",
-          "亮点类型": "形式",
-          "合并结论": "虚实呼应的画中画构图"
-        },
-        "cluster_5": {
-          "聚类主题": "唯美梦幻的光影氛围",
-          "亮点类型": "形式",
-          "合并结论": "梦幻森系的自然光影"
-        }
-      },
-      "features": {
-        "openpose_skeleton": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_3.png",
-          "exists": true
-        },
-        "depth_map": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_3.png",
-          "exists": true
-        },
-        "lineart_edge": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_3.png",
-          "exists": true
-        },
-        "color_palette": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_3.png",
-          "exists": true,
-          "json_data": {
-            "dominant_color": [
-              129,
-              149,
-              88
-            ],
-            "palette": [
-              [
-                226,
-                235,
-                234
-              ],
-              [
-                126,
-                145,
-                86
-              ],
-              [
-                78,
-                74,
-                55
-              ],
-              [
-                210,
-                200,
-                155
-              ],
-              [
-                144,
-                169,
-                158
-              ],
-              [
-                171,
-                205,
-                110
-              ],
-              [
-                66,
-                97,
-                55
-              ]
-            ],
-            "palette_hex": [
-              "#e2ebea",
-              "#7e9156",
-              "#4e4a37",
-              "#d2c89b",
-              "#90a99e",
-              "#abcd6e",
-              "#426137"
-            ]
-          }
-        },
-        "bokeh_mask": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_3.png",
-          "exists": true
-        },
-        "semantic_segmentation": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_3.png",
-          "exists": true
-        },
-        "color_distribution": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_3.png",
-          "exists": true,
-          "json_data": {
-            "hist_h": [
-              0.08796747028827667,
-              0.07544205337762833,
-              0.14689534902572632,
-              0.12777456641197205,
-              0.3085463047027588,
-              0.0542680099606514,
-              0.022549094632267952,
-              0.014717653393745422,
-              0.011737189255654812,
-              0.08198659121990204,
-              0.05702970176935196,
-              0.0014998841797932982,
-              0.003399351378902793,
-              0.0004800144233740866,
-              0.0002187733189202845,
-              0.0010964404791593552,
-              0.0006859187269583344,
-              0.0037056340370327234
-            ],
-            "hist_s": [
-              0.22554758191108704,
-              0.21504710614681244,
-              0.20258988440036774,
-              0.20314133167266846,
-              0.1272115409374237,
-              0.023029109463095665,
-              0.003271948080509901,
-              0.00016150619194377214
-            ],
-            "hist_v": [
-              0.0,
-              0.006298741325736046,
-              0.07633130252361298,
-              0.1305510550737381,
-              0.1652330607175827,
-              0.20487864315509796,
-              0.15114469826221466,
-              0.265562504529953
-            ],
-            "white_ratio": 0.1947,
-            "green_ratio": 0.4209,
-            "mean_brightness": 0.6935,
-            "mean_saturation": 0.2881,
-            "h_bins": 18,
-            "s_bins": 8,
-            "v_bins": 8
-          }
-        }
-      },
-      "hsv_summary": {
-        "white_ratio": 0.1947,
-        "green_ratio": 0.4209,
-        "mean_brightness": 0.6935,
-        "mean_saturation": 0.2881
-      }
-    },
-    "img_4": {
-      "active_clusters": {
-        "cluster_1": {
-          "聚类主题": "优雅的白裙画者",
-          "亮点类型": "实质",
-          "合并结论": "纯净的白裙画者形象"
-        },
-        "cluster_2": {
-          "聚类主题": "充满艺术气息的写生道具",
-          "亮点类型": "实质",
-          "合并结论": "充满艺术感的写生道具"
-        },
-        "cluster_3": {
-          "聚类主题": "清新自然的绿白配色",
-          "亮点类型": "形式",
-          "合并结论": "清新自然的绿白配色"
-        },
-        "cluster_6": {
-          "聚类主题": "巧妙的摄影构图视角",
-          "亮点类型": "形式",
-          "合并结论": "均衡的左右呼应构图"
-        }
-      },
-      "features": {
-        "openpose_skeleton": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_4.png",
-          "exists": true
-        },
-        "depth_map": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_4.png",
-          "exists": true
-        },
-        "lineart_edge": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_4.png",
-          "exists": true
-        },
-        "color_palette": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_4.png",
-          "exists": true,
-          "json_data": {
-            "dominant_color": [
-              116,
-              118,
-              72
-            ],
-            "palette": [
-              [
-                112,
-                116,
-                67
-              ],
-              [
-                216,
-                213,
-                203
-              ],
-              [
-                181,
-                196,
-                191
-              ],
-              [
-                161,
-                151,
-                129
-              ],
-              [
-                158,
-                169,
-                175
-              ],
-              [
-                35,
-                46,
-                31
-              ],
-              [
-                60,
-                47,
-                34
-              ]
-            ],
-            "palette_hex": [
-              "#707443",
-              "#d8d5cb",
-              "#b5c4bf",
-              "#a19781",
-              "#9ea9af",
-              "#232e1f",
-              "#3c2f22"
-            ]
-          }
-        },
-        "bokeh_mask": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_4.png",
-          "exists": true
-        },
-        "semantic_segmentation": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_4.png",
-          "exists": true
-        },
-        "color_distribution": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_4.png",
-          "exists": true,
-          "json_data": {
-            "hist_h": [
-              0.021759580820798874,
-              0.14858633279800415,
-              0.21194759011268616,
-              0.2254870980978012,
-              0.2172277569770813,
-              0.009835791774094105,
-              0.007799269165843725,
-              0.010793889872729778,
-              0.02440738119184971,
-              0.07726301997900009,
-              0.03628162667155266,
-              0.0028279670514166355,
-              0.0010674850782379508,
-              0.000593261793255806,
-              0.00036226288648322225,
-              0.0005269863177090883,
-              0.0009741847752593458,
-              0.0022585128899663687
-            ],
-            "hist_s": [
-              0.17237728834152222,
-              0.09118407964706421,
-              0.1611233353614807,
-              0.3682836592197418,
-              0.15807917714118958,
-              0.03790698200464249,
-              0.009977350942790508,
-              0.00106812862213701
-            ],
-            "hist_v": [
-              0.005347077269107103,
-              0.039011143147945404,
-              0.10711270570755005,
-              0.2906358540058136,
-              0.2130337357521057,
-              0.13399480283260345,
-              0.10851671546697617,
-              0.1023479551076889
-            ],
-            "white_ratio": 0.1343,
-            "green_ratio": 0.3067,
-            "mean_brightness": 0.5639,
-            "mean_saturation": 0.3606,
-            "h_bins": 18,
-            "s_bins": 8,
-            "v_bins": 8
-          }
-        }
-      },
-      "hsv_summary": {
-        "white_ratio": 0.1343,
-        "green_ratio": 0.3067,
-        "mean_brightness": 0.5639,
-        "mean_saturation": 0.3606
-      }
-    },
-    "img_5": {
-      "active_clusters": {
-        "cluster_1": {
-          "聚类主题": "优雅的白裙画者",
-          "亮点类型": "实质",
-          "合并结论": "洁白柔顺的衣物褶皱"
-        },
-        "cluster_2": {
-          "聚类主题": "充满艺术气息的写生道具",
-          "亮点类型": "实质",
-          "合并结论": "斑斓厚重的油彩肌理"
-        },
-        "cluster_3": {
-          "聚类主题": "清新自然的绿白配色",
-          "亮点类型": "形式",
-          "合并结论": "清新高雅的色彩构成"
-        },
-        "cluster_6": {
-          "聚类主题": "巧妙的摄影构图视角",
-          "亮点类型": "形式",
-          "合并结论": "突出动作的局部构图"
-        }
-      },
-      "features": {
-        "openpose_skeleton": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_5.png",
-          "exists": true
-        },
-        "depth_map": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_5.png",
-          "exists": true
-        },
-        "lineart_edge": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_5.png",
-          "exists": true
-        },
-        "color_palette": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_5.png",
-          "exists": true,
-          "json_data": {
-            "dominant_color": [
-              49,
-              91,
-              54
-            ],
-            "palette": [
-              [
-                49,
-                91,
-                54
-              ],
-              [
-                209,
-                214,
-                216
-              ],
-              [
-                104,
-                75,
-                64
-              ],
-              [
-                118,
-                120,
-                71
-              ],
-              [
-                108,
-                147,
-                169
-              ],
-              [
-                163,
-                137,
-                133
-              ],
-              [
-                37,
-                190,
-                206
-              ]
-            ],
-            "palette_hex": [
-              "#315b36",
-              "#d1d6d8",
-              "#684b40",
-              "#767847",
-              "#6c93a9",
-              "#a38985",
-              "#25bece"
-            ]
-          }
-        },
-        "bokeh_mask": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_5.png",
-          "exists": true
-        },
-        "semantic_segmentation": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_5.png",
-          "exists": true
-        },
-        "color_distribution": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_5.png",
-          "exists": true,
-          "json_data": {
-            "hist_h": [
-              0.06531541794538498,
-              0.09025493264198303,
-              0.014375980943441391,
-              0.011843358166515827,
-              0.12692134082317352,
-              0.15304480493068695,
-              0.014180372469127178,
-              0.024089517071843147,
-              0.06461405754089355,
-              0.11568476259708405,
-              0.20321017503738403,
-              0.044057730585336685,
-              0.016082413494586945,
-              0.010450930334627628,
-              0.004185648635029793,
-              0.006949913688004017,
-              0.015166782774031162,
-              0.019571848213672638
-            ],
-            "hist_s": [
-              0.3696361780166626,
-              0.1519850492477417,
-              0.05476089194417,
-              0.10194257646799088,
-              0.17193330824375153,
-              0.104984812438488,
-              0.03291315957903862,
-              0.011844001710414886
-            ],
-            "hist_v": [
-              0.011543510481715202,
-              0.01847798191010952,
-              0.18232890963554382,
-              0.1763029843568802,
-              0.05641070008277893,
-              0.07998481392860413,
-              0.20172573626041412,
-              0.2732253670692444
-            ],
-            "white_ratio": 0.2872,
-            "green_ratio": 0.3239,
-            "mean_brightness": 0.6478,
-            "mean_saturation": 0.3156,
-            "h_bins": 18,
-            "s_bins": 8,
-            "v_bins": 8
-          }
-        }
-      },
-      "hsv_summary": {
-        "white_ratio": 0.2872,
-        "green_ratio": 0.3239,
-        "mean_brightness": 0.6478,
-        "mean_saturation": 0.3156
-      }
-    },
-    "img_6": {
-      "active_clusters": {
-        "cluster_1": {
-          "聚类主题": "优雅的白裙画者",
-          "亮点类型": "实质",
-          "合并结论": "精致的侧颜与配饰"
-        },
-        "cluster_2": {
-          "聚类主题": "充满艺术气息的写生道具",
-          "亮点类型": "实质",
-          "合并结论": "高对比的斑斓调色盘"
-        },
-        "cluster_6": {
-          "聚类主题": "巧妙的摄影构图视角",
-          "亮点类型": "形式",
-          "合并结论": "沉浸式的过肩构图"
-        }
-      },
-      "features": {
-        "openpose_skeleton": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_6.png",
-          "exists": true
-        },
-        "depth_map": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_6.png",
-          "exists": true
-        },
-        "lineart_edge": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_6.png",
-          "exists": true
-        },
-        "color_palette": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_6.png",
-          "exists": true,
-          "json_data": {
-            "dominant_color": [
-              104,
-              143,
-              148
-            ],
-            "palette": [
-              [
-                125,
-                145,
-                148
-              ],
-              [
-                202,
-                204,
-                212
-              ],
-              [
-                47,
-                47,
-                38
-              ],
-              [
-                27,
-                134,
-                147
-              ],
-              [
-                153,
-                189,
-                218
-              ],
-              [
-                72,
-                62,
-                75
-              ],
-              [
-                168,
-                204,
-                201
-              ]
-            ],
-            "palette_hex": [
-              "#7d9194",
-              "#caccd4",
-              "#2f2f26",
-              "#1b8693",
-              "#99bdda",
-              "#483e4b",
-              "#a8ccc9"
-            ]
-          }
-        },
-        "bokeh_mask": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_6.png",
-          "exists": true
-        },
-        "semantic_segmentation": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_6.png",
-          "exists": true
-        },
-        "color_distribution": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_6.png",
-          "exists": true,
-          "json_data": {
-            "hist_h": [
-              0.1566610038280487,
-              0.04552222415804863,
-              0.011773865669965744,
-              0.021885696798563004,
-              0.046773094683885574,
-              0.0223541297018528,
-              0.03028852306306362,
-              0.03333976864814758,
-              0.05309435725212097,
-              0.1629861295223236,
-              0.3142968416213989,
-              0.018021130934357643,
-              0.006420996971428394,
-              0.0047917794436216354,
-              0.0050942013040184975,
-              0.01143412385135889,
-              0.020818213000893593,
-              0.0344439297914505
-            ],
-            "hist_s": [
-              0.130146324634552,
-              0.3402388393878937,
-              0.22351619601249695,
-              0.09706779569387436,
-              0.07324466854333878,
-              0.04026523232460022,
-              0.04923300817608833,
-              0.04628793150186539
-            ],
-            "hist_v": [
-              0.020250044763088226,
-              0.11473309993743896,
-              0.055246055126190186,
-              0.05642228573560715,
-              0.21779786050319672,
-              0.23236235976219177,
-              0.18257728219032288,
-              0.12061101943254471
-            ],
-            "white_ratio": 0.0506,
-            "green_ratio": 0.1604,
-            "mean_brightness": 0.6068,
-            "mean_saturation": 0.3338,
-            "h_bins": 18,
-            "s_bins": 8,
-            "v_bins": 8
-          }
-        }
-      },
-      "hsv_summary": {
-        "white_ratio": 0.0506,
-        "green_ratio": 0.1604,
-        "mean_brightness": 0.6068,
-        "mean_saturation": 0.3338
-      }
-    },
-    "img_7": {
-      "active_clusters": {
-        "cluster_1": {
-          "聚类主题": "优雅的白裙画者",
-          "亮点类型": "实质",
-          "合并结论": "恬静柔美的侧颜特写"
-        },
-        "cluster_2": {
-          "聚类主题": "充满艺术气息的写生道具",
-          "亮点类型": "实质",
-          "合并结论": "洁白玫瑰的互动点缀"
-        },
-        "cluster_3": {
-          "聚类主题": "清新自然的绿白配色",
-          "亮点类型": "形式",
-          "合并结论": "清新的白绿配色调"
-        },
-        "cluster_5": {
-          "聚类主题": "唯美梦幻的光影氛围",
-          "亮点类型": "形式",
-          "合并结论": "充满空气感的柔光氛围"
-        }
-      },
-      "features": {
-        "openpose_skeleton": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_7.png",
-          "exists": true
-        },
-        "depth_map": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_7.png",
-          "exists": true
-        },
-        "lineart_edge": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_7.png",
-          "exists": true
-        },
-        "color_palette": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_7.png",
-          "exists": true,
-          "json_data": {
-            "dominant_color": [
-              83,
-              101,
-              72
-            ],
-            "palette": [
-              [
-                71,
-                96,
-                59
-              ],
-              [
-                171,
-                189,
-                204
-              ],
-              [
-                133,
-                151,
-                169
-              ],
-              [
-                31,
-                27,
-                27
-              ],
-              [
-                129,
-                122,
-                125
-              ],
-              [
-                159,
-                139,
-                141
-              ],
-              [
-                120,
-                100,
-                94
-              ]
-            ],
-            "palette_hex": [
-              "#47603b",
-              "#abbdcc",
-              "#8597a9",
-              "#1f1b1b",
-              "#817a7d",
-              "#9f8b8d",
-              "#78645e"
-            ]
-          }
-        },
-        "bokeh_mask": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_7.png",
-          "exists": true
-        },
-        "semantic_segmentation": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_7.png",
-          "exists": true
-        },
-        "color_distribution": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_7.png",
-          "exists": true,
-          "json_data": {
-            "hist_h": [
-              0.07843989133834839,
-              0.10234537720680237,
-              0.015606259927153587,
-              0.0037384501192718744,
-              0.16384771466255188,
-              0.21072953939437866,
-              0.022516923025250435,
-              0.020746145397424698,
-              0.010117623023688793,
-              0.011814403347671032,
-              0.1484299749135971,
-              0.046803977340459824,
-              0.01757650636136532,
-              0.014380485750734806,
-              0.014578024856746197,
-              0.0272745992988348,
-              0.03201361373066902,
-              0.05904048681259155
-            ],
-            "hist_s": [
-              0.17181169986724854,
-              0.1873188614845276,
-              0.18251743912696838,
-              0.37122422456741333,
-              0.08246918022632599,
-              0.00416184077039361,
-              0.00048580547445453703,
-              1.0938666491711047e-05
-            ],
-            "hist_v": [
-              0.0927245020866394,
-              0.09700087457895279,
-              0.13095127046108246,
-              0.36870384216308594,
-              0.11066005378961563,
-              0.08380112051963806,
-              0.11162008345127106,
-              0.004538259468972683
-            ],
-            "white_ratio": 0.0235,
-            "green_ratio": 0.4193,
-            "mean_brightness": 0.4381,
-            "mean_saturation": 0.3139,
-            "h_bins": 18,
-            "s_bins": 8,
-            "v_bins": 8
-          }
-        }
-      },
-      "hsv_summary": {
-        "white_ratio": 0.0235,
-        "green_ratio": 0.4193,
-        "mean_brightness": 0.4381,
-        "mean_saturation": 0.3139
-      }
-    },
-    "img_8": {
-      "active_clusters": {
-        "cluster_1": {
-          "聚类主题": "优雅的白裙画者",
-          "亮点类型": "实质",
-          "合并结论": "优雅的写生人物"
-        },
-        "cluster_2": {
-          "聚类主题": "充满艺术气息的写生道具",
-          "亮点类型": "实质",
-          "合并结论": "木质画架与调色盘"
-        },
-        "cluster_3": {
-          "聚类主题": "清新自然的绿白配色",
-          "亮点类型": "形式",
-          "合并结论": "清新的绿白配色"
-        }
-      },
-      "features": {
-        "openpose_skeleton": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_8.png",
-          "exists": true
-        },
-        "depth_map": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_8.png",
-          "exists": true
-        },
-        "lineart_edge": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_8.png",
-          "exists": true
-        },
-        "color_palette": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_8.png",
-          "exists": true,
-          "json_data": {
-            "dominant_color": [
-              47,
-              62,
-              44
-            ],
-            "palette": [
-              [
-                206,
-                204,
-                201
-              ],
-              [
-                44,
-                60,
-                42
-              ],
-              [
-                94,
-                139,
-                90
-              ],
-              [
-                131,
-                183,
-                185
-              ],
-              [
-                110,
-                149,
-                166
-              ],
-              [
-                121,
-                103,
-                88
-              ],
-              [
-                86,
-                104,
-                112
-              ]
-            ],
-            "palette_hex": [
-              "#ceccc9",
-              "#2c3c2a",
-              "#5e8b5a",
-              "#83b7b9",
-              "#6e95a6",
-              "#796758",
-              "#566870"
-            ]
-          }
-        },
-        "bokeh_mask": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_8.png",
-          "exists": true
-        },
-        "semantic_segmentation": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_8.png",
-          "exists": true
-        },
-        "color_distribution": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_8.png",
-          "exists": true,
-          "json_data": {
-            "hist_h": [
-              0.016288960352540016,
-              0.05812549963593483,
-              0.028123311698436737,
-              0.03650747612118721,
-              0.08802022784948349,
-              0.3297860026359558,
-              0.1963168829679489,
-              0.07496525347232819,
-              0.027654234319925308,
-              0.04496306553483009,
-              0.08410611748695374,
-              0.005293027497828007,
-              0.00219545466825366,
-              0.0010121483355760574,
-              0.0006923532346263528,
-              0.0009973490377888083,
-              0.0018737291684374213,
-              0.003078912850469351
-            ],
-            "hist_s": [
-              0.10442758351564407,
-              0.14612577855587006,
-              0.3257077932357788,
-              0.283027708530426,
-              0.10212274640798569,
-              0.030628908425569534,
-              0.006496280897408724,
-              0.0014632074162364006
-            ],
-            "hist_v": [
-              0.09568823873996735,
-              0.23660850524902344,
-              0.241120383143425,
-              0.10031850636005402,
-              0.18116876482963562,
-              0.026423312723636627,
-              0.05741770192980766,
-              0.061254601925611496
-            ],
-            "white_ratio": 0.0714,
-            "green_ratio": 0.7117,
-            "mean_brightness": 0.3933,
-            "mean_saturation": 0.3447,
-            "h_bins": 18,
-            "s_bins": 8,
-            "v_bins": 8
-          }
-        }
-      },
-      "hsv_summary": {
-        "white_ratio": 0.0714,
-        "green_ratio": 0.7117,
-        "mean_brightness": 0.3933,
-        "mean_saturation": 0.3447
-      }
-    },
-    "img_9": {
-      "active_clusters": {
-        "cluster_1": {
-          "聚类主题": "优雅的白裙画者",
-          "亮点类型": "实质",
-          "合并结论": "一袭白裙的优雅背影"
-        },
-        "cluster_2": {
-          "聚类主题": "充满艺术气息的写生道具",
-          "亮点类型": "实质",
-          "合并结论": "伫立草坪的木质画架"
-        },
-        "cluster_6": {
-          "聚类主题": "巧妙的摄影构图视角",
-          "亮点类型": "形式",
-          "合并结论": "自然垂落的树枝框景"
-        }
-      },
-      "features": {
-        "openpose_skeleton": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_9.png",
-          "exists": true
-        },
-        "depth_map": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_9.png",
-          "exists": true
-        },
-        "lineart_edge": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_9.png",
-          "exists": true
-        },
-        "color_palette": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_9.png",
-          "exists": true,
-          "json_data": {
-            "dominant_color": [
-              119,
-              139,
-              81
-            ],
-            "palette": [
-              [
-                228,
-                235,
-                239
-              ],
-              [
-                120,
-                140,
-                81
-              ],
-              [
-                213,
-                206,
-                152
-              ],
-              [
-                50,
-                53,
-                37
-              ],
-              [
-                160,
-                176,
-                162
-              ],
-              [
-                47,
-                87,
-                70
-              ],
-              [
-                180,
-                204,
-                117
-              ]
-            ],
-            "palette_hex": [
-              "#e4ebef",
-              "#788c51",
-              "#d5ce98",
-              "#323525",
-              "#a0b0a2",
-              "#2f5746",
-              "#b4cc75"
-            ]
-          }
-        },
-        "bokeh_mask": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_9.png",
-          "exists": true
-        },
-        "semantic_segmentation": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_9.png",
-          "exists": true
-        },
-        "color_distribution": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_9.png",
-          "exists": true,
-          "json_data": {
-            "hist_h": [
-              0.012288626283407211,
-              0.04225928336381912,
-              0.09236609935760498,
-              0.1584002524614334,
-              0.24352367222309113,
-              0.04621071740984917,
-              0.02858530916273594,
-              0.028737805783748627,
-              0.024914421141147614,
-              0.06194116175174713,
-              0.052537769079208374,
-              0.004524746909737587,
-              0.005542686674743891,
-              0.1909305602312088,
-              0.0033851955085992813,
-              0.0011099529219791293,
-              0.001967029646039009,
-              0.0007747149793431163
-            ],
-            "hist_s": [
-              0.3372262120246887,
-              0.15812550485134125,
-              0.1551109254360199,
-              0.21685005724430084,
-              0.10838223248720169,
-              0.02103441208600998,
-              0.0029714566189795732,
-              0.00029920469387434423
-            ],
-            "hist_v": [
-              0.0014799372293055058,
-              0.03709237277507782,
-              0.06861117482185364,
-              0.10374681651592255,
-              0.1604354828596115,
-              0.18214423954486847,
-              0.11757586151361465,
-              0.3289141058921814
-            ],
-            "white_ratio": 0.307,
-            "green_ratio": 0.3654,
-            "mean_brightness": 0.7022,
-            "mean_saturation": 0.2595,
-            "h_bins": 18,
-            "s_bins": 8,
-            "v_bins": 8
-          }
-        }
-      },
-      "hsv_summary": {
-        "white_ratio": 0.307,
-        "green_ratio": 0.3654,
-        "mean_brightness": 0.7022,
-        "mean_saturation": 0.2595
-      }
-    }
-  },
-  "feature_dimension_details": {
-    "openpose_skeleton": {
-      "名称": "OpenPose 人体骨架图",
-      "描述": "使用 lllyasviel/ControlNet OpenposeDetector 提取的人体关键点骨架图,包含身体18个关键点(头部、肩膀、肘部、手腕、髋部、膝盖、脚踝等)",
-      "工具": "controlnet_aux.OpenposeDetector (lllyasviel/ControlNet)",
-      "格式": "PNG RGB图像,黑色背景+彩色骨架线",
-      "生成模型用途": "ControlNet OpenPose条件控制 - 精确控制人物姿态、站立/跪坐/侧身/背影等",
-      "对应亮点": [
-        "cluster_1",
-        "cluster_6"
-      ]
-    },
-    "depth_map": {
-      "名称": "MiDaS 深度图",
-      "描述": "使用 lllyasviel/Annotators MidasDetector 提取的单目深度估计图,灰度值表示相对深度(亮=近,暗=远)",
-      "工具": "controlnet_aux.MidasDetector (lllyasviel/Annotators)",
-      "格式": "PNG 灰度图像",
-      "生成模型用途": "ControlNet Depth条件控制 - 控制场景空间层次、前景/背景分离、景深效果",
-      "对应亮点": [
-        "cluster_4",
-        "cluster_5"
-      ]
-    },
-    "lineart_edge": {
-      "名称": "Lineart 线稿图",
-      "描述": "使用 lllyasviel/Annotators LineartDetector 提取的精细线稿,保留服装褶皱、画架结构、人物轮廓等细节",
-      "工具": "controlnet_aux.LineartDetector (lllyasviel/Annotators)",
-      "格式": "PNG 灰度图像(白线黑底)",
-      "生成模型用途": "ControlNet Lineart条件控制 - 控制服装褶皱、画架结构、整体构图轮廓",
-      "对应亮点": [
-        "cluster_1",
-        "cluster_2"
-      ]
-    },
-    "color_palette": {
-      "名称": "ColorThief 色彩调色板",
-      "描述": "使用 ColorThief 从图片提取的主色调和8色调色板,以RGB色块图和JSON格式存储",
-      "工具": "colorthief.ColorThief",
-      "格式": "PNG 色块图 (640×80) + JSON {dominant_color, palette, palette_hex}",
-      "生成模型用途": "Stable Diffusion color palette条件 / IP-Adapter颜色参考 - 精确控制整体色调",
-      "对应亮点": [
-        "cluster_3",
-        "cluster_2"
-      ]
-    },
-    "bokeh_mask": {
-      "名称": "Bokeh 虚化遮罩",
-      "描述": "基于MiDaS深度图生成的虚化区域遮罩,亮区=清晰(主体),暗区=虚化(背景),量化大光圈散景效果",
-      "工具": "自定义算法 (MiDaS深度图归一化)",
-      "格式": "PNG 灰度图像 (0=完全虚化, 255=完全清晰)",
-      "生成模型用途": "ControlNet Blur/Depth条件 / 后处理散景合成 - 控制虚化程度和区域",
-      "对应亮点": [
-        "cluster_4"
-      ]
-    },
-    "semantic_segmentation": {
-      "名称": "KMeans 语义分割图",
-      "描述": "在LAB色彩空间使用KMeans(k=6)聚类的语义分割图,区分白裙/草地/画架/天空/皮肤/其他区域",
-      "工具": "sklearn.cluster.KMeans (LAB色彩空间, k=6)",
-      "格式": "PNG RGB彩色分割图,固定颜色编码: 白=白裙, 绿=草地, 棕=画架, 蓝=天空, 肤=皮肤, 灰=其他",
-      "生成模型用途": "ControlNet Segmentation条件 - 控制各区域的空间布局和比例",
-      "对应亮点": [
-        "cluster_1",
-        "cluster_3",
-        "cluster_5"
-      ]
-    },
-    "color_distribution": {
-      "名称": "HSV 色彩分布直方图",
-      "描述": "在HSV色彩空间计算的色相/饱和度/明度分布直方图,量化白色比例、绿色比例、平均亮度等关键指标",
-      "工具": "OpenCV cv2.calcHist (HSV空间, H:18bins, S:8bins, V:8bins)",
-      "格式": "PNG 直方图可视化 + JSON {hist_h, hist_s, hist_v, white_ratio, green_ratio, mean_brightness, mean_saturation}",
-      "生成模型用途": "色彩条件控制向量 / 后处理色调调整参考 - 量化白绿配色比例",
-      "对应亮点": [
-        "cluster_3",
-        "cluster_4"
-      ]
-    }
-  }
-}

+ 0 - 1629
examples/find knowledge/overview_mapping_clean.json

@@ -1,1629 +0,0 @@
-{
-  "post_name": "写生油画",
-  "total_images": 9,
-  "total_features": 7,
-  "feature_dimensions": [
-    "openpose_skeleton",
-    "depth_map",
-    "lineart_edge",
-    "color_palette",
-    "bokeh_mask",
-    "semantic_segmentation",
-    "color_distribution"
-  ],
-  "cluster_overview": {
-    "cluster_1": {
-      "聚类主题": "优雅的白裙画者",
-      "亮点类型": "实质",
-      "图片数量": 9,
-      "图片列表": [
-        "img_1",
-        "img_2",
-        "img_3",
-        "img_4",
-        "img_5",
-        "img_6",
-        "img_7",
-        "img_8",
-        "img_9"
-      ],
-      "对应特征维度": [
-        "openpose_skeleton",
-        "lineart_edge",
-        "semantic_segmentation"
-      ]
-    },
-    "cluster_2": {
-      "聚类主题": "充满艺术气息的写生道具",
-      "亮点类型": "实质",
-      "图片数量": 7,
-      "图片列表": [
-        "img_1",
-        "img_4",
-        "img_5",
-        "img_6",
-        "img_7",
-        "img_8",
-        "img_9"
-      ],
-      "对应特征维度": [
-        "lineart_edge",
-        "color_palette"
-      ]
-    },
-    "cluster_3": {
-      "聚类主题": "清新自然的绿白配色",
-      "亮点类型": "形式",
-      "图片数量": 5,
-      "图片列表": [
-        "img_1",
-        "img_4",
-        "img_5",
-        "img_7",
-        "img_8"
-      ],
-      "对应特征维度": [
-        "color_palette",
-        "semantic_segmentation",
-        "color_distribution"
-      ]
-    },
-    "cluster_4": {
-      "聚类主题": "虚实呼应的画中画结构",
-      "亮点类型": "形式",
-      "图片数量": 3,
-      "图片列表": [
-        "img_1",
-        "img_2",
-        "img_3"
-      ],
-      "对应特征维度": [
-        "depth_map",
-        "bokeh_mask",
-        "color_distribution"
-      ]
-    },
-    "cluster_5": {
-      "聚类主题": "唯美梦幻的光影氛围",
-      "亮点类型": "形式",
-      "图片数量": 3,
-      "图片列表": [
-        "img_2",
-        "img_3",
-        "img_7"
-      ],
-      "对应特征维度": [
-        "depth_map",
-        "semantic_segmentation"
-      ]
-    },
-    "cluster_6": {
-      "聚类主题": "巧妙的摄影构图视角",
-      "亮点类型": "形式",
-      "图片数量": 4,
-      "图片列表": [
-        "img_4",
-        "img_5",
-        "img_6",
-        "img_9"
-      ],
-      "对应特征维度": [
-        "openpose_skeleton"
-      ]
-    }
-  },
-  "image_overview": {
-    "img_1": {
-      "active_clusters": {
-        "cluster_1": {
-          "聚类主题": "优雅的白裙画者",
-          "亮点类型": "实质",
-          "合并结论": "优雅的白裙侧背影"
-        },
-        "cluster_2": {
-          "聚类主题": "充满艺术气息的写生道具",
-          "亮点类型": "实质",
-          "合并结论": "充满艺术气息的写生道具"
-        },
-        "cluster_3": {
-          "聚类主题": "清新自然的绿白配色",
-          "亮点类型": "形式",
-          "合并结论": "清新治愈的绿白配色"
-        },
-        "cluster_4": {
-          "聚类主题": "虚实呼应的画中画结构",
-          "亮点类型": "形式",
-          "合并结论": "虚实呼应的画中画结构"
-        }
-      },
-      "features": {
-        "openpose_skeleton": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_1.png",
-          "exists": true
-        },
-        "depth_map": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_1.png",
-          "exists": true
-        },
-        "lineart_edge": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_1.png",
-          "exists": true
-        },
-        "color_palette": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_1.png",
-          "exists": true,
-          "json_data": {
-            "dominant_color": [
-              70,
-              95,
-              62
-            ],
-            "palette": [
-              [
-                72,
-                98,
-                60
-              ],
-              [
-                150,
-                172,
-                181
-              ],
-              [
-                193,
-                201,
-                206
-              ],
-              [
-                147,
-                146,
-                132
-              ],
-              [
-                24,
-                30,
-                24
-              ],
-              [
-                101,
-                133,
-                133
-              ],
-              [
-                147,
-                182,
-                140
-              ]
-            ],
-            "palette_hex": [
-              "#48623c",
-              "#96acb5",
-              "#c1c9ce",
-              "#939284",
-              "#181e18",
-              "#658585",
-              "#93b68c"
-            ]
-          }
-        },
-        "bokeh_mask": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_1.png",
-          "exists": true
-        },
-        "semantic_segmentation": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_1.png",
-          "exists": true
-        },
-        "color_distribution": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_1.png",
-          "exists": true,
-          "json_data": {
-            "hist_h": [
-              0.02299436368048191,
-              0.045076314359903336,
-              0.011987491510808468,
-              0.013310426846146584,
-              0.21862855553627014,
-              0.25030627846717834,
-              0.1314917802810669,
-              0.0352347306907177,
-              0.02485457994043827,
-              0.11076493561267853,
-              0.12063290178775787,
-              0.005362520460039377,
-              0.002378838136792183,
-              0.0013802022440358996,
-              0.0007515507168136537,
-              0.0009613157017156482,
-              0.0014381129294633865,
-              0.0024451136123389006
-            ],
-            "hist_s": [
-              0.09791071712970734,
-              0.23805883526802063,
-              0.23730599880218506,
-              0.33129745721817017,
-              0.08900406956672668,
-              0.006134661380201578,
-              0.0002496589731890708,
-              3.860705692204647e-05
-            ],
-            "hist_v": [
-              0.025200756266713142,
-              0.17062132060527802,
-              0.1783987134695053,
-              0.13612976670265198,
-              0.24666756391525269,
-              0.14068475365638733,
-              0.07682546973228455,
-              0.025471650063991547
-            ],
-            "white_ratio": 0.0239,
-            "green_ratio": 0.6277,
-            "mean_brightness": 0.4702,
-            "mean_saturation": 0.3217,
-            "h_bins": 18,
-            "s_bins": 8,
-            "v_bins": 8
-          }
-        }
-      },
-      "hsv_summary": {
-        "white_ratio": 0.0239,
-        "green_ratio": 0.6277,
-        "mean_brightness": 0.4702,
-        "mean_saturation": 0.3217
-      }
-    },
-    "img_2": {
-      "active_clusters": {
-        "cluster_1": {
-          "聚类主题": "优雅的白裙画者",
-          "亮点类型": "实质",
-          "合并结论": "优雅的白裙背影"
-        },
-        "cluster_4": {
-          "聚类主题": "虚实呼应的画中画结构",
-          "亮点类型": "形式",
-          "合并结论": "虚实呼应的叙事构图"
-        },
-        "cluster_5": {
-          "聚类主题": "唯美梦幻的光影氛围",
-          "亮点类型": "形式",
-          "合并结论": "柔美的逆光氛围"
-        }
-      },
-      "features": {
-        "openpose_skeleton": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_2.png",
-          "exists": true
-        },
-        "depth_map": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_2.png",
-          "exists": true
-        },
-        "lineart_edge": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_2.png",
-          "exists": true
-        },
-        "color_palette": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_2.png",
-          "exists": true,
-          "json_data": {
-            "dominant_color": [
-              138,
-              156,
-              105
-            ],
-            "palette": [
-              [
-                138,
-                156,
-                104
-              ],
-              [
-                219,
-                227,
-                227
-              ],
-              [
-                75,
-                69,
-                55
-              ],
-              [
-                209,
-                194,
-                154
-              ],
-              [
-                72,
-                95,
-                77
-              ],
-              [
-                111,
-                171,
-                189
-              ],
-              [
-                182,
-                212,
-                170
-              ]
-            ],
-            "palette_hex": [
-              "#8a9c68",
-              "#dbe3e3",
-              "#4b4537",
-              "#d1c29a",
-              "#485f4d",
-              "#6fabbd",
-              "#b6d4aa"
-            ]
-          }
-        },
-        "bokeh_mask": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_2.png",
-          "exists": true
-        },
-        "semantic_segmentation": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_2.png",
-          "exists": true
-        },
-        "color_distribution": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_2.png",
-          "exists": true,
-          "json_data": {
-            "hist_h": [
-              0.0732845589518547,
-              0.15593840181827545,
-              0.12949064373970032,
-              0.12419310957193375,
-              0.23567485809326172,
-              0.03178519010543823,
-              0.03388284146785736,
-              0.010717319324612617,
-              0.01433801744133234,
-              0.10481687635183334,
-              0.07486487179994583,
-              0.002149126259610057,
-              0.0011041618417948484,
-              0.0023498828522861004,
-              0.0006904228939674795,
-              0.0003197951300535351,
-              0.003116233041509986,
-              0.0012836846290156245
-            ],
-            "hist_s": [
-              0.28900665044784546,
-              0.2196548581123352,
-              0.2457796037197113,
-              0.18217319250106812,
-              0.05714680999517441,
-              0.004347797948867083,
-              0.0018428434850648046,
-              4.8258822062052786e-05
-            ],
-            "hist_v": [
-              0.0,
-              0.01885053887963295,
-              0.12125833332538605,
-              0.09530602395534515,
-              0.10405567288398743,
-              0.2533491551876068,
-              0.15230870246887207,
-              0.25487157702445984
-            ],
-            "white_ratio": 0.2392,
-            "green_ratio": 0.3379,
-            "mean_brightness": 0.6831,
-            "mean_saturation": 0.2485,
-            "h_bins": 18,
-            "s_bins": 8,
-            "v_bins": 8
-          }
-        }
-      },
-      "hsv_summary": {
-        "white_ratio": 0.2392,
-        "green_ratio": 0.3379,
-        "mean_brightness": 0.6831,
-        "mean_saturation": 0.2485
-      }
-    },
-    "img_3": {
-      "active_clusters": {
-        "cluster_1": {
-          "聚类主题": "优雅的白裙画者",
-          "亮点类型": "实质",
-          "合并结论": "纯净优雅的白裙背影"
-        },
-        "cluster_4": {
-          "聚类主题": "虚实呼应的画中画结构",
-          "亮点类型": "形式",
-          "合并结论": "虚实呼应的画中画构图"
-        },
-        "cluster_5": {
-          "聚类主题": "唯美梦幻的光影氛围",
-          "亮点类型": "形式",
-          "合并结论": "梦幻森系的自然光影"
-        }
-      },
-      "features": {
-        "openpose_skeleton": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_3.png",
-          "exists": true
-        },
-        "depth_map": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_3.png",
-          "exists": true
-        },
-        "lineart_edge": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_3.png",
-          "exists": true
-        },
-        "color_palette": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_3.png",
-          "exists": true,
-          "json_data": {
-            "dominant_color": [
-              129,
-              149,
-              88
-            ],
-            "palette": [
-              [
-                226,
-                235,
-                234
-              ],
-              [
-                126,
-                145,
-                86
-              ],
-              [
-                78,
-                74,
-                55
-              ],
-              [
-                210,
-                200,
-                155
-              ],
-              [
-                144,
-                169,
-                158
-              ],
-              [
-                171,
-                205,
-                110
-              ],
-              [
-                66,
-                97,
-                55
-              ]
-            ],
-            "palette_hex": [
-              "#e2ebea",
-              "#7e9156",
-              "#4e4a37",
-              "#d2c89b",
-              "#90a99e",
-              "#abcd6e",
-              "#426137"
-            ]
-          }
-        },
-        "bokeh_mask": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_3.png",
-          "exists": true
-        },
-        "semantic_segmentation": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_3.png",
-          "exists": true
-        },
-        "color_distribution": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_3.png",
-          "exists": true,
-          "json_data": {
-            "hist_h": [
-              0.08796747028827667,
-              0.07544205337762833,
-              0.14689534902572632,
-              0.12777456641197205,
-              0.3085463047027588,
-              0.0542680099606514,
-              0.022549094632267952,
-              0.014717653393745422,
-              0.011737189255654812,
-              0.08198659121990204,
-              0.05702970176935196,
-              0.0014998841797932982,
-              0.003399351378902793,
-              0.0004800144233740866,
-              0.0002187733189202845,
-              0.0010964404791593552,
-              0.0006859187269583344,
-              0.0037056340370327234
-            ],
-            "hist_s": [
-              0.22554758191108704,
-              0.21504710614681244,
-              0.20258988440036774,
-              0.20314133167266846,
-              0.1272115409374237,
-              0.023029109463095665,
-              0.003271948080509901,
-              0.00016150619194377214
-            ],
-            "hist_v": [
-              0.0,
-              0.006298741325736046,
-              0.07633130252361298,
-              0.1305510550737381,
-              0.1652330607175827,
-              0.20487864315509796,
-              0.15114469826221466,
-              0.265562504529953
-            ],
-            "white_ratio": 0.1947,
-            "green_ratio": 0.4209,
-            "mean_brightness": 0.6935,
-            "mean_saturation": 0.2881,
-            "h_bins": 18,
-            "s_bins": 8,
-            "v_bins": 8
-          }
-        }
-      },
-      "hsv_summary": {
-        "white_ratio": 0.1947,
-        "green_ratio": 0.4209,
-        "mean_brightness": 0.6935,
-        "mean_saturation": 0.2881
-      }
-    },
-    "img_4": {
-      "active_clusters": {
-        "cluster_1": {
-          "聚类主题": "优雅的白裙画者",
-          "亮点类型": "实质",
-          "合并结论": "纯净的白裙画者形象"
-        },
-        "cluster_2": {
-          "聚类主题": "充满艺术气息的写生道具",
-          "亮点类型": "实质",
-          "合并结论": "充满艺术感的写生道具"
-        },
-        "cluster_3": {
-          "聚类主题": "清新自然的绿白配色",
-          "亮点类型": "形式",
-          "合并结论": "清新自然的绿白配色"
-        },
-        "cluster_6": {
-          "聚类主题": "巧妙的摄影构图视角",
-          "亮点类型": "形式",
-          "合并结论": "均衡的左右呼应构图"
-        }
-      },
-      "features": {
-        "openpose_skeleton": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_4.png",
-          "exists": true
-        },
-        "depth_map": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_4.png",
-          "exists": true
-        },
-        "lineart_edge": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_4.png",
-          "exists": true
-        },
-        "color_palette": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_4.png",
-          "exists": true,
-          "json_data": {
-            "dominant_color": [
-              116,
-              118,
-              72
-            ],
-            "palette": [
-              [
-                112,
-                116,
-                67
-              ],
-              [
-                216,
-                213,
-                203
-              ],
-              [
-                181,
-                196,
-                191
-              ],
-              [
-                161,
-                151,
-                129
-              ],
-              [
-                158,
-                169,
-                175
-              ],
-              [
-                35,
-                46,
-                31
-              ],
-              [
-                60,
-                47,
-                34
-              ]
-            ],
-            "palette_hex": [
-              "#707443",
-              "#d8d5cb",
-              "#b5c4bf",
-              "#a19781",
-              "#9ea9af",
-              "#232e1f",
-              "#3c2f22"
-            ]
-          }
-        },
-        "bokeh_mask": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_4.png",
-          "exists": true
-        },
-        "semantic_segmentation": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_4.png",
-          "exists": true
-        },
-        "color_distribution": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_4.png",
-          "exists": true,
-          "json_data": {
-            "hist_h": [
-              0.021759580820798874,
-              0.14858633279800415,
-              0.21194759011268616,
-              0.2254870980978012,
-              0.2172277569770813,
-              0.009835791774094105,
-              0.007799269165843725,
-              0.010793889872729778,
-              0.02440738119184971,
-              0.07726301997900009,
-              0.03628162667155266,
-              0.0028279670514166355,
-              0.0010674850782379508,
-              0.000593261793255806,
-              0.00036226288648322225,
-              0.0005269863177090883,
-              0.0009741847752593458,
-              0.0022585128899663687
-            ],
-            "hist_s": [
-              0.17237728834152222,
-              0.09118407964706421,
-              0.1611233353614807,
-              0.3682836592197418,
-              0.15807917714118958,
-              0.03790698200464249,
-              0.009977350942790508,
-              0.00106812862213701
-            ],
-            "hist_v": [
-              0.005347077269107103,
-              0.039011143147945404,
-              0.10711270570755005,
-              0.2906358540058136,
-              0.2130337357521057,
-              0.13399480283260345,
-              0.10851671546697617,
-              0.1023479551076889
-            ],
-            "white_ratio": 0.1343,
-            "green_ratio": 0.3067,
-            "mean_brightness": 0.5639,
-            "mean_saturation": 0.3606,
-            "h_bins": 18,
-            "s_bins": 8,
-            "v_bins": 8
-          }
-        }
-      },
-      "hsv_summary": {
-        "white_ratio": 0.1343,
-        "green_ratio": 0.3067,
-        "mean_brightness": 0.5639,
-        "mean_saturation": 0.3606
-      }
-    },
-    "img_5": {
-      "active_clusters": {
-        "cluster_1": {
-          "聚类主题": "优雅的白裙画者",
-          "亮点类型": "实质",
-          "合并结论": "洁白柔顺的衣物褶皱"
-        },
-        "cluster_2": {
-          "聚类主题": "充满艺术气息的写生道具",
-          "亮点类型": "实质",
-          "合并结论": "斑斓厚重的油彩肌理"
-        },
-        "cluster_3": {
-          "聚类主题": "清新自然的绿白配色",
-          "亮点类型": "形式",
-          "合并结论": "清新高雅的色彩构成"
-        },
-        "cluster_6": {
-          "聚类主题": "巧妙的摄影构图视角",
-          "亮点类型": "形式",
-          "合并结论": "突出动作的局部构图"
-        }
-      },
-      "features": {
-        "openpose_skeleton": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_5.png",
-          "exists": true
-        },
-        "depth_map": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_5.png",
-          "exists": true
-        },
-        "lineart_edge": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_5.png",
-          "exists": true
-        },
-        "color_palette": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_5.png",
-          "exists": true,
-          "json_data": {
-            "dominant_color": [
-              49,
-              91,
-              54
-            ],
-            "palette": [
-              [
-                49,
-                91,
-                54
-              ],
-              [
-                209,
-                214,
-                216
-              ],
-              [
-                104,
-                75,
-                64
-              ],
-              [
-                118,
-                120,
-                71
-              ],
-              [
-                108,
-                147,
-                169
-              ],
-              [
-                163,
-                137,
-                133
-              ],
-              [
-                37,
-                190,
-                206
-              ]
-            ],
-            "palette_hex": [
-              "#315b36",
-              "#d1d6d8",
-              "#684b40",
-              "#767847",
-              "#6c93a9",
-              "#a38985",
-              "#25bece"
-            ]
-          }
-        },
-        "bokeh_mask": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_5.png",
-          "exists": true
-        },
-        "semantic_segmentation": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_5.png",
-          "exists": true
-        },
-        "color_distribution": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_5.png",
-          "exists": true,
-          "json_data": {
-            "hist_h": [
-              0.06531541794538498,
-              0.09025493264198303,
-              0.014375980943441391,
-              0.011843358166515827,
-              0.12692134082317352,
-              0.15304480493068695,
-              0.014180372469127178,
-              0.024089517071843147,
-              0.06461405754089355,
-              0.11568476259708405,
-              0.20321017503738403,
-              0.044057730585336685,
-              0.016082413494586945,
-              0.010450930334627628,
-              0.004185648635029793,
-              0.006949913688004017,
-              0.015166782774031162,
-              0.019571848213672638
-            ],
-            "hist_s": [
-              0.3696361780166626,
-              0.1519850492477417,
-              0.05476089194417,
-              0.10194257646799088,
-              0.17193330824375153,
-              0.104984812438488,
-              0.03291315957903862,
-              0.011844001710414886
-            ],
-            "hist_v": [
-              0.011543510481715202,
-              0.01847798191010952,
-              0.18232890963554382,
-              0.1763029843568802,
-              0.05641070008277893,
-              0.07998481392860413,
-              0.20172573626041412,
-              0.2732253670692444
-            ],
-            "white_ratio": 0.2872,
-            "green_ratio": 0.3239,
-            "mean_brightness": 0.6478,
-            "mean_saturation": 0.3156,
-            "h_bins": 18,
-            "s_bins": 8,
-            "v_bins": 8
-          }
-        }
-      },
-      "hsv_summary": {
-        "white_ratio": 0.2872,
-        "green_ratio": 0.3239,
-        "mean_brightness": 0.6478,
-        "mean_saturation": 0.3156
-      }
-    },
-    "img_6": {
-      "active_clusters": {
-        "cluster_1": {
-          "聚类主题": "优雅的白裙画者",
-          "亮点类型": "实质",
-          "合并结论": "精致的侧颜与配饰"
-        },
-        "cluster_2": {
-          "聚类主题": "充满艺术气息的写生道具",
-          "亮点类型": "实质",
-          "合并结论": "高对比的斑斓调色盘"
-        },
-        "cluster_6": {
-          "聚类主题": "巧妙的摄影构图视角",
-          "亮点类型": "形式",
-          "合并结论": "沉浸式的过肩构图"
-        }
-      },
-      "features": {
-        "openpose_skeleton": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_6.png",
-          "exists": true
-        },
-        "depth_map": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_6.png",
-          "exists": true
-        },
-        "lineart_edge": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_6.png",
-          "exists": true
-        },
-        "color_palette": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_6.png",
-          "exists": true,
-          "json_data": {
-            "dominant_color": [
-              104,
-              143,
-              148
-            ],
-            "palette": [
-              [
-                125,
-                145,
-                148
-              ],
-              [
-                202,
-                204,
-                212
-              ],
-              [
-                47,
-                47,
-                38
-              ],
-              [
-                27,
-                134,
-                147
-              ],
-              [
-                153,
-                189,
-                218
-              ],
-              [
-                72,
-                62,
-                75
-              ],
-              [
-                168,
-                204,
-                201
-              ]
-            ],
-            "palette_hex": [
-              "#7d9194",
-              "#caccd4",
-              "#2f2f26",
-              "#1b8693",
-              "#99bdda",
-              "#483e4b",
-              "#a8ccc9"
-            ]
-          }
-        },
-        "bokeh_mask": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_6.png",
-          "exists": true
-        },
-        "semantic_segmentation": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_6.png",
-          "exists": true
-        },
-        "color_distribution": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_6.png",
-          "exists": true,
-          "json_data": {
-            "hist_h": [
-              0.1566610038280487,
-              0.04552222415804863,
-              0.011773865669965744,
-              0.021885696798563004,
-              0.046773094683885574,
-              0.0223541297018528,
-              0.03028852306306362,
-              0.03333976864814758,
-              0.05309435725212097,
-              0.1629861295223236,
-              0.3142968416213989,
-              0.018021130934357643,
-              0.006420996971428394,
-              0.0047917794436216354,
-              0.0050942013040184975,
-              0.01143412385135889,
-              0.020818213000893593,
-              0.0344439297914505
-            ],
-            "hist_s": [
-              0.130146324634552,
-              0.3402388393878937,
-              0.22351619601249695,
-              0.09706779569387436,
-              0.07324466854333878,
-              0.04026523232460022,
-              0.04923300817608833,
-              0.04628793150186539
-            ],
-            "hist_v": [
-              0.020250044763088226,
-              0.11473309993743896,
-              0.055246055126190186,
-              0.05642228573560715,
-              0.21779786050319672,
-              0.23236235976219177,
-              0.18257728219032288,
-              0.12061101943254471
-            ],
-            "white_ratio": 0.0506,
-            "green_ratio": 0.1604,
-            "mean_brightness": 0.6068,
-            "mean_saturation": 0.3338,
-            "h_bins": 18,
-            "s_bins": 8,
-            "v_bins": 8
-          }
-        }
-      },
-      "hsv_summary": {
-        "white_ratio": 0.0506,
-        "green_ratio": 0.1604,
-        "mean_brightness": 0.6068,
-        "mean_saturation": 0.3338
-      }
-    },
-    "img_7": {
-      "active_clusters": {
-        "cluster_1": {
-          "聚类主题": "优雅的白裙画者",
-          "亮点类型": "实质",
-          "合并结论": "恬静柔美的侧颜特写"
-        },
-        "cluster_2": {
-          "聚类主题": "充满艺术气息的写生道具",
-          "亮点类型": "实质",
-          "合并结论": "洁白玫瑰的互动点缀"
-        },
-        "cluster_3": {
-          "聚类主题": "清新自然的绿白配色",
-          "亮点类型": "形式",
-          "合并结论": "清新的白绿配色调"
-        },
-        "cluster_5": {
-          "聚类主题": "唯美梦幻的光影氛围",
-          "亮点类型": "形式",
-          "合并结论": "充满空气感的柔光氛围"
-        }
-      },
-      "features": {
-        "openpose_skeleton": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_7.png",
-          "exists": true
-        },
-        "depth_map": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_7.png",
-          "exists": true
-        },
-        "lineart_edge": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_7.png",
-          "exists": true
-        },
-        "color_palette": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_7.png",
-          "exists": true,
-          "json_data": {
-            "dominant_color": [
-              83,
-              101,
-              72
-            ],
-            "palette": [
-              [
-                71,
-                96,
-                59
-              ],
-              [
-                171,
-                189,
-                204
-              ],
-              [
-                133,
-                151,
-                169
-              ],
-              [
-                31,
-                27,
-                27
-              ],
-              [
-                129,
-                122,
-                125
-              ],
-              [
-                159,
-                139,
-                141
-              ],
-              [
-                120,
-                100,
-                94
-              ]
-            ],
-            "palette_hex": [
-              "#47603b",
-              "#abbdcc",
-              "#8597a9",
-              "#1f1b1b",
-              "#817a7d",
-              "#9f8b8d",
-              "#78645e"
-            ]
-          }
-        },
-        "bokeh_mask": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_7.png",
-          "exists": true
-        },
-        "semantic_segmentation": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_7.png",
-          "exists": true
-        },
-        "color_distribution": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_7.png",
-          "exists": true,
-          "json_data": {
-            "hist_h": [
-              0.07843989133834839,
-              0.10234537720680237,
-              0.015606259927153587,
-              0.0037384501192718744,
-              0.16384771466255188,
-              0.21072953939437866,
-              0.022516923025250435,
-              0.020746145397424698,
-              0.010117623023688793,
-              0.011814403347671032,
-              0.1484299749135971,
-              0.046803977340459824,
-              0.01757650636136532,
-              0.014380485750734806,
-              0.014578024856746197,
-              0.0272745992988348,
-              0.03201361373066902,
-              0.05904048681259155
-            ],
-            "hist_s": [
-              0.17181169986724854,
-              0.1873188614845276,
-              0.18251743912696838,
-              0.37122422456741333,
-              0.08246918022632599,
-              0.00416184077039361,
-              0.00048580547445453703,
-              1.0938666491711047e-05
-            ],
-            "hist_v": [
-              0.0927245020866394,
-              0.09700087457895279,
-              0.13095127046108246,
-              0.36870384216308594,
-              0.11066005378961563,
-              0.08380112051963806,
-              0.11162008345127106,
-              0.004538259468972683
-            ],
-            "white_ratio": 0.0235,
-            "green_ratio": 0.4193,
-            "mean_brightness": 0.4381,
-            "mean_saturation": 0.3139,
-            "h_bins": 18,
-            "s_bins": 8,
-            "v_bins": 8
-          }
-        }
-      },
-      "hsv_summary": {
-        "white_ratio": 0.0235,
-        "green_ratio": 0.4193,
-        "mean_brightness": 0.4381,
-        "mean_saturation": 0.3139
-      }
-    },
-    "img_8": {
-      "active_clusters": {
-        "cluster_1": {
-          "聚类主题": "优雅的白裙画者",
-          "亮点类型": "实质",
-          "合并结论": "优雅的写生人物"
-        },
-        "cluster_2": {
-          "聚类主题": "充满艺术气息的写生道具",
-          "亮点类型": "实质",
-          "合并结论": "木质画架与调色盘"
-        },
-        "cluster_3": {
-          "聚类主题": "清新自然的绿白配色",
-          "亮点类型": "形式",
-          "合并结论": "清新的绿白配色"
-        }
-      },
-      "features": {
-        "openpose_skeleton": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_8.png",
-          "exists": true
-        },
-        "depth_map": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_8.png",
-          "exists": true
-        },
-        "lineart_edge": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_8.png",
-          "exists": true
-        },
-        "color_palette": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_8.png",
-          "exists": true,
-          "json_data": {
-            "dominant_color": [
-              47,
-              62,
-              44
-            ],
-            "palette": [
-              [
-                206,
-                204,
-                201
-              ],
-              [
-                44,
-                60,
-                42
-              ],
-              [
-                94,
-                139,
-                90
-              ],
-              [
-                131,
-                183,
-                185
-              ],
-              [
-                110,
-                149,
-                166
-              ],
-              [
-                121,
-                103,
-                88
-              ],
-              [
-                86,
-                104,
-                112
-              ]
-            ],
-            "palette_hex": [
-              "#ceccc9",
-              "#2c3c2a",
-              "#5e8b5a",
-              "#83b7b9",
-              "#6e95a6",
-              "#796758",
-              "#566870"
-            ]
-          }
-        },
-        "bokeh_mask": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_8.png",
-          "exists": true
-        },
-        "semantic_segmentation": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_8.png",
-          "exists": true
-        },
-        "color_distribution": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_8.png",
-          "exists": true,
-          "json_data": {
-            "hist_h": [
-              0.016288960352540016,
-              0.05812549963593483,
-              0.028123311698436737,
-              0.03650747612118721,
-              0.08802022784948349,
-              0.3297860026359558,
-              0.1963168829679489,
-              0.07496525347232819,
-              0.027654234319925308,
-              0.04496306553483009,
-              0.08410611748695374,
-              0.005293027497828007,
-              0.00219545466825366,
-              0.0010121483355760574,
-              0.0006923532346263528,
-              0.0009973490377888083,
-              0.0018737291684374213,
-              0.003078912850469351
-            ],
-            "hist_s": [
-              0.10442758351564407,
-              0.14612577855587006,
-              0.3257077932357788,
-              0.283027708530426,
-              0.10212274640798569,
-              0.030628908425569534,
-              0.006496280897408724,
-              0.0014632074162364006
-            ],
-            "hist_v": [
-              0.09568823873996735,
-              0.23660850524902344,
-              0.241120383143425,
-              0.10031850636005402,
-              0.18116876482963562,
-              0.026423312723636627,
-              0.05741770192980766,
-              0.061254601925611496
-            ],
-            "white_ratio": 0.0714,
-            "green_ratio": 0.7117,
-            "mean_brightness": 0.3933,
-            "mean_saturation": 0.3447,
-            "h_bins": 18,
-            "s_bins": 8,
-            "v_bins": 8
-          }
-        }
-      },
-      "hsv_summary": {
-        "white_ratio": 0.0714,
-        "green_ratio": 0.7117,
-        "mean_brightness": 0.3933,
-        "mean_saturation": 0.3447
-      }
-    },
-    "img_9": {
-      "active_clusters": {
-        "cluster_1": {
-          "聚类主题": "优雅的白裙画者",
-          "亮点类型": "实质",
-          "合并结论": "一袭白裙的优雅背影"
-        },
-        "cluster_2": {
-          "聚类主题": "充满艺术气息的写生道具",
-          "亮点类型": "实质",
-          "合并结论": "伫立草坪的木质画架"
-        },
-        "cluster_6": {
-          "聚类主题": "巧妙的摄影构图视角",
-          "亮点类型": "形式",
-          "合并结论": "自然垂落的树枝框景"
-        }
-      },
-      "features": {
-        "openpose_skeleton": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/openpose_skeleton/img_9.png",
-          "exists": true
-        },
-        "depth_map": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/depth_map/img_9.png",
-          "exists": true
-        },
-        "lineart_edge": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/lineart_edge/img_9.png",
-          "exists": true
-        },
-        "color_palette": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_palette/img_9.png",
-          "exists": true,
-          "json_data": {
-            "dominant_color": [
-              119,
-              139,
-              81
-            ],
-            "palette": [
-              [
-                228,
-                235,
-                239
-              ],
-              [
-                120,
-                140,
-                81
-              ],
-              [
-                213,
-                206,
-                152
-              ],
-              [
-                50,
-                53,
-                37
-              ],
-              [
-                160,
-                176,
-                162
-              ],
-              [
-                47,
-                87,
-                70
-              ],
-              [
-                180,
-                204,
-                117
-              ]
-            ],
-            "palette_hex": [
-              "#e4ebef",
-              "#788c51",
-              "#d5ce98",
-              "#323525",
-              "#a0b0a2",
-              "#2f5746",
-              "#b4cc75"
-            ]
-          }
-        },
-        "bokeh_mask": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/bokeh_mask/img_9.png",
-          "exists": true
-        },
-        "semantic_segmentation": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/semantic_segmentation/img_9.png",
-          "exists": true
-        },
-        "color_distribution": {
-          "file": "/Users/elksmmx/Desktop/aigc_knowledge/aigc_workspace/output/写生油画/features/color_distribution/img_9.png",
-          "exists": true,
-          "json_data": {
-            "hist_h": [
-              0.012288626283407211,
-              0.04225928336381912,
-              0.09236609935760498,
-              0.1584002524614334,
-              0.24352367222309113,
-              0.04621071740984917,
-              0.02858530916273594,
-              0.028737805783748627,
-              0.024914421141147614,
-              0.06194116175174713,
-              0.052537769079208374,
-              0.004524746909737587,
-              0.005542686674743891,
-              0.1909305602312088,
-              0.0033851955085992813,
-              0.0011099529219791293,
-              0.001967029646039009,
-              0.0007747149793431163
-            ],
-            "hist_s": [
-              0.3372262120246887,
-              0.15812550485134125,
-              0.1551109254360199,
-              0.21685005724430084,
-              0.10838223248720169,
-              0.02103441208600998,
-              0.0029714566189795732,
-              0.00029920469387434423
-            ],
-            "hist_v": [
-              0.0014799372293055058,
-              0.03709237277507782,
-              0.06861117482185364,
-              0.10374681651592255,
-              0.1604354828596115,
-              0.18214423954486847,
-              0.11757586151361465,
-              0.3289141058921814
-            ],
-            "white_ratio": 0.307,
-            "green_ratio": 0.3654,
-            "mean_brightness": 0.7022,
-            "mean_saturation": 0.2595,
-            "h_bins": 18,
-            "s_bins": 8,
-            "v_bins": 8
-          }
-        }
-      },
-      "hsv_summary": {
-        "white_ratio": 0.307,
-        "green_ratio": 0.3654,
-        "mean_brightness": 0.7022,
-        "mean_saturation": 0.2595
-      }
-    }
-  },
-  "feature_dimension_details": {
-    "openpose_skeleton": {
-      "名称": "OpenPose 人体骨架图",
-      "描述": "使用 lllyasviel/ControlNet OpenposeDetector 提取的人体关键点骨架图,包含身体18个关键点(头部、肩膀、肘部、手腕、髋部、膝盖、脚踝等)",
-      "工具": "controlnet_aux.OpenposeDetector (lllyasviel/ControlNet)",
-      "格式": "PNG RGB图像,黑色背景+彩色骨架线",
-      "生成模型用途": "ControlNet OpenPose条件控制 - 精确控制人物姿态、站立/跪坐/侧身/背影等",
-      "对应亮点": [
-        "cluster_1",
-        "cluster_6"
-      ]
-    },
-    "depth_map": {
-      "名称": "MiDaS 深度图",
-      "描述": "使用 lllyasviel/Annotators MidasDetector 提取的单目深度估计图,灰度值表示相对深度(亮=近,暗=远)",
-      "工具": "controlnet_aux.MidasDetector (lllyasviel/Annotators)",
-      "格式": "PNG 灰度图像",
-      "生成模型用途": "ControlNet Depth条件控制 - 控制场景空间层次、前景/背景分离、景深效果",
-      "对应亮点": [
-        "cluster_4",
-        "cluster_5"
-      ]
-    },
-    "lineart_edge": {
-      "名称": "Lineart 线稿图",
-      "描述": "使用 lllyasviel/Annotators LineartDetector 提取的精细线稿,保留服装褶皱、画架结构、人物轮廓等细节",
-      "工具": "controlnet_aux.LineartDetector (lllyasviel/Annotators)",
-      "格式": "PNG 灰度图像(白线黑底)",
-      "生成模型用途": "ControlNet Lineart条件控制 - 控制服装褶皱、画架结构、整体构图轮廓",
-      "对应亮点": [
-        "cluster_1",
-        "cluster_2"
-      ]
-    },
-    "color_palette": {
-      "名称": "ColorThief 色彩调色板",
-      "描述": "使用 ColorThief 从图片提取的主色调和8色调色板,以RGB色块图和JSON格式存储",
-      "工具": "colorthief.ColorThief",
-      "格式": "PNG 色块图 (640×80) + JSON {dominant_color, palette, palette_hex}",
-      "生成模型用途": "Stable Diffusion color palette条件 / IP-Adapter颜色参考 - 精确控制整体色调",
-      "对应亮点": [
-        "cluster_3",
-        "cluster_2"
-      ]
-    },
-    "bokeh_mask": {
-      "名称": "Bokeh 虚化遮罩",
-      "描述": "基于MiDaS深度图生成的虚化区域遮罩,亮区=清晰(主体),暗区=虚化(背景),量化大光圈散景效果",
-      "工具": "自定义算法 (MiDaS深度图归一化)",
-      "格式": "PNG 灰度图像 (0=完全虚化, 255=完全清晰)",
-      "生成模型用途": "ControlNet Blur/Depth条件 / 后处理散景合成 - 控制虚化程度和区域",
-      "对应亮点": [
-        "cluster_4"
-      ]
-    },
-    "semantic_segmentation": {
-      "名称": "KMeans 语义分割图",
-      "描述": "在LAB色彩空间使用KMeans(k=6)聚类的语义分割图,区分白裙/草地/画架/天空/皮肤/其他区域",
-      "工具": "sklearn.cluster.KMeans (LAB色彩空间, k=6)",
-      "格式": "PNG RGB彩色分割图,固定颜色编码: 白=白裙, 绿=草地, 棕=画架, 蓝=天空, 肤=皮肤, 灰=其他",
-      "生成模型用途": "ControlNet Segmentation条件 - 控制各区域的空间布局和比例",
-      "对应亮点": [
-        "cluster_1",
-        "cluster_3",
-        "cluster_5"
-      ]
-    },
-    "color_distribution": {
-      "名称": "HSV 色彩分布直方图",
-      "描述": "在HSV色彩空间计算的色相/饱和度/明度分布直方图,量化白色比例、绿色比例、平均亮度等关键指标",
-      "工具": "OpenCV cv2.calcHist (HSV空间, H:18bins, S:8bins, V:8bins)",
-      "格式": "PNG 直方图可视化 + JSON {hist_h, hist_s, hist_v, white_ratio, green_ratio, mean_brightness, mean_saturation}",
-      "生成模型用途": "色彩条件控制向量 / 后处理色调调整参考 - 量化白绿配色比例",
-      "对应亮点": [
-        "cluster_3",
-        "cluster_4"
-      ]
-    }
-  }
-}

+ 4 - 0
examples/find knowledge/run.py

@@ -29,6 +29,10 @@ from agent.trace import (
 )
 from agent.llm import create_openrouter_llm_call
 
+# 导入自定义工具模块,触发 @tool 装饰器注册
+sys.path.insert(0, str(Path(__file__).parent))
+import tool  # noqa: E402
+
 
 def check_stdin() -> str | None:
     """非阻塞检查 stdin 是否有输入"""

+ 0 - 18
examples/find knowledge/test.html

@@ -1,18 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-    <meta charset="UTF-8">
-    <title>测试页面</title>
-</head>
-<body>
-    <h1>测试</h1>
-    <div id="test"></div>
-    <script>
-        console.log("Script loaded");
-        document.addEventListener('DOMContentLoaded', function() {
-            console.log("DOM loaded");
-            document.getElementById('test').textContent = "JavaScript 正常工作!";
-        });
-    </script>
-</body>
-</html>

+ 7 - 0
examples/find knowledge/tool/__init__.py

@@ -0,0 +1,7 @@
+"""
+Find Knowledge 示例的自定义工具
+"""
+
+from .nanobanana import nanobanana
+
+__all__ = ["nanobanana"]

+ 572 - 0
examples/find knowledge/tool/nanobanana.py

@@ -0,0 +1,572 @@
+"""
+NanoBanana Tool - 图像特征提取与图像生成
+
+该工具可以提取图片中的特征,也可以根据描述生成图片。
+支持通过 OpenRouter 调用多模态模型,提取结构化的图像特征并保存为 JSON,
+或基于输入图像生成新的图像。
+"""
+
+import base64
+import json
+import mimetypes
+import os
+import re
+from pathlib import Path
+from typing import Optional, Dict, Any, List, Tuple
+
+import httpx
+from dotenv import load_dotenv
+
+from agent.tools import tool, ToolResult
+
+OPENROUTER_BASE_URL = "https://openrouter.ai/api/v1"
+DEFAULT_TIMEOUT = 120.0
+
+DEFAULT_EXTRACTION_PROMPT = (
+    "请从这张图像中提取跨场景相对稳定、可复用的视觉不变特征。"
+    "输出严格 JSON,字段包含:identity_features、pose_features、appearance_features、"
+    "material_features、style_features、uncertainty、notes。"
+    "每个字段给出简洁要点,避免臆测。"
+)
+
+DEFAULT_IMAGE_PROMPT = (
+    "基于输入图像生成一张保留主体身份与关键视觉特征的新图像。"
+    "保持人物核心特征一致,同时提升清晰度与可用性。"
+)
+
+DEFAULT_IMAGE_MODEL_CANDIDATES = [
+    "google/gemini-2.5-flash-image",
+    # "google/gemini-3-pro-image-preview",
+    # "black-forest-labs/flux.2-flex",
+    # "black-forest-labs/flux.2-pro",
+]
+
+
+def _resolve_api_key() -> Optional[str]:
+    """优先读取环境变量,缺失时尝试从 .env 加载。"""
+    api_key = os.getenv("OPENROUTER_API_KEY") or os.getenv("OPEN_ROUTER_API_KEY")
+    if api_key:
+        return api_key
+
+    load_dotenv()
+    return os.getenv("OPENROUTER_API_KEY") or os.getenv("OPEN_ROUTER_API_KEY")
+
+
+def _image_to_data_url(image_path: Path) -> str:
+    """将图片文件编码为 data URL。"""
+    mime_type = mimetypes.guess_type(str(image_path))[0] or "application/octet-stream"
+    raw = image_path.read_bytes()
+    b64 = base64.b64encode(raw).decode("utf-8")
+    return f"data:{mime_type};base64,{b64}"
+
+
+def _safe_json_parse(content: str) -> Dict[str, Any]:
+    """尽量从模型文本中提取 JSON。"""
+    try:
+        return json.loads(content)
+    except json.JSONDecodeError:
+        start = content.find("{")
+        end = content.rfind("}")
+        if start != -1 and end != -1 and end > start:
+            candidate = content[start:end + 1]
+            return json.loads(candidate)
+        raise
+
+
+def _extract_data_url_images(message: Dict[str, Any]) -> List[Tuple[str, str]]:
+    """
+    从 OpenRouter 响应消息中提取 data URL 图片。
+
+    Returns:
+        List[(mime_type, base64_data)]
+    """
+    extracted: List[Tuple[str, str]] = []
+
+    # 官方文档中的主要位置:message.images[]
+    for img in message.get("images", []) or []:
+        if not isinstance(img, dict):
+            continue
+        if img.get("type") != "image_url":
+            continue
+        data_url = ((img.get("image_url") or {}).get("url") or "").strip()
+        if not data_url.startswith("data:"):
+            continue
+        m = re.match(r"^data:([^;]+);base64,(.+)$", data_url, flags=re.DOTALL)
+        if not m:
+            continue
+        extracted.append((m.group(1), m.group(2)))
+
+    # 兼容某些模型可能把 image_url 放在 content 数组中
+    content = message.get("content")
+    if isinstance(content, list):
+        for part in content:
+            if not isinstance(part, dict):
+                continue
+            if part.get("type") != "image_url":
+                continue
+            data_url = ((part.get("image_url") or {}).get("url") or "").strip()
+            if not data_url.startswith("data:"):
+                continue
+            m = re.match(r"^data:([^;]+);base64,(.+)$", data_url, flags=re.DOTALL)
+            if not m:
+                continue
+            extracted.append((m.group(1), m.group(2)))
+
+    return extracted
+
+
+def _extract_image_refs(choice: Dict[str, Any], message: Dict[str, Any]) -> List[Dict[str, str]]:
+    """
+    尝试从不同响应格式中提取图片引用。
+
+    返回格式:
+    - {"kind": "data_url", "value": "data:image/png;base64,..."}
+    - {"kind": "base64", "value": "...", "mime_type": "image/png"}
+    - {"kind": "url", "value": "https://..."}
+    """
+    refs: List[Dict[str, str]] = []
+
+    # 1) 标准 message.images
+    for img in message.get("images", []) or []:
+        if not isinstance(img, dict):
+            continue
+        # image_url 结构
+        data_url = ((img.get("image_url") or {}).get("url") or "").strip()
+        if data_url.startswith("data:"):
+            refs.append({"kind": "data_url", "value": data_url})
+            continue
+        if data_url.startswith("http"):
+            refs.append({"kind": "url", "value": data_url})
+            continue
+
+        # 兼容 base64 字段
+        b64 = (img.get("b64_json") or img.get("base64") or "").strip()
+        if b64:
+            refs.append({"kind": "base64", "value": b64, "mime_type": img.get("mime_type", "image/png")})
+
+    # 2) 某些格式可能在 choice.images
+    for img in choice.get("images", []) or []:
+        if not isinstance(img, dict):
+            continue
+        data_url = ((img.get("image_url") or {}).get("url") or "").strip()
+        if data_url.startswith("data:"):
+            refs.append({"kind": "data_url", "value": data_url})
+            continue
+        if data_url.startswith("http"):
+            refs.append({"kind": "url", "value": data_url})
+            continue
+        b64 = (img.get("b64_json") or img.get("base64") or "").strip()
+        if b64:
+            refs.append({"kind": "base64", "value": b64, "mime_type": img.get("mime_type", "image/png")})
+
+    # 3) content 数组里的 image_url
+    content = message.get("content")
+    if isinstance(content, list):
+        for part in content:
+            if not isinstance(part, dict):
+                continue
+            if part.get("type") != "image_url":
+                continue
+            url = ((part.get("image_url") or {}).get("url") or "").strip()
+            if url.startswith("data:"):
+                refs.append({"kind": "data_url", "value": url})
+            elif url.startswith("http"):
+                refs.append({"kind": "url", "value": url})
+
+    # 4) 极端兼容:文本中可能出现 data:image 或 http 图片 URL
+    if isinstance(content, str):
+        # data URL
+        for m in re.finditer(r"(data:image\/[a-zA-Z0-9.+-]+;base64,[A-Za-z0-9+/=]+)", content):
+            refs.append({"kind": "data_url", "value": m.group(1)})
+        # http(s) 图片链接
+        for m in re.finditer(r"(https?://\S+\.(?:png|jpg|jpeg|webp))", content, flags=re.IGNORECASE):
+            refs.append({"kind": "url", "value": m.group(1)})
+
+    return refs
+
+
+def _mime_to_ext(mime_type: str) -> str:
+    """MIME 类型映射到扩展名。"""
+    mapping = {
+        "image/png": ".png",
+        "image/jpeg": ".jpg",
+        "image/webp": ".webp",
+    }
+    return mapping.get(mime_type.lower(), ".png")
+
+
+def _normalize_model_id(model_id: str) -> str:
+    """
+    规范化常见误写模型 ID,减少无效重试。
+    """
+    if not model_id:
+        return model_id
+    m = model_id.strip()
+    # 常见误写:gemini/gemini-xxx -> google/gemini-xxx
+    if m.startswith("gemini/"):
+        m = "google/" + m.split("/", 1)[1]
+    # 常见顺序误写:preview-image -> image
+    if "gemini-2.5-flash-preview-image" in m:
+        m = m.replace("gemini-2.5-flash-preview-image", "gemini-2.5-flash-image")
+    # 兼容旧 ID 到当前可用 ID
+    if "gemini-2.5-flash-image-preview" in m:
+        m = m.replace("gemini-2.5-flash-image-preview", "gemini-2.5-flash-image")
+    return m
+
+
+@tool(description="可以提取图片中的特征,也可以根据描述生成图片")
+async def nanobanana(
+    image_path: str = "",
+    image_paths: Optional[List[str]] = None,
+    output_file: Optional[str] = None,
+    prompt: Optional[str] = None,
+    model: Optional[str] = None,
+    max_tokens: int = 1200,
+    generate_image: bool = False,
+    image_output_path: Optional[str] = None,
+) -> ToolResult:
+    """
+    可以提取图片中的特征,也可以根据描述生成图片。
+
+    Args:
+        image_path: 输入图片路径(单图模式,可选)
+        image_paths: 输入图片路径列表(多图整体模式,可选)
+        output_file: 输出 JSON 文件路径(可选,用于特征提取模式)
+        prompt: 自定义提取指令或生成描述(可选)
+        model: OpenRouter 模型名(可选,默认读取 NANOBANANA_MODEL 或使用 Gemini 视觉模型)
+        max_tokens: 最大输出 token
+        generate_image: 是否生成图片(False=提取特征,True=生成图片)
+        image_output_path: 生成图片保存路径(generate_image=True 时可选)
+
+    Returns:
+        ToolResult: 包含结构化特征和输出文件路径,或生成的图片路径
+    """
+    raw_paths: List[str] = []
+    if image_paths:
+        raw_paths.extend(image_paths)
+    if image_path:
+        raw_paths.append(image_path)
+    if not raw_paths:
+        return ToolResult(
+            title="NanoBanana 提取失败",
+            output="",
+            error="未提供输入图片,请传入 image_path 或 image_paths",
+        )
+
+    # 去重并检查路径
+    unique_raw: List[str] = []
+    seen = set()
+    for p in raw_paths:
+        if p and p not in seen:
+            unique_raw.append(p)
+            seen.add(p)
+
+    input_paths: List[Path] = [Path(p) for p in unique_raw]
+    invalid = [str(p) for p in input_paths if (not p.exists() or not p.is_file())]
+    if invalid:
+        return ToolResult(
+            title="NanoBanana 提取失败",
+            output="",
+            error=f"以下图片不存在或不可读: {invalid}",
+        )
+
+    api_key = _resolve_api_key()
+    if not api_key:
+        return ToolResult(
+            title="NanoBanana 提取失败",
+            output="",
+            error="未找到 OpenRouter API Key,请设置 OPENROUTER_API_KEY 或 OPEN_ROUTER_API_KEY",
+        )
+
+    if generate_image:
+        user_prompt = prompt or DEFAULT_IMAGE_PROMPT
+    else:
+        chosen_model = model or os.getenv("NANOBANANA_MODEL") or "google/gemini-2.5-flash"
+        user_prompt = prompt or DEFAULT_EXTRACTION_PROMPT
+
+    try:
+        image_data_urls = [_image_to_data_url(p) for p in input_paths]
+    except Exception as e:
+        return ToolResult(
+            title="NanoBanana 提取失败",
+            output="",
+            error=f"图片编码失败: {e}",
+        )
+
+    user_content: List[Dict[str, Any]] = [{"type": "text", "text": user_prompt}]
+    for u in image_data_urls:
+        user_content.append({"type": "image_url", "image_url": {"url": u}})
+
+    payload: Dict[str, Any] = {
+        "messages": [
+            {
+                "role": "system",
+                "content": (
+                    "你是视觉助手。"
+                    "当任务为特征提取时输出 JSON 对象,不要输出 markdown。"
+                    "当任务为图像生成时请返回图像。"
+                ),
+            },
+            {
+                "role": "user",
+                "content": user_content,
+            },
+        ],
+        "temperature": 0.2,
+        "max_tokens": max_tokens,
+    }
+    if generate_image:
+        payload["modalities"] = ["image", "text"]
+
+    headers = {
+        "Authorization": f"Bearer {api_key}",
+        "Content-Type": "application/json",
+        "HTTP-Referer": "https://local-agent",
+        "X-Title": "Agent NanoBanana Tool",
+    }
+
+    endpoint = f"{OPENROUTER_BASE_URL}/chat/completions"
+
+    # 图像生成模式:自动尝试多个可用模型,减少 404/invalid model 影响
+    if generate_image:
+        candidates: List[str] = []
+        if model:
+            candidates.append(_normalize_model_id(model))
+        if env_model := os.getenv("NANOBANANA_IMAGE_MODEL"):
+            candidates.append(_normalize_model_id(env_model))
+        candidates.extend([_normalize_model_id(x) for x in DEFAULT_IMAGE_MODEL_CANDIDATES])
+        # 去重并保持顺序
+        dedup: List[str] = []
+        seen = set()
+        for m in candidates:
+            if m and m not in seen:
+                dedup.append(m)
+                seen.add(m)
+        candidates = dedup
+    else:
+        candidates = [chosen_model]
+
+    data: Optional[Dict[str, Any]] = None
+    used_model: Optional[str] = None
+    errors: List[Dict[str, Any]] = []
+
+    for cand in candidates:
+        modality_attempts: List[Optional[List[str]]] = [None]
+        if generate_image:
+            modality_attempts = [["image", "text"], ["image"], None]
+
+        for mods in modality_attempts:
+            trial_payload = dict(payload)
+            trial_payload["model"] = cand
+
+            if mods is None:
+                trial_payload.pop("modalities", None)
+            else:
+                trial_payload["modalities"] = mods
+
+            try:
+                async with httpx.AsyncClient(timeout=DEFAULT_TIMEOUT) as client:
+                    resp = await client.post(endpoint, json=trial_payload, headers=headers)
+                    resp.raise_for_status()
+                    data = resp.json()
+                    used_model = cand
+                    break
+            except httpx.HTTPStatusError as e:
+                errors.append({
+                    "model": cand,
+                    "modalities": mods,
+                    "status_code": e.response.status_code,
+                    "body": e.response.text[:600],
+                })
+                continue
+            except Exception as e:
+                errors.append({
+                    "model": cand,
+                    "modalities": mods,
+                    "status_code": None,
+                    "body": str(e)[:600],
+                })
+                continue
+
+        if data is not None:
+            break
+
+    if data is None:
+        title = "NanoBanana 生成失败" if generate_image else "NanoBanana 提取失败"
+        return ToolResult(
+            title=title,
+            output=json.dumps({"attempted_models": candidates, "errors": errors}, ensure_ascii=False, indent=2),
+            long_term_memory="All candidate models failed for this request",
+            metadata={"attempted_models": candidates, "errors": errors},
+        )
+
+    chosen_model = used_model or candidates[0]
+
+    choices = data.get("choices") or []
+    message = choices[0].get("message", {}) if choices else {}
+
+    # 图像生成分支
+    if generate_image:
+        refs = _extract_image_refs(choices[0] if choices else {}, message)
+        if not refs:
+            content = message.get("content")
+            preview = ""
+            if isinstance(content, str):
+                preview = content[:500]
+            elif isinstance(content, list):
+                preview = json.dumps(content[:3], ensure_ascii=False)[:500]
+
+            return ToolResult(
+                title="NanoBanana 生成失败",
+                output=json.dumps(data, ensure_ascii=False, indent=2),
+                error="模型未返回可解析图片(未在 message.images/choice.images/content 中发现图片)",
+                metadata={
+                    "model": chosen_model,
+                    "choice_keys": list((choices[0] if choices else {}).keys()),
+                    "message_keys": list(message.keys()) if isinstance(message, dict) else [],
+                    "content_preview": preview,
+                },
+            )
+
+        output_paths: List[str] = []
+        if image_output_path:
+            base_path = Path(image_output_path)
+        else:
+            if len(input_paths) > 1:
+                base_path = input_paths[0].parent / "set_generated.png"
+            else:
+                base_path = input_paths[0].parent / f"{input_paths[0].stem}_generated.png"
+        base_path.parent.mkdir(parents=True, exist_ok=True)
+
+        for idx, ref in enumerate(refs):
+            kind = ref.get("kind", "")
+            mime_type = "image/png"
+            raw_bytes: Optional[bytes] = None
+
+            if kind == "data_url":
+                m = re.match(r"^data:([^;]+);base64,(.+)$", ref.get("value", ""), flags=re.DOTALL)
+                if not m:
+                    continue
+                mime_type = m.group(1)
+                raw_bytes = base64.b64decode(m.group(2))
+            elif kind == "base64":
+                mime_type = ref.get("mime_type", "image/png")
+                raw_bytes = base64.b64decode(ref.get("value", ""))
+            elif kind == "url":
+                url = ref.get("value", "")
+                try:
+                    with httpx.Client(timeout=DEFAULT_TIMEOUT) as client:
+                        r = client.get(url)
+                        r.raise_for_status()
+                        raw_bytes = r.content
+                        mime_type = r.headers.get("content-type", "image/png").split(";")[0]
+                except Exception:
+                    continue
+            else:
+                continue
+
+            if not raw_bytes:
+                continue
+
+            ext = _mime_to_ext(mime_type)
+            if len(refs) == 1:
+                target = base_path
+                if target.suffix.lower() not in [".png", ".jpg", ".jpeg", ".webp"]:
+                    target = target.with_suffix(ext)
+            else:
+                stem = base_path.stem
+                target = base_path.with_name(f"{stem}_{idx+1}{ext}")
+            try:
+                target.write_bytes(raw_bytes)
+                output_paths.append(str(target))
+            except Exception as e:
+                return ToolResult(
+                    title="NanoBanana 生成失败",
+                    output="",
+                    error=f"写入生成图片失败: {e}",
+                    metadata={"model": chosen_model},
+                )
+
+        if not output_paths:
+            return ToolResult(
+                title="NanoBanana 生成失败",
+                output=json.dumps(data, ensure_ascii=False, indent=2),
+                error="检测到图片引用但写入失败(可能是无效 base64 或 URL 不可访问)",
+                metadata={"model": chosen_model, "ref_count": len(refs)},
+            )
+
+        usage = data.get("usage", {})
+        prompt_tokens = usage.get("prompt_tokens") or usage.get("input_tokens", 0)
+        completion_tokens = usage.get("completion_tokens") or usage.get("output_tokens", 0)
+        summary = {
+            "model": chosen_model,
+            "input_images": [str(p) for p in input_paths],
+            "input_count": len(input_paths),
+            "generated_images": output_paths,
+            "prompt_tokens": prompt_tokens,
+            "completion_tokens": completion_tokens,
+        }
+        return ToolResult(
+            title="NanoBanana 图片生成完成",
+            output=json.dumps({"summary": summary}, ensure_ascii=False, indent=2),
+            long_term_memory=f"Generated {len(output_paths)} image(s) from {len(input_paths)} input image(s) using {chosen_model}",
+            attachments=output_paths,
+            metadata=summary,
+        )
+
+    content = message.get("content") or ""
+    if not content:
+        return ToolResult(
+            title="NanoBanana 提取失败",
+            output=json.dumps(data, ensure_ascii=False, indent=2),
+            error="模型未返回内容",
+        )
+
+    try:
+        parsed = _safe_json_parse(content)
+    except Exception as e:
+        return ToolResult(
+            title="NanoBanana 提取失败",
+            output=content,
+            error=f"模型返回非 JSON 内容,解析失败: {e}",
+            metadata={"model": chosen_model},
+        )
+
+    if output_file:
+        out_path = Path(output_file)
+    else:
+        if len(input_paths) > 1:
+            out_path = input_paths[0].parent / "set_invariant_features.json"
+        else:
+            out_path = input_paths[0].parent / f"{input_paths[0].stem}_invariant_features.json"
+
+    out_path.parent.mkdir(parents=True, exist_ok=True)
+    out_path.write_text(json.dumps(parsed, ensure_ascii=False, indent=2), encoding="utf-8")
+
+    usage = data.get("usage", {})
+    prompt_tokens = usage.get("prompt_tokens") or usage.get("input_tokens", 0)
+    completion_tokens = usage.get("completion_tokens") or usage.get("output_tokens", 0)
+
+    summary = {
+        "model": chosen_model,
+        "input_images": [str(p) for p in input_paths],
+        "input_count": len(input_paths),
+        "output_file": str(out_path),
+        "prompt_tokens": prompt_tokens,
+        "completion_tokens": completion_tokens,
+    }
+
+    return ToolResult(
+        title="NanoBanana 不变特征提取完成",
+        output=json.dumps(
+            {
+                "summary": summary,
+                "features": parsed,
+            },
+            ensure_ascii=False,
+            indent=2,
+        ),
+        long_term_memory=f"Extracted invariant features from {len(input_paths)} input image(s) using {chosen_model}",
+        attachments=[str(out_path)],
+        metadata=summary,
+    )

+ 0 - 39
examples/find knowledge/使用说明.txt

@@ -1,39 +0,0 @@
-多模态特征可视化 HTML 使用说明
-=====================================
-
-文件位置:
-features_visualization.html
-
-功能特性:
-1. ✅ 展示所有 9 张原始图片,点击可放大查看
-2. ✅ 展示 7 个多模态特征维度的详细信息
-3. ✅ 每个维度包含:
-   - 提取原因和描述
-   - 使用的工具
-   - 生成模型用途
-   - 关联的亮点聚类
-4. ✅ 点击维度可展开查看所有特征图片
-5. ✅ 特征图片可点击放大
-6. ✅ 特殊展示:
-   - color_palette: 显示色彩调色板色块
-   - color_distribution: 显示 HSV 统计数据(绿色/白色/亮度/饱和度)
-7. ✅ 原始图片卡片显示关联的聚类标签和色彩统计
-
-使用方法:
-1. 在浏览器中打开 features_visualization.html
-2. 滚动查看原始图片和特征维度
-3. 点击任意图片可放大查看
-4. 点击维度标题或"展开查看"按钮查看该维度的所有特征图片
-5. 按 ESC 键或点击背景关闭放大的图片
-
-技术特点:
-- 响应式设计,自适应不同屏幕尺寸
-- 懒加载图片,提升性能
-- 交互式展开/收起,按需加载
-- 美观的渐变色设计
-- 完整的数据可视化
-
-数据来源:
-- overview_mapping.json: 包含所有映射关系和元数据
-- input/: 原始图片
-- output/features/: 7 个维度的特征图片和 JSON 数据

+ 0 - 65
examples/find knowledge/更新说明.txt

@@ -1,65 +0,0 @@
-HTML 可视化文件更新说明
-=====================================
-
-更新时间:2026-03-03
-文件:features_visualization.html
-
-本次更新内容:
-
-✅ 1. 所有特征维度默认展开
-   - 打开页面后,所有7个维度的特征图片自动加载并显示
-   - 不需要手动点击"展开查看"按钮
-   - 可以点击维度标题或按钮来收起/展开
-
-✅ 2. 色彩调色板显示优化
-   - 网格视图中显示原图(而不是色彩条)
-   - 色彩条保留在图片下方
-   - 点击放大后仍然显示原图+特征图对比
-   - 更直观地看到色彩提取效果
-
-✅ 3. 添加详细的特征对应信息
-   每个维度现在显示:
-
-   📝 描述(可点击展开/收起工具信息)
-   - 点击描述区域可以展开或收起工具详细信息
-
-   🛠️ 提取工具、📄 格式、🎯 生成模型用途(可折叠)
-   - 默认收起,点击描述区域展开
-   - 显示提取工具、格式和生成模型用途
-
-   📍 来源亮点(始终显示)
-   - 列出该维度对应的亮点聚类
-   - 说明为什么需要提取这个维度
-
-   🎯 制作表特征对应(始终显示)
-   - 列出该维度对应的制作表中的具体特征
-   - 显示评分范围
-   - 说明特征如何映射到维度值
-
-   📦 输出文件(始终显示)
-   - 说明该维度生成了哪些文件
-   - 文件格式和规格
-   - 文件数量
-
-功能特性(保持不变):
-- ✅ 点击任意图片可放大查看
-- ✅ 点击特征图片时,左侧显示原图,右侧显示特征图
-- ✅ 按 ESC 键或点击背景关闭放大视图
-- ✅ 响应式设计,自适应屏幕大小
-- ✅ 色彩调色板显示色块和十六进制值
-- ✅ HSV 分布显示统计数据
-
-使用方法:
-1. 在浏览器中打开 features_visualization.html
-2. 页面自动加载所有内容
-3. 滚动查看各个维度的详细信息和特征图片
-4. 点击任意图片放大查看
-5. 阅读每个维度的来源、对应关系和输出说明
-
-数据完整性:
-- 9张原始图片
-- 7个特征维度
-- 63个特征图片(9×7)
-- 18个JSON数据文件(color_palette和color_distribution各9个)
-- 6个亮点聚类
-- 完整的映射关系

Некоторые файлы не были показаны из-за большого количества измененных файлов