File size: 2,466 Bytes
aac350d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23d337e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
88
89
90
91
92
93
94
95
96
97
98
99
100
"""
Normalization-internal DTOs.

These are intermediate objects used by the merger before being promoted
to the cross-layer models in models/reports.py.
"""

from __future__ import annotations

from dataclasses import dataclass, field
from typing import Dict, List, Optional


@dataclass
class NormalizedBox:
    """One face box from one detector."""
    x: int
    y: int
    w: int
    h: int
    confidence: float
    detector: str
    landmarks: Optional[dict] = None


@dataclass
class NormalizedMatch:
    """One recognition match against the gallery."""
    query_face_index: int
    best_match: Optional[str]
    distance: float
    distances: Dict[str, float]
    recognizer: str


@dataclass
class NormalizedScrapeImage:
    url: str
    alt: str
    source_page: str
    scraper: str
    width: Optional[int] = None
    height: Optional[int] = None


@dataclass
class NormalizedReverseMatch:
    image_url: str
    source_page: str
    title: str
    snippet: str
    thumbnail: str
    provider: str


@dataclass
class NormalizedImageAnalysis:
    """One image-analysis result."""
    provider: str
    quality_score: Optional[float] = None
    brightness: Optional[float] = None
    contrast: Optional[float] = None
    sharpness: Optional[float] = None
    noise_level: Optional[float] = None
    width: Optional[int] = None
    height: Optional[int] = None
    channels: Optional[int] = None
    color_profile: Optional[str] = None
    dominant_colors: List[str] = field(default_factory=list)
    aspects: dict = field(default_factory=dict)


@dataclass
class NormalizedMetadata:
    """One metadata-extraction result."""
    provider: str
    format: Optional[str] = None
    exif: dict = field(default_factory=dict)
    xmp: dict = field(default_factory=dict)
    iptc: dict = field(default_factory=dict)
    gps: Optional[dict] = None
    camera_make: Optional[str] = None
    camera_model: Optional[str] = None
    software: Optional[str] = None
    capture_time: Optional[str] = None


@dataclass
class NormalizedForensics:
    """One forensics result."""
    provider: str
    integrity_score: Optional[float] = None
    is_duplicate: Optional[bool] = None
    duplicate_of: Optional[str] = None
    similarity_score: Optional[float] = None
    manipulation_indicators: List[str] = field(default_factory=list)
    ela_score: Optional[float] = None
    noise_inconsistency: Optional[float] = None
    details: dict = field(default_factory=dict)