Python数据分析实战:万物识别结果的可视化与统计

想象一下,你刚用“万物识别-中文-通用领域”镜像处理完一批图片,拿到了几百条识别结果。看着返回的JSON数据,你可能会有点懵——这么多数据,到底该怎么看?哪些物体出现得最多?识别结果的质量怎么样?有没有什么规律可循?

这就是我们今天要解决的问题。单纯拿到识别结果只是第一步,真正让数据产生价值,需要我们对结果进行深度分析和可视化。这篇文章,我就带你用Python的数据分析三板斧——Pandas、Matplotlib和Seaborn,把这些看似枯燥的识别结果变成直观的图表和有用的洞察。

1. 从原始数据到结构化分析

万物识别模型返回的结果,通常是JSON格式。直接看这些数据,信息是零散的。我们的第一步,就是把这些数据整理成结构化的表格,方便后续分析。

1.1 解析识别结果数据

假设我们已经通过镜像处理了一批图片,得到了如下的识别结果列表:

import json
import pandas as pd
from datetime import datetime

# 模拟的识别结果数据(实际数据会更多)
recognition_results = [
    {
        "image_id": "img_001.jpg",
        "timestamp": "2024-01-15 10:30:25",
        "recognition_result": {
            "labels": ["狗", "草地", "飞盘"],
            "confidences": [0.92, 0.87, 0.78],
            "primary_object": "狗"
        }
    },
    {
        "image_id": "img_002.jpg",
        "timestamp": "2024-01-15 10:31:10",
        "recognition_result": {
            "labels": ["咖啡杯", "笔记本电脑", "书", "眼镜"],
            "confidences": [0.95, 0.89, 0.82, 0.76],
            "primary_object": "咖啡杯"
        }
    },
    {
        "image_id": "img_003.jpg",
        "timestamp": "2024-01-15 10:32:45",
        "recognition_result": {
            "labels": ["猫", "沙发", "毛线球"],
            "confidences": [0.94, 0.85, 0.71],
            "primary_object": "猫"
        }
    },
    # ... 更多数据
]

# 将数据转换为DataFrame
def parse_recognition_data(results):
    """解析识别结果,转换为结构化的DataFrame"""
    records = []
    
    for result in results:
        image_id = result["image_id"]
        timestamp = result["timestamp"]
        rec_result = result["recognition_result"]
        
        # 每个标签单独作为一条记录
        for label, confidence in zip(rec_result["labels"], rec_result["confidences"]):
            records.append({
                "image_id": image_id,
                "timestamp": timestamp,
                "label": label,
                "confidence": confidence,
                "is_primary": (label == rec_result["primary_object"])
            })
    
    return pd.DataFrame(records)

# 创建DataFrame
df = parse_recognition_data(recognition_results)
print("数据概览:")
print(f"总记录数:{len(df)}")
print(f"唯一图片数:{df['image_id'].nunique()}")
print(f"唯一标签数:{df['label'].nunique()}")
print("\n前5条数据:")
print(df.head())

运行这段代码,你会看到一个结构清晰的表格,每一行代表一个图片中的一个识别物体,包含了图片ID、时间戳、物体标签、置信度和是否为主要物体等信息。

1.2 数据清洗与预处理

原始数据可能会有一些需要处理的地方,比如重复的标签、置信度过低的识别结果等。我们可以添加一些数据清洗的步骤:

def clean_recognition_data(df, min_confidence=0.5):
    """清洗识别数据"""
    
    # 创建副本,避免修改原始数据
    df_clean = df.copy()
    
    # 1. 过滤低置信度的识别结果
    print(f"过滤前记录数:{len(df_clean)}")
    df_clean = df_clean[df_clean['confidence'] >= min_confidence]
    print(f"过滤低置信度(<{min_confidence})后记录数:{len(df_clean)}")
    
    # 2. 处理时间戳
    df_clean['timestamp'] = pd.to_datetime(df_clean['timestamp'])
    df_clean['hour'] = df_clean['timestamp'].dt.hour
    df_clean['date'] = df_clean['timestamp'].dt.date
    
    # 3. 添加置信度等级
    def get_confidence_level(conf):
        if conf >= 0.9:
            return "高置信度"
        elif conf >= 0.7:
            return "中置信度"
        else:
            return "低置信度"
    
    df_clean['confidence_level'] = df_clean['confidence'].apply(get_confidence_level)
    
    return df_clean

