医保人工报销OCR识别方案
医保人工报销 OCR 识别方案文章目录医保人工报销 OCR 识别方案一、方案架构二、环境准备2.1 环境信息2.2 新建 Conda 环境2.3 安装依赖已验证完整命令2.4 验证安装三、图像预处理3.1 公章去除3.2 图像增强针式打印/褪色清单3.3 ROI 裁剪 — 只取通用名列3.4 完整预处理流水线四、OCR 识别引擎4.1 单实例封装4.2 并发方案生产环境五、医保字典匹配5.1 字典结构5.2 模糊匹配引擎5.3 策略优先级六、业务处理流程人工审核界面设计要点七、准确率预估不宜全自动的场景八、部署建议注意事项场景: 医院费用清单A4纸打印含公章覆盖→ OCR识别通用名 → 模糊匹配医保字典 → 确定收费等级原则: 自动匹配 例外转人工不做全自动一、方案架构费用清单扫描件 → 预处理(去公章增强) → ROI裁剪(通用名列) → PaddleOCR识别 → 编辑距离模糊匹配字典 → 命中介入自通过 → 未命中/低置信 → 人工审核界面 → 确认入库二、环境准备2.1 环境信息基于 Python 3.9 PaddleOCR 2.9.1 验证通过实测环境组件版本说明Python3.9.25conda 独立环境paddlepaddle3.1.0CPU 版GPU 版替换为 paddlepaddle-gpupaddleocr2.9.1PP-OCRv4 模型含 PP-Structure 表格识别paddlex3.5.2模型管理依赖自动安装opencv-python4.11.0.86图像预处理公章去除、增强Pillow11.3.0图像加载numpy1.26.4数组运算python-Levenshtein0.27.1编辑距离模糊匹配需单独安装重要: CPU 模式下必须设置环境变量FLAGS_use_mkldnn0否则 OneDNN 与 Windows 上的 PIR 属性转换存在兼容问题会导致NotImplementedError。2.2 新建 Conda 环境conda create-nmedical_ocrpython3.9-yconda activate medical_ocr2.3 安装依赖已验证完整命令# PaddlePaddleCPU版pipinstallpaddlepaddle3.1.0-ihttps://pypi.tuna.tsinghua.edu.cn/simple# GPU版如有NVIDIA卡# pip install paddlepaddle-gpu3.1.0 -i https://pypi.tuna.tsinghua.edu.cn/simple# PaddleOCRpipinstallpaddleocr-ihttps://pypi.tuna.tsinghua.edu.cn/simple# 图像处理pipinstallopencv-python pillow numpy-ihttps://pypi.tuna.tsinghua.edu.cn/simple# Levenshtein距离模糊匹配pipinstallpython-Levenshtein-ihttps://pypi.tuna.tsinghua.edu.cn/simple2.4 验证安装importos os.environ[FLAGS_use_mkldnn]0# CPU模式必须frompaddleocrimportPaddleOCR ocrPaddleOCR(langch)print(PaddleOCR ready)三、图像预处理3.1 公章去除importcv2importnumpyasnpdefremove_red_stamp(img_path):imgcv2.imread(img_path)hsvcv2.cvtColor(img,cv2.COLOR_BGR2HSV)# 红色范围公章lower_red1np.array([0,50,50])upper_red1np.array([10,255,255])lower_red2np.array([156,50,50])upper_red2np.array([180,255,255])mask1cv2.inRange(hsv,lower_red1,upper_red1)mask2cv2.inRange(hsv,lower_red2,upper_red2)maskmask1|mask2# 膨胀后填充白色kernelnp.ones((3,3),np.uint8)maskcv2.dilate(mask,kernel,iterations1)img[mask0][255,255,255]returnimg3.2 图像增强针式打印/褪色清单defenhance_image(img):# 灰度化 CLAHE对比度增强graycv2.cvtColor(img,cv2.COLOR_BGR2GRAY)clahecv2.createCLAHE(clipLimit2.0,tileGridSize(8,8))enhancedclahe.apply(gray)# 自适应二值化binarycv2.adaptiveThreshold(enhanced,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2)# 转回三通道给PaddleOCRreturncv2.cvtColor(binary,cv2.COLOR_GRAY2BGR)3.3 ROI 裁剪 — 只取通用名列defcrop_drug_column(img): 根据清单模板裁剪药品通用名列区域。 建议做成配置化不同医院模板定义不同的列坐标。 h,wimg.shape[:2]# 示例通用名列在 x50~300, y表头下方到页脚上方roiimg[200:h-80,50:300]returnroi3.4 完整预处理流水线defpreprocess(image_path):imgremove_red_stamp(image_path)imgenhance_image(img)imgcrop_drug_column(img)returnimg四、OCR 识别引擎4.1 单实例封装importos os.environ[FLAGS_use_mkldnn]0frompaddleocrimportPaddleOCRclassMedicalOCR:def__init__(self,use_gpuFalse):self.ocrPaddleOCR(langch,use_angle_clsTrue)self.use_gpuuse_gpudefrecognize(self,img):返回文本行列表resultself.ocr.ocr(img)ifnotresultornotresult[0]:return[]# 按y坐标排序表格从上到下linessorted(result[0],keylambdax:x[0][0][1])return[{text:line[1][0],confidence:line[1][1],bbox:line[0]}forlineinlines]ocr_engineMedicalOCR()4.2 并发方案生产环境frommultiprocessingimportPooldefinit_worker():global_ocrimportos os.environ[FLAGS_use_mkldnn]0frompaddleocrimportPaddleOCR _ocrPaddleOCR(langch,use_angle_clsTrue)defprocess_image(img_path):imgpreprocess(img_path)result_ocr.ocr(img)returnextract_lines(result)# 4进程池withPool(4,initializerinit_worker)aspool:resultspool.map(process_image,image_files)五、医保字典匹配5.1 字典结构# 示例药品通用名 → 医保编码 → 收费等级MEDICAL_DICT{阿莫西林胶囊:{code:XA01-001,level:甲类,dosage:胶囊},氯化钠注射液:{code:XB05-023,level:甲类,dosage:注射液},阿托伐他汀钙片:{code:XC10-056,level:乙类,dosage:片剂},# ... 数万条}5.2 模糊匹配引擎fromLevenshteinimportdistanceaslevenshteindeffuzzy_match(ocr_text,dict_keys,threshold0.85): 编辑距离 ≤1 或 相似度 ≥threshold 返回最佳匹配 返回: (matched_key, score, level) 或 None best_key,best_scoreNone,0ocr_cleanocr_text.strip().replace( ,)forkeyindict_keys:key_cleankey.strip().replace( ,)# 完全匹配直接返回ifocr_cleankey_clean:return(key,1.0,MEDICAL_DICT[key][level])# 编辑距离max_lenmax(len(ocr_clean),len(key_clean))ifmax_len0:continuedistlevenshtein(ocr_clean,key_clean)similarity1-dist/max_lenifsimilaritybest_score:best_scoresimilarity best_keykeyifbest_scorethreshold:return(best_key,best_score,MEDICAL_DICT[best_key][level])returnNone5.3 策略优先级defmatch_pipeline(ocr_lines):results[]foriteminocr_lines:textitem[text]confitem[confidence]# 策略1: OCR置信度 0.7 → 直接转人工ifconf0.7:results.append({status:REVIEW,reason:低置信度,ocr_text:text,ocr_conf:conf})continue# 策略2: 完全匹配iftextinMEDICAL_DICT:entryMEDICAL_DICT[text]results.append({status:MATCHED,code:entry[code],level:entry[level],ocr_text:text})continue# 策略3: 编辑距离 ≤1 模糊匹配matchedfuzzy_match(text,MEDICAL_DICT.keys(),threshold0.85)ifmatched:results.append({status:FUZZY,code:MEDICAL_DICT[matched[0]][code],level:matched[2],ocr_text:text,matched_name:matched[0],score:matched[1]})continue# 策略4: 未命中 → 转人工results.append({status:REVIEW,reason:未匹配字典,ocr_text:text,ocr_conf:conf})returnresults六、业务处理流程扫描件 → 预处理 → ROI裁剪 → OCR识别 → 字典匹配 ↓ ↓ 结构化字段 ├─ 完全匹配 → 自动通过 (医院名、日期、 ├─ 模糊匹配(标注) → 自动通过 就诊号) └─ 低置信/未匹配 → 人工审核界面 ↓ 人工选择/修正 → 确认入库人工审核界面设计要点左侧显示原始清单截图高亮待确认行右侧显示 OCR 识别文本 字典候选列表编辑距离排序 Top 5单键操作选中确认 / 手动输入 / 跳过批量审核全部模糊匹配的行集中展示一键批量确认七、准确率预估环节预估准确率备注图像预处理95%公章去除增强少数极端案例无效OCR 单字识别90%A4印刷清单非针式打印OCR 整行识别85%窄列≤3字宽易串行字典完全匹配70%OCR 未出错且字典有该条目模糊匹配编辑距离≤122%补上 OCR 小误差自动通过合计92%70% 22%转人工审核8%约每 100 条 8 条需人工确认不宜全自动的场景针式打印点阵断续清单 — 准确率骤降至 60~70%公章覆盖超过 3 行文字 — 预处理无效手写补充的药品名 — 需单独训练手写模型八、部署建议环境配置吞吐CPU开发/小规模8核 4进程6080 张/小时GPU生产推荐T4/V100 单卡6001000 张/小时CPU高并发16核 8进程 队列150200 张/小时注意事项不同医院清单格式不同ROI 裁剪坐标需做成模板配置一个医院一个配置文件医保字典定期同步更新模糊匹配结果建议记录日志便于追溯审计OCR 所有低置信度/未匹配结果必须留痕医保审计需要生产环境务必使用多进程池方案单进程 PaddleOCR 非线程安全