43.0 身份证、发票等关键信息提取

Posted by 子颢 on October 24, 2018

身份证识别

身份证识别的方法有很多,最常用的方式是三步走:第一步图像预处理,第二步文字分割,第三步文字识别。 card_OCR

  1. 图像预处理。因为所有文字都是黑色的,所以先split图片的RGB通道,留下黑色通道,这样基本上所有背景都被去掉了,然后再把头像部分也去除。
     boundary = ([0, 0, 0], [100, 100, 100])
     preprocess_bg_mask = PreprocessBackgroundMask(boundary)
    
     left_half_id_card_img_mask=np.copy(id_card_img_mask)
     left_half_id_card_img_mask[:,norm_width/2:]=0
    
  2. 文字分割。还是用上节同样的方法,往左投影求和找到文本行,然后每一行进行垂直投影,找到每一个字。
     for line_range in line_ranges:
         start_y, end_y = line_range
         end_y += 1
         line_img = id_card_img_mask[start_y: end_y]
         vertical_sum = np.sum(line_img, axis=0)
         vertical_peek_ranges = extract_peek_ranges_from_array(vertical_sum, minimun_val=40, minimun_range=1)
         vertical_peek_ranges2d.append(vertical_peek_ranges)
    

    card_OCR

  3. 文字识别。文字识别可以直接调用上一讲训练好的OCR字符识别模型。

上述是身份证识别的最常用的方法,这种方式对身份证、护照等格式简单且固定的场景特别有效,但是一旦场景变得复杂,比如海关单证、收据等的关键信息提取,文本行提取的难度就会显著加大,甚至变得不可行,这时更通用的解决方案是基于自定义模板的方式。

基于自定义模板的OCR

只要表格类的样式较为固定,就可以针对性的制作出相应的模板,然后导入样本图片实现结构化的数据提取。 card_OCR 其实现原理其实非常简单,主要分为以下几步。

  1. 上传一张待识别的特定的一类具有固定格式的文档的图片作为模板,在模板上框选一些固定不变的文字段作为【参照点】。 card_OCR 后续调用识别接口时,会将新上传的图片以【参照点】为依据,扭正到和模板图片一致,扭正方法也很简单,根据N个参考点求对应的透视变换,校正到统一的坐标维度。
  2. 框选【识别区】,并映射每个字段对应的字段名。 card_OCR 将扭正后的图片和识别区通过图像mask的方式提取目标文本行。
  3. 通过上述方法就可以很容易的提取到目标文本行,然后再通过同样的方式进行文字分割和文字识别。

社群


分享到: 微博 微信


返回顶部