# 清洗数据
df_clean = clean_recognition_data(df, min_confidence=0.6)
print("\n清洗后的数据信息:")
print(df_clean.info())

2. 基础统计分析:发现数据中的规律

有了干净的数据,我们就可以开始进行各种统计分析了。这些分析能帮助我们快速了解识别结果的整体情况。

2.1 物体出现频率分析

哪些物体被识别得最多?这是最基础也最重要的问题。

import matplotlib.pyplot as plt
import seaborn as sns

# 设置中文字体(如果需要显示中文标签)
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False

def analyze_label_frequency(df, top_n=15):
    """分析标签出现频率"""
    
    # 统计每个标签的出现次数
    label_counts = df['label'].value_counts()
    
    print("=== 物体出现频率分析 ===")
    print(f"总共识别到 {len(label_counts)} 种不同物体")
    print(f"\n出现次数最多的前{top_n}个物体:")
    for i, (label, count) in enumerate(label_counts.head(top_n).items(), 1):
        print(f"{i:2d}. {label:10s} - {count:3d}次")
    
    # 可视化
    fig, axes = plt.subplots(1, 2, figsize=(14, 6))
    
    # 条形图:前N个最常见物体
    top_labels = label_counts.head(top_n)
    axes[0].barh(range(len(top_labels)), top_labels.values)
    axes[0].set_yticks(range(len(top_labels)))
    axes[0].set_yticklabels(top_labels.index)
    axes[0].set_xlabel('出现次数')
    axes[0].set_title(f'前{top_n}个最常见识别物体')
    axes[0].invert_yaxis()  # 让最多的显示在最上面
    
    # 饼图:前5个物体的占比
    top5_labels = label_counts.head(5)
    other_count = label_counts[5:].sum()
    pie_data = list(top5_labels.values) + [other_count]
    pie_labels = list(top5_labels.index) + ['其他']
    
    axes[1].pie(pie_data, labels=pie_labels, autopct='%1.1f%%', startangle=90)
    axes[1].set_title('识别物体分布(前5名 vs 其他)')
    
    plt.tight_layout()
    plt.show()
    
    return label_counts

# 执行频率分析
label_counts = analyze_label_frequency(df_clean, top_n=10)

2.2 置信度分布分析

识别结果的置信度怎么样?整体质量如何?

def analyze_confidence_distribution(df):
    """分析置信度分布"""
    
    print("=== 置信度分布分析 ===")
    print(f"平均置信度:{df['confidence'].mean():.3f}")
    print(f"置信度中位数:{df['confidence'].median():.3f}")
    print(f"置信度标准差:{df['confidence'].std():.3f}")
    
    # 按置信度等级统计
    conf_level_stats = df['confidence_level'].value_counts()
    print("\n按置信度等级统计:")
    for level, count in conf_level_stats.items():
        percentage = count / len(df) * 100
        print(f"{level}: {count}次 ({percentage:.1f}%)")
    
    # 可视化
    fig, axes = plt.subplots(1, 3, figsize=(15, 5))
    
    # 1. 置信度直方图
    axes[0].hist(df['confidence'], bins=20, edgecolor='black', alpha=0.7)
    axes[0].axvline(df['confidence'].mean(), color='red', linestyle='--', 
                   label=f'均值: {df["confidence"].mean():.2f}')
    axes[0].axvline(df['confidence'].median(), color='green', linestyle='--', 
                   label=f'中位数: {df["confidence"].median():.2f}')
    axes[0].set_xlabel('置信度')
    axes[0].set_ylabel('频次')
    axes[0].set_title('置信度分布直方图')
    axes[0].legend()
    axes[0].grid(True, alpha=0.3)
    
    # 2. 箱线图
    axes[1].boxplot(df['confidence'], vert=True)
    axes[1].set_ylabel('置信度')
    axes[1].set_title('置信度箱线图')
    axes[1].grid(True, alpha=0.3)
    
    # 3. 置信度等级饼图
    conf_level_counts = df['confidence_level'].value_counts()
    axes[2].pie(conf_level_counts.values, labels=conf_level_counts.index, 
                autopct='%1.1f%%', startangle=90)
    axes[2].set_title('置信度等级分布')
    
    plt.tight_layout()
    plt.show()

