Tesseract » History » Version 4

Gabriel Winckler, 04 Jul 2016 16:29

1 1 Gabriel Winckler
h1. Tesseract
2 1 Gabriel Winckler
3 1 Gabriel Winckler
h2. Envio local, exemplos de scripts
4 1 Gabriel Winckler
5 1 Gabriel Winckler
Informações sobre o uso direto do cluster local estão em [[SLURM|aqui]].
6 1 Gabriel Winckler
7 1 Gabriel Winckler
h3. Exemplo simples
8 1 Gabriel Winckler
9 1 Gabriel Winckler
Exemplo para processar todos os .tiff de um diretório usando apenas um core (serial). Verifica se já existe um arquivo processado antes.
10 1 Gabriel Winckler
11 1 Gabriel Winckler
*ocr.sh:*
12 1 Gabriel Winckler
<pre>
13 1 Gabriel Winckler
#!/bin/bash
14 1 Gabriel Winckler
module load tesseract
15 1 Gabriel Winckler
16 1 Gabriel Winckler
for INPUT in *.tiff
17 1 Gabriel Winckler
do
18 1 Gabriel Winckler
  BASENAME=$(basename $INPUT .tiff)
19 1 Gabriel Winckler
20 1 Gabriel Winckler
  if [ ! -f "${BASENAME}.pdf" ]
21 1 Gabriel Winckler
  then
22 1 Gabriel Winckler
    echo "Processing $INPUT"
23 1 Gabriel Winckler
    tesseract "$INPUT" "$BASENAME" -l por pdf
24 1 Gabriel Winckler
  fi
25 1 Gabriel Winckler
done
26 1 Gabriel Winckler
</pre>
27 1 Gabriel Winckler
28 1 Gabriel Winckler
<pre>
29 1 Gabriel Winckler
sbatch ocr.sh
30 1 Gabriel Winckler
</pre>
31 1 Gabriel Winckler
32 1 Gabriel Winckler
h3. Exemplo paralelo
33 1 Gabriel Winckler
34 2 Gabriel Winckler
Exemplo para processar todos os .tiff de um diretório usando múltiplos cores (paralelo).
35 2 Gabriel Winckler
36 2 Gabriel Winckler
A ideia desse script é permitir que vários processos independentes trabalhem no mesmo diretório sem definir previamente qual processo ficará responsável por cada arquivo. O workflow é:
37 2 Gabriel Winckler
38 2 Gabriel Winckler
# O processo é iniciado e lista todos os arquivos com uma extensão (.tiff, no exemplo)
39 2 Gabriel Winckler
# Para cada arquivo encontrado
40 2 Gabriel Winckler
## Verifica se ele já foi convertido (verificando se existe um .pdf)
41 2 Gabriel Winckler
## Verifica se existe um arquivo de lock (ou seja, algum outro processo está trabalhando nesse arquivo)
42 2 Gabriel Winckler
## Se não houver:
43 2 Gabriel Winckler
### cria o arquivo lock com o seu identificador e verifica depois de 5 segundos se o lock ainda é seu. (Isso é feito para evitar problemas de concorrência.)
44 2 Gabriel Winckler
### Converte o arquivo gerando um arquivo temporário
45 2 Gabriel Winckler
### Renomeia o arquivo temporário para o nome final.
46 2 Gabriel Winckler
### Remove o lock
47 1 Gabriel Winckler
48 1 Gabriel Winckler
<pre>
49 1 Gabriel Winckler
#!/bin/bash
50 1 Gabriel Winckler
module load tesseract
51 1 Gabriel Winckler
52 1 Gabriel Winckler
for INPUT in *.tiff
53 1 Gabriel Winckler
do
54 1 Gabriel Winckler
  BASENAME=$(basename $INPUT .tiff)
55 1 Gabriel Winckler
56 1 Gabriel Winckler
  if [ ! -f "${BASENAME}.pdf" ] && [ ! -f "${BASENAME}.lock" ]
57 1 Gabriel Winckler
  then
58 1 Gabriel Winckler
    # lock and wait 5 seconds (to reduce concurrency)
59 1 Gabriel Winckler
    echo "$SLURM_ARRAY_TASK_ID" > "${BASENAME}.lock"
