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
"""Выполните распознавание текста на номерном знаке."""
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
"""Исправить обнаруженный текст до ближайшего совпадения с целевыми словами."""
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
"""Основная функция для распознавания номерных знаков."""
# Названия целевых мест
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