赛题链接
关于数据
看了数据集sample,可以归纳为「单行不定长数字串ocr」。
解题思路有三种:
- 不定长补成定长
这个思路很粗暴,但也很巧,将补位位置的背景统一归类为第11类数字 - 直接使用不定长算法
之前没听过。。 - 检测识别
这个是我接触过的ocr的正统思路,emmm
关于baseline
跑了下baseline的代码,纯cpu下太慢了。。没跑完,果断换cuda模式(use_cuda=True
),然后,跑出bug了:
主要是数据在内存和显存之间的拷贝问题,下面是原始代码和fix bug之后的代码:
- 原代码
def predict(test_loader, model, tta=10):
......
for i, (input, target) in enumerate(test_loader):
if use_cuda:
input = input.cuda()
c0, c1, c2, c3, c4 = model(input)
output = np.concatenate([
c0.data.numpy(),
c1.data.numpy(),
c2.data.numpy(),
c3.data.numpy(),
c4.data.numpy()], axis=1)
test_pred.append(output)
......
- bug fix代码
def predict(test_loader, model, tta=10):
......
for i, (input, target) in enumerate(test_loader):
if use_cuda:
input = input.cuda()
c0, c1, c2, c3, c4 = model(input)
output = np.concatenate([
c0.cpu().data.numpy(),
c1.cpu().data.numpy(),
c2.cpu().data.numpy(),
c3.cpu().data.numpy(),
c4.cpu().data.numpy()], axis=1)
else:
c0, c1, c2, c3, c4 = model(input)
output = np.concatenate([
c0.data.numpy(),
c1.data.numpy(),
c2.data.numpy(),
c3.data.numpy(),
c4.data.numpy()], axis=1)
test_pred.append(output)
......
跑完后传到天池上测了下,正确率在0.43,比教程里估计的0.33高不少。。。不知道啥情况