File size: 3,367 Bytes
a10ba7f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import matplotlib.pyplot as plt
import numpy as np
import os

# Sử dụng style chuyên nghiệp
plt.style.use('ggplot')

# 1. Định nghĩa dữ liệu mở rộng tối đa (SOTA + Internal Variants)
models = [
    'iTracker', 'GazeNet', 'FullFace', 'RT-Gene', 
    'AFF-Net', 'MobileNetV3', 'L2CS-Net (Teacher)', 
    'FAZE (Few-shot)', 'ETH-XGaze (R18)',
    'LIPE V16 (Baseline)', 'LIPE V2 GOLD (Ours)', 'LIPE V6 (Stabilizer)'
]

# Trục Y: Sai số (MAE độ)
mae = [6.8, 6.2, 5.5, 5.3, 4.8, 6.0, 4.5, 4.0, 4.4, 6.2, 5.2, 5.0]             

# Trục X: Complexity (GFLOPs)
gflops = [3.20, 1.20, 2.10, 1.60, 0.15, 0.05, 1.80, 0.45, 1.80, 0.0019, 0.00234, 0.021] 

# Kích thước bong bóng: Tham số (Millions)
params = [35.0, 11.5, 50.0, 15.0, 4.5, 1.5, 25.0, 10.0, 11.7, 0.12, 0.18, 0.51]       

# Quy đổi kích thước bong bóng
bubble_sizes = [p * 30 + 100 for p in params] 

# 2. Khởi tạo đồ thị
plt.figure(figsize=(14, 9), dpi=300)

# Bảng màu mở rộng
colors = [
    '#7f8c8d', '#34495e', '#2c3e50', '#2980b9', 
    '#27ae60', '#a3cb38', '#c0392b', '#8e44ad', '#16a085',
    '#edae49', '#f1c40f', '#e67e22'
] 

# 3. Vẽ đồ thị bong bóng
scatter = plt.scatter(gflops, mae, s=bubble_sizes, c=colors, alpha=0.8, edgecolors='black', linewidth=1.0)

# 4. Cấu hình trục Logarit cho Complexity
plt.xscale('log')

# 5. Thêm nhãn và Annotations (Tinh chỉnh offset để né nhau)
for i, txt in enumerate(models):
    offset = (12, 5)
    if 'GOLD' in txt: offset = (15, -12)
    elif 'Stabilizer' in txt: offset = (15, 5)
    elif 'Baseline' in txt: offset = (-130, -5)
    elif 'MobileNet' in txt: offset = (-120, 5)
    elif 'AFF-Net' in txt: offset = (-65, -15)
    elif 'FAZE' in txt: offset = (15, 5)
    elif 'L2CS' in txt: offset = (15, -10)
    elif 'ETH' in txt: offset = (-110, 10)
    elif 'FullFace' in txt: offset = (-70, 10)
    
    plt.annotate(txt, (gflops[i], mae[i]), xytext=offset, textcoords='offset points', 
                 fontsize=9, fontweight='bold' if 'GOLD' in txt else 'normal',
                 bbox=dict(boxstyle='round,pad=0.2', fc='white', alpha=0.7, ec='none'))

# 6. Mũi tên định hướng tối ưu
plt.annotate('TinyML Pareto Front', xy=(0.0015, 4.8), xytext=(0.05, 4.2),
             arrowprops=dict(facecolor='#e74c3c', shrink=0.05, width=1.2, headwidth=7),
             fontsize=10, fontweight='bold', color='#e74c3c')

# 7. Tiêu đề và nhãn
plt.xlabel(r'$\leftarrow$ Computational Complexity (GFLOPs in Log Scale)', fontsize=12, fontweight='bold')
plt.ylabel(r'$\leftarrow$ Estimation Error (MAE in Degree)', fontsize=12, fontweight='bold')
plt.title('Comprehensive SOTA Comparison: Accuracy vs. Efficiency', fontsize=15, fontweight='bold', pad=25)

plt.xlim(0.0004, 10.0)
plt.ylim(3.5, 7.5)

# 8. Legend cho tham số
for p in [0.18, 1.5, 11.7, 50.0]:
    label = f"{p}M (GOLD)" if p == 0.18 else f"{p}M"
    plt.scatter([], [], c='gray', alpha=0.5, s=p*30+100, label=label, edgecolors='black')
plt.legend(title="Model Footprint (#Params)", loc="upper right", frameon=True, fontsize=9)

plt.grid(True, which="both", ls="-", alpha=0.3)
plt.tight_layout()

# Lưu file ảnh
output_path = 'comprehensive_sota_tradeoff.png'
plt.savefig(output_path, bbox_inches='tight')
print(f"Biểu đồ SOTA toàn diện đã được lưu tại: {os.path.abspath(output_path)}")