Какой лучший способ максимально использовать текст из скриншотов видеоигр?

Я пытаюсь использовать инструмент tesseract ocr для извлечения ocr-текста из видеоигр (я предварительно обрабатываю скриншоты и передаю их в вывод tsv инструмента командной строки и анализируя это).

Я бы хотел использовать его для автоматизации тестирования, в отличие от веб-тестирования селена. То есть я хотел бы иметь возможность ждать появления элементов вместо сна и нажатия на кнопки (в основном меню).

Чтобы быть в состоянии сделать это, мне нужно иметь возможность последовательно находить один и тот же текст кнопки и находить как можно больше текста против целого ряда видеоигр. Для абстракции я предпочел бы, чтобы параметры предварительной обработки /tesseract были одинаковыми для каждой игры.

Возможно, я могу добавить словарь каждого слова, встречающегося в каждой игре, но я бы предпочел не делать этого.

У меня есть настройка, где я могу протестировать несколько различных комбинаций опций предварительной обработки /tesseract и увидеть полученные слова.

Я уже попробовал взорвать скриншот (который 70-90 точек на дюйм) в 5 раз и сделать его серого, прежде чем передать его в tesarect.

Какие еще методы я могу использовать для улучшения числа и точности моих результатов? На какие ручки tesseract я должен смотреть? Есть ли другая полезная предварительная обработка, которую я могу добавить?

PS Я нахожу, что если я увеличу изображение вдвое длиннее/широко, то tesseract взрывается, похоже, потому что у него заканчивается память для изображения. Есть ли статический предел? Могу ли я найти его, чтобы я мог взорвать изображение около максимального размера? Могу ли я его отрегулировать?

Ответ 1

Обучите свою собственную tessdata

Это, безусловно, самый важный урок, извлеченный из моего опыта работы с tesseract. Из текста tesseract прекрасно работает распознавание отсканированного текста книги и газеты, но когда вы пытаетесь использовать его с шрифтом, который не похож на стандартные книжные и газетные шрифты (например, Times New Roman), мой опыт значительно уменьшает точность. Обучение было намного сложнее, но в настоящее время tesstrain.sh делает его сухожильным. Вам нужно будет собрать свои видеоигры (или те, которые похожи на них, по крайней мере) и предоставить их в качестве вклада в учебный скрипт. Даже если ваши шрифты отличаются друг от друга, tesseract сможет с успехом выбрать правильный шрифт для предоставленного изображения во время выполнения. Кроме того, я знаю, что это утомительно, но было бы полезно предоставить список слов всех слов, встречающихся в видеоиграх, на учебный сценарий. Обучение tesseract с вашими собственными шрифтами и вашим собственным списком слов даст вам почти идеальную точность, не делая ничего большего.

Изображение препроцесса для распознавания

Не полагайтесь на анализ макета tesseract

Если можно, сделайте свой собственный анализ макета и обведите изображение в части, содержащие текст. Teseract имеет встроенный механизм сегментации страниц, но он должен охватывать такие широкие возможности использования, что, скорее всего, не будет работать для ваших конкретных потребностей. Кроме того, по моему опыту, это также помогает с точностью, если вы разделите изображение на отдельные строки текста и используйте режим сегментации 7 (обрабатывайте изображение как одну текстовую строку).

Поднять x-высоту текста ввода

Это помогает, если вы увеличиваете x-высоту входного текста до той же высоты, которую вы использовали для тренировки tesseract (IIRC это было 70 пикселей в моем случае).

Поднимите DPI входного текста

Tesseract действительно любит 300 DPI. Обратите внимание, что изменение DPI изображения не совпадает с изменением его размера. (например, с помощью ImageMagick вы использовали бы опцию -density для изменения DPI изображения).

Использовать переменные конфигурации Tesseract

По моему опыту, настройка различных настроек "штрафа", связанных с соответствующими словарями, оказала наибольшее влияние на повышение точности. Настройки, которые работали на меня:

language_model_penalty_non_dict_word      0.975
language_model_penalty_non_freq_dict_word 0.575
segment_penalty_dict_case_bad             1.3125
segment_penalty_dict_case_ok              1.1
segment_penalty_dict_nonword              10.25

Но вы должны, очевидно, сделать свою собственную настройку. Кроме того, я обнаружил, что настройки x-height были очень полезны во время выполнения: textord_min_xheight и min_sane_x_ht_pixels.


