Linux,  ИИ

Распознавание пакета отсканированных документов и изображений

Author

NMitin

Date Published

unicode

Инструкция только для ОС Linux (выполнялось на MX-23.6_KDE)
Такая необходимость возникает, когда нужно проанализировать с помощью ИИ массу документов, а они в виде картинок или сканов.
Предварительно просмотреть все файлы на предмет перевернутых, они могут не распознаться. Если они важны, то надо перевернуть изображение и сохранить в нормальном виде.

Нужно установить программу распознавания Tesseract OCR и локализацию для текста на русском языке:


1sudo apt install tesseract-ocr tesseract-ocr-rus


Протестировать на одном из документов (рисунок, не pdf)


1tesseract input.jpg output -l rus

Это создаст файл output.txt с распознанным текстом из input.jpg, если все устраивает, идем дальше. Если нет, можно поиграть ключами. Используется утилита convert из пакета ImageMagick, практически у всех пользователей линукс уже установлен, если нет , то надо установить.


1convert input.jpg -contrast-stretch 0.5% clean.jpg
2tesseract clean.jpg output -l rus

Если текст мелкий, можно увеличить изображение:

1convert input.jpg -resize 200% resized.jpg
2tesseract resized.jpg output -l rus

С изображениями закончили, далее файлы pdf (сканы). Их нужно предварительно конвертировать в картинки. Если не установлена утилита poppler-utils, устанавливаем:

1sudo apt install poppler-utils

в ее составе есть конвертер "pdftoppm -png"

Далее создаем скрипт на bash для пакетной обработки всех файлов, он сначала преобразует pdf в картинки, а затем будут распознаны в текст. Выходной файл создается в формате JSON "fileName": "content".

1#!/usr/bin/env bash
2set -euo pipefail
3
4SRC_DIR="/home/you/images"
5DST_FILE="/home/you/results.json"
6LANG="rus"
7
8mkdir -p "$(dirname "$DST_FILE")"
9echo "[" > "$DST_FILE"
10first=true
11
12find "$SRC_DIR" -type f \
13 \( -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.png' \
14 -o -iname '*.tif' -o -iname '*.tiff' -o -iname '*.pdf' \) \
15 -print0 | while IFS= read -r -d '' file; do
16
17 base=$(basename "$file")
18 name="${base%.*}"
19 echo "→ Обрабатываю $base …"
20
21 # Если PDF — сначала вынимаем страницы в PNG
22 if [[ "${file,,}" == *.pdf ]]; then
23 tmpd=$(mktemp -d)
24 # конвертация всех страниц в tmpd/page-*.png
25 pdftoppm -r 300 "$file" "$tmpd/page" -png
26 text=""
27 for img in "$tmpd"/page-*.png; do
28 text+=$(tesseract "$img" stdout -l "$LANG")
29 text+=$'\n'
30 done
31 rm -rf "$tmpd"
32 else
33 # обычное изображение
34 text=$(tesseract "$file" stdout -l "$LANG")
35 fi
36
37 # Экранируем JSON-строку
38 text_json=$(jq -Rsa . <<< "$text")
39
40 # разделитель
41 if $first; then first=false; else echo "," >> "$DST_FILE"; fi
42
43 printf '{"file":"%s","text":%s}' "$base" "$text_json" >> "$DST_FILE"
44done
45
46echo "]" >> "$DST_FILE"
47echo "✅ Готово — результат в $DST_FILE"
48


Здесь в начале скрипта меняем две переменные на свои:
SRC_DIR="/home/you/images"

DST_FILE="/home/you/results.json"

Делаем скрипт исполняемым и выполняем :


1chmod +x ocr_to_json_recursive.sh
2./ocr_to_json_recursive.sh

Скрипт рекурсивно найдёт и JPG/JPEG/PNG/TIFF/PDF.

Для PDF конвертирует страницы в PNG и распознаёт каждую.

Сгенерирует единый results.json с именами и текстом.

У меня машинка довольно мощная, быстро отработал, несколько минут.

Текст в JSON будет в виде символов unicode, как в шапке этого сообщения.

Для LLM (искусственного интеллекта) это не важно, он прочитает без проблем. Если хотите сделать читаемым для человека, то процесс продолжается.
Сначала установим утилиту jq


1sudo apt install jq

Если выполнять в той же папке, где файл для преобразования, то выполнить:

1jq '.' ./results.json > results_readable.json
2

иначе подставить правильный путь к файлам.

Все, вот это results_readable.json и есть заветная цель. Можно читать людям и машинам :).