У меня есть схема с несколькими изображениями, каждая из которых содержит метки в виде буквенно-цифровых символов, а не только текстовую метку. Я хочу, чтобы моя модель YOLO идентифицировала все цифры и буквенно-цифровые символы, присутствующие в ней.
Как я могу обучить свою модель YOLO делать то же самое. Набор данных можно найти здесь. https://drive.google.com/open?id=1iEkGcreFaBIJqUdAADDXJbUrSj99bvoi
Например: см. Ограничивающие рамки. Я хочу, чтобы YOLO обнаружил, где присутствует текст. Однако в настоящее время нет необходимости идентифицировать текст внутри него.
То же самое должно быть сделано для этих типов изображений
Изображения можно скачать здесь
Это то, что я пытался использовать opencv, но это не работает для всех изображений в наборе данных.
import cv2
import numpy as np
import pytesseract
pytesseract.pytesseract.tesseract_cmd = r"C:\Users\HPO2KOR\AppData\Local\Tesseract-OCR\tesseract.exe"
image = cv2.imread(r'C:\Users\HPO2KOR\Desktop\Work\venv\Patent\PARTICULATE DETECTOR\PD4.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
clean = thresh.copy()
horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (15,1))
detect_horizontal = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, horizontal_kernel, iterations=2)
cnts = cv2.findContours(detect_horizontal, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
cv2.drawContours(clean, [c], -1, 0, 3)
vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1,30))
detect_vertical = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, vertical_kernel, iterations=2)
cnts = cv2.findContours(detect_vertical, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
cv2.drawContours(clean, [c], -1, 0, 3)
cnts = cv2.findContours(clean, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
area = cv2.contourArea(c)
if area < 100:
cv2.drawContours(clean, [c], -1, 0, 3)
elif area > 1000:
cv2.drawContours(clean, [c], -1, 0, -1)
peri = cv2.arcLength(c, True)
approx = cv2.approxPolyDP(c, 0.02 * peri, True)
x,y,w,h = cv2.boundingRect(c)
if len(approx) == 4:
cv2.rectangle(clean, (x, y), (x + w, y + h), 0, -1)
open_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2,2))
opening = cv2.morphologyEx(clean, cv2.MORPH_OPEN, open_kernel, iterations=2)
close_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,2))
close = cv2.morphologyEx(opening, cv2.MORPH_CLOSE, close_kernel, iterations=4)
cnts = cv2.findContours(close, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
x,y,w,h = cv2.boundingRect(c)
area = cv2.contourArea(c)
if area > 500:
ROI = image[y:y+h, x:x+w]
ROI = cv2.GaussianBlur(ROI, (3,3), 0)
data = pytesseract.image_to_string(ROI, lang='eng',config='--psm 6')
if data.isalnum():
cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 2)
print(data)
cv2.imwrite('image.png', image)
cv2.imwrite('clean.png', clean)
cv2.imwrite('close.png', close)
cv2.imwrite('opening.png', opening)
cv2.waitKey()
Есть ли какая-либо модель или методика opencv или какая-то предварительно обученная модель, которая может сделать то же самое для меня? Мне просто нужны ограничивающие рамки вокруг всех буквенно-цифровых символов, присутствующих на изображениях. После этого мне нужно определить, что в нем присутствует. Однако вторая часть в настоящее время не важна.
источник
Ответы:
Возможный подход заключается в использовании детектора текста EAST (эффективный и точный текст сцены) на основе статьи Чжоу и др. 2017 года, EAST: эффективный и точный детектор текста сцены . Изначально модель была подготовлена для обнаружения текста в естественных изображениях сцены, но может быть возможно применить его к изображениям диаграммы. EAST достаточно устойчив и способен обнаруживать размытый или отражающий текст. Вот модифицированная версия реализации EAST Адриана Роузброка, Вместо того, чтобы применять детектор текста непосредственно к изображению, мы можем попытаться удалить как можно больше нетекстовых объектов на изображении перед выполнением обнаружения текста. Идея состоит в том, чтобы удалить горизонтальные линии, вертикальные линии и нетекстовые контуры (кривые, диагонали, круглые формы) перед применением обнаружения. Вот результаты с некоторыми вашими изображениями:
Ввод
->
нетекстовых контуров для удаления зеленым цветомРезультат
Другие изображения
Предварительно обученную
frozen_east_text_detection.pb
модель, необходимую для обнаружения текста, можно найти здесь . Хотя модель улавливает большую часть текста, результаты не являются точными на 100% и иногда дают ложные срабатывания, вероятно, из-за того, как она обучалась на естественных изображениях сцены. Чтобы получить более точные результаты, вам, вероятно, придется тренировать собственную модель. Но если вы хотите достойное готовое решение, то это должно сработать. Посмотрите сообщение в блоге Adrian's OpenCV Text Detection (EAST text детектор) для более подробного объяснения детектора текста EAST.Код
источник
Для удобства я хотел бы добавить пакет keras_ocr . Он может быть легко установлен с помощью pip и основан на текстовом детекторе CRAFT, который немного новее, чем детектор EAST, если я не ошибаюсь.
Рядом с обнаружением он уже делает некоторые OCR тоже! Результаты приведены ниже. Рассматривайте это как альтернативу, возможно, проще для реализации, чем принятый ответ.
источник
То, что вы описываете, кажется, OCR ( Оптическое распознавание символов ). Я знаю один механизм распознавания текста - это tesseract , хотя есть еще один от IBM и других.
Поскольку YOLO изначально был подготовлен для совершенно другой задачи, использование его для локализации текста, вероятно, потребует переобучить его с нуля. Можно попытаться использовать существующие пакеты (адаптированные к вашим конкретным настройкам) для обоснованной правды (хотя стоит помнить, что модель, как правило, будет в лучшем случае такой же хорошей, как и основополагающая правда). Или, возможно, более просто генерировать синтетические данные для обучения (т. Е. Добавить текст в выбранных вами позициях к существующим чертежам, а затем обучиться их локализации).
В качестве альтернативы, если все ваши целевые изображения структурированы аналогично приведенному выше, можно попытаться создать основную правду, используя классическую CV эвристику, как вы делали выше для разделения / сегментирования символов, с последующей классификацией с использованием CNN, обученного по MNIST или подобному, для определения если данный BLOB-объект содержит символ.
Для случая, когда вы выбираете YOLO - в Python есть существующие реализации, например, у меня был некоторый опыт с этим - должно быть довольно просто настроить обучение с вашей собственной основной правдой.
Наконец, если использование YOLO или CNN не является самоцелью, а скорее только решением, любая из вышеупомянутых «основных истин» может быть использована непосредственно в качестве решения, а не для обучения модели.
Надеюсь, я правильно понял ваш вопрос
источник