60 1 Gabriel Winckler
    sleep 5
61 1 Gabriel Winckler
    
62 1 Gabriel Winckler
    if [ "$(cat ${BASENAME}.lock)" = "$SLURM_ARRAY_TASK_ID" ]
63 1 Gabriel Winckler
    then
64 1 Gabriel Winckler
      echo "Processing $INPUT -- (task $SLURM_ARRAY_TASK_ID)"
65 1 Gabriel Winckler
      TMPNAME=".$BASENAME-$SLURM_ARRAY_TASK_ID"
66 3 Gabriel Winckler
67 1 Gabriel Winckler
      tesseract "$INPUT" "$TMPNAME" -l por pdf
68 3 Gabriel Winckler
69 1 Gabriel Winckler
      mv "$TMPNAME.pdf" "$BASENAME.pdf"
70 3 Gabriel Winckler
      rm "${BASENAME}.lock"
71 3 Gabriel Winckler
    else
72 3 Gabriel Winckler
      echo "Lost lock on $INPUT"
73 3 Gabriel Winckler
    fi
74 3 Gabriel Winckler
  fi
75 3 Gabriel Winckler
done
76 3 Gabriel Winckler
</pre>
77 3 Gabriel Winckler
78 3 Gabriel Winckler
Para usar 30 cores:
79 3 Gabriel Winckler
80 3 Gabriel Winckler
<pre>
81 3 Gabriel Winckler
sbatch --array=0-30 ocr.sh
82 3 Gabriel Winckler
</pre>
83 3 Gabriel Winckler
84 3 Gabriel Winckler
h3. Ghostscript (.pdf -> .tiff)
85 3 Gabriel Winckler
86 3 Gabriel Winckler
Exemplo para processar todos os .pdf de um diretório usando múltiplos cores (paralelo).
87 3 Gabriel Winckler
88 3 Gabriel Winckler
A ideia desse script é permitir que vários processos independentes trabalhem no mesmo diretório sem definir previamente qual processo ficará responsável por cada arquivo. O workflow é:
89 3 Gabriel Winckler
90 3 Gabriel Winckler
<pre>
91 3 Gabriel Winckler
#!/bin/bash
92 3 Gabriel Winckler
93 3 Gabriel Winckler
for INPUT in *.pdf
94 3 Gabriel Winckler
do
95 3 Gabriel Winckler
  BASENAME=$(basename $INPUT .pdf)
96 3 Gabriel Winckler
97 3 Gabriel Winckler
  if [ ! -f "${BASENAME}-000.tiff" ] && [ ! -f "${BASENAME}.lock" ]
98 3 Gabriel Winckler
  then
99 3 Gabriel Winckler
    # lock and wait 5 seconds (to reduce concurrency)
100 3 Gabriel Winckler
    echo "$SLURM_ARRAY_TASK_ID" > "${BASENAME}.lock"
101 3 Gabriel Winckler
    sleep 5
102 3 Gabriel Winckler
    
103 3 Gabriel Winckler
    if [ "$(cat ${BASENAME}.lock)" = "$SLURM_ARRAY_TASK_ID" ]
104 3 Gabriel Winckler
    then
105 3 Gabriel Winckler
      echo "Processing $INPUT -- (task $SLURM_ARRAY_TASK_ID)"
106 3 Gabriel Winckler
107 3 Gabriel Winckler
      gs -q -dNOPAUSE -dBATCH -sDEVICE=tiffg4 -r400x400 -sOutputFile=${BASENAME}-%03d.tiff ${INPUT}
108 3 Gabriel Winckler
109 1 Gabriel Winckler
      rm "${BASENAME}.lock"
110 1 Gabriel Winckler
    else
111 1 Gabriel Winckler
      echo "Lost lock on $INPUT"
112 1 Gabriel Winckler
    fi
113 1 Gabriel Winckler
  fi
114 1 Gabriel Winckler
done
115 1 Gabriel Winckler
</pre>
116 1 Gabriel Winckler
117 1 Gabriel Winckler
Para usar 30 cores:
118 1 Gabriel Winckler
119 1 Gabriel Winckler
<pre>
120 4 Gabriel Winckler
sbatch --array=0-30 gs.sh
121 1 Gabriel Winckler
</pre>