4.1 KiB
4.1 KiB
手术室耗材篮子识别包(离线 + 推流)
段内流程:手检(≥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,见下文)
快速安装
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. 离线跑视频
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 测试)
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 scripts/remux_hevc.sh /path/to/source.mp4
# 输出: input/remuxed/<name>_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
常见问题
- CUDA OOM:勿将
imgsz_det设为 3840;当前 1920 在 8GB 显卡可用。 - 无 GUI:无法弹窗框选 ROI,需另备 ROI JSON(当前入口每次仍弹窗)。
- 分段过多:可调大
basket.confirm_seconds或cooldown_seconds。