有个 NeuralNetwork training 的问题, 请教高手

E
ExpressoLove
楼主 (未名空间)

应用场景是从Invoice document (any type of documents) 抓取 Key - value pair, 怎样建neural network 来 extract key-value。 这个key-value 可以水平, 也可以垂直, 也可以对角。
用image processing 可以 locate words/string, 然后用CNN+LSTM可以认。 但是怎么建立NN来提取联系。
我想到的人脸识别,分两步走。 首先确定是人脸, 然后用两个NN,确定同一张脸的唯一特征。 最后辨认。

有没有高手指导一下。 已经有公司做了。 但是网上搜不到这种类似的项目。 OCR 到
时很多。 但是这个key-value 关系的抓取不多见。

可以私下联系。

r
repast
2 楼

Expensify 据说后端是人在做,至少前几年是这样。
联系不一定要NN来提,你认出来那些是key, 然后你知道那些地方最可能出现 value,
然后如果 direction 能对得上就行了啊。
l
longtian
3 楼

先调整invoice的角度,让文字水平,然后再提取,避免方向的问题。

这个比较重要的是图片的质量,图片质量不高的时候,ocr识别问题很大,抓出来的key-value也没用

【 在 ExpressoLove (MoneyForNothing) 的大作中提到: 】
: 应用场景是从Invoice document (any type of documents) 抓取 Key - value
pair
: , 怎样建neural network 来 extract key-value。 这个key-value 可以水平, 也可
: 以垂直, 也可以对角。
: 用image processing 可以 locate words/string, 然后用CNN+LSTM可以认。 但是怎么
: 建立NN来提取联系。
: 我想到的人脸识别,分两步走。 首先确定是人脸, 然后用两个NN,确定同一张脸的唯
: 一特征。 最后辨认。
: 有没有高手指导一下。 已经有公司做了。 但是网上搜不到这种类似的项目。 OCR 到
: 时很多。 但是这个key-value 关系的抓取不多见。
: 可以私下联系。

E
ExpressoLove
4 楼

谢谢大家。
可能我没有说仔细这个问题。
现在一般先从传统的OCR认识text,输出word 和 坐标。 然后建模。 这步我知道怎么
做, classification问题,不难。当然,也可以用corenlp 或者LSTM 抓 value。 后
者问题是不能很好的抓vertical 的 value。 原因是你不能控制OCR 输出, 从而保证
key 和value 正好一起。 要不然问题很简单。

现在似乎直接从image上认出 text 要比传统的OCR 好, 尤其低质量的image。当然图
片质量好,没有必要用NN。 所以我想跳开传统OCR, 直接从image上认出这个key-
value pair。 找到word和并认出不难, 简单的CNN + LSTM 就行。 问题是怎么建立个NN 或两个NN, 通过训练, 从而能让NN 自己extract key-value 。 比如, “
invoice” 和 A123456, 后者在 在”invoice“ 的周围。 感兴趣的可以看看公司
Rossum。

最终就是image 进, key-values 出来。

【 在 longtian (有人的地方,就有江湖) 的大作中提到: 】
: 先调整invoice的角度,让文字水平,然后再提取,避免方向的问题。
: 这个比较重要的是图片的质量,图片质量不高的时候,ocr识别问题很大,抓出来的
key
: -value也没用
: pair

E
ExpressoLove
5 楼

谢谢大家。
可能我没有说仔细这个问题。
现在一般先从传统的OCR认识text,输出word 和 坐标。 然后建模。 这步我知道怎么
做, classification问题,不难。当然,也可以用corenlp 或者LSTM 抓 value。 后
者问题是不能很好的抓vertical 的 value。 原因是你不能控制OCR 输出, 从而保证
key 和value 正好一起。 要不然问题很简单。

现在似乎直接从image上认出 text 要比传统的OCR 好, 尤其低质量的image。当然图
片质量好,没有必要用NN。 所以我想跳开传统OCR, 直接从image上认出这个key-
value pair。 找到word和并认出不难, 简单的CNN + LSTM 就行。 问题是怎么建立个NN 或两个NN, 通过训练, 从而能让NN 自己extract key-value 。 比如, “
invoice” 和 A123456, 后者在 在”invoice“ 的周围。 感兴趣的可以看看公司
Rossum。

最终就是image 进, key-values 出来。

