深度学习OCR与传统OCR对比实验:图像数据集联系博主获取

光学字符识别(OCR)是将图像中的文字转化为可编辑文本的技术,广泛应用于日常生活和工作中,比如票据扫描、表单识别等。近年来,随着深度学习技术的快速发展,OCR技术在复杂场景下的表现越来越出色。

为了让大家更直观地了解传统OCR和深度学习OCR的差异,我们在Halcon平台上进行了对比实验,从准确率和处理时间两个维度展开对比分析。如果您对本实验的数据集感兴趣,欢迎联系博主免费获取!


实验环境
  1. 电脑配置

    • CPU:12th Gen Intel® Core™ i7-12700H @ 2.30 GHz
    • GPU:NVIDIA GeForce GTX 1050 Ti
    • 操作系统:Windows 10
  2. 软件环境

    • 平台:Halcon 22.11

实验数据与方法
1. 数据集准备

本次实验使用了一个包含 200张数字图像 的数据集。这些图像分为清晰图像和模糊图像,经过人工标注确认为"合格样本"。数据集被划分为以下三部分:

  • 训练集:100张图像,用于训练深度学习OCR模型。
  • 验证集:50张图像,用于调整模型参数。
  • 测试集 :50张图像,用于评估两种方法的最终表现。
    此外,深度学习模型在测试集上未识别成功的图像(约30张)被用作后期模型优化的补充数据。
2. 传统OCR配置

传统OCR采用了Halcon内置的 ocr_classic 算法,无需额外训练,直接加载算法后即可应用。以下是传统OCR的核心代码:

cpp 复制代码
* 初始化
*initial_program (WindowHandle)
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
* 读取字体库
read_ocr_class_cnn ('Universal_0-9_NoRej.occ', OCRHandle)
* 加载图像
list_image_files ('', 'default', [], ImageFiles)
for imgi := 0 to |ImageFiles| - 1 by 1
    read_image (Image, ImageFiles[imgi])
    count_seconds (T1)
    * 获取图像尺寸
    get_image_size (Image, IFeaImgWid, IFeaImgHei)
    
    * 平滑图像, 消除噪声
    median_image (Image, ImgSmooth, 'circle', 1, 'mirrored')
    
    * 锐化边界, 增强字符与背景的差异(11略大于字符的宽度, 一般取1.5~2倍)
    emphasize (ImgSmooth, ImgEmph, 11, 11, 3)
    * 顶帽变换, 去除区域
    gen_disc_se (SE, 'byte', 11, 11, 0)
    gray_tophat (ImgEmph, SE, ImgTopHat)
    
    * //< 提取字符, 该算子仅仅用于白底黑字的图像, 此处增加一个颜色反转
    invert_image (ImgTopHat, ImgInvert)
    segment_characters (ImgInvert, ImgInvert, ImgForeground, RegForeground, \
                        'local_auto_shape', 'false', 'false', 'medium', 35, 50, 20, 20, UserTh)
    
    * // 提取一个生长区域, 以上述区域为种子点, 以下面区域作为生长范围
    median_image (ImgTopHat, ImgTopSmooth, 'circle', 11, 'mirrored')
    dyn_threshold (ImgTopHat, ImgTopSmooth, RegLight, 25, 'light')
    complement (RegLight, RegLightComplent)
    
    * 分成两行(水平方向上闭合)
    closing_rectangle1 (RegForeground, RegClose, 101, 5)
    connection (RegClose, RegCloses)
    select_shape (RegCloses, RegValids, ['width', 'height'], \
                  'and', [200, 30], [1e3, 500])
    * 计算区域的数量
    count_obj (RegValids, cNumber)
    * 
    gen_empty_obj (RegChars)
    for ri := 1 to cNumber by 1
        select_obj (RegValids, RegValid, ri)
        * 
        intersection (RegValid, RegForeground, RegTempChar)
        * 切分
        select_characters (RegTempChar, RegTempChars, 'false', 'medium', 35, 50, 'false', \
                           'false', 'fixed_width', 'true', 'medium', 'true', 10, 'completion')
        expand_region (RegTempChars, RegLightComplent, RegTempCharExs, 'maximal', 'image')
        
        * 
        concat_obj (RegChars, RegTempCharExs, RegChars)
    endfor
    
    * // 显示提取区域
    dev_display (Image)
    dev_display (RegChars)
    stop ()
    
    * 字符识别过程
    sort_region (RegChars, RegSortedChars, 'character', 'true', 'row')
    
    * 因为字符识别库大多都是白底黑字的情况, 需要对图像进行反转, 或者手动绘制图像
    * 案例采用绘制的方式
    paint_region (Image, Image, ImgBG, 255, 'fill')
    paint_region (RegSortedChars, ImgBG, ImgFind, 0, 'fill')
    
    * 识别
    do_ocr_multi_class_cnn (RegSortedChars, ImgFind, OCRHandle, Class, Confidence)
    count_seconds (T2)
    * 显示结果
    linestr1 := sum(Class[0:11])
    linestr2 := sum(Class[12:19])
    
    dev_display (Image)
    dev_disp_text (linestr1 + '\n' + linestr2, 'window', 12, 24, 'green', 'box', 'false')
    dev_disp_text ('耗时:'+1000*(T2-T1), 'window', 40, 24, 'green', 'box', 'false')
    stop ()