# 执行置信度分析
analyze_confidence_distribution(df_clean)

2.3 时间趋势分析

如果你的图片是在不同时间拍摄或处理的,还可以分析识别结果随时间的变化。

def analyze_time_trends(df):
    """分析时间趋势"""
    
    # 按小时分析
    hourly_stats = df.groupby('hour').agg({
        'image_id': 'nunique',  # 不同图片数
        'label': 'count',       # 总识别数
        'confidence': 'mean'    # 平均置信度
    }).rename(columns={
        'image_id': '图片数量',
        'label': '识别总数',
        'confidence': '平均置信度'
    })
    
    print("=== 时间趋势分析 ===")
    print("按小时统计的识别情况:")
    print(hourly_stats)
    
    # 可视化
    fig, axes = plt.subplots(2, 2, figsize=(14, 10))
    
    # 1. 每小时识别数量
    axes[0, 0].plot(hourly_stats.index, hourly_stats['识别总数'], 
                    marker='o', linewidth=2)
    axes[0, 0].set_xlabel('小时')
    axes[0, 0].set_ylabel('识别总数')
    axes[0, 0].set_title('每小时识别物体总数')
    axes[0, 0].grid(True, alpha=0.3)
    axes[0, 0].set_xticks(range(0, 24, 2))
    
    # 2. 每小时平均置信度
    axes[0, 1].bar(hourly_stats.index, hourly_stats['平均置信度'], 
                   alpha=0.7)
    axes[0, 1].set_xlabel('小时')
    axes[0, 1].set_ylabel('平均置信度')
    axes[0, 1].set_title('每小时平均置信度')
    axes[0, 1].grid(True, alpha=0.3)
    axes[0, 1].set_xticks(range(0, 24, 2))
    
    # 3. 每小时处理的图片数量
    axes[1, 0].plot(hourly_stats.index, hourly_stats['图片数量'], 
                    marker='s', linewidth=2, color='green')
    axes[1, 0].set_xlabel('小时')
    axes[1, 0].set_ylabel('图片数量')
    axes[1, 0].set_title('每小时处理图片数量')
    axes[1, 0].grid(True, alpha=0.3)
    axes[1, 0].set_xticks(range(0, 24, 2))
    
    # 4. 热力图:小时 vs 置信度等级
    # 创建透视表
    heatmap_data = pd.crosstab(df['hour'], df['confidence_level'])
    sns.heatmap(heatmap_data, annot=True, fmt='d', cmap='YlOrRd', 
                ax=axes[1, 1])
    axes[1, 1].set_xlabel('置信度等级')
    axes[1, 1].set_ylabel('小时')
    axes[1, 1].set_title('小时 vs 置信度等级热力图')
    
    plt.tight_layout()
    plt.show()
    
    return hourly_stats

# 执行时间趋势分析(如果有时间数据的话)
if 'hour' in df_clean.columns:
    hourly_stats = analyze_time_trends(df_clean)

3. 高级分析与洞察挖掘

基础统计能告诉我们"是什么",但更深入的分析能告诉我们"为什么"和"怎么办"。

3.1 物体共现分析

哪些物体经常一起出现?这能帮助我们理解场景的构成。

