Tesseract » History » Version 2
Version 1 (Gabriel Winckler, 05 May 2016 12:51) → Version 2/5 (Gabriel Winckler, 04 Jul 2016 16:23)
h1. Tesseract
h2. Envio local, exemplos de scripts
Informações sobre o uso direto do cluster local estão em [[SLURM|aqui]].
h3. Exemplo simples
Exemplo para processar todos os .tiff de um diretório usando apenas um core (serial). Verifica se já existe um arquivo processado antes.
*ocr.sh:*
<pre>
#!/bin/bash
module load tesseract
for INPUT in *.tiff
do
BASENAME=$(basename $INPUT .tiff)
if [ ! -f "${BASENAME}.pdf" ]
then
echo "Processing $INPUT"
tesseract "$INPUT" "$BASENAME" -l por pdf
fi
done
</pre>
<pre>
sbatch ocr.sh
</pre>
h3. Exemplo paralelo
Exemplo para processar todos os .tiff de um diretório usando múltiplos cores (paralelo).
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 é:
# O processo é iniciado e lista todos os arquivos com uma extensão (.tiff, no exemplo)
# Para cada arquivo encontrado
## Verifica se ele já foi convertido (verificando se existe um .pdf)
## Verifica se existe um arquivo de lock (ou seja, algum outro processo está trabalhando nesse arquivo)
## Se não houver:
### 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.)
### Converte o arquivo gerando um arquivo temporário
### Renomeia o arquivo temporário para o nome final.
### Remove o lock cores(paralelo).
<pre>
#!/bin/bash
module load tesseract
for INPUT in *.tiff
do
BASENAME=$(basename $INPUT .tiff)
if [ ! -f "${BASENAME}.pdf" ] && [ ! -f "${BASENAME}.lock" ]
then
# lock and wait 5 seconds (to reduce concurrency)
echo "$SLURM_ARRAY_TASK_ID" > "${BASENAME}.lock"
sleep 5
if [ "$(cat ${BASENAME}.lock)" = "$SLURM_ARRAY_TASK_ID" ]
then
echo "Processing $INPUT -- (task $SLURM_ARRAY_TASK_ID)"
TMPNAME=".$BASENAME-$SLURM_ARRAY_TASK_ID"
tesseract "$INPUT" "$TMPNAME" -l por pdf
mv "$TMPNAME.pdf" "$BASENAME.pdf"
rm "${BASENAME}.lock"
else
echo "Lost lock on $INPUT"
fi
fi
done
</pre>
Para usar 30 cores:
<pre>
sbatch --array=0-30 ocr.sh
</pre>
h2. Envio local, exemplos de scripts
Informações sobre o uso direto do cluster local estão em [[SLURM|aqui]].
h3. Exemplo simples
Exemplo para processar todos os .tiff de um diretório usando apenas um core (serial). Verifica se já existe um arquivo processado antes.
*ocr.sh:*
<pre>
#!/bin/bash
module load tesseract
for INPUT in *.tiff
do
BASENAME=$(basename $INPUT .tiff)
if [ ! -f "${BASENAME}.pdf" ]
then
echo "Processing $INPUT"
tesseract "$INPUT" "$BASENAME" -l por pdf
fi
done
</pre>
<pre>
sbatch ocr.sh
</pre>
h3. Exemplo paralelo
Exemplo para processar todos os .tiff de um diretório usando múltiplos cores (paralelo).
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 é:
# O processo é iniciado e lista todos os arquivos com uma extensão (.tiff, no exemplo)
# Para cada arquivo encontrado
## Verifica se ele já foi convertido (verificando se existe um .pdf)
## Verifica se existe um arquivo de lock (ou seja, algum outro processo está trabalhando nesse arquivo)
## Se não houver:
### 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.)
### Converte o arquivo gerando um arquivo temporário
### Renomeia o arquivo temporário para o nome final.
### Remove o lock cores(paralelo).
<pre>
#!/bin/bash
module load tesseract
for INPUT in *.tiff
do
BASENAME=$(basename $INPUT .tiff)
if [ ! -f "${BASENAME}.pdf" ] && [ ! -f "${BASENAME}.lock" ]
then
# lock and wait 5 seconds (to reduce concurrency)
echo "$SLURM_ARRAY_TASK_ID" > "${BASENAME}.lock"
sleep 5
if [ "$(cat ${BASENAME}.lock)" = "$SLURM_ARRAY_TASK_ID" ]
then
echo "Processing $INPUT -- (task $SLURM_ARRAY_TASK_ID)"
TMPNAME=".$BASENAME-$SLURM_ARRAY_TASK_ID"
tesseract "$INPUT" "$TMPNAME" -l por pdf
mv "$TMPNAME.pdf" "$BASENAME.pdf"
rm "${BASENAME}.lock"
else
echo "Lost lock on $INPUT"
fi
fi
done
</pre>
Para usar 30 cores:
<pre>
sbatch --array=0-30 ocr.sh
</pre>