最近在做ocr识别项目,由于是第一次接触这个东西,所以在整个过程中采到了非常多的坑,这里就记录一下采坑的地方,以及都是怎么解决的,方便大家接下来使用。
1、首先是这个坑
pytorch错误:RuntimeError: cuDNN error: CUDNN_STATUS_EXECUTION_FAILED (安装cuda)
RuntimeError: CUDA error: unspecified launch failure
这两个错误表达的意思好像是内存或者显存不够,这个一般是在训练开始几轮之后才会发生,这个时候就要去检查train时传入hatch_size和test的batch_size,一般这个这两个是同时使用的,train和test同时发生,如果train的batch_size和test的都等于4那么两个在一起就是8了,这个时候内存很有可能不够,就会发生这个错误,那么我们要做的就是把这两个数字调小。
2、第二个经验就是我们使用360w提供的数据集的时候注意他们的标签长度都是10个,而且都是需要在加载数据的时候去查字典,把编码转换成真正的文字符号的,那么我们在训练我们自己的数据集的时候有很多时候都是不定长的,我们还有360w的那个数据加载代码肯定是会报错的,所以我们必须使用own这个文件里面的代码。数据集的格式是下面这个样子
左边是我们训练的图片,右边是txt格式的文件,文件里面是图片的名字+格式 (格式和内容之间保留一个空格)+图片上的内容,
3、要注意你在训练的时候是使用完整的训练还是迁移训练,这个可以在train文件的代码中可以看到
if config.TRAIN.FINETUNE.IS_FINETUNE:#迁移学习
model_state_file = config.TRAIN.FINETUNE.FINETUNE_CHECKPOINIT
if model_state_file == '':
print(" => no checkpoint found")
checkpoint = torch.load(model_state_file, map_location='cpu')
if 'state_dict' in checkpoint.keys():
checkpoint = checkpoint['state_dict']
from collections import OrderedDict
model_dict = OrderedDict()
for k, v in checkpoint.items():
if 'cnn' in k:
model_dict[k[4:]] = v
model.cnn.load_state_dict(model_dict)
if config.TRAIN.FINETUNE.FREEZE:
for p in model.cnn.parameters():
p.requires_grad = False
elif config.TRAIN.RESUME.IS_RESUME:#重新训练
model_state_file = config.TRAIN.RESUME.FILE
if model_state_file == '':
print(" => no checkpoint found")
差不多与这个一样。
4、还有一个就是.yaml文件的修改以及里面参数的意思这里与大家分享一下
GPUID: 0 #GPU的编号
WORKERS: 0 #0表示单线程工作,一般设置为0
PRINT_FREQ: 10 # 多少个step打印一次训练信息
SAVE_FREQ: 10 #多少个epoch保存一次
PIN_MEMORY: False #读取数据集加速
OUTPUT_DIR: 'output'
CUDNN:
BENCHMARK: True
DETERMINISTIC: False
ENABLED: True
DATASET:
DATASET: OWN
ROOT: "C:/Users/ljs/Desktop/test3" #加载图片的路径
CHAR_FILE: 'lib/dataset/txt/char_std_5990.txt' #加载字典的路径
JSON_FILE: {'train': 'lib/dataset/txt/train.txt', 'val': 'lib/dataset/txt/test.txt'} #这两个是训练和测试需要文件路径
SCALE_FACTOR: 0.25
ROT_FACTOR: 30
STD: 0.193 #这个与下面这个应该是归一化的参数,
MEAN: 0.588
ALPHABETS: '' #字母表
TRAIN:
BATCH_SIZE_PER_GPU: 2 #训练时加载数据batch_size的大小
SHUFFLE: True #洗牌,避免喂入数据的顺序对网络造成影响,增加随机性,提高泛化能力
BEGIN_EPOCH: 0
END_EPOCH: 200 #训练圈数
RESUME:
IS_RESUME: False #是否重新训练
FILE: ''
OPTIMIZER: 'adam'
LR: 0.0001
WD: 0.0
LR_STEP: [60, 80]
LR_FACTOR: 0.1
MOMENTUM: 0.0
NESTEROV: False #梯度下降算法
RMSPROP_ALPHA:
RMSPROP_CENTERED:
FINETUNE: #迁移训练
IS_FINETUNE: True
FINETUNE_CHECKPOINIT: 'output/checkpoints/crnn.pth'
FREEZE: true #使用迁移训练是否冻结参数
TEST:
BATCH_SIZE_PER_GPU: 2 #测试时加载batch_size的大小
SHUFFLE: True # for random test rather than test on the whole validation set
NUM_TEST_BATCH: 4
NUM_TEST_DISP: 10
MODEL:
NAME: 'crnn'
IMAGE_SIZE:
OW: 280. # origial width: 280
H: 32
W: 160 # resized width: 160
NUM_CLASSES: 0
NUM_HIDDEN: 256
目前只记得这些,如果接下来还有别的错误发生我会随时记录下来与大家分享一下。