Запрос VNRecognizeTextRequest не срабатывает, но позволяет выделять текст в Preview.app.

Вопрос или проблема

Я использую VNRecognizeTextRequest на сервере OCR, который принимает изображения по TCP, выполняет OCR и возвращает извлеченный текст. Цель заключается в поддержке всех языков, но есть проблемы с китайским.

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

Тем не менее, если я открываю эти изображения в Preview, я могу выбрать и скопировать текст в буфер обмена. Я предполагаю, что приложение Preview на MacOs использует тот же фреймворк OCR VNRecognize, поэтому непонятно, почему OCR успешно работает в Preview, но не удается при использовании VNRecognizeTextRequest в программе на Swift.

Вот два изображения, показывающих, что я могу выбрать и скопировать текст из изображения в Preview.app:

Выбор текста возможен

Выбор текста возможен #2

Окружение – MacOS 15.0.1 (это приложение MacOS, а не iOS)

Вот код. Я пробовал различные комбинации VNRecognizeTextRequest.usesLanguageCorrection и VNRecognizeTextRequest.recognitionLanguages, но они не работают на двух вышеупомянутых изображениях.

Есть ли предложения по изменению, чтобы программа соответствовала поведению Preview.app? Я прикреплю чистые изображения внизу этого поста.

public func doOcr(image: CGImage, outStrings: inout [String]) async -> Bool
{
    var ret = true
    
    let ocrRequest = VNRecognizeTextRequest(completionHandler: ocrCompleteCb)
    ocrRequest.recognitionLevel = .accurate
    ocrRequest.automaticallyDetectsLanguage = true
    ocrRequest.customWords = ["…", "᠁", "..."]
    ocrRequest.usesLanguageCorrection = false
    print("usesLanguageCorrection: \(ocrRequest.usesLanguageCorrection)")
    
    //ocrRequest.recognitionLanguages = ["zh-Hant"];
    
    let imageRequestHandler = VNImageRequestHandler(cgImage: image)
    
    do
    {
        try imageRequestHandler.perform([ocrRequest])
        outStrings = mOcrResults
    }
    catch
    {
        outStrings.append("\(error)")
        ret = false
        print("Ошибка OCR: \(error)")
    }

    return ret
 }


 private func ocrCompleteCb(request: VNRequest, error: Error?)
 {
     mOcrResults.removeAll()

     // Обработка результатов распознавания
     guard let observations = request.results as? [VNRecognizedTextObservation] else
     {
         print("Неожиданный тип наблюдения.")
         return
     }
 
     // <<< Ноль наблюдений найдено при ошибке OCR >>>
     mLogger.consoleLogMsg("ocrCompleteCb \(observations.count) наблюдений")
     
     for observation in observations
     {
         let topCandidate = observation.topCandidates(1).first
     
         if let recognizedText = topCandidate?.string
         {
             mLogger.consoleLogMsg("Найдено: \(recognizedText)")
             mOcrResults.append(recognizedText)
         }
     }
 }

[введите описание изображения здесь3

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

.

Ответ или решение

Описание проблемы: Неудачи с VNRecognizeTextRequest при распознавании текста

Ваша ситуация, когда библиотека VNRecognizeTextRequest не может распознать текст на определенных изображениях в вашем приложении, несмотря на то, что это возможно в приложении Preview.app, действительно вызывает вопросы. Тем не менее, существует несколько факторов, которые могут влиять на различия в поведении между двумя средами. Давайте рассмотрим потенциальные причины и возможные решения данной проблемы.

Поиск причин неудачи

  1. Качество входного изображения: Обратите внимание на качество изображений, которые вы используете для распознавания текста. Preview.app может использовать собственные алгоритмы предварительной обработки изображений, которые улучшают контраст или убирают шум, прежде чем передать их в механизм распознавания. Убедитесь, что изображения, которые вы обрабатываете, имеют достаточное разрешение и четкость.

  2. Настройки VNRecognizeTextRequest:

    • Recognition Level: Вы установили ocrRequest.recognitionLevel = .accurate, что предполагает более высокий уровень точности, но может быть более чувствительным к качеству изображения.
    • Language Correction: Вы установили ocrRequest.usesLanguageCorrection = false. Попробуйте установить его в true, чтобы система могла учитывать контекст языка при распознавании текста.
    • Параметры распознавания языка: Ваша строка ocrRequest.recognitionLanguages = ["zh-Hant"]; закомментирована. Попробуйте ее раскомментировать, установить язык явно, особенно если текст является на китайском.
  3. Структура изображения: Некоторые изображения содержат текст, завуалированный другими элементами (например, фоном или графическими элементами). Убедитесь, что текст изначально хорошо видим. Также иногда текст может быть написан нестандартным шрифтом, что усложняет его автоматическое распознавание.

  4. Обработка ошибок: Убедитесь, что ваш код правильно обрабатывает случаи ошибки. В вашем методе ocrCompleteCb вы уже проверяете, есть ли результаты, но также стоит добавить больше логов для детальной диагностики.

Рекомендации и улучшения кода

  1. Попробуйте добавить явное указание для языковых параметров:

    ocrRequest.recognitionLanguages = ["zh-Hant"]
  2. Включите корректировку языка:

    ocrRequest.usesLanguageCorrection = true
  3. Проверьте и обработайте изображения перед передачей на распознавание (например, улучшение контраста, масштабирование и т.д.). Вы можете использовать Core Image для доработки изображений перед их обработкой.

  4. Логируйте более подробную информацию о результатах распознавания, чтобы оценить, в каком именно месте возникает проблема:

    print("Observations count: \(observations.count)") 
    if observations.isEmpty {
        print("No observations found, check the input image quality and parameters.")
    }

Вывод

Несмотря на то что VNRecognizeTextRequest и Preview.app используют один и тот же механизм OCR, различия в обработке и параметрах могут привести к различным результатам. Испробуйте предложенные улучшения и внимательно настройте параметры распознавания. Надеюсь, это поможет вам в решении проблемы и обеспечит более стабильное распознавание текста на изображениях.

Оцените материал
Добавить комментарий

Капча загружается...