Tesseract OCR大量文件

Nav*_*eed 1 parallel-processing tesseract

.TIF我的硬盘上有大约135000个文件(1.2KB到1.4KB).我需要从这些文件中提取文本.如果我tesseract作为一个cron工作,我最多每小时500到600.任何人都可以建议我的策略,这样我每分钟至少可以得到500个?

更新:

下面是我执行@Mark提供的建议后的代码,我似乎每分钟超过20个文件.

#!/bin/bash

cd /mnt/ramdisk/input

function tess() 
{
    if [ -f /mnt/ramdisk/output/$2.txt ]
        then
        echo skipping $2
        return
    fi
    tesseract --tessdata-dir /mnt/ramdisk/tessdata -l eng+kan $1 /mnt/ramdisk/output/$2 > /dev/null 2>&1
}

export -f tess

find . -name \*.tif -print0 | parallel -0 -j100 --progress tess {/} {/.}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 6

你需要GNU Parallel.在这里,我在iMac上以37s处理500个TIF文件,每个3kB.作为比较,如果在顺序for循环中完成,则相同的处理需要160秒.

基本命令如下所示:

parallel --bar 'tesseract {} {.} > /dev/null 2>&1' ::: *.tif
Run Code Online (Sandbox Code Playgroud)

这将显示进度条并使用您计算机上的所有可用内核.这是在行动:

在此输入图像描述

如果你想在没有实际做任何事情的情况下看到它会做什么,请使用parallel --dry-run.


由于你有135,000个文件,它可能会溢出你的命令行长度 - 你可以sysctl像这样检查:

sysctl -a kern.argmax
kern.argmax: 262144
Run Code Online (Sandbox Code Playgroud)

所以,你需要泵入的文件名GNU并行stdin,并与空字符分隔,所以你不要有空格的问题:

find . -iname \*.tif -print0 | parallel -0 --bar 'tesseract {} {.} > /dev/null 2>&1'
Run Code Online (Sandbox Code Playgroud)

如果您正在处理大量文件,则可能需要考虑被中断和重新启动的可能性.您可以将mv每个TIF文件处理后调用到一个子目录,processed以便在重新启动时不会再次完成,或者您可以txt在处理任何TIF类似文件之前测试相应文件是否存在:

#!/bin/bash

doit() {
   if [ -f "${2}.txt" ]; then
      echo Skipping $1...
      return
   fi
   tesseract "$1" "$2" > /dev/null 2>&1
}

export -f doit
time parallel --bar doit {} {.} ::: *.tif
Run Code Online (Sandbox Code Playgroud)

如果你连续两次运行,你会发现它第二次接近瞬时,因为所有处理都是第一次完成.


如果您有数百万个文件,您可以考虑并行使用多台计算机,因此只需确保您已ssh登录到网络中的每台计算机,然后运行4台计算机,包括localhost,如下所示:

parallel -S :,remote1,remote2,remote3 ...
Run Code Online (Sandbox Code Playgroud)

在哪里:是您运行的机器的简写.