Я не знаю ограничений на размер памяти для tesseract. Возможно, вы используете tesseract через обертку, у которой есть свои лимиты?


Примечание: этот ответ предполагает, что вы используете последнюю стабильную сборку tesseract, которая будет tesseract 3.05. Если вы используете tesseract 4.0, ваша собственная подготовка и сегментация будут по-прежнему применяться, но другие разделы ответа могут быть OBE.

Ответ 2

Существует множество причин, по которым вы не можете получить качественный результат от tesseract. Важно отметить, что, если вы не используете очень необычный шрифт или новый язык переучивания tesseract вряд ли поможет.

Итак, посмотрите на инструмент ImproveQuality для таких задач, как: Rescaling, Binarization, Noise Removal, Rotation/Deskewing и Border Removal.

Например, вот сценарий, в котором вы можете найти преобразования цвета, преобразования и операции построения:

from __future__ import division, print_function
from skimage.transform import radon
from PIL import Image
from numpy import asarray, mean, array, blackman
import numpy
from numpy.fft import rfft
import matplotlib.pyplot as plt
from matplotlib.mlab import rms_flat

try:
    # More accurate peak finding from
    # https://gist.github.com/endolith/255291#file-parabolic-py
    from parabolic import parabolic

    def argmax(x):
       return parabolic(x, numpy.argmax(x))[0]

except ImportError:
    from numpy import argmax

filename = 'skew-linedetection.png'

# Load file, converting to grayscale
I = asarray(Image.open(filename).convert('L'))
I = I - mean(I)  # Demean; make the brightness extend above and below zero
plt.subplot(2, 2, 1)
plt.imshow(I)

# Do the radon transform and display the result
sinogram = radon(I)

plt.subplot(2, 2, 2)
plt.imshow(sinogram.T, aspect='auto')
plt.gray()

# Find the RMS value of each row and find "busiest" rotation,
# where the transform is lined up perfectly with the alternating dark
# text and white lines
r = array([rms_flat(line) for line in sinogram.transpose()])
rotation = argmax(r)
print('Rotation: {:.2f} degrees'.format(90 - rotation))
plt.axhline(rotation, color='r')

# Plot the busy row
row = sinogram[:, rotation]
N = len(row)
plt.subplot(2, 2, 3)
plt.plot(row)

# Take spectrum of busy row and find line spacing
window = blackman(N)
spectrum = rfft(row * window)
plt.plot(row * window)
frequency = argmax(abs(spectrum))
line_spacing = N / frequency  # pixels
print('Line spacing: {:.2f} pixels'.format(line_spacing))

plt.subplot(2, 2, 4)
plt.plot(abs(spectrum))
plt.axvline(frequency, color='r')
plt.yscale('log')
plt.show()

Ответ 3

Я не эксперт с Tesseract, но я попробую два разных ответа:

Во-первых, вам нужно получить текст? Если сравнение изображений (сопоставление шаблонов) достаточно, то может помочь такой инструмент, как браузер SikuliX или KantuX Chromium.

И если вам нужен текст, он использует онлайн- опцию? Если это так, есть Google Cloud vision, Azure OCR или бесплатное OCR.space(25000 конверсий/месяцев бесплатно). Очевидным недостатком является гораздо более низкая скорость, так как вам нужно загружать скриншоты. Но эти OCR-сервисы работают очень хорошо, особенно с текстом на фоне красочной "видеоигры" (или youtube). Как упоминалось выше, Tesseract по умолчанию оптимизирован для сканирования книг (на белом фоне).

Ответ 4

Пробовали ли вы использовать методы глубокого обучения и, в частности, алгоритм распознавания объектов, чтобы обнаружить текст кнопки su chas в https://matthewearl.github.io/2016/05/06/cnn-anpr/?

Ответ 5

Облако Google предлагает OCR для видео. Так что вам не нужно делать скриншот. Вы можете просто обновить все игровые видео до GCP и вызвать API для их обработки. API будет возвращать метку времени и ограничивающую рамку для каждого текста в видео. Он обрабатывается очень быстро, а полученные результаты очень плотные и последовательные. Вы можете увидеть подробности в официальных документах: https://cloud.google.com/video-intelligence/docs/text-detection