Apple Vision - 无法将单个数字识别为区域

Posted

技术标签:

【中文标题】Apple Vision - 无法将单个数字识别为区域【英文标题】:Apple Vision – Can't recognize a single number as region 【发布时间】:2018-06-16 01:25:37 【问题描述】:

我想使用 Vision 框架中的 VNDetectTextRectanglesRequest 来检测图像中的区域,该图像仅包含一个字符,数字“9”,背景为白色。我正在使用以下代码来执行此操作:

 private func performTextDetection() 
    let textRequest = VNDetectTextRectanglesRequest(completionHandler: self.detectTextHandler)
    textRequest.reportCharacterBoxes = true
    textRequest.preferBackgroundProcessing = false

    let handler = VNImageRequestHandler(cgImage: loadedImage.cgImage!, options: [:])

    DispatchQueue.global(qos: .userInteractive).async 
        do 
            try handler.perform([textRequest])
         catch 
            print ("Error")
        
    


func detectTextHandler(request: VNRequest, error: Error?) 
    guard let observations = request.results, !observations.isEmpty else 
        fatalError("no results")
    

    print("there is result")

我得到的观察结果数为 0,但是如果我在黑色背景上提供带有文本“123”的图像,则“123”被检测为带有文本的区域。所描述的问题也会出现在 2 位数字上,白色背景上的“22”也不会被检测到。

在我的情况下,为什么 Vision API 只能检测到白色背景上的 3 位数字+数字?

【问题讨论】:

好问题,我也有同样的问题。 我遇到了类似的问题。它还有待解决。 ***.com/questions/54282757/… 单个字符在占用更多空间时往往会更好地阅读。即使单个字符的字体大小比包含多个字符的文本大,当单个字符变大时也会为我阅读。只是一个猜测:对于单个字符,没有足够的边缘(或匹配的边缘,可能像笔画宽度变换的输出)来说服 OCR 算法存在字符。 【参考方案1】:

长字符仍然是 XCode 12.5 和 Swift 5 中 VNRecognizeTextRequest 和 VNDetectTextRectanglesRequest 的问题。

我已经看到 VNDetectTextRectanglesRequest 几乎可以在一张纸上找到所有单个单词,但无法检测到单个字符 [在处理整个图像时]。将属性 VNDetectTextRectanglesRequest.regionOfInterest 设置为较小的区域可能会有所帮助。

对我有用的是让单个字符占据 VNRecognizeTextRequest 的更多感兴趣区域 (ROI)。我测试了不同高度的单个字符,很明显,单个字符在达到 ROI 内的特定大小后开始阅读。

对于某些单个字符,当 ROI 大约是字符本身宽度的三倍和高度的三倍时,检测似乎会发生。这是一个相当紧密的关注区域。正确放置是另一个问题,但也是可以解决的。

如果处理时间对您的应用程序来说不是问题,您可以创建一个数组 [CGRect] 跨越怀疑包含单独字符的区域。

我的怀疑是,当 VNRecognizeTextRequest 对边缘内容、边缘密度和/或类似于笔划的图像特征执行初始检查时,如果找不到足够的候选者,它会提前退出。初始检查可能只是一个嵌入的 VNDetectTextRectanglesRequest。无论最初的检查是什么,它都运行得很快,所以我不认为它有那么复杂。

有关笔画检测以查找字符的更多信息,请搜索有关笔画宽度变换的 SO 帖子和文章。还有这个:https://www.microsoft.com/en-us/research/publication/detecting-text-in-natural-scenes-with-stroke-width-transform/。 SWT 旨在处理“自然”图像,例如在户外看到的文本。

有一些技巧可以解决这个问题。其中一些 hack 令人不快,但对于特定的应用程序,它们可能是值得的。

创建一个由小感兴趣区域 (ROI) 组成的网格。在一个又一个 ROI 上运行文本请求。 作为 VNDetectTextRectanglesRequest 的廉价替代品,查找图像中具有表明可能存在单个字符的边缘内容的区域。如果不出意外,这可能有助于忽略没有边缘内容的区域。 在处理图像之前尝试使用缩放过滤器来放大图像。这可以确保单个字符足够大以阅读。 (对于 CIFilters,一个非常方便的资源是 https://cifilter.io/) 在您的图像上运行多个通道。首先,在完整图像上运行 OCR。然后获取已阅读单词的边界框。搜索框之间的可疑间隙。在可疑的空白区域运行小 ROI 网格。 使用 Tesseract 作为备份。 (https://www.seemuapps.com/swift-optical-character-recognition-tutorial)

【讨论】:

以上是关于Apple Vision - 无法将单个数字识别为区域的主要内容,如果未能解决你的问题,请参考以下文章

Apple Vision Framework 识别人脸

Apple Vision 框架:LCD/LED 数字识别

用于对象识别的 ARKit 和 Vision 框架

Mobile Vision API (TEXT) 未检测到单个数字?

Wit.ai 将数字识别为位置

sqlserver中判断是数字(会自动将.3识别为0.3)