awrya-cmd/PicIntel
GitHub: awrya-cmd/PicIntel
PicIntel 是一个基于 Flask 的 AI 驱动图像情报平台,用于图像真实性验证、EXIF 元数据提取、OCR 文字识别、本地及网络反向图像搜索和 AI 生成检测。
Stars: 0 | Forks: 0
# 🛰️ PicIntel
**面向数字时代的 AI 驱动图像情报**
### 🧩 概述
在数字媒体极易被篡改、错误归属或合成的时代,验证图像的完整性和来源至关重要。**PicIntel** 是一个轻量级、响应式且先进的**开源情报 (OSINT)** 平台。它允许用户验证图像真实性、提取 EXIF 元数据、在本地和全球数据库中执行反向图像搜索,并检测 AI 生成的迹象——所有这些都在一个无缝、交互式的仪表板中完成。
### 🔍 核心功能
* **真实性检查与篡改分析**:
* 通过 OpenCV 的 `ORB` (Oriented FAST and Rotated BRIEF) 计算纹理特征和空间模式。
* 评估文件压缩率并比较空间结构一致性。
* 标记表明进行了平滑处理、编辑或结构修改的异常情况。
* **AI 生成验证(本地启发式)**:
* 在 HSV 颜色空间中测量色彩饱和度指标。
* 使用 OpenCV Laplacian 方差计算分析纹理锐度。
* 检测流行 AI 生成模型的典型尺寸(例如,$512\times512$、$768\times768$)。
* **综合元数据与 GPS 情报**:
* 提取基本文件参数(尺寸、格式、色彩空间、模式)。
* 检索完整的 EXIF 数据(相机型号、软件、曝光设置、时间戳)。
* 解析 GPS 坐标,将其转换为十进制度数,并生成动态 Google 地图定位链接。
* **光学字符识别 (OCR)**:
* 使用 PyTesseract 从上传的图像中提取覆盖、嵌入或扫描的文本。
* **混合反向图像搜索**:
* **本地库搜索**:使用感知哈希 (`imagehash.phash`) 在 SQLite 中对上传的图像进行索引,并使用汉明距离映射相似图像。
* **网络反向搜索**:使用临时公共端点无缝查询 SerpApi(以 Google Lens 主搜索和 Google 反向图像回退),呈现去重、排名的搜索结果。
* **引导式 OSINT 聊天机器人**:
* 包含带有快速触发器的客户端聊天机器人界面,可指导用户完成图像分析过程。
### ⚙️ 技术栈
| 技术 | 用途 | 描述 |
| :--- | :--- | :--- |
| **Flask** | 应用框架 | 提供 Web 端点,处理表单、路由和 JSON API payload。 |
| **SQLite3** | 本地数据库 | 存储文件索引、感知哈希和图像元数据以进行匹配。 |
| **OpenCV (headless)** | 计算机视觉 | 执行特征点检测 (ORB)、Canny 边缘复杂度检测、Laplacian 方差和 HSV 空间提取。 |
| **Pillow (PIL)** | 图像处理 | 处理文件解析、验证、渲染、格式转换和 EXIF 提取。 |
| **PyTesseract** | OCR 引擎 | 与 Tesseract OCR 接口,以读取嵌入在图形中的文本。 |
| **imagehash** | 感知哈希 | 生成离散的 `phash` 哈希,以识别重复项而不受压缩影响。 |
| **SerpApi** | 搜索集成 | 查询 Google Lens 和 Google 图像以进行匹配。 |
| **Flask-WTF / WTForms** | 验证与安全 | 确保 CSRF 防护并验证上传的图像签名。 |
### 📂 项目结构
```
PicIntel-1/
├── app.py # Main Flask application containing routes, APIs, and image processors
├── config.py # Global application configuration properties
├── requirements.txt # Python dependency manifest
├── seed_index.py # Helper script to populate the local library database using seed images
├── bannernew.png # Repository brand header banner image
├── local_index.sqlite # SQLite database storing perceptual hashes of indexed images
├── seed_images/ # Pre-collected directory of images used to seed the local search database
├── static/
│ ├── js/
│ │ └── upload.js # Asynchronous drag-and-drop file uploader and progress controller
│ └── uploads/ # Dynamic storage for uploaded images and analysis report JSON files
└── templates/
├── base.html # Master layout containing navigation and shared UI headers
├── index.html # Drag-and-drop dashboard for image uploads
├── analysis.html # Visual dashboard showing metadata, EXIF, reverse matches, and AI metrics
└── chatbot.html # Interactive help and guidance interface
```
### 🏗️ 系统架构
下图映射了 **PicIntel** 的结构组件:
```
graph TD
User([User / Browser])
subgraph Frontend [Presentation Layer]
UI["HTML Templates & Vanilla CSS (base.html, index.html, analysis.html)"]
JS["AJAX Client Controller (upload.js)"]
end
subgraph FlaskApp [Flask Web Server]
Controller["App Routers & Controller (app.py)"]
WTForms["CSRF Security & Form Validation"]
Chatbot["Heuristic Chatbot Engine"]
end
subgraph AnalysisEngine [AI & Image Analysis Engine]
Metadata["PIL Metadata / EXIF / GPS parser"]
OCR["pytesseract OCR Engine"]
Heuristics["Authenticity & AI Detection Heuristics"]
CVProc["OpenCV Analyzer (ORB, Canny, Laplacian)"]
LocalIndex["Perceptual Hash Analyzer (imagehash.phash)"]
end
subgraph Storage [Storage Layer]
SQLite[("SQLite DB (local_index.sqlite)")]
FS[("File System (uploads/ & *_analysis.json)")]
end
subgraph External [External Services]
SerpApi["SerpApi (Google Lens / Google Reverse Image)"]
end
User <-->|HTTP Requests| UI
UI --> JS
JS -->|REST Actions| Controller
Controller --> WTForms
Controller --> Chatbot
Controller --> AnalysisEngine
AnalysisEngine --> SQLite
AnalysisEngine --> FS
AnalysisEngine --> SerpApi
```
### 🔄 操作工作流
图像上传和 OSINT 分析期间的逐步事务流:
```
sequenceDiagram
autonumber
actor User as User (Browser)
participant Server as Flask Server (app.py)
participant DB as SQLite DB
participant Engine as Analysis Engine
participant Serp as SerpApi (Google Lens)
User->>Server: Upload image file via POST /upload
Server->>Server: Validate file signature and extensions (PIL.Image.verify)
alt Invalid Image
Server-->>User: Return 400 Bad Request
else Valid Image
Server->>Server: Generate unique timestamped filename & save to uploads/
Server->>Engine: Run metadata, EXIF parameters, and GPS extraction
Server->>Engine: Read image via Tesseract OCR for text
Server->>Engine: Analyze via OpenCV (ORB feature density, Canny edges, Laplacian variance)
Server->>Engine: Compute AI-generation indicators & authenticity metrics
Server->>Engine: Compute perceptual hash (phash)
Server->>DB: Record index (filename, original title, phash, timestamp)
Server->>DB: Query for similar local hashes (Hamming Distance)
DB-->>Server: Return local duplicate matches
Server->>Serp: Submit public URL (if configured) for web reverse image search
Serp-->>Server: Return Google Lens / Reverse Image results
Server->>Server: Compile all results into {filename}_analysis.json file
Server-->>User: Return success JSON response with unique filename
User->>Server: Request GET /analysis/
Server->>Server: Load and parse stored JSON analysis file
Server-->>User: Render visual analysis dashboard (metadata, maps, AI score, OCR, matches)
end
```
### 📡 API 文档
#### 1. 上传与分析图像
* **路由**:`/upload`
* **方法**:`POST`
* **表单参数**:
* `file`:二进制图像 payload(JPEG、PNG、WebP、GIF、BMP、TIFF;最大 16MB)。
* **响应**:
* **成功 (200 OK)**:
{
"success": true,
"filename": "20260626_211344_image.png",
"message": "Analysis complete"
}
* **失败 (400 Bad Request / 500 Server Error)**:
{
"success": false,
"error": "Only image files are allowed (PNG, JPG, JPEG, GIF, BMP, TIFF, WEBP)"
}
#### 2. 检索分析页面
* **路由**:`/analysis/`
* **方法**:`GET`
* **描述**:基于预先生成的 `{filename}_analysis.json`,为特定上传的图像渲染完整的 Web 仪表板。
#### 3. 对话助手
* **路由**:`/chat`
* **方法**:`POST`
* **请求 JSON Payload**:
{
"message": "how to upload?"
}
* **响应 JSON Payload**:
{
"success": true,
"response": {
"text": "Click Choose File → select an image → Analyze. Max 16MB. Formats: PNG/JPG/JPEG/WebP/TIFF/GIF.",
"type": "guide"
},
"timestamp": "2026-06-26T21:13:44.123456"
}
#### 4. 重新扫描外部网络匹配项
* **路由**:`/rescan/`
* **方法**:`POST`
* **描述**:触发针对特定图像文件的新 SerpApi 反向搜索查询,并更新分析数据库文件。免除 CSRF。
* **响应**:
* **成功 (200 OK)**:
{
"success": true,
"message": "Rescan complete"
}
#### 5. 提供上传的资源
* **路由**:`/uploads/`
* **方法**:`GET`
* **描述**:从本地上传文件夹提供原始上传的图像和验证报告。
### ⚙️ 安装与设置
#### 1. 安装 Tesseract OCR 引擎
PicIntel 使用 PyTesseract 提取图像 OCR 文本。您的机器上必须安装 Tesseract。
* **Windows**:从 UB Mannheim 下载并运行安装程序。默认情况下,可执行文件应位于 `C:\Program Files\Tesseract-OCR\tesseract.exe`。
* **macOS**:通过 Homebrew 安装:
brew install tesseract
* **Linux (Ubuntu/Debian)**:通过 apt 安装:
sudo apt-get install tesseract-ocr
#### 2. 克隆仓库并配置 Python 虚拟环境
导航到该目录并运行:
```
# 初始化 virtual environment
python -m venv venv
# 在 Windows 上激活
venv\Scripts\activate
# 在 macOS/Linux 上激活
source venv/bin/activate
# 安装所需的 packages
pip install -r requirements.txt
```
#### 3. 设置环境变量
设置本地环境变量(或直接在您的环境启动器中配置它们):
```
# Windows Command Prompt
set SECRET_KEY=your-super-secret-key
set SERPAPI_KEY=your_serpapi_key_here
set REVERSE_SEARCH_MODE=GOOGLE_ONLY
set PUBLIC_BASE_URL=https://your-ngrok-subdomain.ngrok-free.app
# Windows PowerShell
$env:SECRET_KEY="your-super-secret-key"
$env:SERPAPI_KEY="your_serpapi_key_here"
$env:REVERSE_SEARCH_MODE="GOOGLE_ONLY"
$env:PUBLIC_BASE_URL="https://your-ngrok-subdomain.ngrok-free.app"
```
#### 4. 填充本地搜索数据库
使用本地仓库图像预填充 SQLite 数据库 (`local_index.sqlite`),以运行相似性测试:
```
python seed_index.py
```
#### 5. 启动应用程序
运行 Web 应用程序服务器:
```
python app.py
```
在您的 Web 浏览器中打开 [http://localhost:5000](http://localhost:5000)。
### 👩💻 HackOps 团队
* **Arushi Gupta**
* **Arya Rai**
* **Nimisha Goyal**
* **Ritwiza Bhardwaj**
### 📜 许可证
该项目在 MIT 许可证下授权 - 有关详细信息,请参阅 `LICENSE` 文件。
标签:ESC4, OpenCV, OSINT, Python, 元数据提取, 后端开发, 图像取证, 无后门, 深度伪造检测, 进程保护, 逆向图片搜索, 逆向工具