# 手术室耗材篮子识别包(离线 + 推流) 段内流程:**手检(≥2 手 union)→ 好坏帧门控 → 耗材分类**;**推流**在每个接触段内与耗材**并行**医生识别;**离线**在全片结束后追加一行医生信息。 与 `configs/default_config.yaml` 当前参数一致(`imgsz_det: 1920`、`contact+1~+6` 等)。 ## 环境要求 - Python 3.10+(推荐 conda 环境 `yolo`) - NVIDIA GPU + CUDA - `python3-tk`(每次运行首帧弹窗框选篮子 ROI) - `ffmpeg` / `ffprobe`(HEVC 视频建议先转 H.264,见下文) ## 快速安装 ```bash cd /path/to/6.1 bash setup.sh # 若用 conda(推荐) conda activate yolo pip install -r requirements.txt ``` ## 三个入口 | 脚本 | 用途 | |------|------| | `main_basket.py` | **离线**:全片篮子接触分段 → Phase2 → gap 合并 → 医生识别 | | `main_basket_stream.py` | **推流/本地 MP4 模拟推流**:逐帧触发 → 段内耗材+医生并行 → 实时写 15 列 TSV | | `main_segments_offline.py` | 按 TSV 时间段对离线 MP4 重跑段内识别(校验用) | ## 1. 离线跑视频 ```bash conda activate yolo cd /path/to/6.1 python main_basket.py \ --video /path/to/your.mp4 \ --excel input/视频中的商品信息表.xlsx \ --out output/result_offline.txt \ --save-basket-roi output/basket_roi.json \ --config configs/default_config.yaml ``` 运行后**弹窗框选篮子 ROI**,然后自动全片扫描 + 段内识别。 ## 2. 推流(或本地 MP4 测试) ```bash python main_basket_stream.py \ --rtsp /path/to/your.mp4 \ --excel input/视频中的商品信息表.xlsx \ --out output/result_stream.txt \ --save-basket-roi output/basket_roi_stream.json \ --config configs/default_config.yaml ``` - 本地 MP4:`stream.infer_source: file` → 段内**回源 4K**(与离线一致) - 真 RTSP:无法 seek 时回退 JPEG 缓存(`cache_max_width: 1920`) - 医生识别:`doctor_identity.stream_enabled: true` 时,每段并行识别,TSV 追加 `doctor_id` / `doctor_name` / `doctor_conf` ## 3. HEVC 视频 4K HEVC 可能导致 OpenCV 解码不稳定,建议先转码: ```bash bash scripts/remux_hevc.sh /path/to/source.mp4 # 输出: input/remuxed/_h264.mp4 ``` ## 配置说明(`configs/default_config.yaml`) | 段 | 关键参数 | |----|----------| | `phase2` | `imgsz_det: 1920`,`pad_bottom_ratio: 0.5`,`det_conf: 0.6` | | `classification` | 好帧 0.8,耗材 0.8,重试 0.6 / 0.5 | | `basket` | `iou_on: 0.03`,`confirm: 0.1`,`cooldown: 3`,窗口 contact+1~+6 | | `stream` | 段窗口与 basket 一致;`infer_source: file` | | `io` | `use_whitelist: false`(全 41 类) | | `doctor_identity` | `enabled` / `stream_enabled`;推流用 `segment_sample_fps` 在段 `[start,end]` 内采样 | ## 模型文件(`weights/`) - `hand_detect.pt` — 手部检测 - `goodbad_frame.pt` — 好坏帧门控 - `haocai_classify.pt` — 耗材分类 - `doctor_identity_package/doctor_info.pth` — 医生 ReID(需同目录 `train_reid_contrastive.py`) ## 输出格式 - **推流**:15 列 TSV(12 列耗材 + `doctor_id` / `doctor_name` / `doctor_conf`),无末尾汇总行 - **离线**:12 列 TSV + 末尾一行 `医生信息:...`(全片中间窗口识别) ## 目录结构 ``` 6.1/ ├── main_basket.py # 离线入口 ├── main_basket_stream.py # 推流入口 ├── main_segments_offline.py # TSV 段内重跑 ├── configs/default_config.yaml ├── weights/ # 3 个 YOLO 权重 ├── input/视频中的商品信息表.xlsx ├── doctor_identity_package/ # 医生识别(离线整片 + 推流段内) ├── src/ code/ # 编排与算法 ├── output/ # 结果输出目录 ├── setup.sh requirements.txt └── README.md ``` ## 常见问题 1. **CUDA OOM**:勿将 `imgsz_det` 设为 3840;当前 1920 在 8GB 显卡可用。 2. **无 GUI**:无法弹窗框选 ROI,需另备 ROI JSON(当前入口每次仍弹窗)。 3. **分段过多**:可调大 `basket.confirm_seconds` 或 `cooldown_seconds`。