LINUX.ORG.RU
решено ФорумAdmin

Распознать через tesseract, но исключить спецсимволы из распознанного.

 ,


0

1

Есть несколько картинок в директории. На картинках - текст и картинка. Их нужно распознать утилитой tesseract, присвоить каждой из них имя, которое распозналось с этой картинки.

Т.е. каждый файл нужно распознать и назвать в соответствии с текстом в нем. А потом перекинуть на винду, чтобы винда при этом не ругалась на нечитабельные символы.

Для этого написан скрипт (взяла отсюда, тему изучила на предмет соответствия моим нуждам):

#!/bin/sh
for filename in *.jpg; do
newfilename=$(tesseract "$filename" stdout -l rus)
mv "$filename" "$newfilename".jpg
done

Скрипт работает, распознает, переводит на русский и присваивает русские названия. Но после выполнения скрипта вывод такой:

Слишком длинное имя файла (для одного из файлов - текст действительно большой в картинке, а распозналось всё)
Detected 9 diacritics

При распознавании, насколько я поняла, распознаются спецсимволы, которых нет в картинке, а чаще - спецсимволы из разных кодировок. Пример:

—®—   нвдгтигд-еп. jpg
 

При этом после пробелов тож есть какие-то неотображаемые символы

Вопрос 1. Как указать в скрипте, чтобы при распознавании распознавать только русские буквы в кодировке UTF8? Или исключать все остальные, кроме русских/английских?

Вопрос 2. Можно как-то указать, чтобы сильно длинные имена файлов обрезались до 150 символов, например? Если можно, то как?

Ой, братишка, зря ты это. Я около года назад пытался работать с тесерактом, даже обучение делал. Гиблое это дело, если нет тонны времени и способностей править исходники. Рекомендую взять FineReader и не парится. 12 версия еще работает в вайне ЕМНИП. В виртуалке работают все.

anonymous
()

Подумала зайти с другой стороны: просто удалять/заменять лишние символы командой, взятой отсюда:

find -type f -name '*:*' -exec rename -n 'y/:/_/' {} \;

Команда должна заменять двоеточия на нижний дефис. Но почему-то не работает rename:

rename: not enough arguments

Как ввести аргумент корректно?

manik207
() автор топика

1.

sed -r 's/[^a-zA-ZАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя]//g'
надеюсь с русским алфавитом набирая буквы не ошибся :) проверьте на всякий случай
2.
${newfilename:0:150}

anc ★★★★★
()
Ответ на: комментарий от anc

Спасибо за ответ

С учетом ваших рекомендаций, скрипт получился таким:

#!/bin/sh
for filename in *.jpg; do
newfilename=$(tesseract "$filename" stdout -l rus | sed -r 's/[^ a-zA-ZАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя]//g')
mv "$filename" "${newfilename:0:50}".jpg
done

Добавила пробел в разрешенные символы. Всё работает, но в названиях файлах появляются знаки вопроса, хотя в разрешенных его нет, ls показывает названия вот так:

 ??ПРОВОД ОБРЫВ?ОРЕЛ ТРУД ЛУЧШЕГО.jpg

 ПШШЁПШП?? .jpg

В результате файлы оказываются не копируемыми на винду: System Error. Code: 123. Синтаксическая ошибка в имени файла, имени папки или метке тома

manik207
() автор топика
Ответ на: комментарий от anc

Да, после ^ поставила пробел. Иначе все распознанные символы пишутся слитно, но вопросительные знаки там тоже есть.

??ПРОВОДОБРЫВ?ОРЕЛТРУДЛУЧШЕГО.jpg

ПШШЁПШП??.jpg

Про кодировки искала, в tesseract про UTF8 сказано, что они под UTF8 всё адаптировали (нашла это в man):

Version 2.00 brought Unicode (UTF-8) support, six languages, and the ability to train Tesseract.
manik207
() автор топика
Ответ на: комментарий от manik207

1. Интересно, а что говорит:
LANG='en_US.C' ls -1 например для файла ПШШЁПШП??.jpg

