Какой лучший способ получить как можно больше текста из скриншотов видеоигр? - PullRequest
0 голосов
/ 04 мая 2018

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

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

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

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

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

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

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

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

Ответы [ 4 ]

0 голосов
/ 07 апреля 2019

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

0 голосов
/ 14 мая 2018

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

0 голосов
/ 15 мая 2018

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

Итак, посмотрите на инструмент ImproveQuality для таких задач, как: Масштабирование, бинаризация, удаление шума, вращение / выравнивание и удаление границы.

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

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()
0 голосов
/ 13 мая 2018

Тренируй свои собственные тессдаты

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

Предварительная обработка изображения для распознавания

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

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

Увеличение x-высоты входного текста

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

Увеличение DPI входного текста

Тессеракт очень нравится 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.

...