aayush-mistry/MedSecure-AI
GitHub: aayush-mistry/MedSecure-AI
MedSecure-AI 是一个利用 OCR、计算机视觉和规则评分引擎实时验证药品包装真伪并标记假药风险的全栈检测平台。
Stars: 0 | Forks: 0
# MedSecure AI — 实时假药检测器
### 验证框架 | Meridian 团队
MedSecure AI 是一个生产级、实时的假药检测与验证平台。本应用根据国家药品监管标准设计,允许检查员、药剂师和消费者使用设备摄像头扫描药品标签,以验证真伪、检测视觉印刷偏差、解码条形码以及追踪举报预警。
## 🏗️ 系统架构
MedSecure AI 基于解耦的多服务架构构建,旨在实现高吞吐量、低延迟的机器学习推理和实时前端通知。
```
graph TD
User["📱 User / Device Camera"] -->|1. Uploads JPEG Scan| Backend["⚡ Node.js Fastify API"]
Backend -->|2. Saves Image / Creates Scan Record| DB[("🗄️ SQLite Database")]
Backend -->|3. Dispatches Path for Analysis| ML["🐍 Python FastAPI ML Engine"]
subgraph ML Service Pipeline
ML --> Preprocess["⚙️ Image Preprocessing (Deskew, CLAHE, Denoise)"]
Preprocess --> OCR["🔍 EasyOCR Text Extraction"]
OCR --> Barcode["🏷️ pyzbar Barcode Decoding"]
Barcode --> CV["🎨 OpenCV Layout & Color Anomaly Check"]
CV --> Score["📊 Rules-based Scoring Engine"]
end
Score -->|4. Returns Anomaly Signals & Scores| Backend
Backend -->|5. Emits Socket Updates| WS["🔌 WebSockets /ws/scan"]
WS -->|6. Renders Live Step Animation| User
```
### 技术栈明细
* **前端:** React 18 (Vite) • Vanilla CSS / Tailwind CSS • Leaflet Maps(预警位置追踪)• Recharts(分析仪表盘)
* **后端:** Node.js (Fastify) • SQLite3(带有 Promise 包装器)• WebSockets (`@fastify/websocket`) • JWT 认证
* **ML 推理服务:** Python 3.14 • FastAPI • EasyOCR(CPU 文本提取)• OpenCV(计算机视觉检查)• NumPy
## 🌟 核心功能
1. **实时扫描处理 Pipeline:** 利用 WebSockets 将细粒度的视觉处理阶段(例如,预处理、OCR、匹配、评分)动态推送到用户界面。
2. **高级图像预处理:** 应用图像纠偏、双边去噪和对比度增强(CLAHE),以在光照条件不佳的情况下最大化 OCR 识别准确率。
3. **批号与条形码验证:** 根据标准制造商正则表达式验证批号,并使用 `pyzbar` 解析 1D/2D 条形码。
4. **颜色与版式特征检查:** 将上传的药品颜色直方图和 Logo 坐标与参考元数据进行比对,以检测颜色特征偏移和包装不匹配。
5. **交互式预警地图:** 将位置元数据连接到由 Leaflet 驱动的发光实时热力图,展示被标记假药的地理位置集群。
6. **药剂师与检查员仪表盘:** 提供关于风险等级、扫描历史、常见包装异常和区域级风险指标的数据可视化。
7. **离线验证降级方案:** 在与 ML 引擎的网络连接中断时,支持基于客户端 canvas 的文本分析。
## 🗄️ 数据库 Schema
数据库模型在 SQLite 中实现,以支持具有快速查询性能的关系型存储。
### `users`
存储已注册的检查员、药剂师、医疗保健人员和消费者的详细信息。
| 列名 | 类型 | 约束 | 描述 |
|--------|------|-------------|-------------|
| `id` | TEXT | PRIMARY KEY | 唯一的 UUID 标识符 |
| `email` | TEXT | UNIQUE | 用户登录电子邮箱 |
| `password_hash` | TEXT | - | Bcrypt 哈希密码 |
| `role` | TEXT | CHECK (在角色范围内) | `consumer`, `pharmacist`, `healthcare_worker`, `inspector` |
| `verified` | INTEGER | DEFAULT 0 | 如果凭证已验证则为 1,否则为 0 |
| `license_number`| TEXT | - | 药剂师/医疗执照注册号 |
| `pin_code` | TEXT | - | 主要业务区域邮政编码 |
| `language` | TEXT | DEFAULT 'en' | 首选 UI 本地化语言 |
| `created_at` | TEXT | DEFAULT CURRENT_TIMESTAMP | 注册日期和时间 |
### `medicines`
存储已验证正品药物的参考标准属性。
| 列名 | 类型 | 约束 | 描述 |
|--------|------|-------------|-------------|
| `id` | TEXT | PRIMARY KEY | 唯一药品代码 / 注册 ID |
| `name` | TEXT | - | 药物品牌名称 |
| `generic_name` | TEXT | - | 活性药物成分 (API) |
| `manufacturer_name`| TEXT | - | 注册的制药公司 |
| `cdsco_license` | TEXT | - | 制造许可证编号 |
| `approved_batch_format` | TEXT | - | 验证正确批次格式的 Regex 字符串 |
| `composition` | TEXT | JSON Array | 活性成分数量(JSON 数组) |
| `expected_colors` | TEXT | JSON Object | 十六进制颜色范围和主色比例 |
| `reference_image_url`| TEXT | - | 已验证正品标签图像的 URL 路径 |
| `logo_embedding` | TEXT | JSON Array | 用于 Logo 对齐的特征 embedding |
### `scans`
维护扫描提交和 ML 评分输出的日志记录。
| 列名 | 类型 | 约束 | 描述 |
|--------|------|-------------|-------------|
| `id` | TEXT | PRIMARY KEY | 唯一的扫描事件标识符 |
| `user_id` | TEXT | FOREIGN KEY | 引用 `users(id)`(访客可为空) |
| `medicine_id` | TEXT | FOREIGN KEY | 引用 `medicines(id)`(匹配的药品标准) |
| `image_url` | TEXT | - | 上传查询图像的文件路径 |
| `authenticity_score`| REAL | - | 置信度指标,范围从 0.0 到 100.0 |
| `verdict` | TEXT | CHECK (在裁决范围内)| `verified`, `caution`, `high_risk` |
| `ocr_extracted` | TEXT | JSON String | 从包装中提取的文本块 |
| `anomalies` | TEXT | JSON String | 视觉、批次和文本偏差的列表 |
| `signal_breakdown` | TEXT | JSON String | 影响评分的多因子权重 |
| `lat` | REAL | - | 扫描位置的纬度坐标 |
| `lng` | REAL | - | 扫描位置的经度坐标 |
| `scanned_at` | TEXT | DEFAULT CURRENT_TIMESTAMP | 发生扫描的日期和时间 |
### `alerts`
存储被标记的位置和重复假药报告的计数。
| 列名 | 类型 | 约束 | 描述 |
|--------|------|-------------|-------------|
| `id` | TEXT | PRIMARY KEY | 唯一预警标识符 |
| `medicine_id` | TEXT | FOREIGN KEY | 引用 `medicines(id)` |
| `batch_number` | TEXT | - | 被标记的批次标识 |
| `report_count` | INTEGER| DEFAULT 1 | 在此位置记录的总报告数 |
| `lat` | REAL | - | 预警的纬度 |
| `lng` | REAL | - | 预警的经度 |
| `severity` | TEXT | CHECK (在严重程度范围内)| `caution` 或 `high` |
| `created_at` | TEXT | DEFAULT CURRENT_TIMESTAMP | 首次记录预警的日期和时间 |
## ⚡ ML 处理 Pipeline 详情
Python ML 引擎使用多阶段规则引擎来评估提交内容:
1. **预处理:** 执行双边滤波去噪以消除印刷半色调伪影,使用霍夫变换检测旋转角度,并自动对标签进行纠偏。
2. **OCR 提取:** 运行 `easyocr` 检测文本边界框,目标对象包括药品名称、通用名、批号、制造商和许可证字段。
3. **条形码解码:** 解码标准 1D/2D 条形码(如果支持 `pyzbar`)。条形码 payload 会与包装文本进行交叉比对。
4. **视觉分析:** 在 HSV 颜色空间中分析颜色直方图。与参考药物模板的严重偏差会标记出版面篡改或非标准印刷。
5. **药品匹配:** 采用 `difflib.get_close_matches` 将提取的文本片段与 SQLite 参考数据库稳健配对,并考虑到微小的印刷变形或 OCR 噪声。
6. **批次与有效期验证:** 使用正则表达式检查批次文本以标记格式异常,并解析有效期以在过期时发出预警。
7. **评分引擎:** 根据文本匹配、布局结构、条形码检查和批次有效性,计算出加权的综合置信度得分。
## 🚀 安装与设置
### 选项 A:快速开始
启动该平台最简单的方法是通过 Docker。请确保已安装 Docker 和 Docker Compose。
```
# Clone 仓库
git clone https://github.com/VekariaDharmesh/MedSecure-AI.git
cd MedSecure-AI
# 构建规范的印度医药产品 DB 和示例图像
python migrate_csv.py
cd ml && python create_samples.py && cd ..
# 在 detached 模式下启动所有容器
docker compose up --build -d
```
访问入口:
* **前端仪表盘:** `http://localhost:5173`
* **Fastify API 服务器:** `http://localhost:3001`
* **Python ML 推理:** `http://localhost:8000`
### 选项 B:本地开发设置
如果本地运行服务,请使用不同的终端标签页分别进行设置:
#### 1. 构建规范数据库和样本
```
python migrate_csv.py
cd ml
python create_samples.py
```
#### 2. Python ML 推理服务设置
确保已安装 Python 3.10+(macOS 支持修复首选 3.14)。
```
cd ml
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
pip install -r requirements.txt
python -m uvicorn main:app --host 0.0.0.0 --port 8000
```
#### 3. 后端 Fastify 服务器设置
```
cd backend
npm install
npm start
```
*注意:该应用现在使用由 `migrate_csv.py` 从 `indian_pharmaceutical_products_clean.csv` 构建的 `db/indian_pharmaceutical_products.db`。*
#### 4. 前端 React Web 应用设置
```
cd frontend
npm install
npm run dev
```
## 🧪 演示场景
一旦应用程序在本地运行,打开 `http://localhost:5173` 测试界面顶部预设的演示包:
* **场景 1:Calpol 500mg 片剂(正品)**
* **预期结果:** 高真伪得分(98.4%),注册匹配,有效的批号 regex 结构。徽章状态:**验证为正品**。
* **场景 2:Crocin Advance 片剂(假药批次格式)**
* **预期结果:** 标记出批次格式不匹配的 regex 违规。徽章状态:**高风险预警**。
* **场景 3:Bromez 20mg 胶囊(假药包装特征)**
* **预期结果:** 触发主色调特征偏差(例如,在预期为红色印刷的地方检测到蓝色色调)以及高印刷模糊指数。徽章状态:**高风险预警 / 警示**。
## 📡 API Endpoint 参考
### 认证
* `POST /api/v1/auth/register` - 创建新的用户配置(`consumer`, `pharmacist`, `healthcare_worker`, `inspector`)。
* `POST /api/v1/auth/login` - 登录并返回 JWT token。
* `GET /api/v1/auth/me` - 验证 JWT 并检索已认证用户的 payload。
### 扫描与分析
* `POST /api/v1/scans` - 提交 multipart 图像 payload 以排队进行 OCR/CV 分析。
* `GET /api/v1/scans/:id` - 获取特定扫描的结果明细。
* `GET /api/v1/scans/history` - 检索当前已认证用户执行的扫描历史记录。
### 预警与分析
* `GET /api/v1/alerts/map` - 返回活动地图图钉的坐标和严重程度权重。
* `GET /api/v1/alerts/feed` - 获取最近高风险预警的实时日志。
* `POST /api/v1/reports` - 用于可疑包裹的手动报告提交 endpoint。
* `GET /api/v1/dashboard/pharmacist` - 注册药房仪表盘的指标摘要。
标签:MITM代理, OCR, 假药检测, 全栈应用, 微服务架构, 目标检测, 自定义脚本, 计算机视觉, 请求拦截, 逆向工具