VNDetectRectanglesRequestのminimumSizeについて

VNDetectRectanglesRequestのminimumSizeについて

Visionフレームワークを触っていてわからなかったことがあります。
VNDetectRectanglesRequestminimumSizeプロパティの意味です。

minimumSizeプロパティは検出する矩形の最小サイズを指定するプロパティです。
分析する画像の矩形が指定したものよりも小さければ、分析処理をしません。
多くの矩形を分析する際は処理を軽くするために指定すると良いものです。
デフォルトが0.2になっており、0.0から1.0の値が指定できます。

let request = VNDetectRectanglesRequest()
request.minimumSize = 0.2

ただこの数値の意味がわからないのです。

ドキュメントにはこう書かれています。

The minimum size of a rectangle to detect, as a proportion of the smallest dimension.
筆者訳:検出する矩形の最小サイズを、最小寸法の比率で指定します。

as a proportion of the smallest dimension. ってなんだ?という話です。

同じ疑問を持つ人は他にもいて、stackoverflowに質問が上がっていました。
https://stackoverflow.com/questions/53829351/how-does-the-minimum-size-work-on-detected-rectangle-using-vndetectrectanglesreq

回答が一つあって、こう書かれています。

It is the minimal share of the screen that the smaller side of the potential rectangle needs to take up, before Vision detects it.
作者訳:Visionが矩形を検出する前に、検知されうる矩形の小さい方の側面が取り上げられる必要があるのは画面の最小シェアです。

the minimal share of the screen って言っているから画面の比率を指しているんでしょうか?
しかしVisionは画像データしか渡していないので画面サイズ(UIScreen.main)にはアクセスしていない気がします。

一方でVNRecognizeTextRequestminimumTextHeightはわかりやすいです。

文字を認識するリクエスト、VNRecognizeTextRequestにもminimumTextHeightという最小サイズを指定するプロパティがあります。
そのドキュメントはこちら。

https://developer.apple.com/documentation/vision/vnrecognizetextrequest/3152641-minimumtextheight

The minimum height, relative to the image height, of the text to recognize.
作者訳:画像の高さに対する、認識する文字の最小の高さ。

わかりやすい。画像に対して文字の最小の高さを割合で指定するんだってことが明確です。

試してみる

ドキュメントでわからないことは実際試してみましょう。
静止画からVNDetectRectanglesRequestを実行するアプリを作りました。

rectangle_detected

サンプルアプリ

VNDetectRectanglesRequestminimumSizeを指定をして、どの数値が境目になるかを調べます。

該当コードはこちらです。

https://github.com/SatoTakeshiX/SwiftUI-Vision/blob/365509e5d29808624649c88fe173f60c760ced9c/Detected-in-Still-Image/Detected-in-Still-Image/Model/VisionClient.swift#L110

lazy var rectDetectionRequest: VNDetectRectanglesRequest = {
    let rectDetectRequest = VNDetectRectanglesRequest { [weak self] request, error in
        ...
    }
    rectDetectRequest.minimumSize = 0.42 // ここを追加
    return rectDetectRequest
}()

すると0.42を境にこれ以下にすると矩形が検出されなくなりました。

この0.42の割合が何なのかを調べます。

矩形の比較はIllustratorを使うと便利です。

分析する画像の大きさがw:640、h:427です。
それの42%の矩形を作ります。
矩形の大きさはw:268.8、h:179.34になりました。

それを画像のクレジットカードと合わせてみます。

----------2021-08-05-0.24.08

ピッタリ重なりました。

minimumSizeの意味は「画像に対する矩形の割合を指定する」とみて良いですね。

宣伝

Visionレームワークの入門書を書きました。
iOSで画像分析に興味のある方ぜひ見ていただければと思います。

SwiftUIで学ぶVisionフレームワーク入門