General OCR一般包含两步:
1. detection-->找到包含文字的区域(proposal);
2. classification-->识别区域中的文字。
先说detection models.
近两年比较热门的object detection model有 faster-rcnn 和 Yolo, 两个模型都是基于CNN给出proposed regions 同时对object region进行分类。 其中yolo比faster-rcnn的速度更快,但是在accuracy上有些损失。
再说classification models.
比较著名的是Ian goodfellow在13年提出的multi-digit number classification([1312.6082] Multi-digit Number Recognition from Street View Imagery using Deep Convolutional Neural Networks), 同样也是基于deep CNN. 该方法的不足在于要事先选定可预测的sequence的最大长度,较适用于门牌号码或者车牌号码(少量字符, 且每个字符之间可以看作是独立); 另一类比较常用的方法是RNN/LSTM/GRU + CTC, 方法最早由Alex Graves在06年提出应用于语音识别。这个方法的好处在于可以产生任意长度的文字,并且模型的性质决定了它有能力学到文字于文字之间的联系(temporal relations/dependencies)。不足之处在于sequential natural决定了它的计算效率没有CNN高,并且还有潜在的gradients exploding/vanishing的问题。
以上说的这两类模型都不需要对文字预先分割(end-to-end)。
另一类不需要对文字预先分割的方法就是attention-mechanism,attention可以分为hard attention和soft attention. 其中hard attention能够直接给出hard location,通常是bounding box的位置 (https://arxiv.org/pdf/1412.7755.pdf), 想法直观,缺点是不能直接暴力bp。soft attention通常是rnn/lstm/gru encoder-decoder model (https://arxiv.org/abs/1603.03101), 可以暴力bp。还有一种比较特别的gradient-based attention(http://www.ics.uci.edu/~yyang8/research/feedback/feedback-iccv2015.pdf) 也挺有意思。
文字检测算法近几年发展迅速,可以分为水平文字检测(四个自由度,类似物体检测)和倾斜文字检测(文字框是不规则四边形,八个自由度),水平文字检测个人认为比较好的算法是2016 ECCV乔宇老师团队的CTPN,倾斜文字检测个人比较喜欢的方法是2017 CVPR的EAST和Seglink,感兴趣可以看论文继续了解。
文字识别近两年没有太大进展,有两种方法,一种是CNN+RNN+CTC,白翔老师团队的CRNN写的比较清楚,还有一种是CNN+RNN基于Attention的方法。
最近比较火的方向是文字检测和识别放到一个网络里joint train,沈春华老师团队2017 ICCV的Towards End-to-end Text Spotting with Convolutional Recurrent Neural Networks这篇文章已经在水平文字上把检测识别end to end做的比较work,感觉这可能是未来一两年的一个热点。