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, 元数据提取, 后端开发, 图像取证, 无后门, 深度伪造检测, 进程保护, 逆向图片搜索, 逆向工具