def analyze_co_occurrence(df):
    """分析物体共现关系"""
    
    # 按图片分组,获取每张图片中的所有标签
    image_groups = df.groupby('image_id')['label'].apply(list)
    
    # 创建共现矩阵
    from itertools import combinations
    from collections import defaultdict
    
    co_occurrence = defaultdict(int)
    
    for labels in image_groups:
        # 对每张图片中的标签两两组合
        for label1, label2 in combinations(sorted(set(labels)), 2):
            co_occurrence[(label1, label2)] += 1
    
    # 转换为DataFrame
    co_df = pd.DataFrame([
        {'label1': k[0], 'label2': k[1], 'count': v}
        for k, v in co_occurrence.items()
    ])
    
    # 只保留出现次数较多的共现关系
    co_df = co_df[co_df['count'] > 1].sort_values('count', ascending=False)
    
    print("=== 物体共现分析 ===")
    print(f"发现 {len(co_df)} 对频繁共现的物体")
    print("\n最常见的共现关系:")
    for i, row in co_df.head(10).iterrows():
        print(f"{row['label1']} & {row['label2']}: {row['count']}次")
    
    # 可视化:网络图(需要networkx库)
    try:
        import networkx as nx
        
        # 创建图
        G = nx.Graph()
        
        # 添加节点和边
        for _, row in co_df.head(20).iterrows():  # 只显示前20个关系
            G.add_edge(row['label1'], row['label2'], weight=row['count'])
        
        # 绘制网络图
        plt.figure(figsize=(12, 8))
        
        # 节点大小基于度数
        node_sizes = [G.degree(node) * 100 for node in G.nodes()]
        
        # 边宽度基于共现次数
        edge_widths = [G[u][v]['weight'] * 0.5 for u, v in G.edges()]
        
        pos = nx.spring_layout(G, seed=42)
        nx.draw_networkx_nodes(G, pos, node_size=node_sizes, 
                              node_color='lightblue', alpha=0.8)
        nx.draw_networkx_edges(G, pos, width=edge_widths, 
                              alpha=0.5, edge_color='gray')
        nx.draw_networkx_labels(G, pos, font_size=10)
        
        plt.title('物体共现关系网络图')
        plt.axis('off')
        plt.show()
        
    except ImportError:
        print("提示:安装networkx库可以生成共现关系网络图")
        print("安装命令:pip install networkx")
    
    return co_df

# 执行共现分析
co_df = analyze_co_occurrence(df_clean)

3.2 主要物体分析

每张图片的主要识别物体是什么?这些主要物体的分布情况如何?

def analyze_primary_objects(df):
    """分析主要物体"""
    
    # 筛选主要物体
    primary_df = df[df['is_primary'] == True]
    
    print("=== 主要物体分析 ===")
    print(f"总共 {len(primary_df)} 张图片有主要物体识别")
    
    # 主要物体分布
    primary_counts = primary_df['label'].value_counts()
    
    print(f"\n出现最多的主要物体:")
    for i, (label, count) in enumerate(primary_counts.head(10).items(), 1):
        percentage = count / len(primary_df) * 100
        print(f"{i:2d}. {label:10s} - {count:3d}次 ({percentage:.1f}%)")
    
    # 主要物体的置信度分析
    primary_conf_stats = primary_df['confidence'].describe()
    print(f"\n主要物体置信度统计:")
    print(f"平均置信度:{primary_conf_stats['mean']:.3f}")
    print(f"中位数:{primary_conf_stats['50%']:.3f}")
    print(f"最小值:{primary_conf_stats['min']:.3f}")
    print(f"最大值:{primary_conf_stats['max']:.3f}")
    
    # 可视化
    fig, axes = plt.subplots(1, 2, figsize=(14, 6))
    
    # 1. 主要物体分布
    top_primary = primary_counts.head(8)
    axes[0].bar(range(len(top_primary)), top_primary.values)
    axes[0].set_xticks(range(len(top_primary)))
    axes[0].set_xticklabels(top_primary.index, rotation=45, ha='right')
    axes[0].set_ylabel('出现次数')
    axes[0].set_title('最常见的主要物体')
    axes[0].grid(True, alpha=0.3, axis='y')
    
    # 2. 主要物体 vs 非主要物体置信度对比
    primary_conf = df[df['is_primary'] == True]['confidence']
    non_primary_conf = df[df['is_primary'] == False]['confidence']
    
    box_data = [primary_conf, non_primary_conf]
    axes[1].boxplot(box_data, labels=['主要物体', '非主要物体'])
    axes[1].set_ylabel('置信度')
    axes[1].set_title('主要物体 vs 非主要物体置信度对比')
    axes[1].grid(True, alpha=0.3)
    
    # 添加均值线
    for i, data in enumerate(box_data, 1):
        axes[1].plot([i-0.2, i+0.2], [data.mean(), data.mean()], 
                    color='red', linewidth=2)
    
    plt.tight_layout()
    plt.show()
    
    return primary_df

