第一届西安交通大学人工智能实践大赛(2018AI实践大赛--图片文字识别)第一名;仅采用densenet识别图中文字

Overview

OCR

第一届西安交通大学人工智能实践大赛(2018AI实践大赛--图片文字识别)冠军

模型结果

该比赛计算每一个条目的f1score,取所有条目的平均,具体计算方式在这里。这里的计算方式不对一句话里的相同文字重复计算,故f1score比提交的最终结果低:

- train val
f1score 0.9911 0.9582
recall 0.9943 0.9574
precision 0.9894 0.9637

模型说明

  1. 模型

采用densenet结构,模型输入为(64×512)的图片,输出为(8×64×2159)的概率。

将图片划分为多个(8×8)的方格,在每个方格预测2159个字符的概率。

  1. Loss

将(8×64×2159)的概率沿着长宽方向取最大值,得到(2159)的概率,表示这张图片里有对应字符的概率。

balance: 对正例和负例分别计算loss,使得正例loss权重之和与负例loss权重之和相等,解决数据不平衡的问题。

hard-mining

  1. 文字检测 将(8×64×2159)的概率沿着宽方向取最大值,得到(64×2159)的概率。 沿着长方向一个个方格预测文字,然后连起来可得到一句完整的语句。

存在问题:两个连续的文字无法重复检测

下图是一个文字识别正确的示例:的长为半径作圆

下图是一个文字识别错误的示例:为10元;经粗加工后销售,每

文件目录

ocr
|
|--code
|
|--files
|	|
|	|--train.csv
|
|--data
	|
	|--dataset
	|	|
	|	|--train
	|	|
	|	|--test
	|
	|--result
	|	|
	|	|--test_result.csv
	|
	|--images		此文件夹放置任何图片均可,我放的celebA数据集用作pretrain

运行环境

Ubuntu16.04, python2.7, CUDA9.0

安装pytorch, 推荐版本: 0.2.0_3

pip install -r requirement.txt

下载数据

这里下载初赛、复赛数据、模型,合并训练集、测试集。

预处理

如果不更换数据集,不需要执行这一步。

如果更换其他数据集,一并更换 files/train.csv

cd code/preprocessing
python map_word_to_index.py
python analysis_dataset.py  

训练

cd code/ocr
python main.py

测试

f1score在0.9以下,lr=0.001,不使用hard-mining;

f1score在0.9以上,lr=0.0001,使用hard-mining;

生成的model保存在不同的文件夹里。

cd code/ocr
python main.py --phase test --resume  ../../data/models-small/densenet/eval-16-1/best_f1score.ckpt
You might also like...
Comments
  • IndexError: tuple index out of range

    IndexError: tuple index out of range

    您好,我是在window7运行该工程的。运行环境是是torch1.0.0,最后改成可以训练时,出现如题所示的错误。错误如下: `best_f1score 0

    1 train-1 0%| | 0/596 [00:00<?, ?it/s]T raceback (most recent call last): File "main.py", line 864, in if name == 'main': File "main.py", line 831, in main

    File "main.py", line 494, in train_eval images, labels = [Variable() for x in data[1:3]] File "main.py", line 471, in get_weight label_true = (labels>0.5).sum(0) IndexError: tuple index out of range 0%| | 0/596 [00:16<?, ?it/s]

    在get_weight函数中我是没有动的,如下:def get_weight(labels): labels = labels.data.cpu().numpy() weights = np.zeros_like(labels) # weight_false = 1.0 / ((labels<0.5).sum() + 10e-20) # weight_true = 1.0 / ((labels>0.5).sum() + 10e-20) weight_false = 1.0 / ((labels<0.5).sum(0) + 10e-20) label_true = (labels>0.5).sum(0) for i in range(labels.shape[1]): label_i = labels[:,i] weight_i = np.ones(labels.shape[0]) * weight_false[i] # weight_i = np.ones(labels.shape[0]) * weight_false if label_true[i] > 0: weight_i[label_i>0.5] = 1.0 / label_true[i] weights[:,i] = weight_i weights *= np.ones_like(labels).sum() / (weights.sum() + 10e-20) weights[labels<-0.5] = 0 return weights` 给为大佬能给点提示吗?或者大概说一下这个函数的具体作用,labels的数据类型是啥?

    opened by SeventhBlue 3
  • 分析数据集的代码analysis_dataset.py好像有问题,具体如下

    分析数据集的代码analysis_dataset.py好像有问题,具体如下

    1. 第37行对h进行除以10的操作,会产生小数,导致第47行的h_count_dict.keys()全是小数,从而x = range(max(h_count_dict.keys())+1)会报错,因为range里面只能是整数;
    2. 继续看下去,第48行的y = [0 for _ in x]让y初始化为一个列表,51行y[h] = h_count_dict[h]赋值操作,因为h是小数,所以y[h]写法是错误的,会报错;
    3. 请问作者是怎么成功运行analysis_dataset.py的???
    opened by HELL-TO-HEAVEN 0
  • 输出文字有乱序现象。

    输出文字有乱序现象。

    您好,我在用自己图片训练时,loss到0.01以下后,测试训练集内的数据,发现输出的文字有乱序现象。 训练图片是32*280,每张图至多10个字符。字符集大概400,包括汉字、标点、数字等。 乱序很多是三个字的: 123 会变成 132, 但也有12345变成51234的。 不知道是原因,请不吝赐教!

    opened by oohurbert 2
Owner
尹畅
Ph.D. in CSE Research interests: deep learning, active learning, medical application
尹畅