【 在 longtian (有人的地方,就有江湖) 的大作中提到: 】
: 先调整invoice的角度,让文字水平,然后再提取,避免方向的问题。
: 这个比较重要的是图片的质量,图片质量不高的时候,ocr识别问题很大,抓出来的
key
: -value也没用
: pair

E
ExpressoLove
6 楼

这可以用传统的ML 做。 无非就是用附近的word 来做feature。 但是对poor image不
好。 NN表现在poor image 上更好

【 在 repast (xebec) 的大作中提到: 】
: Expensify 据说后端是人在做,至少前几年是这样。
: 联系不一定要NN来提,你认出来那些是key, 然后你知道那些地方最可能出现 value,
: 然后如果 direction 能对得上就行了啊。

l
longtian
7 楼

简单的receipt在同一行的,就是key-value。附件这个是我自己用照片ocr出来的,一
行的split出来就是key-value,做成json使用很方便

如果有table,就是去下一行同样的位置找

我遇到的receipt都很简单,其他的复杂情况我没遇到

【 在 ExpressoLove (MoneyForNothing) 的大作中提到: 】
: 谢谢大家。
: 可能我没有说仔细这个问题。
: 现在一般先从传统的OCR认识text,输出word 和 坐标。 然后建模。 这步我知道怎么
: 做, classification问题,不难。当然,也可以用corenlp 或者LSTM 抓 value。 后
: 者问题是不能很好的抓vertical 的 value。 原因是你不能控制OCR 输出, 从而保证
: key 和value 正好一起。 要不然问题很简单。
: 现在似乎直接从image上认出 text 要比传统的OCR 好, 尤其低质量的image。当然图
: 片质量好,没有必要用NN。 所以我想跳开传统OCR, 直接从image上认出这个key-
: value pair。 找到word和并认出不难, 简单的CNN + LSTM 就行。 问题是怎么建立个
: NN 或两个NN, 通过训练, 从而能让NN 自己extract key-value 。 比如, “
: ...................

g
guvest
8 楼

我猜他是想学习这个“谁在谁下面一行”这样的一个位置关系或者rule,但
是说不清楚吧?

所以他说两个NN。NN本身是map fitting,
Map之间的Map也是Map,这点弄明白了就可以套类库试一下了。
这类似于识别海滩上哪些男女是恋人类似。有文献可以参考。

这就好比向量空间也可以用一组向量来表示类似。
【 在 longtian(有人的地方,就有江湖) 的大作中提到: 】
<br>: 简单的receipt在同一行的,就是key-value。附件这个是我自己用照片
ocr出来
的,一
<br>: 行的split出来就是key-value,做成json使用很方便
<br>: 如果有table,就是去下一行同样的位置找
<br>: 我遇到的receipt都很简单,其他的复杂情况我没遇到
<br>

l
longtian
9 楼

谁在谁下面这种问题,我觉得问题的本质是个结构分类。这种结构分类是由关键词决定的,用ocr的关键词来做就好。比如receipt上面总有title啥的

比如你知道这是costco加油站的,那做个costco加油站的template,只要有costco,
oil这种词就extract相关位置的信息就好。更一般的做法是你可以把所有的ocr信息作
为输入,然后标记label,然后用nn来train。其实nn都不需要,用个rf效果就应该不错。

【 在 guvest (我爱你老婆Anna) 的大作中提到: 】
: 我猜他是想学习这个“谁在谁下面一行”这样的一个位置关系或者rule,但
: 是说不清楚吧?
: 所以他说两个NN。NN本身是map fitting,
: Map之间的Map也是Map,这点弄明白了就可以套类库试一下了。
: 这类似于识别海滩上哪些男女是恋人类似。有文献可以参考。
: 这就好比向量空间也可以用一组向量来表示类似。
:
: 简单的receipt在同一行的,就是key-value。附件这个是我自己用照片
: ocr出来
: 的,一
:
: 行的split出来就是key-value,做成json使用很方便
: ...................

g
guvest
10 楼

把训练集和label整理好。任何有监督学习的算法的接口都是类似的。套了以后调参数
。trail and error。

就是关系这个领域,没听到DL的突破(我没怎么看文献)。所以是不是有优势不太清楚。

【 在 longtian(有人的地方,就有江湖) 的大作中提到: 】