# 执行主要物体分析
primary_df = analyze_primary_objects(df_clean)

3.3 自定义场景分析

根据你的具体需求,还可以进行更定制化的分析。比如,如果你处理的是电商商品图片:

def analyze_ecommerce_scenario(df):
    """电商场景专项分析"""
    
    # 定义电商相关标签(示例)
    ecommerce_categories = {
        '服装': ['衬衫', '裤子', '裙子', '外套', '鞋子', '帽子'],
        '电子产品': ['手机', '笔记本电脑', '耳机', '相机', '平板电脑'],
        '家居': ['沙发', '桌子', '椅子', '床', '灯具'],
        '食品': ['水果', '蔬菜', '饮料', '零食', '面包'],
        '美妆': ['口红', '香水', '护肤品', '化妆品']
    }
    
    # 为每个识别结果添加类别
    def get_category(label):
        for category, items in ecommerce_categories.items():
            if label in items:
                return category
        return '其他'
    
    df_with_category = df.copy()
    df_with_category['category'] = df_with_category['label'].apply(get_category)
    
    # 按类别分析
    category_stats = df_with_category.groupby('category').agg({
        'label': 'count',
        'confidence': 'mean',
        'image_id': 'nunique'
    }).rename(columns={
        'label': '识别次数',
        'confidence': '平均置信度',
        'image_id': '涉及图片数'
    }).sort_values('识别次数', ascending=False)
    
    print("=== 电商场景分析 ===")
    print("按商品类别统计:")
    print(category_stats)
    
    # 可视化
    fig, axes = plt.subplots(2, 2, figsize=(14, 10))
    
    # 1. 各类别识别次数
    axes[0, 0].barh(range(len(category_stats)), category_stats['识别次数'])
    axes[0, 0].set_yticks(range(len(category_stats)))
    axes[0, 0].set_yticklabels(category_stats.index)
    axes[0, 0].set_xlabel('识别次数')
    axes[0, 0].set_title('各商品类别识别次数')
    axes[0, 0].invert_yaxis()
    
    # 2. 各类别平均置信度
    colors = plt.cm.Set3(range(len(category_stats)))
    axes[0, 1].bar(range(len(category_stats)), category_stats['平均置信度'], 
                   color=colors)
    axes[0, 1].set_xticks(range(len(category_stats)))
    axes[0, 1].set_xticklabels(category_stats.index, rotation=45, ha='right')
    axes[0, 1].set_ylabel('平均置信度')
    axes[0, 1].set_title('各商品类别平均置信度')
    axes[0, 1].axhline(y=df['confidence'].mean(), color='red', 
                       linestyle='--', label='总体平均')
    axes[0, 1].legend()
    
    # 3. 各类别涉及图片数
    axes[1, 0].pie(category_stats['涉及图片数'], labels=category_stats.index,
                   autopct='%1.1f%%', startangle=90)
    axes[1, 0].set_title('各类别涉及图片数占比')
    
    # 4. 散点图:识别次数 vs 平均置信度
    axes[1, 1].scatter(category_stats['识别次数'], 
                      category_stats['平均置信度'],
                      s=category_stats['涉及图片数']*10,  # 点大小表示图片数
                      alpha=0.6)
    
    # 添加标签
    for idx, row in category_stats.iterrows():
        axes[1, 1].annotate(idx, (row['识别次数'], row['平均置信度']),
                           fontsize=9, ha='center')
    
    axes[1, 1].set_xlabel('识别次数')
    axes[1, 1].set_ylabel('平均置信度')
    axes[1, 1].set_title('识别次数 vs 平均置信度(点大小=涉及图片数)')
    axes[1, 1].grid(True, alpha=0.3)
    
    plt.tight_layout()
    plt.show()
    
    return df_with_category, category_stats

