Это седьмой день моего участия в ноябрьском испытании обновлений, подробности о мероприятии:Вызов последнего обновления 2021 г.
В этом руководстве вы узнаете, как использовать OpenCV для обнаружения текста на изображениях с помощью детектора текста EAST.
Детектор текста EAST требует от нас запуска OpenCV 3.4.2 или OpenCV 4 в нашей системе.
-
Оригинальная бумага:АР Вест V.org/ABS/1704.03…
-
Кодовый адрес:github.com/argman/EAST
оригинал:woohoo.py изображение search.com/2018/08/20/…
В первой части сегодняшнего урока я расскажу, почему обнаружение текста на изображениях естественных сцен может быть таким сложным. Далее я кратко расскажу о детекторе текста EAST, почему мы его используем и что делает алгоритм таким новым. Я также предоставлю ссылку на исходную статью, чтобы вы могли прочитать подробности, если хотите.
Наконец, я предоставлю свою реализацию обнаружения текста на Python + OpenCV, чтобы вы могли начать применять обнаружение текста в своих собственных приложениях.
Почему обнаружение текста естественной сцены так сложно?
Обнаружение текста в ограниченной контролируемой среде часто можно выполнить с помощью эвристических методов, таких как использование информации о градиенте или тот факт, что текст часто сгруппирован в абзацы, а символы отображаются на прямой линии.
Однако обнаружение текста в естественной сцене отличается и является более сложной задачей. Из-за преобладания дешевых цифровых камер, не говоря уже о том, что почти каждый смартфон сейчас оснащен камерой, нам необходимо уделять пристальное внимание условиям, в которых делаются снимки, а также тому, какие предположения мы можем сделать и какие. не надо. Я описываю сводную версию проблемы обнаружения текста в естественной сцене в превосходной статье Селин Манкас-Тиллоу и Бернара Госселина 2017 года «Понимание текста в естественной сцене» следующим образом:
- Шум изображения/сенсора: шум сенсора портативных камер обычно выше, чем у обычных сканеров. Кроме того, недорогие камеры часто интерполируют пиксели оригинального сенсора для получения реалистичных цветов.
- Перспектива: Тексты естественных сцен, естественно, имеют перспективы, которые не параллельны тексту, что затрудняет распознавание текста.
- Размытость: неконтролируемая среда имеет тенденцию быть размытой, особенно если конечный пользователь использует смартфон без какой-либо формы стабилизации.
- Условия освещения: Мы не можем делать никаких предположений об условиях освещения на изображениях естественной сцены. Может быть почти темно, может быть включена вспышка на камере, или солнце может быть настолько ярким, что заливает все изображение.
- Разрешение: не все камеры созданы одинаковыми — мы можем иметь дело с камерами с разрешением ниже номинала.
- Небумажные объекты: большая часть (но не вся) бумага не отражающая (по крайней мере, в бумажной среде, которую вы пытаетесь сканировать). Текст в естественных сценах может быть отражающим, включая логотипы, знаки и т. д.
- Неплоские объекты: подумайте, что происходит, когда вы оборачиваете текст вокруг бутылки — текст на поверхности искажается. Хотя люди все еще могут легко «обнаруживать» и читать текст, наши алгоритмы столкнутся с трудностями. Мы должны быть в состоянии справиться с такими вариантами использования.
- Неизвестный макет: мы не можем использовать какую-либо предварительную информацию, чтобы дать нашему алгоритму «подсказки» о том, где находится текст.
Детектор текста глубокого обучения EAST
[Не удалось передать изображение по внешней ссылке, исходный сайт может иметь механизм защиты от пиявки, рекомендуется сохранить изображение и загрузить его напрямую (img-XXPKId7V-1637126841247) (py image search.com/Боюсь-контент/…)]
С выпуском OpenCV 3.4.2 и OpenCV 4 мы теперь можем использовать детектор текста на основе глубокого обучения под названием EAST, который основан на статье EAST 2017 года: эффективный и точный детектор текста сцены Чжоу и др.
Мы называем этот алгоритм «ВОСТОЧНЫМ», потому что это один из них: эффективный и точный конвейер обнаружения текста сцены.
По словам авторов, конвейер EAST способен предсказывать слова и строки текста в произвольной ориентации на изображениях с разрешением 720p и может работать со скоростью 13 кадров в секунду. Возможно, самое главное, поскольку модели глубокого обучения являются сквозными, они могут избежать дорогостоящих в вычислительном отношении подалгоритмов, обычно применяемых другими детекторами текста, включая агрегацию кандидатов и разделение слов.
Для создания и обучения такой модели глубокого обучения в методе EAST используется новая хорошо продуманная функция потерь. Для получения более подробной информации о EAST, включая проектирование архитектуры и методы обучения, обязательно обратитесь к публикациям авторов.
Структура проекта
$ tree --dirsfirst
.
├── images
│ ├── car_wash.png
│ ├── lebron_james.jpg
│ └── sign.jpg
├── frozen_east_text_detection.pb
├── text_detection.py
└── text_detection_video.py
Обратите внимание, что я предоставил три примера изображений в каталоге images/. Вы можете добавить изображения, собранные вашим смартфоном, или изображения, которые вы нашли в Интернете. Сегодня мы рассмотрим два файла .py:
- text_detection.py : Обнаружение текста в статических изображениях.
- text_detection_video.py : Обнаружение текста через веб-камеру или входной видеофайл.
Примечания по реализации
Реализация обнаружения текста, которую я включил сегодня, основана на официальном примере C++ из OpenCV, однако, должен признать, у меня возникли некоторые проблемы с его переводом на Python.
Во-первых, в Python нет функций Point2f и RotatedRect, поэтому я не могу на 100% имитировать реализацию C++. Реализация C++ может генерировать повернутые ограничивающие рамки, но, к сожалению, та, которой я делюсь с вами сегодня, не может.
Во-вторых, функция NMSBoxes не возвращает никакого значения для привязок Python (по крайней мере, для моей предварительной установки OpenCV 4), что приводит к тому, что OpenCV выдает ошибку. Функция NMSBoxes работает в OpenCV 3.4.2, но я не могу ее полностью протестировать.
Я решил это, используя свою собственную немаксимальную реализацию подавления в imutils, но опять же, я не верю, что они на 100% взаимозаменяемы, поскольку похоже, что NMSBoxes принимает дополнительные аргументы.
Учитывая все это, я изо всех сил старался предоставить вам лучшую реализацию OpenCV для обнаружения текста, используя рабочие функции и ресурсы, которые у меня есть. Если у вас есть какие-либо улучшения этого метода, поделитесь ими в комментариях ниже.
Реализуйте наш детектор текста с помощью OpenCV
Прежде чем начать, я хотел бы отметить, что вам необходимо установить как минимум OpenCV 3.4.2 (или OpenCV 4) в вашей системе, чтобы использовать детектор текста EAST OpenCV, затем убедитесь, что imutils также установлен/обновлен в вашей системе:
pip install --upgrade imutils
Теперь ваша система настроена, поэтому откройте text_detection.py и вставьте следующий код:
# import the necessary packages
from imutils.object_detection import non_max_suppression
import numpy as np
import argparse
import time
import cv2
# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", type=str,
help="path to input image")
ap.add_argument("-east", "--east", type=str,
help="path to input EAST text detector")
ap.add_argument("-c", "--min-confidence", type=float, default=0.5,
help="minimum probability required to inspect a region")
ap.add_argument("-w", "--width", type=int, default=320,
help="resized image width (should be multiple of 32)")
ap.add_argument("-e", "--height", type=int, default=320,
help="resized image height (should be multiple of 32)")
args = vars(ap.parse_args())
Сначала импортируйте необходимые пакеты и модули. Примечательно, что мы импортировали NumPy, OpenCV и мою реализацию non_max_suppression из imutils.object_detection. Затем мы приступаем к разбору пяти аргументов командной строки:
--image : путь к нашему входному изображению.
--east : путь к файлу модели текстового детектора сцены EAST.
--min-confidence : определить порог вероятности для текста. Необязательно, по умолчанию = 0,5 .
--width : скорректированная ширина изображения - должна быть кратна 32. Необязательно, если по умолчанию 320.
--height : скорректированная высота изображения - должна быть кратна 32. Необязательно, если по умолчанию 320.
Важно: текст EAST требует, чтобы размеры входного изображения были кратны 32, поэтому, если вы решите настроить значения --width и --height, убедитесь, что они кратны 32! Оттуда давайте загрузим наше изображение и изменим его размер:
# load the input image and grab the image dimensions
image = cv2.imread(args["image"])
orig = image.copy()
(H, W) = image.shape[:2]
# set the new width and height and then determine the ratio in change
# for both the width and height
(newW, newH) = (args["width"], args["height"])
rW = W / float(newW)
rH = H / float(newH)
# resize the image and grab the new image dimensions
image = cv2.resize(image, (newW, newH))
(H, W) = image.shape[:2]
Мы загружаем и копируем наше входное изображение. Определяет отношение размеров исходного изображения к размерам нового изображения (на основе аргументов командной строки, предоставленных для --width и --height). Затем мы изменяем размер изображения, игнорируя соотношение сторон. Чтобы использовать модели глубокого обучения OpenCV и EAST для обнаружения текста, нам нужно извлечь выходные карты объектов двух слоев:
# define the two output layer names for the EAST detector model that
# we are interested -- the first is the output probabilities and the
# second can be used to derive the bounding box coordinates of text
layerNames = [
"feature_fusion/Conv_7/Sigmoid",
"feature_fusion/concat_3"]
Мы создаем список имен слоев:
Первый слой — это активация нашей выходной сигмоиды, которая дает нам вероятность того, содержит ли область текст.
Второй слой — это выходная карта объектов, представляющая «геометрию» изображения — мы сможем использовать эту геометрию для получения координат ограничивающей рамки текста на входном изображении.
Давайте загрузим текстовый детектор OpenCV EAST:
# load the pre-trained EAST text detector
print("[INFO] loading EAST text detector...")
net = cv2.dnn.readNet(args["east"])
# construct a blob from the image and then perform a forward pass of
# the model to obtain the two output layer sets
blob = cv2.dnn.blobFromImage(image, 1.0, (W, H),
(123.68, 116.78, 103.94), swapRB=True, crop=False)
start = time.time()
net.setInput(blob)
(scores, geometry) = net.forward(layerNames)
end = time.time()
# show timing information on text prediction
print("[INFO] text detection took {:.6f} seconds".format(end - start))
Мы используем cv2.dnn.readNet для загрузки нейронной сети в память, передав путь к детектору EAST.
Затем мы подготавливаем наше изображение, преобразуя его в блоб. Чтобы узнать больше об этом шаге, см. Глубокое обучение: как работает blobFromImage в OpenCV. Чтобы предсказать текст, мы можем просто установить большой двоичный объект в качестве входных данных и вызвать net.forward. Строки окружены временными метками захвата, чтобы мы могли распечатать прошедшее время. Предоставляя layerNames в качестве аргумента для net.forward, мы инструктируем OpenCV вернуть две интересующие нас карты объектов:
-
Выходная геометрия, используемая для экспорта координат ограничивающей рамки текста во входном изображении.
-
Точно так же карта оценок, содержащая вероятность того, что данная область содержит текст
Нам нужно перебрать каждое из этих значений одно за другим:
# grab the number of rows and columns from the scores volume, then
# initialize our set of bounding box rectangles and corresponding
# confidence scores
(numRows, numCols) = scores.shape[2:4]
rects = []
confidences = []
# loop over the number of rows
for y in range(0, numRows):
# extract the scores (probabilities), followed by the geometrical
# data used to derive potential bounding box coordinates that
# surround text
scoresData = scores[0, 0, y]
xData0 = geometry[0, 0, y]
xData1 = geometry[0, 1, y]
xData2 = geometry[0, 2, y]
xData3 = geometry[0, 3, y]
anglesData = geometry[0, 4, y]
Сначала мы получаем размеры списка очков ( а затем инициализируем два списка:
- rects: сохраняет координаты ограничивающей рамки (x, y) текстовой области.
- доверие: сохраните вероятность, связанную с каждой ограничивающей рамкой, в прямоугольниках
Мы применим немаксимальное подавление к этим областям позже. Перебрать ряды. Извлеките дробные и геометрические данные для текущей строки y. Затем мы перебираем каждый индекс столбца текущей выбранной строки:
# loop over the number of columns
for x in range(0, numCols):
# if our score does not have sufficient probability, ignore it
if scoresData[x] < args["min_confidence"]:
continue
# compute the offset factor as our resulting feature maps will
# be 4x smaller than the input image
(offsetX, offsetY) = (x * 4.0, y * 4.0)
# extract the rotation angle for the prediction and then
# compute the sin and cosine
angle = anglesData[x]
cos = np.cos(angle)
sin = np.sin(angle)
# use the geometry volume to derive the width and height of
# the bounding box
h = xData0[x] + xData2[x]
w = xData1[x] + xData3[x]
# compute both the starting and ending (x, y)-coordinates for
# the text prediction bounding box
endX = int(offsetX + (cos * xData1[x]) + (sin * xData2[x]))
endY = int(offsetY - (sin * xData1[x]) + (cos * xData2[x]))
startX = int(endX - w)
startY = int(endY - h)
# add the bounding box coordinates and probability score to
# our respective lists
rects.append((startX, startY, endX, endY))
confidences.append(scoresData[x])
Для каждой строки мы начинаем перебирать столбцы. Нам нужно отфильтровать обнаружение слабого текста, игнорируя области, вероятность которых недостаточно высока.
Детектор текста EAST естественным образом уменьшает размер тома по мере того, как изображение проходит через сеть — размер нашего тома на самом деле в 4 раза меньше, чем наше входное изображение, поэтому мы умножаем на 4, чтобы вернуть координаты исходному изображению.
Извлечь данные угла. Затем мы обновляем наш прямоугольник и списки доверия соответственно. Мы почти закончили! Последний шаг — применить немаксимальное подавление к нашим ограничивающим рамкам, чтобы подавить слабо перекрывающиеся ограничивающие рамки, а затем отобразить результирующие предсказания текста:
# apply non-maxima suppression to suppress weak, overlapping bounding
# boxes
boxes = non_max_suppression(np.array(rects), probs=confidences)
# loop over the bounding boxes
for (startX, startY, endX, endY) in boxes:
# scale the bounding box coordinates based on the respective
# ratios
startX = int(startX * rW)
startY = int(startY * rH)
endX = int(endX * rW)
endY = int(endY * rH)
# draw the bounding box on the image
cv2.rectangle(orig, (startX, startY), (endX, endY), (0, 255, 0), 2)
# show the output image
cv2.imshow("Text Detection", orig)
cv2.waitKey(0)
Как я упоминал в предыдущем разделе, я не могу использовать немаксимальное подавление в моей установке OpenCV 4 (cv2.dnn.NMSBoxes), потому что привязки Python не возвращают значение, что в конечном итоге приводит к ошибке OpenCV. Я не могу полностью протестировать OpenCV 3.4.2, поэтому он работает в версии 3.4.2.
Вместо этого я использовал немаксимальную реализацию подавления, предоставленную в пакете imutils (строка 114). Результаты по-прежнему выглядят хорошо, однако я не могу сравнить свой вывод с функцией NMSBoxes, чтобы увидеть, совпадают ли они. Зациклите нашу ограничительную рамку, масштабируйте координаты до размеров исходного изображения и нарисуйте вывод в исходное изображение. Исходное изображение остается на экране до тех пор, пока не будет нажата клавиша.
В качестве последнего замечания по реализации я хотел бы упомянуть, что наши два вложенных цикла for для зацикливания дробей и геометрии были бы хорошим примером того, как вы можете использовать преимущества Cython для значительного ускорения конвейера. Я продемонстрировал мощь Cython в быстром оптимизированном цикле для пикселей с использованием OpenCV и Python.
Результаты обнаружения текста OpenCV
Готовы ли вы применить обнаружение текста к изображениям?
Скачать Frozen_east_text_detection, адрес:
oyyd/frozen_east_text_detection.pb (github.com)
. Оттуда вы можете выполнить следующие команды в терминале (обратите внимание на два аргумента командной строки):
$ python text_detection.py --image images/lebron_james.jpg \
--east frozen_east_text_detection.pb
Ваш результат должен напоминать изображение ниже:
На Леброне Джеймсе идентифицированы три текстовые области. Теперь попробуем определить текст логотипа компании:
$ python text_detection.py --image images/car_wash.png \
--east frozen_east_text_detection.pb
Обнаружение текста в видео с помощью OpenCV
Теперь, когда мы увидели, как обнаруживать текст на изображениях, давайте перейдем к обнаружению текста в видео с помощью OpenCV. Это объяснение будет очень кратким, при необходимости см. предыдущий раздел. Откройте text_detection_video.py и вставьте следующий код:
# import the necessary packages
from imutils.video import VideoStream
from imutils.video import FPS
from imutils.object_detection import non_max_suppression
import numpy as np
import argparse
import imutils
import time
import cv2
Начнем с импорта нашего пакета. Мы будем использовать VideoStream для доступа к веб-камере и FPS для оценки кадров в секунду этого скрипта. В остальном все то же, что и в предыдущем разделе.
Для удобства давайте определим новую функцию для декодирования нашей функции предсказания — она будет повторно использоваться в каждом кадре и сделает наш цикл чище:
def decode_predictions(scores, geometry):
# grab the number of rows and columns from the scores volume, then
# initialize our set of bounding box rectangles and corresponding
# confidence scores
(numRows, numCols) = scores.shape[2:4]
rects = []
confidences = []
# loop over the number of rows
for y in range(0, numRows):
# extract the scores (probabilities), followed by the
# geometrical data used to derive potential bounding box
# coordinates that surround text
scoresData = scores[0, 0, y]
xData0 = geometry[0, 0, y]
xData1 = geometry[0, 1, y]
xData2 = geometry[0, 2, y]
xData3 = geometry[0, 3, y]
anglesData = geometry[0, 4, y]
# loop over the number of columns
for x in range(0, numCols):
# if our score does not have sufficient probability,
# ignore it
if scoresData[x] < args["min_confidence"]:
continue
# compute the offset factor as our resulting feature
# maps will be 4x smaller than the input image
(offsetX, offsetY) = (x * 4.0, y * 4.0)
# extract the rotation angle for the prediction and
# then compute the sin and cosine
angle = anglesData[x]
cos = np.cos(angle)
sin = np.sin(angle)
# use the geometry volume to derive the width and height
# of the bounding box
h = xData0[x] + xData2[x]
w = xData1[x] + xData3[x]
# compute both the starting and ending (x, y)-coordinates
# for the text prediction bounding box
endX = int(offsetX + (cos * xData1[x]) + (sin * xData2[x]))
endY = int(offsetY - (sin * xData1[x]) + (cos * xData2[x]))
startX = int(endX - w)
startY = int(endY - h)
# add the bounding box coordinates and probability score
# to our respective lists
rects.append((startX, startY, endX, endY))
confidences.append(scoresData[x])
# return a tuple of the bounding boxes and associated confidences
return (rects, confidences)
Определяет функцию decode_predictions.
Эта функция используется для извлечения: координат ограничивающей рамки текстовой области и вероятности обнаружения текстовой области. Эта специальная функция облегчит чтение кода и управление им позже в этом скрипте. Давайте разберем наши аргументы командной строки:
# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-east", "--east", type=str, required=True,
help="path to input EAST text detector")
ap.add_argument("-v", "--video", type=str,
help="path to optinal input video file")
ap.add_argument("-c", "--min-confidence", type=float, default=0.5,
help="minimum probability required to inspect a region")
ap.add_argument("-w", "--width", type=int, default=320,
help="resized image width (should be multiple of 32)")
ap.add_argument("-e", "--height", type=int, default=320,
help="resized image height (should be multiple of 32)")
args = vars(ap.parse_args())
Разбор параметров командной строки:
--east : путь к файлу модели текстового детектора сцены EAST.
--video : Путь к нашему входному видео. Необязательно. Если указан видеотракт, веб-камера не будет использоваться.
--min-confidence : определить порог вероятности для текста. Необязательно, по умолчанию = 0,5 .
--width : скорректированная ширина изображения (должна быть кратна 32). Необязательное значение по умолчанию=320 .
--height : скорректированная высота изображения (должна быть кратна 32). Необязательное значение по умолчанию=320 .
Основное изменение (с точки зрения аргументов командной строки) по сравнению со сценарием только для изображений в предыдущем разделе заключается в том, что я заменил аргумент --image на --video . Важно: текст EAST требует, чтобы размеры входного изображения были кратны 32, поэтому, если вы решите настроить значения --width и --height, убедитесь, что они кратны 32! Далее мы выполним важную инициализацию, имитирующую предыдущий скрипт:
# initialize the original frame dimensions, new frame dimensions,
# and ratio between the dimensions
(W, H) = (None, None)
(newW, newH) = (args["width"], args["height"])
(rW, rH) = (None, None)
# define the two output layer names for the EAST detector model that
# we are interested -- the first is the output probabilities and the
# second can be used to derive the bounding box coordinates of text
layerNames = [
"feature_fusion/Conv_7/Sigmoid",
"feature_fusion/concat_3"]
# load the pre-trained EAST text detector
print("[INFO] loading EAST text detector...")
net = cv2.dnn.readNet(args["east"])
Инициализация высоты/ширины и отношения позволит нам позже правильно масштабировать ограничивающую рамку. Имя нашего выходного слоя определено, загрузите наш предварительно обученный текстовый детектор EAST. Следующий блок настраивает наш видеопоток и счетчик кадров в секунду:
# if a video path was not supplied, grab the reference to the web cam
if not args.get("video", False):
print("[INFO] starting video stream...")
vs = VideoStream(src=0).start()
time.sleep(1.0)
# otherwise, grab a reference to the video file
else:
vs = cv2.VideoCapture(args["video"])
# start the FPS throughput estimator
fps = FPS().start()
Наши настройки видеопотока: веб-камера или видеофайл
Инициализируйте счетчик кадров в секунду и начните перебирать входящие кадры:
# loop over frames from the video stream
while True:
# grab the current frame, then handle if we are using a
# VideoStream or VideoCapture object
frame = vs.read()
frame = frame[1] if args.get("video", False) else frame
# check to see if we have reached the end of the stream
if frame is None:
break
# resize the frame, maintaining the aspect ratio
frame = imutils.resize(frame, width=1000)
orig = frame.copy()
# if our frame dimensions are None, we still need to compute the
# ratio of old frame dimensions to new frame dimensions
if W is None or H is None:
(H, W) = frame.shape[:2]
rW = W / float(newW)
rH = H / float(newH)
# resize the frame, this time ignoring aspect ratio
frame = cv2.resize(frame, (newW, newH))
Итерация по кадрам видео/веб-камеры. Размер нашего кадра изменен с сохранением соотношения сторон. Оттуда мы получаем размеры и вычисляем масштабирование. Затем мы снова изменяем размер кадра (должен быть кратен 32), на этот раз игнорируя соотношение сторон, поскольку мы сохранили соотношение для безопасного хранения. Вывод и рисование ограничивающей рамки текстовой области происходит в следующих строках:
# construct a blob from the frame and then perform a forward pass
# of the model to obtain the two output layer sets
blob = cv2.dnn.blobFromImage(frame, 1.0, (newW, newH),
(123.68, 116.78, 103.94), swapRB=True, crop=False)
net.setInput(blob)
(scores, geometry) = net.forward(layerNames)
# decode the predictions, then apply non-maxima suppression to
# suppress weak, overlapping bounding boxes
(rects, confidences) = decode_predictions(scores, geometry)
boxes = non_max_suppression(np.array(rects), probs=confidences)
# loop over the bounding boxes
for (startX, startY, endX, endY) in boxes:
# scale the bounding box coordinates based on the respective
# ratios
startX = int(startX * rW)
startY = int(startY * rH)
endX = int(endX * rW)
endY = int(endY * rH)
# draw the bounding box on the frame
cv2.rectangle(orig, (startX, startY), (endX, endY), (0, 255, 0), 2)
В этом блоке мы:
Обнаружьте текстовые области с помощью EAST, создав большой двоичный объект и передав его в сеть.
Расшифруйте предсказания и примените NMS. Мы используем функцию decode_predictions, определенную ранее в этом скрипте, и мою вспомогательную функцию imutils non_max_suppression.
Зациклите ограничивающие рамки и нарисуйте их на рамке. Это включает в себя масштабирование поля с помощью коэффициентов, собранных ранее.
Оттуда мы закроем цикл обработки кадров, а также сам скрипт:
# update the FPS counter
fps.update()
# show the output frame
cv2.imshow("Text Detection", orig)
key = cv2.waitKey(1) & 0xFF
# if the `q` key was pressed, break from the loop
if key == ord("q"):
break
# stop the timer and display FPS information
fps.stop()
print("[INFO] elasped time: {:.2f}".format(fps.elapsed()))
print("[INFO] approx. FPS: {:.2f}".format(fps.fps()))
# if we are using a webcam, release the pointer
if not args.get("video", False):
vs.stop()
# otherwise, release the file pointer
else:
vs.release()
# close all windows
cv2.destroyAllWindows()
Мы обновляем наш счетчик кадров в секунду на каждой итерации цикла, чтобы время можно было рассчитать и отобразить, когда мы выйдем из цикла. Мы отображаем вывод обнаружения текста EAST и обработки нажатий клавиш в строке 165. Если нажать «q» для «выхода», мы выходим из цикла и продолжаем очистку и освобождение указателя.
Результаты обнаружения видеотекста
Откройте терминал и выполните следующую команду (это запустит вашу веб-камеру, поскольку мы не предоставили --video через аргумент командной строки):
python text_detection_video.py --east frozen_east_text_detection.pb
Суммировать
В сегодняшнем сообщении в блоге мы узнали, как использовать новый детектор текста EAST OpenCV для автоматического обнаружения присутствия текста на изображениях природных сцен.
Детектор текста не только точен, но и работает почти в реальном времени со скоростью около 13 кадров в секунду на изображениях 720p.
Чтобы обеспечить реализацию детектора текста EAST OpenCV, мне нужно преобразовать пример OpenCV C++, однако я столкнулся со многими проблемами, такими как:
- Невозможно использовать NMSBoxes OpenCV для подавления не максимума, и необходимо использовать реализацию в imutils.
- Настоящая повернутая ограничивающая рамка не может быть вычислена из-за отсутствия привязок Python для RotatedRect .
Время может быть рассчитано и отображено при выходе из цикла. Мы отображаем вывод обнаружения текста EAST и обработки нажатий клавиш в строке 165. Если нажать «q» для «выхода», мы выходим из цикла и продолжаем очистку и освобождение указателя.
Результаты обнаружения видеотекста
Откройте терминал и выполните следующую команду (это запустит вашу веб-камеру, поскольку мы не предоставили --video через аргумент командной строки):
python text_detection_video.py --east frozen_east_text_detection.pb
Суммировать
В сегодняшнем сообщении в блоге мы узнали, как использовать новый детектор текста EAST OpenCV для автоматического обнаружения присутствия текста на изображениях природных сцен.
Детектор текста не только точен, но и работает почти в реальном времени со скоростью около 13 кадров в секунду на изображениях 720p.
Чтобы обеспечить реализацию детектора текста EAST OpenCV, мне нужно преобразовать пример OpenCV C++, однако я столкнулся со многими проблемами, такими как:
- Невозможно использовать NMSBoxes OpenCV для подавления не максимума, и необходимо использовать реализацию в imutils.
- Настоящая повернутая ограничивающая рамка не может быть вычислена из-за отсутствия привязок Python для RotatedRect .
Я пытаюсь максимально приблизить свою реализацию к OpenCV, но имейте в виду, что моя версия не на 100% идентична версии C++, и со временем может быть небольшая ошибка или две, которые нужно исправить. В любом случае, надеюсь, вам понравился сегодняшний урок по обнаружению текста в OpenCV! Полный код:download.CSDN.net/download/Хе-хе…