基于PaddleOCR银行卡识别实现(二)
前言
上一章讲了检测模型的实现,这一章将一下识别模型的实现,实现原理很简单,PaddleOCR提供的通用字符集有6623个,但是银行卡号就不需要这么多,只需要0~9就可以了,下面我们来看看如何实现,以及获取卡号后,如何获取银行卡名称和银行卡类型,文章最后有模型下载地址。
一、银行卡识别模型实现
1、创建字符集
在ppocr/utils/目录中创建一份只有数字的字符集ppocr_keys_bank.txt,0~9。
2、导入数据集
目前收集了3000张左右的真实银行卡卡号切图和上万张合成卡号切图
数据集部分切图:
3、创建配置文件
复制一份yml文件
文件内容如下:
Global:
use_gpu: true
epoch_num: 500
log_smooth_window: 20
print_batch_step: 10
save_model_dir: ./output/rec_chinese_lite_v2.0_bank
save_epoch_step: 50
# evaluation is run every 5000 iterations after the 4000th iteration
# eval_batch_step: [0, 2000]
eval_batch_step: 100
cal_metric_during_train: True
# pretrained_model: ./pretrained_models/ch_ppocr_mobile_v2.0_rec_pre/best_accuracy
pretrained_model:
checkpoints:
save_inference_dir: ./inference/rec_chinese_lite_v2.0_bank
use_visualdl: False
infer_img: doc/imgs_words/ch/word_1.jpg
# for data or label process
character_dict_path: ppocr/utils/ppocr_keys_bank.txt
character_type: ch
max_text_length: 25
infer_mode: False
use_space_char: False
save_res_path: ./output/rec/predicts_chinese_lite_v2.0.txt
Optimizer:
name: Adam
beta1: 0.9
beta2: 0.999
lr:
name: Cosine
learning_rate: 0.001
regularizer:
name: 'L2'
factor: 0.00001
Architecture:
model_type: rec
algorithm: CRNN
Transform:
Backbone:
name: MobileNetV3
scale: 0.5
model_name: small
small_stride: [1, 2, 2, 2]
Neck:
name: SequenceEncoder
encoder_type: rnn
hidden_size: 48
Head:
name: CTCHead
fc_decay: 0.00001
Loss:
name: CTCLoss
PostProcess:
name: CTCLabelDecode
Metric:
name: RecMetric
main_indicator: acc
Train:
dataset:
name: SimpleDataSet
data_dir: ./train_data/
label_file_list:
- "./train_data/bank/real_rec_train.txt"
ratio_list: [1.0]
transforms:
- DecodeImage: # load image
img_mode: BGR
channel_first: False
- RecAug:
- CTCLabelEncode: # Class handling label
- RecResizeImg:
image_shape: [3, 32, 320]
- KeepKeys:
keep_keys: ['image', 'label', 'length'] # dataloader will return list in this order
loader:
shuffle: True
batch_size_per_card: 32
drop_last: True
num_workers: 8
Eval:
dataset:
name: SimpleDataSet
data_dir: ./train_data/
label_file_list:
- "./train_data/bank/real_rec_test.txt"
ratio_list: [1.0]
transforms:
- DecodeImage: # load image
img_mode: BGR
channel_first: False
- CTCLabelEncode: # Class handling label
- RecResizeImg:
image_shape: [3, 32, 320]
- KeepKeys:
keep_keys: ['image', 'label', 'length'] # dataloader will return list in this order
loader:
shuffle: False
drop_last: False
batch_size_per_card: 32
num_workers: 8
4、执行命令进行GPU训练
python -m paddle.distributed.launch --gpus 0 tools/train.py -o Global.use_visualdl=True -c configs/rec/ch_ppocr_v2.0/rec_chinese_lite_train_v2.0_bank.yml
注意显存问题,需要大于4G的显存,2G显存会溢出
5、显示运行图
visualdl --logdir=output/rec_chinese_lite_v2.0_bank/vdl --port 8081
识别模型效果最高能到达:acc:0.97
6、导出模型
python tools/export_model.py -c configs/rec/ch_ppocr_v2.0/rec_chinese_lite_train_v2.0_bank.yml
-o Global.pretrained_model="./output/rec_chinese_lite_v2.0_bank/best_accuracy" Global.save
_inference_dir="./output/rec_chinese_lite_v2.0_bank/"
检测模型和识别模型串联验证:
python tools/infer/predict_system.py --det_algorithm="DB" --det_model_dir="./inference/ch_db_mv3_bank/" --rec_model_dir=./inference/rec_chinese_lite_v2.0_bank/ --image_dir="C:\Users\YY007\Desktop\bank\1.jpg" --rec_char_dict_path="./ppocr/utils/ppocr_keys_bank.txt" --use_gpu=True --use_angle_cls=False --det_db_unclip_ratio=2.5
7、验证模型
8、获取银行卡类型和名称
获取银行卡名称和类型,可以通过这个链接来进行获取:
"https://ccdcapi.alipay.com/validateAndCacheCardInfo.json?cardNo=" + rec_res_final[ "bank_card_number"] + "&cardBinCheck=true"
获取的结果:
{
"cardType": "DC",
"bank": "HNRCU",
"key": "622991116400066409",
"messages": [],
"validated": true,
"stat": "ok"
}
银行卡类型对应的名称:
{ "DC": "借记卡", "CC": "信用卡", "SCC": "准贷记卡", "PC": "预付费卡" }
银行卡编号对应的银行卡名称文件下载地址:
小结
到这一步,银行卡识别已经完成,通过PaddleOCR来完成银行卡识别功能,只需要改动很少的代码就可以完成识别功能,具体改动参考“基于PaddleOCR银行卡识别实现(一)”文本检测部分,大家可通过提升数据集数量或者使用别的分割网络来试试看效果,下一章将继续讲解整个部署流程构建基于PaddleOCR银行卡识别实现(三),下方提供的模型开箱就可以使用,检测效果(0.983)、识别效果(0.975),欢迎大家下载。
3000多张真实银行卡卡号切图和上万张合成卡号切图下载地址:
检测和识别模型下载地址:
更多推荐
所有评论(0)