Tesseract » History » Version 2

Gabriel Winckler, 04 Jul 2016 16:23

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 1 Gabriel Winckler
      tesseract "$INPUT" "$TMPNAME" -l por pdf
67 1 Gabriel Winckler
      mv "$TMPNAME.pdf" "$BASENAME.pdf"
68 1 Gabriel Winckler
      rm "${BASENAME}.lock"
69 1 Gabriel Winckler
    else
70 1 Gabriel Winckler
      echo "Lost lock on $INPUT"
71 1 Gabriel Winckler
    fi
72 1 Gabriel Winckler
  fi
73 1 Gabriel Winckler
done
74 1 Gabriel Winckler
</pre>
75 1 Gabriel Winckler
76 1 Gabriel Winckler
Para usar 30 cores:
77 1 Gabriel Winckler
78 1 Gabriel Winckler
<pre>
79 1 Gabriel Winckler
sbatch --array=0-30 ocr.sh
80 1 Gabriel Winckler
</pre>