# 执行电商场景分析(如果适用)
# df_with_category, category_stats = analyze_ecommerce_scenario(df_clean)

4. 生成分析报告与自动化

最后,我们可以把所有的分析结果整合成一个完整的报告,甚至可以自动化这个分析流程。

4.1 生成分析报告

def generate_analysis_report(df, output_file='recognition_analysis_report.txt'):
    """生成完整的分析报告"""
    
    report_lines = []
    
    # 报告头部
    report_lines.append("=" * 60)
    report_lines.append("万物识别结果分析报告")
    report_lines.append("=" * 60)
    report_lines.append(f"生成时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
    report_lines.append(f"数据范围:{df['timestamp'].min()} 到 {df['timestamp'].max()}")
    report_lines.append(f"分析图片数:{df['image_id'].nunique()}")
    report_lines.append(f"识别总数:{len(df)}")
    report_lines.append(f"唯一标签数:{df['label'].nunique()}")
    report_lines.append("")
    
    # 基础统计
    report_lines.append("一、基础统计")
    report_lines.append("-" * 40)
    report_lines.append(f"平均置信度:{df['confidence'].mean():.3f}")
    report_lines.append(f"置信度中位数:{df['confidence'].median():.3f}")
    report_lines.append(f"置信度标准差:{df['confidence'].std():.3f}")
    report_lines.append("")
    
    # 最常见物体
    top_labels = df['label'].value_counts().head(10)
    report_lines.append("二、最常见识别物体(前10名)")
    report_lines.append("-" * 40)
    for i, (label, count) in enumerate(top_labels.items(), 1):
        percentage = count / len(df) * 100
        report_lines.append(f"{i:2d}. {label:15s} {count:4d}次 ({percentage:5.1f}%)")
    report_lines.append("")
    
    # 置信度分布
    conf_stats = df['confidence'].describe()
    report_lines.append("三、置信度分布统计")
    report_lines.append("-" * 40)
    report_lines.append(f"最小值:{conf_stats['min']:.3f}")
    report_lines.append(f"25%分位数:{conf_stats['25%']:.3f}")
    report_lines.append(f"中位数:{conf_stats['50%']:.3f}")
    report_lines.append(f"75%分位数:{conf_stats['75%']:.3f}")
    report_lines.append(f"最大值:{conf_stats['max']:.3f}")
    report_lines.append("")
    
    # 主要物体分析
    if 'is_primary' in df.columns:
        primary_df = df[df['is_primary'] == True]
        if len(primary_df) > 0:
            report_lines.append("四、主要物体分析")
            report_lines.append("-" * 40)
            report_lines.append(f"有主要物体的图片数:{len(primary_df)}")
            report_lines.append(f"主要物体平均置信度:{primary_df['confidence'].mean():.3f}")
            
            top_primary = primary_df['label'].value_counts().head(5)
            report_lines.append("\n最常见的主要物体:")
            for i, (label, count) in enumerate(top_primary.items(), 1):
                report_lines.append(f"  {i}. {label} ({count}次)")
    
    # 保存报告
    report_content = "\n".join(report_lines)
    
    with open(output_file, 'w', encoding='utf-8') as f:
        f.write(report_content)
    
    print(f"分析报告已保存到:{output_file}")
    print("\n报告摘要:")
    print(report_content[:500])  # 打印前500字符作为预览
    
    return report_content

# 生成报告
report = generate_analysis_report(df_clean)

4.2 创建自动化分析流水线

如果你需要定期分析识别结果,可以创建一个自动化的分析流水线:

class RecognitionAnalyzer:
    """识别结果分析器"""
    
    def __init__(self, min_confidence=0.6):
        self.min_confidence = min_confidence
        self.df = None
        self.analysis_results = {}
    
    def load_data(self, recognition_results):
        """加载识别结果数据"""
        self.df = parse_recognition_data(recognition_results)
        self.df = clean_recognition_data(self.df, self.min_confidence)
        print(f"数据加载完成,共 {len(self.df)} 条记录")
        return self
    
    def run_full_analysis(self):
        """运行完整分析流程"""
        if self.df is None:
            print("请先加载数据")
            return
        
        print("开始运行完整分析流程...")
        
        # 1. 频率分析
        print("\n1. 进行物体频率分析...")
        self.analysis_results['label_counts'] = analyze_label_frequency(self.df)
        
        # 2. 置信度分析
        print("\n2. 进行置信度分布分析...")
        analyze_confidence_distribution(self.df)
        
        # 3. 主要物体分析
        if 'is_primary' in self.df.columns:
            print("\n3. 进行主要物体分析...")
            self.analysis_results['primary_analysis'] = analyze_primary_objects(self.df)
        
        # 4. 共现分析(如果数据量适中)
        if len(self.df) < 1000:  # 数据量太大时网络图可能不好看
            print("\n4. 进行物体共现分析...")
            self.analysis_results['co_occurrence'] = analyze_co_occurrence(self.df)
        
        # 5. 生成报告
        print("\n5. 生成分析报告...")
        report = generate_analysis_report(self.df)
        self.analysis_results['report'] = report
        
        print("\n分析流程完成!")
        return self
    
    def export_results(self, output_dir='analysis_results'):
        """导出分析结果"""
        import os
        import json
        
        os.makedirs(output_dir, exist_ok=True)
        
        # 导出数据
        if self.df is not None:
            csv_path = os.path.join(output_dir, 'recognition_data.csv')
            self.df.to_csv(csv_path, index=False, encoding='utf-8-sig')
            print(f"数据已导出到:{csv_path}")
        
        # 导出分析结果
        results_path = os.path.join(output_dir, 'analysis_summary.json')
        
        summary = {
            'total_records': len(self.df) if self.df is not None else 0,
            'unique_images': self.df['image_id'].nunique() if self.df is not None else 0,
            'unique_labels': self.df['label'].nunique() if self.df is not None else 0,
            'avg_confidence': float(self.df['confidence'].mean()) if self.df is not None else 0,
            'top_labels': self.analysis_results.get('label_counts', {}).head(10).to_dict()
        }
        
        with open(results_path, 'w', encoding='utf-8') as f:
            json.dump(summary, f, ensure_ascii=False, indent=2)
        
        print(f"分析摘要已导出到:{results_path}")
        
        # 保存图表
        for i, fig in enumerate(plt.get_fignums(), 1):
            fig_path = os.path.join(output_dir, f'chart_{i}.png')
            plt.figure(fig).savefig(fig_path, dpi=150, bbox_inches='tight')
            print(f"图表已保存到:{fig_path}")

# 使用示例
if __name__ == "__main__":
    # 创建分析器实例
    analyzer = RecognitionAnalyzer(min_confidence=0.6)
    
    # 加载数据(这里用模拟数据,实际使用时替换为你的数据)
    analyzer.load_data(recognition_results)
    
    # 运行分析
    analyzer.run_full_analysis()
    
    # 导出结果
    analyzer.export_results()

5. 总结与建议

走完这一整套分析流程,你应该对万物识别的结果有了更深入的理解。从最基础的数据整理,到各种统计分析,再到高级的洞察挖掘,我们一步步把原始的识别结果变成了有价值的洞察。

实际使用中,有几点建议供你参考。首先,分析前一定要先了解你的数据特点,比如图片的来源、拍摄场景、处理目的等,这能帮你选择最合适的分析方法。其次,不要一味追求复杂的分析,有时候最简单的频率统计和置信度分布就能回答最关键的问题。第三,可视化真的很重要,一张好的图表比十页数字表格更有说服力,也更容易发现规律。

这套分析方法不仅适用于万物识别,稍作调整也能用于其他AI模型的输出分析。关键是要理解你的业务需求,选择恰当的分析维度。比如,如果是做内容审核,你可能更关注风险标签的分布;如果是做商品识别,可能需要更精细的类别分析。

最后,数据分析是个迭代的过程。第一次分析可能只能回答一些基础问题,但随着数据积累和需求明确,你可以不断优化分析流程,加入更多定制化的分析维度。希望这篇文章能帮你更好地理解和利用万物识别的结果,让AI的能力真正为你的业务创造价值。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