Вопрос или проблема
Я использую VNRecognizeTextRequest
на сервере OCR, который принимает изображения по TCP, выполняет OCR и возвращает извлеченный текст. Цель заключается в поддержке всех языков, но есть проблемы с китайским.
В целом, это работает отлично, но есть некоторые изображения, которые не возвращают никаких результатов наблюдения, то есть OCR не удается.
Тем не менее, если я открываю эти изображения в Preview, я могу выбрать и скопировать текст в буфер обмена. Я предполагаю, что приложение Preview на MacOs использует тот же фреймворк OCR VNRecognize
, поэтому непонятно, почему OCR успешно работает в Preview, но не удается при использовании VNRecognizeTextRequest
в программе на Swift.
Вот два изображения, показывающих, что я могу выбрать и скопировать текст из изображения в Preview.app:
Окружение – 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)
}
}
}
[
.
Ответ или решение
Описание проблемы: Неудачи с VNRecognizeTextRequest при распознавании текста
Ваша ситуация, когда библиотека VNRecognizeTextRequest
не может распознать текст на определенных изображениях в вашем приложении, несмотря на то, что это возможно в приложении Preview.app, действительно вызывает вопросы. Тем не менее, существует несколько факторов, которые могут влиять на различия в поведении между двумя средами. Давайте рассмотрим потенциальные причины и возможные решения данной проблемы.
Поиск причин неудачи
-
Качество входного изображения: Обратите внимание на качество изображений, которые вы используете для распознавания текста. Preview.app может использовать собственные алгоритмы предварительной обработки изображений, которые улучшают контраст или убирают шум, прежде чем передать их в механизм распознавания. Убедитесь, что изображения, которые вы обрабатываете, имеют достаточное разрешение и четкость.
-
Настройки
VNRecognizeTextRequest
:- Recognition Level: Вы установили
ocrRequest.recognitionLevel = .accurate
, что предполагает более высокий уровень точности, но может быть более чувствительным к качеству изображения. - Language Correction: Вы установили
ocrRequest.usesLanguageCorrection = false
. Попробуйте установить его вtrue
, чтобы система могла учитывать контекст языка при распознавании текста. - Параметры распознавания языка: Ваша строка
ocrRequest.recognitionLanguages = ["zh-Hant"];
закомментирована. Попробуйте ее раскомментировать, установить язык явно, особенно если текст является на китайском.
- Recognition Level: Вы установили
-
Структура изображения: Некоторые изображения содержат текст, завуалированный другими элементами (например, фоном или графическими элементами). Убедитесь, что текст изначально хорошо видим. Также иногда текст может быть написан нестандартным шрифтом, что усложняет его автоматическое распознавание.
-
Обработка ошибок: Убедитесь, что ваш код правильно обрабатывает случаи ошибки. В вашем методе
ocrCompleteCb
вы уже проверяете, есть ли результаты, но также стоит добавить больше логов для детальной диагностики.
Рекомендации и улучшения кода
-
Попробуйте добавить явное указание для языковых параметров:
ocrRequest.recognitionLanguages = ["zh-Hant"]
-
Включите корректировку языка:
ocrRequest.usesLanguageCorrection = true
-
Проверьте и обработайте изображения перед передачей на распознавание (например, улучшение контраста, масштабирование и т.д.). Вы можете использовать Core Image для доработки изображений перед их обработкой.
-
Логируйте более подробную информацию о результатах распознавания, чтобы оценить, в каком именно месте возникает проблема:
print("Observations count: \(observations.count)") if observations.isEmpty { print("No observations found, check the input image quality and parameters.") }
Вывод
Несмотря на то что VNRecognizeTextRequest
и Preview.app используют один и тот же механизм OCR, различия в обработке и параметрах могут привести к различным результатам. Испробуйте предложенные улучшения и внимательно настройте параметры распознавания. Надеюсь, это поможет вам в решении проблемы и обеспечит более стабильное распознавание текста на изображениях.