2. На «попробовать», добавить в начало скрипта
export LANG='ru_RU.UTF8'
и потом посмотреть LANG='ru_RU.UTF8' ls -1 - так же будут знаки вопроса?

3. Еще можно в самом скрипте посмотреть что за символы подставляет echo "$newfilename" | od -t x1c

anc ★★★★★
()
Ответ на: комментарий от anc

1. LANG='en_US.C' ls -1 говорит исключительно знаками вопроса, при отображении файла ПШШЁПШП?? .jpg - ???????????????? .jpg

2.3. Скрипт привела к виду:

#!/bin/sh
export LANG='ru_RU.UTF8'
for filename in *.jpg; do
newfilename=$(tesseract "$filename" stdout -l rus | sed -r 's/[^ a-zA-ZАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя]//g')
mv "$filename" "${newfilename:0:50}".jpg
echo "$newfilename" | od -t x1c
done

2. После выполнения команды LANG='ru_RU.UTF8' ls -1 - вопросительные знаки остались в названиях файлов: ПШШЁПШП?? .jpg

3. При выполнении скрипта отображается:

0000000  d0  af  20  d0  bf  d0  be  d0  bf  d1  80  d0  b5  d0  b6  d0
        320 257     320 277 320 276 320 277 321 200 320 265 320 266 320
0000020  bd  d0  b5  d0  bc  d1  83  0a  d0  b6  d0  b5  d0  bb  d0  b0
        275 320 265 320 274 321 203  \n 320 266 320 265 320 273 320 260
0000040  d1  8e  20  d1  82  d0  b5  d0  b1  d0  b5  20  d1  81  d1  87
        321 216     321 202 320 265 320 261 320 265     321 201 321 207
0000060  d0  b0  d1  81  d1  82  d1  8c  d1  8f  0a  d0  bd  d0  be  20
        320 260 321 201 321 202 321 214 321 217  \n 320 275 320 276
0000100  d1  8f  20  d0  b2  20  d1  8d  d1  82  d0  be  d0  bc  20  d0
        321 217     320 262     321 215 321 202 320 276 320 274     320
0000120  b1  d0  be  d0  bb  d1  8c  d1  88  d0  b5  0a  0a  d0  bd  d0
        261 320 276 320 273 321 214 321 210 320 265  \n  \n 320 275 320
0000140  b5  20  d1  83  d1  87  d0  b0  d1  81  d1  82  d0  b2  d1  83
        265     321 203 321 207 320 260 321 201 321 202 320 262 321 203
0000160  d1  8e  0a
        321 216  \n
0000163
0000000  20  0a  0a  20  d0  bf  d1  80  d0  be  d1  86  d0  b5  d0  bd
             \n  \n     320 277 321 200 320 276 321 206 320 265 320 275
0000020  d1  82  d0  be  d0  b2  20  d1  82  d0  be  d0  b3  d0  be  20
        321 202 320 276 320 262     321 202 320 276 320 263 320 276
0000040  d1  87  d1  82  d0  be  20  d1  82  d1  8b  20  d0  b8  d0  b7
        321 207 321 202 320 276     321 202 321 213     320 270 320 267
0000060  d1  83  d1  87  d0  b0  d0  b5  d1  88  d1  8c  0a  d0  b2  20
        321 203 321 207 320 260 320 265 321 210 321 214  \n 320 262
0000100  d1  88  d0  ba  d0  be  d0  bb  d0  b5  20  d1  82  d0  b5  d0
        321 210 320 272 320 276 320 273 320 265     321 202 320 265 320
0000120  b1  d0  b5  20  d0  bd  d0  b5  20  d0  bf  d0  be  d0  bd  d0
        261 320 265     320 275 320 265     320 277 320 276 320 275 320
0000140  b0  d0  b4  d0  be  d0  b1  d0  b8  d1  82  d1  81  d1  8f  0a
        260 320 264 320 276 320 261 320 270 321 202 321 201 321 217  \n
0000160  0a  d0  bd  d0  b8  d0  ba  d0  be  d0  b3  d0  b4  d0  b0  0a
         \n 320 275 320 270 320 272 320 276 320 263 320 264 320 260  \n