endfor

3. 深度学习OCR配置

深度学习OCR采用Halcon内置的 deep_ocr 模型,通过训练和验证数据进行参数调整后,再在测试集上进行性能评估。以下是深度学习OCR的核心代码:

cpp 复制代码
* 深度学习OCR代码示例
dev_open_window (0, 0, 600, 300, 'black', WindowHandle1)
set_display_font (WindowHandle1, 16, 'mono', 'true', 'false')
* 读取.hdl文件,不是.hdowenjian 
query_available_dl_devices (gen_tuple_const(1,'runtime'), 'cpu', DLDeviceHandles)
if (|DLDeviceHandles| == 0)
    throw ('No supported device found to continue this example.')
endif
​
read_deep_ocr ('C:/Users/QC/Desktop/难度教高/model_数据集best.hdo', DeepOcrHandle)
set_deep_ocr_param (DeepOcrHandle, 'device', DLDeviceHandles[0])
​
set_deep_ocr_param (DeepOcrHandle, 'detection_image_width', 640)
set_deep_ocr_param (DeepOcrHandle, 'detection_image_width', 180)
* Image Acquisition 01: Code generated by Image Acquisition 01
list_files ('C:/Users/QC/Desktop/培训班资料/OCR作业回收/Photo/原图', ['files','follow_links','recursive'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
​
*定义数量
OK:=0
*检测内容不一致
NG:=0   
*检测数量不一致
UN:=0
​
*定义参考内容
cont_1:='240311801102'
cont_2:='20240311'
​
for Index := 0 to |ImageFiles| - 1 by 1
    read_image (Image, ImageFiles[Index])
     count_seconds (T1)
    *先定位再识别
    apply_deep_ocr (Image, DeepOcrHandle, 'auto', DeepOcrResult)
    count_seconds (T2)
    
    *获取定位图形
    get_dict_tuple(DeepOcrResult,'words',WordsRes)
    get_dict_tuple(WordsRes,'word',Words)
    
   dev_display_deep_ocr_results (Image, WindowHandle1, DeepOcrResult, [], [])
    
    if(|Words|==0)
        UN:=UN+1
      write_image (Image, 'bmp', 0, './空白/'+Index)  
      continue
    endif
​
 
    *若数量不一致
    if(|Words|!=2)
        UN:=UN+1
        dev_disp_text ('检测数量不一致', 'window', 'top', 'left', 'red', 'box', 'false')
         write_image (Image, 'bmp', 0, './杂乱/'+Index)  
        *stop()
        continue
    endif
    
    *数据过滤 
    try
        * 使用tuple_strstr搜索子字符串
        tuple_strstr (Words[0], cont_1, SubTupleUp)
        tuple_strstr (Words[1], cont_2, SubTupleDown)
    catch (Exception)
    endtry
    if((SubTupleUp==-1) or (SubTupleDown==-1))
        NG:=NG+1
        dev_disp_text ('识别信息失败', 'window', 'top', 'left', 'red', 'box', 'false')
        dev_disp_text ('上:'+Words[0], 'window', 40, 'left', 'red', 'box', 'false')
        dev_disp_text ('下:'+Words[1], 'window',80, 'left', 'red', 'box', 'false')
        write_image (Image, 'bmp', 0, './NG/'+Index)
        *stop()
        continue
    endif
    
    count_seconds (T2)
    OK:=OK+1
    dev_disp_text ('识别信息成功 耗时:'+1000*(T2-T1), 'window', 'top', 'left', 'green', 'box', 'false')
    dev_disp_text ('上:'+Words[0], 'window', 40, 'left', 'green', 'box', 'false')
    dev_disp_text ('下:'+Words[1], 'window',80, 'left', 'green', 'box', 'false')
       write_image (Image, 'bmp', 0, './OK/'+Index)  
    stop ()
endfor
​
dev_disp_text ('OK:'+OK+'   NG:'+NG+'   UN:'+UN, 'window', 100, 'left', 'green', 'box', 'false')
​

深度学习OCR模型的训练约需数小时,根据数据量和硬件配置不同有所变化。


实验结果
方法 准确率 平均处理时间(毫秒/图像)
传统OCR 80% 240-300
深度学习OCR 99% 300-450

效果对比图

为方便理解,这里展示了两种算法在部分测试图像上的效果图:

示例效果图:
  1. 传统OCR效果图



  2. 深度学习OCR效果图


分析与讨论
  1. 准确率对比

    实验结果表明,深度学习OCR在测试数据上的识别准确率显著高于传统OCR(99% vs 80%)。这主要是因为深度学习模型可以通过大量训练数据学习复杂的字体特征,尤其擅长处理模糊、不规则字体以及复杂背景的图像。

  2. 处理时间对比

    尽管深度学习OCR的处理时间略长(300-450毫秒 vs 240-300毫秒),但考虑到准确率的大幅提升,这种时间代价是完全可以接受的。优化硬件(例如使用更高性能的GPU)将显著缩短深度学习OCR的处理时间。

  3. 应用场景

  • 传统OCR:适用于字体规范、背景单一的简单场景,如标准化文档扫描。
  • 深度学习OCR:适用于复杂背景、字体多样的高难度场景,如票据识别或图像文字提取。

结论

通过实验对比可以看出,深度学习OCR在Halcon平台上的表现显著优于传统OCR方法,尤其在识别复杂图像方面具有更高的准确率。虽然处理时间稍长,但结合实际需求,这是可以接受的折衷方案。

未来的工作将集中在以下两方面:

  1. 优化模型结构:进一步提升识别速度与准确率。
  2. 硬件升级:利用更强大的GPU缩短处理时间。

如需获取本次实验的数据集,或者了解代码实现细节,欢迎联系博主!


相关推荐
小陈phd21 分钟前
深度学习之目标检测——RCNN
python·深度学习·算法·计算机视觉
牧歌悠悠1 小时前
【深度学习】 零基础介绍卷积神经网络(CNN)
人工智能·深度学习·cnn·深度优先
凳子花❀1 小时前
CNN和Transfomer介绍
人工智能·神经网络·cnn·transformer
⊙ ∀ ⊙1 小时前
电脑充当树莓派屏幕(无线连接)
人工智能
Odoo老杨2 小时前
Odoo:免费开源ERP的AI技术赋能出海企业电子商务应用介绍
人工智能·odoo·数字化转型·erp·企业信息化·出海企业
Srlua2 小时前
Llama2及法律判决分类实战
人工智能·python
IT古董2 小时前
【漫话机器学习系列】010.Bagging算法(Bootstrap Aggregating)
人工智能·算法·机器学习·bootstrap
goomind2 小时前
深度学习实战智能交通计数
深度学习·yolo·计算机视觉·目标跟踪·bytetrack·deepsort·撞线计数
金书世界3 小时前
自动驾驶AVM环视算法--python版本的超广角投影模式
人工智能·机器学习·自动驾驶
小陈phd3 小时前
深度学习之超分辨率算法——FRCNN
python·深度学习·神经网络