# Python后端 JSON数据尿检识别 - 技术实施方案 > 基于 C++ `ProcessJsonDataRequest` 逐行翻译到 Python > 依赖:`/usr/local/Models/ml.json` + `*.data` (OpenCV RTrees 模型) --- ## 1. 可行性验证 | 检查项 | 状态 | |--------|------| | OpenCV 版本 | 4.13.0 ✅ | | cv2.ml.RTrees_load() 加载 .data 文件 | ✅ uro_0, glu_1, glu-rts-M1 均加载成功 | | RTrees.predict() 预测 | ✅ `predict(sample)` 返回浮点数 | | /usr/local/Models/ 所有模型文件存在 | ✅ 14项×2+ (Green+Rts) 全部存在 | | ml.json 配置完整 | ✅ 包含所有14项×21种试纸类型配置 | --- ## 2. 总体架构 ``` POST /api/urinecheck/analyze-json │ ├── 接收 JSON body (与txt文件格式一致) │ ├── MLConfigLoader ─── 解析 /usr/local/Models/ml.json │ ├── 构建 model_lookup[paperType][position] = (model, indexFunc, indexMap) │ └── 标注 PRO/MAU/SG/pH 的 position │ ├── UrineJsonRecognizer │ ├── 1. 解析输入JSON │ ├── 2. extract paperType from extend │ ├── 3. 逐帧处理 │ │ └── 每帧: mapData[id→[6 floats]] → ML推理 → {position: rawIndex} │ ├── 4. CountResultsModal (多帧投票) │ ├── 5. PRO/MAU + SG/PH 关联修正 │ ├── 6. indexMap 映射 │ └── 7. 构建输出JSON │ └── 返回 {"score":"100", "status":"0", "data": [{id, index}, ...]} ``` --- ## 3. 实施步骤 ### Step 1: 新建 `ml_config.py` — ML配置加载器 **功能**:解析 `/usr/local/Models/ml.json`,构建运行时查表结构 ```python class MLConfigLoader: def load(self): # 解析 ml.json # 对每个 item (uro/glu/ket/...): # 对每个 model entry (positon, id, filepath, algorithm, indexmap): # paperType = j (model数组中的索引) # if positon >= 0: # models[paperType][positon] = RTrees.load(filepath) # result_funcs[paperType][positon] = indexFuncName # stat_ids[paperType][positon] = id # index_maps[paperType][positon] = [int(x) for x in indexmap.split(',')] # if name == 'pro': positionsPro[paperType] = positon # ... etc ``` ### Step 2: 新建 `json_recognizer.py` — JSON数据识别器 **核心类**:`UrineJsonRecognizer` ```python class UrineJsonRecognizer: def recognize(self, json_data: dict) -> dict: # 完整复制 ProcessJsonDataRequest 逻辑 ... def _get14_results(self, map_data: dict, paper_type: int) -> dict: # 完整复制 UrineCheck14::Get14Results(mapData, X) 逻辑 ... ``` **各检测项的结果索引修正函数**(直接翻译C++): - `_red_pro_index(p, h)` — if ret>0 and (h<25 or h>110) → 0 - `_red_mau_index(p, h)` — if ret>0 and (h<30 or h>115) → 0 - `_red_ket_index(p, h)` — if ret>1 and 450 and 400 and 25> | dict[int, cv2.ml.RTrees] | | `atoi()` string→int | `int()` 或 `float()` | | `split(s, ',', vs)` | `s.split(',')` | | `GetModal1()` → 众数 | `collections.Counter.most_common(1)` | | `GetPredictResultVal(data)` | `model.predict(np.array([data], dtype=np.float32))` | --- ## 5. 文件清单 | 文件 | 操作 | 功能 | |------|------|------| | `backend/ml_config.py` | **新建** | ML配置加载器 | | `backend/json_recognizer.py` | **新建** | JSON数据识别核心逻辑 | | `backend/schemas.py` | **修改** | 添加 JsonDataRequest | | `backend/routers/urinecheck.py` | **修改** | 添加 /analyze-json 路由 | | `backend/app.py` | **修改** | 启动时初始化识别器 |