: 谁在谁下面这种问题,我觉得问题的本质是个结构分类。这种结构分类是由关键词决定

: 的,用ocr的关键词来做就好。比如receipt上面总有title啥的

: 比如你知道这是costco加油站的,那做个costco加油站的template,只要有
costco,

: oil这种词就extract相关位置的信息就好。更一般的做法是你可以把所有的ocr
信息作

: 为输入,然后标记label,然后用nn来train。其实nn都不需要,用个rf效果就应该不错。

j
justnow
11 楼

这个 pipeline 可行?

1 用 OCR 把图片变成文字:https://cloud.google.com/vision/docs/ocr。留意到这
个 API 是返回坐标的,所以理论上可以重建文字的位置;

2 用 NLP 中的 NER 来标记命名实体,比如价格,电话等;

3 利用命名实体的位置来左右或者上下对齐,来尝试找到 key value pair。

【 在 ExpressoLove (MoneyForNothing) 的大作中提到: 】
: 谢谢大家。
: 可能我没有说仔细这个问题。
: 现在一般先从传统的OCR认识text,输出word 和 坐标。 然后建模。 这步我知道怎么
: 做, classification问题,不难。当然,也可以用corenlp 或者LSTM 抓 value。 后
: 者问题是不能很好的抓vertical 的 value。 原因是你不能控制OCR 输出, 从而保证
: key 和value 正好一起。 要不然问题很简单。
: 现在似乎直接从image上认出 text 要比传统的OCR 好, 尤其低质量的image。当然图
: 片质量好,没有必要用NN。 所以我想跳开传统OCR, 直接从image上认出这个key-
: value pair。 找到word和并认出不难, 简单的CNN + LSTM 就行。 问题是怎么建立个
: NN 或两个NN, 通过训练, 从而能让NN 自己extract key-value 。 比如, “
: ...................

j
justnow
12 楼

刨除技术的因素,我觉得这个项目有一个难点是很难完全自动化,完全无需人的核验。因为收据涉及到钱,很敏感。连准确率到 95% 可能有些人也不会接受。

类似的技术用来数据化实体名片就没问题。10 张名片能对 9 张我就用。
n
neros
13 楼

我来做的话分3步,第一个NN做带位置的OCR把各个独立字串识别出来。

第二步把独立字串中的Key找出来,输入是字串本身及周围字串的内容及位置。

第三步找出某个Key所对应的Value,输入是Key本身和周围的字串内容及位置。

【 在 ExpressoLove (MoneyForNothing) 的大作中提到: 】
: 应用场景是从Invoice document (any type of documents) 抓取 Key - value
pair
: , 怎样建neural network 来 extract key-value。 这个key-value 可以水平, 也可
: 以垂直, 也可以对角。
: 用image processing 可以 locate words/string, 然后用CNN+LSTM可以认。 但是怎么
: 建立NN来提取联系。
: 我想到的人脸识别,分两步走。 首先确定是人脸, 然后用两个NN,确定同一张脸的唯
: 一特征。 最后辨认。
: 有没有高手指导一下。 已经有公司做了。 但是网上搜不到这种类似的项目。 OCR 到
: 时很多。 但是这个key-value 关系的抓取不多见。
: 可以私下联系。

E
ExpressoLove
14 楼

