# EAST **Repository Path**: yzhouxdu/EAST ## Basic Information - **Project Name**: EAST - **Description**: 支持QUAD 和 RBOX 的 EAST 文本检测模型,可支持多类识别 - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: https://gitee.com/yzhouxdu/EAST - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2022-08-31 - **Last Updated**: 2024-11-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## EAST.PYTORCH 用于证件检测(支持QUAD和RBOX) 该项目利用[EAST文本检测](http://openaccess.thecvf.com/content_cvpr_2017/papers/Zhou_EAST_An_Efficient_CVPR_2017_paper.pdf)的方法来实现多种类别证件检测。主要参考项目https://github.com/SakuraRiven/EAST 在该项目的基础上支持: * RBOX 和 QUAD训练和推理方式 * 可设置多类别检测对象 * 同时增加一些常用工具代码段:命令行传参,暂停继续训练,冻结训练,tensorboard, 增量目录输出,可视化脚本,标签转换脚本(easydl2quad) 所用括银行卡(91),行驶证(115),发票(120), 按照7:3划分训练测试集 用银行卡和行驶证进行训练500 epochs, 再加入发票,冻结backbone训练50个epochs,结果如下: | Classes | Precision | Recall | Hmean | | ------- | --------- | ------ | ----- | | 银行卡 | 0.80 | 0.92 | 0.86 | | 行驶证 | 0.89 | 0.97 | 0.93 | 加入发票类进行增量训练 | Classes | Precision | Recall | Hmean | | - | - | - | - | | 银行卡 | 0.78 | 0.96 | 0.86 | | 行驶证 | 0.94 | 0.97 | 0.96 | | 发票 | 0.75 | 1.0 | 0.86 | ## 环境 在以下环境已做测试 * Anaconda3 * Python 3.9/Python 3.8 * PyTorch 1.8/1.7.1 * Shapely 1.6.4 * opencv-python 4 * lanms 1.0.2 注意:在eval时需要你的环境中有zip/unzip ## 安装 ### 1. 拉取代码 ``` git clone https://gitee.com/yzhouxdu/EAST cd EAST ``` ### 2. 数据准备 * 数据组织格式同 [ICDAR 2015 Challenge 4](http://rrc.cvc.uab.es/?ch=4&com=downloads)一样, 将数据分成四个部分: train_img, train_gt, test_img, test_gt。 * 从Pytorch下载VGG16预训练模型: [VGG16](https://drive.google.com/open?id=1HgDuFGd2q77Z6DcUlDEfBZgxeJv4tald) , 并存放于新建目录pths下 数据组织如下: 首先all中数据只有银行卡和行驶证两类,当需要加入新类(发票)时,将invoice中的数据拷贝增加到all中; 如果想要尝试只训练新增类别head和新增数据,可以参考下面训练部分,同时将训练集路径指向invoice(经简单尝试网络似乎并不能收敛) ``` . ├── EAST │   ├── evaluate │   └── pths └── CARD ├── USED ├── all ├── train_img ├── train_gt ├── test_img └── test_gt ├── invoice ├── train_img ├── train_gt ├── test_img └── test_gt ``` ## 训练 以先训练两类(银行卡和行驶证)为例,新增类别(发票)进行增量训练 1). 首先训练用两类数据集进行训练 * 设置config.py中所用类别 ``` CLASS_NAME = ['bank_card', 'vehicle_lisence'] ``` * 在train.py中设置训练集路径和geometry类型,或者通过命令行: ``` python train.py --train_img_path --train_gt_path --geometry QUAD ``` ​ 所得权重会保存在目录 output/train/QUAD/exp 中 2). 增量训练 - 将新增类别数据图像和标签分别加入上述训练路径中 - 设置config.py中所用类别 ``` CLASS_NAME = ['bank_card', 'vehicle_lisence','invoice'] ``` - 在train.py中设置所得权重路径,或者通过命令行: ``` python train.py --train_img_path --train_gt_path --geometry QUAD --new_classes ./output/train/QUAD/exp/model_epoch_500.pth ``` ​ 增量训练中默认只冻结backbone进行训练,因为经实验,只有这种冻结方式网络可以收敛 ​ 如想要冻结除了新增类别头的其余网络,可在```trian.py```中进行设置,需要注意的是需要在```trian.py```中打开freeze(model),才能完全固定除了新增类别头的其余网络部分,同时如果要这样使用需要换到model_new.py,该脚本支持随类别数构建网络,并便于加载除新增类别外的权重,但经实验验证此种模型构建方式精度并没有model.py的构造方式精度高 ```python from model_new import EAST if arg.new_classes: checkpoint = torch.load(arg.new_classes) model_dict = checkpoint['model_dict'] pre_nc = checkpoint['pre_num_cls'] model.load_state_dict(model_dict, strict=False) start_epoch = checkpoint['epoches'] + 1 # freeze backbone for k,v in model.named_parameters(): if 'extractor' in k: v.requires_grad = False else: v.requires_grad = True # # only freeze new class head # for k,v in model.named_parameters(): # if 'output' in k and int(k.split('.')[-2])>=pre_nc: # v.requires_grad = True # else: # v.requires_grad = False ............................ for epoch in range(epoch_iter): epoch += start_epoch model.train() ##freeze the running_mean and running_var of bn #freeze(model) epoch_loss = 0 epoch_time = time.time() ``` ## 检测 运行 ```detect.py``` 或者```detect_api.py```: ``` python detect.py python detect_api.py ``` ## 验证 * 验证脚本使用的ICDAR官方评估方法并进行了一定的修改 [ICDAR Offline evaluation](http://rrc.cvc.uab.es/?ch=4&com=mymethods&task=1) * 根据自己的数据集更改 ```evaluate/gt.zip``` ``` python eval.py ```