«Проблемы распознавания текста при распознавании номерных знаков с использованием YOLO и EasyOCR»Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 «Проблемы распознавания текста при распознавании номерных знаков с использованием YOLO и EasyOCR»

Сообщение Anonymous »

Я работаю над системой распознавания номерных знаков, используя YOLO для обнаружения объектов и EasyOCR для распознавания текста. Я настроил следующий конвейер:
YOLO (Ultralytics YOLOv8) обнаруживает номерной знак на изображении.
EasyOCR выполняет распознавание текста на обнаруженном номерном знаке.
Хотя система правильно определяет область номерного знака, результаты распознавания иногда выдают неправильный или нерелевантный текст. Например:
OCR обнаруживает «اباز» (что кажется неправильным определением).
OCR также обнаруживает «الراق», что частично соответствует «العراق».
Для правильных чисел, таких как «٢٦٠٤٩٩», достоверность высока.
Я попытался использовать difflib.get_close_matches() для сопоставления обнаруженный текст в список известных целевых слов (например, такие города, как «العراق», «سلیمانی», «اربیل» и т. д.), но система по-прежнему выдает неправильные совпадения, такие как «اباز», с низким показателем достоверности.
Что я пытаюсь сделать:
Повысить точность распознавания текста.
Убедиться, что близкие совпадения (например, от «الراق» до «العراق») распознаются правильно.
Отфильтровать текст с низким уровнем достоверности или нерелевантный текст.
Я жду предложений по следующим вопросам:
Улучшение сопоставления текста (например, с использованием более точной меры сходства).
Повышение точности распознавания текста на арабском языке, особенно когда обнаруженный текст близок к моему целевому. слов.
Любые другие советы по повышению точности распознавания номерных знаков в этом контексте.
импортировать cv2
импортировать easyocr
из ultralytics, импортировать YOLO
импортировать matplotlib.pyplot как plt
из difflib import get_close_matches
def show_image(title, image):
"""Отобразить image."""
if len(image.shape) == 3:
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
plt.imshow(image)
plt.title(title)
plt.axis('off')
plt.show()
def Detect_plate_with_yolo(image_path, model_path="yolov8n.pt"):
"""Определить номерной знак с помощью YOLO."""
# Загрузить модель YOLO
model = YOLO(model_path)

Код: Выделить всё

# Read the image
img = cv2.imread(image_path)
if img is None:
raise FileNotFoundError(f"Image not found at {image_path}")

# Perform YOLO inference
results = model(img)

# Extract bounding boxes
detections = results[0].boxes.xyxy.cpu().numpy()  # Bounding boxes
if len(detections) == 0:
print("No license plate detected.")
return None, img

# Crop the first detected license plate
x1, y1, x2, y2 = map(int, detections[0])
plate_img = img[y1:y2, x1:x2]

show_image("Detected License Plate", plate_img)
return plate_img, img
def Perform_ocr_on_plate(plate_img):
"""Выполните распознавание текста на номерном знаке."""
reader = easyocr.Reader(['ar', ' ru'], gpu=False)

Код: Выделить всё

# Preprocess plate image
plate_gray = cv2.cvtColor(plate_img, cv2.COLOR_BGR2GRAY)
plate_gray = cv2.resize(plate_gray, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)

# OCR on the processed plate
results = reader.readtext(plate_gray, detail=1, text_threshold=0.4, min_size=10)

detected_text = []
for bbox, text, confidence in results:
detected_text.append((text, confidence))

return detected_text
def корректный_текст(обнаруженный_текст, целевые_слова, сходство_cutoff=0.9, доверие_threshold=0.7):
"""Исправить обнаруженный текст до ближайшего совпадения с целевыми словами."""
corrected_results = []

Код: Выделить всё

for text, confidence in detected_text:
# Skip text with low OCR confidence
if confidence < confidence_threshold:
continue

# Find the closest match to the target words
closest_match = get_close_matches(text, target_words, n=1, cutoff=similarity_cutoff)

if closest_match:
corrected_results.append((closest_match[0], confidence))
else:
corrected_results.append((text, confidence))  # If no match, keep original text

return corrected_results
def ignore_plate(image_path, model_path="yolov8n.pt"):
"""Основная функция для распознавания номерных знаков."""
# Названия целевых мест
target_words = ["Аль-Ирак", "Сулеймани", "Эрбиль", "Хавлир", "Киркук", "Дахок"]

Код: Выделить всё

# Detect plate using YOLO
try:
plate_img, original_img = detect_plate_with_yolo(image_path, model_path)
except Exception as e:
raise RuntimeError(f"Error during YOLO detection: {e}")

if plate_img is not None:
try:
detected_text = perform_ocr_on_plate(plate_img)
except Exception as e:
raise RuntimeError(f"Error during OCR processing: {e}")

print("Detected License Plate Text:")
for text, confidence in detected_text:
print(f"Text: {text}, Confidence: {confidence:.2f}")

# Correct detected text
corrected_text = correct_text(detected_text, target_words)

print("\nCorrected License Plate Text:")
for text, confidence in corrected_text:
print(f"Match: {text}, Confidence: {confidence:.2f}")

return corrected_text
else:
print("No license plate detected.")
return None
Проверьте функцию
image_path = r'C:\Users\ZETTA-\Downloads\IBCvska.webp' # Замените своим путем к изображениюпопробуйте:
result = распознать_плиту(путь_изображения)
если результат:
print("Распознавание завершено.")
кроме FileNotFoundError как e:
print(f"Error: {e}")
кроме исключения как e:
print(f"Неожиданная ошибка: {e}")
Что вы пробовали?
Я настроил конвейер распознавания номерных знаков, используя YOLOv8 для обнаружения номерных знаков и EasyOCR для распознавания текста. Вот что я сделал на данный момент:
YOLOv8 правильно определяет область номерного знака на изображении.
EasyOCR выполняет распознавание обнаруженной области и возвращает текст (например, «٢٦٠٤٩٩» , "اباز", "الراق").
Я использую функцию get_close_matches() из модуля difflib Python для сопоставления обнаруженного текста с известные целевые слова, такие как «العراق», «سلیمانی», «اربیل» и т. д.
Я применяю порог достоверности, чтобы отфильтровать результаты оптического распознавания символов с низкой достоверностью.
Чего я ожидал?Я ожидал, что система:
Обнаружит и распознает номерные знаки с высокой степенью достоверности.
Для частично обнаруженных или неправильных слов (например, «اباز» или «الراق»), система должна возвращать ближайшее совпадение из предопределенного списка целевых слов (например, «العراق» для «الراق»).
Повысьте точность распознавания и сопоставления текста, особенно для Текст на арабском языке, отфильтровывая нерелевантные результаты или результаты с низкой достоверностью.

Подробнее здесь: https://stackoverflow.com/questions/792 ... nd-easyocr
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»