谢谢大家踊跃发言。
1.目前公司的一个平台在做, 是一边学习, 一遍总结rule, 没有一开始训练大量
data,所以准确率不到80%, 而且需要很多regular expression。而且传统的OCR的认
识准确率影响最终结果, 尤其是image 质量不太好的。
2. invoice number 的 key 其实不唯一, 加上OCR认识误差。 会有很多variation。 比如, invoice, inveice#, invoice number, invoice No 或者 inv。或者
dollar amount 的key 更多, total amount, amount due, total。。。
3. 大家说的, 我将要做, 用传统的ML 方法, 无非就是 给定一个value,比如 $ 20.99,然后找周围最近的1-grams, 2-grams words (total 或者total amount, 然后
输出一个feature matrix。 下面就是classification 问题。 技术和逻辑上很清楚。
4. 但是,像我说的, image 质量比较差的情况, 完全抓瞎了。 但是NN可以整个word recognition, 准确率会高。 而且, 不需要regular expression。 只要label key 和 value , 然后训练, 最终可以发现key-value 的maping rule。
5. 在3 里,那个feature matrix 其实人已经规定了rule , 上下左右,最近的key。 现在问题是怎么设计NN, 我只需要label key 和value, 当然还有各自的位置。然后
整个图片(3300x2550)放进NN, NN会自己找到所谓的最近邻mapping rule。 输出多
个key-value pairs。
6. 基于图片的 CNN+LTSM (character-wise 和 word-wise recognition ) 已经搞定了。下面是设计NNstructure。 应该也是先找到key 和 它的坐标。 然后找它周围的
word。或者直接在一张图上label key, value, 坐标。 那怎么准备输入的X。是合并坐标image的tensor 然后转化成一维向量吗。

已有公司做了, 准确率已经超过公司的现在的产品。 我将要开始传统的ML 建模。 图片质量好的的话, 准确率应该也会比较高。 但是NN抓取key-value 代表未来的方向, 处理低质量的图片比较准确。 而且客户的文档扫描的多。

谢谢。 我继续搜。

【 在 neros (尼禄@淫油湿仁) 的大作中提到: 】
: 我来做的话分3步,第一个NN做带位置的OCR把各个独立字串识别出来。
: 第二步把独立字串中的Key找出来,输入是字串本身及周围字串的内容及位置。
: 第三步找出某个Key所对应的Value,输入是Key本身和周围的字串内容及位置。
: pair

E
ExpressoLove
15 楼

谢谢。
这个invoice不是统一的。 不同的vendor 出的invoice 格式很不一样, 用的key 也不一样。
而且如果OCR 出错, 这个key就不好定了。 需要regular expression。 一旦引入
regex, 那么variation 就多了。

【 在 longtian (有人的地方,就有江湖) 的大作中提到: 】
: 简单的receipt在同一行的,就是key-value。附件这个是我自己用照片ocr出来的,一
: 行的split出来就是key-value,做成json使用很方便
: 如果有table,就是去下一行同样的位置找
: 我遇到的receipt都很简单,其他的复杂情况我没遇到

E
ExpressoLove
16 楼

你这个男女关系类比很贴切。 谢谢。

【 在 guvest (我爱你老婆Anna) 的大作中提到: 】
: 我猜他是想学习这个“谁在谁下面一行”这样的一个位置关系或者rule,但
: 是说不清楚吧?
: 所以他说两个NN。NN本身是map fitting,
: Map之间的Map也是Map,这点弄明白了就可以套类库试一下了。
: 这类似于识别海滩上哪些男女是恋人类似。有文献可以参考。
: 这就好比向量空间也可以用一组向量来表示类似。
:
: 简单的receipt在同一行的,就是key-value。附件这个是我自己用照片
: ocr出来
: 的,一
:
: 行的split出来就是key-value,做成json使用很方便
: ...................

E
ExpressoLove
17 楼

基于template的OCR 抓取很简单, 问题是vendor的发票不统一。 不想中国的增值税发票

【 在 longtian (有人的地方,就有江湖) 的大作中提到: 】
: 谁在谁下面这种问题,我觉得问题的本质是个结构分类。这种结构分类是由关键词决定
: 的,用ocr的关键词来做就好。比如receipt上面总有title啥的
: 比如你知道这是costco加油站的,那做个costco加油站的template,只要有costco,: oil这种词就extract相关位置的信息就好。更一般的做法是你可以把所有的ocr信息作
: 为输入,然后标记label,然后用nn来train。其实nn都不需要,用个rf效果就应该不错。

E
ExpressoLove
18 楼

这个到是一个方向。我也稍微试了一下。一个问题是垂直方向不好辨认NER。 NER取决
于周围的token的language 方面的特性, 动词, 名词, 大小写, 词根啊。 问题是
从OCR出来不能想人眼一样直接排序。 所以一个NER周围的tokens不定。 水平方向的
key-value, 用glove, nlp ,lstm 很容易的。 非垂直方向就不定了。 当然, 图片如果来自一个版本, 也容易。

【 在 justnow (阿材) 的大作中提到: 】
: 这个 pipeline 可行?
: 1 用 OCR 把图片变成文字:https://cloud.google.com/vision/docs/ocr。留意到这
: 个 API 是返回坐标的,所以理论上可以重建文字的位置;
: 2 用 NLP 中的 NER 来标记命名实体,比如价格,电话等;
: 3 利用命名实体的位置来左右或者上下对齐,来尝试找到 key value pair。

l
longtian
19 楼

所以做这个一般都要求scan图片,600dpi才能有比较好的结果,手机照片效果不好

【 在 ExpressoLove (MoneyForNothing) 的大作中提到: 】
: 谢谢。
: 这个invoice不是统一的。 不同的vendor 出的invoice 格式很不一样, 用的key 也不
: 一样。
: 而且如果OCR 出错, 这个key就不好定了。 需要regular expression。 一旦引入
: regex, 那么variation 就多了。

l
lightroom
20 楼

你们这个深学基础不是太多,不要一口吃个胖子,一点一点来。比如OCR先换成深学,
这个open source都不少。有点感觉在往上加

【 在 ExpressoLove (MoneyForNothing) 的大作中提到: 】
: 谢谢大家踊跃发言。
: 1.目前公司的一个平台在做, 是一边学习, 一遍总结rule, 没有一开始训练大量
: data,所以准确率不到80%, 而且需要很多regular expression。而且传统的OCR的认
: 识准确率影响最终结果, 尤其是image 质量不太好的。
: 2. invoice number 的 key 其实不唯一, 加上OCR认识误差。 会有很多variation

: 比如, invoice, inveice#, invoice number, invoice No 或者 inv。或者
: dollar amount 的key 更多, total amount, amount due, total。。。
: 3. 大家说的, 我将要做, 用传统的ML 方法, 无非就是 给定一个value,比如 $ 20
: .99,然后找周围最近的1-grams, 2-grams words (total 或者total amount, 然后
: 输出一个feature matrix。 下面就是classification 问题。 技术和逻辑上很清楚。
: ...................

l
longtian
21 楼

现在的ocr都有dl的算法, 比如最popular的tesseract

【 在 lightroom (吃一条鱼,思考一个问题,法号三丰) 的大作中提到: 】
: 你们这个深学基础不是太多,不要一口吃个胖子,一点一点来。比如OCR先换成深学,
: 这个open source都不少。有点感觉在往上加
: 。
: 20

w
wflower
22 楼

you sure tesseract's ocr is dl-based?

【 在 longtian (有人的地方,就有江湖) 的大作中提到: 】
: 现在的ocr都有dl的算法, 比如最popular的tesseract

e
ericalex
23 楼

我做过类似的工作。几点想法:
1。how good is good enough。 你提到有人做得更好,是否apple to apple
comparison?
2. find the bottleneck。 看看extracted错误结果,其OCR结果是否正确?一般说来
,OCR就用off the shelf, tesseract。可以联调image pre-processing和OCR。
3. 有基于区域的OCR,把header和line items分别处理。
4. 用一个sliding window读取key-value pairs。 改变window的尺寸,直到提取most likely key-value pair.
5. 用NN,结合手工feature。
w
wflower
24 楼

I think each key should have a semantic class. For example, "Tel."/"
Telephone"/"Tel #", even typo like "Tol #" all belong to a same class.

I once interviewed a startup doing this. No expert, but know it is
definitely no easy.

【 在 ExpressoLove (MoneyForNothing) 的大作中提到: 】
: 谢谢。
: 这个invoice不是统一的。 不同的vendor 出的invoice 格式很不一样, 用的key 也不
: 一样。
: 而且如果OCR 出错, 这个key就不好定了。 需要regular expression。 一旦引入
: regex, 那么variation 就多了。

l
lightroom
25 楼

the latest version is based on DL.

K, V pair labeling is very similar to semantic parsing. If you don't have
detailed labels, in my opinion, RL would help in a weakly supervising
manner.

【 在 wflower (流) 的大作中提到: 】
: you sure tesseract's ocr is dl-based?

E
ExpressoLove
26 楼

你说得对。 key本生就可以多种variantion,加上ocr问题,最后抓取率受影响。
现在DL的优点在于image直接认,准确率决定于你的训练集。我也evaluate TESSERAT。现在的TESSERAT 确实基于LSTM 的神经网络,确实比传统的OCR在低质量的图片表现胜
出。

【 在 wflower (流) 的大作中提到: 】
: I think each key should have a semantic class. For example, "Tel."/"
: Telephone"/"Tel #", even typo like "Tol #" all belong to a same class.
: I once interviewed a startup doing this. No expert, but know it is
: definitely no easy.