简介:本文详细介绍了如何从零开始搭建基于PaddleOCR、Flask和Layui的银行卡识别Web API平台,涵盖环境配置、OCR模型部署、API开发及前端交互设计,适合开发者快速上手。
在金融科技与OCR(光学字符识别)技术深度融合的背景下,银行卡识别已成为自动化流程中的关键环节。传统识别方案依赖第三方服务,存在成本高、定制性差等问题。本文将介绍如何基于PaddleOCR(百度开源的OCR工具库)、Flask(轻量级Web框架)和Layui(前端UI框架)搭建一个高可用的银行卡识别Web API平台,实现从图像上传到结构化数据输出的全流程。
平台采用分层设计:
# 创建虚拟环境(推荐)python -m venv ocr_envsource ocr_env/bin/activate # Linux/Mac# ocr_env\Scripts\activate # Windows# 安装Flask与PaddleOCRpip install flask paddleocr opencv-python# 下载Layui(手动或通过CDN)# 将layui文件夹放入static目录
PaddleOCR提供通用OCR模型,但银行卡识别需针对卡号、有效期等字段优化:
ch_PP-OCRv4_det(检测) + ch_PP-OCRv4_rec(识别)
from paddleocr import PaddleOCRocr = PaddleOCR(use_angle_cls=True, lang="ch") # 自动下载默认模型
MM/YY,排除无效日期。/api/recognize_bankcardmultipart/form-data(图像文件)
from flask import Flask, request, jsonifyfrom paddleocr import PaddleOCRimport cv2import reapp = Flask(__name__)ocr = PaddleOCR(use_angle_cls=True, lang="ch")def validate_card_number(number):# Luhn算法校验digits = [int(c) for c in number]odd_sum = sum(digits[-1::-2])even_sum = sum(sum(divmod(d * 2, 10)) for d in digits[-2::-2])return (odd_sum + even_sum) % 10 == 0@app.route('/api/recognize_bankcard', methods=['POST'])def recognize_bankcard():if 'file' not in request.files:return jsonify({"error": "No file uploaded"}), 400file = request.files['file']img = cv2.imdecode(np.frombuffer(file.read(), np.uint8), cv2.IMREAD_COLOR)# 调用PaddleOCRresult = ocr.ocr(img, cls=True)# 提取卡号与有效期card_number = ""expiry_date = ""for line in result[0]:text = line[1][0]if re.fullmatch(r'\d{16}', text): # 16位卡号card_number = textelif re.fullmatch(r'\d{2}/\d{2}', text): # MM/YYexpiry_date = text# 校验卡号if card_number and not validate_card_number(card_number):return jsonify({"warning": "Card number may be invalid"}), 200return jsonify({"card_number": card_number,"expiry_date": expiry_date,"status": "success"})if __name__ == '__main__':app.run(debug=True)
<!DOCTYPE html><html><head><meta charset="utf-8"><title>银行卡识别</title><link rel="stylesheet" href="/static/layui/css/layui.css"></head><body><div class="layui-container" style="margin-top: 50px;"><form class="layui-form" id="uploadForm"><div class="layui-form-item"><label class="layui-form-label">银行卡图片</label><div class="layui-input-block"><input type="file" name="file" accept="image/*" class="layui-upload-file"></div></div><div class="layui-form-item"><div class="layui-input-block"><button class="layui-btn" lay-submit lay-filter="submit">识别</button></div></div></form><div id="result" class="layui-hide"></div></div><script src="/static/layui/layui.js"></script><script>layui.use(['form', 'layer'], function(){var form = layui.form;var layer = layui.layer;form.on('submit(submit)', function(data){var formData = new FormData();formData.append('file', data.field.file[0]);fetch('/api/recognize_bankcard', {method: 'POST',body: formData}).then(response => response.json()).then(result => {var html = `<div class="layui-card"><div class="layui-card-header">识别结果</div><div class="layui-card-body"><p>卡号: ${result.card_number || '未识别'}</p><p>有效期: ${result.expiry_date || '未识别'}</p></div></div>`;layer.open({type: 1,title: '识别结果',content: html,area: ['400px', '300px']});}).catch(error => {layer.msg('识别失败: ' + error, {icon: 2});});return false;});});</script></body></html>
FileReaderAPI实现图片上传前预览。
# 启动Flask应用python app.py# 访问 http://127.0.0.1:5000
本文通过PaddleOCR+Flask+Layui的组合,实现了银行卡识别的全流程开发。实际项目中,可进一步扩展:
该方案兼顾效率与成本,适合金融、电商等需要自动化卡号录入的场景。