0000200  0a  d0  97  d0  90  d0  a2  d0  9e  20  d0  a2  d0  95  d0  91
         \n 320 227 320 220 320 242 320 236     320 242 320 225 320 221
0000220  d0  95  20  d0  9e  d0  a7  d0  95  d0  9d  d0  ac  20  d0  9f
        320 225     320 236 320 247 320 225 320 235 320 254     320 237
0000240  d0  9e  d0  9d  d0  90  d0  94  d0  9e  d0  91  d0  af  d0  a2
        320 236 320 235 320 220 320 224 320 236 320 221 320 257 320 242
0000260  d0  a1  d0  af  20  d0  a2  d0  95  20  d0  9d  d0  95  d0  99
        320 241 320 257     320 242 320 225     320 235 320 225 320 231
0000300  d0  a0  d0  9e  d0  9d  d0  9d  d0  ab  d0  95  20  d0  a1  d0
        320 240 320 236 320 235 320 235 320 253 320 225     320 241 320
0000320  92  d0  af  d0  97  d0  98  20  d0  9a  d0  9e  d0  a2  d0  9e
        222 320 257 320 227 320 230     320 232 320 236 320 242 320 236
0000340  d0  a0  d0  ab  d0  95  20  d0  9f  d0  a0  d0  98  0a  d0  ad
        320 240 320 253 320 225     320 237 320 240 320 230  \n 320 255
0000360  d0  a2  d0  9e  d0  9c  20  d0  92  d0  9e  d0  97  d0  9d  d0
        320 242 320 236 320 234     320 222 320 236 320 227 320 235 320
0000400  98  d0  9a  d0  9b  d0  98  20  d0  98  20  d0  9d  d0  90  d0
        230 320 232 320 233 320 230     320 230     320 235 320 220 320
0000420  a2  d0  a0  d0  95  d0  9d  d0  98  d0  a0  d0  9e  d0  92  d0
        242 320 240 320 225 320 235 320 230 320 240 320 236 320 222 320
0000440  90  d0  9f  d0  98  d0  a1  d0  ac  0a
        220 320 237 320 230 320 241 320 254  \n
0000452
Detected 9 diacritics
0000000  20  20  20  20  20  0a  0a  d0  91  d0  9e  d0  a0  d0  ac  d0
                             \n  \n 320 221 320 236 320 240 320 254 320
0000020  91  d0  90  20  d0  a1  d0  9e  20  d0  a1  d0  92  d0  9e  d0
        221 320 220     320 241 320 236     320 241 320 222 320 236 320
0000040  98  d0  9c  d0  98  20  d0  a7  d0  a3  d0  92  d0  a1  0a  d0
        230 320 234 320 230     320 247 320 243 320 222 320 241  \n 320
0000060  a1  d0  90  d0  9c  d0  90  d0  af  20  d0  a2  d0  a0  d0  a3
        241 320 220 320 234 320 220 320 257     320 242 320 240 320 243
0000100  d0  94  d0  9d  d0  90  d0  af  20  d0  a5  d0  a3  d0  94  d0
        320 224 320 235 320 220 320 257     320 245 320 243 320 224 320
0000120  a8  d0  95  d0  93  d0  9e  20  d0  91  d0  a0  d0  90  d0  93
        250 320 225 320 223 320 236     320 221 320 240 320 220 320 223
0000140  d0  90  0a  d0  98  20  d0  9d  d0  95  20  d0  9d  d0  90  d0
        320 220  \n 320 230     320 235 320 225     320 235 320 220 320
0000160  99  d0  a2  d0  98  20  0a  0a  20  0a
        231 320 242 320 230      \n  \n      \n
0000172
0000000  20  20  20  0a  0a  d0  bd  d0  b2  d0  b4  d0  b3  d1  82  d0
                     \n  \n 320 275 320 262 320 264 320 263 321 202 320
0000020  b8  d0  b3  d0  b4  d0  b5  d0  bf  0a
        270 320 263 320 264 320 265 320 277  \n
0000032
0000000  0a  0a  d0  92  d0  90  d0  96  d0  9d  d0  ab  d0  9c  20  d0
         \n  \n 320 222 320 220 320 226 320 235 320 253 320 234     320
0000020  90  d0  95  d0  90  d0  9e  d0  9c  20  d0  a3  20  d0  9d  d0
        220 320 225 320 220 320 236 320 234     320 243     320 235 320
0000040  90  d0  a1  0a  d0  97  d0  90  d0  9d  d0  98  d0  9c  d0  90
        220 320 241  \n 320 227 320 220 320 235 320 230 320 234 320 220
0000060  d0  ae  d0  a2  d0  a1  d0  af  20  d0  a2  d0  9e  d0  90  d0
        320 256 320 242 320 241 320 257     320 242 320 236 320 220 320
0000100  ac  d0  9a  d0  9e  0a  d0  92  d0  90  d0  96  d0  9d  d0  ab
        254 320 232 320 236  \n 320 222 320 220 320 226 320 235 320 253
0000120  d0  95  20  d0  90  d0  ae  d0  90  d0  98  0a  0a  d0  90  20
        320 225     320 220 320 256 320 220 320 230  \n  \n 320 220
0000140  d0  a5  d0  9e  d0  a2  d0  95  d0  90  d0  9e  d0  a1  d0  ac
        320 245 320 236 320 242 320 225 320 220 320 236 320 241 320 254
0000160  20  d0  91  d0  ab  20  d0  a7  d0  a2  d0  9e  d0  91  d0  ab
            320 221 320 253     320 247 320 242 320 236 320 221 320 253
0000200  0a  d0  a3  d0  9c  d0  9d  d0  ab  d0  95  0a
         \n 320 243 320 234 320 235 320 253 320 225  \n
0000214
0000000  d0  9f  d0  a8  d0  a8  d0  81  d0  9f  d0  a8  d0  9f  0a  0a
        320 237 320 250 320 250 320 201 320 237 320 250 320 237  \n  \n
0000020  20  0a
             \n
0000022
manik207
() автор топика
Ответ на: комментарий от manik207

Пункт 1. А так:
LANG='en_US.C' ls -1 --show-control-chars

Пункт 3.
А можно только для единственного файла?

#!/bin/bash
export LANG='ru_RU.UTF8'
filename="ПШШЁПШП??.jpg" (где ПШШЁПШП??.jpg - до преобразования)
newfilename=$(tesseract "$filename" stdout -l rus | sed -r 's/[^ a-zA-ZАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя]//g')
echo "${newfilename:0:50}" | od -t x1c

anc ★★★★★
()
Ответ на: комментарий от manik207

Посмотрел внимательно, у вас там перенос строк попадает \n, это и есть знаки вопроса. Добавьте еще | tr -d '\n'

anc ★★★★★
()
Ответ на: комментарий от manik207

Но почему-то не работает rename:

В некоторых дистрибутивах их несколько с разным синтаксисом. Например, в дебиане есть rename и rename.ul.

И не следует ли взять в кавычки или экранировать фигурные скобки?

olegd ★★★
()
Ответ на: комментарий от anc

Спасибо!!!!!

Ни одного знака вопроса не осталось!! Спасибо большое! Всё копируется!!

А можно как-то не удалять переносы строк совсем, а на пробелы их заменить?

И ещё. Большинство исходных файлов с картинками начинаются с минуса, а некоторые с двух минусов, а linux их воспринимает как аргументы и после выполнения скрипта оставляет не тронутыми. Как в скрипт добавить, что если имя начинается с - или --, то начальные два символа удалить. Названия картинок - -9LvkM6RJwg.jpg, -u-sHfoiDAQ.jpg

manik207
() автор топика
Ответ на: Спасибо!!!!! от manik207

А можно как-то не удалять переносы строк совсем, а на пробелы их заменить?

tr '\n' ' '

И ещё. Большинство исходных файлов с картинками начинаются с минуса, а некоторые с двух минусов, а linux их воспринимает как аргументы и после выполнения скрипта оставляет не тронутыми.

./ добавьте
mv "./$filename"...

anc ★★★★★
()
Ответ на: комментарий от anc

Спасибо!!!!!

Задача решена полностью, спасибо Вам огромное!!!

manik207
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.