2022年02月17日

アップルのMLアプリのサンプルの exifOrientationFromDeviceOrientation() は間違えているという話

機械学習のためのVisionフレームワークを使ったmacOS/iOSアプリの開発をやっています。
その中で、アップルが公開して世間で広く使われているサンプルのSwiftコードに誤りがあるのではないかということに気がつきました。
それはビデオキャプチャ、特にiPhoneのカメラを使ったアプリの場合に使われる exifOrientationFromDeviceOrientation() のコードです。
これはiPhoneの向きに合わせて推論の向きを変更するコードで、今では世界中の多くのブログや教科書に転載されていますが、これでアプリを作成すると、portrait(iPhoneを縦に持つ)に Visionの推論の精度が低くなることに気がつきました。
また、横持ちの場合でも出力される結果が反転する現象がありました。
アップルが提供するコードに誤りがあるとはついぞ思い至らなかったため、自作の部分をこねくりまわして悩むことになってしまいました。世間で広く使われているコードは以下になります(Swift)。
func exifOrientationFromDeviceOrientation() -> CGImagePropertyOrientation {
let curDeviceOrientation = UIDevice.current.orientation
let exifOrientation: CGImagePropertyOrientation

switch curDeviceOrientation {
case UIDeviceOrientation.portraitUpsideDown: // Device oriented vertically, home button on the top
exifOrientation = .left
case UIDeviceOrientation.landscapeLeft: // Device oriented horizontally, home button on the right
exifOrientation = .upMirrored
case UIDeviceOrientation.landscapeRight: // Device oriented horizontally, home button on the left
exifOrientation = .down
case UIDeviceOrientation.portrait: // Device oriented vertically, home button on the bottom
exifOrientation = .up
default:
exifOrientation = .up
}
return exifOrientation
}

これを 以下のように修正します。
func exifOrientationFromDeviceOrientation() -> CGImagePropertyOrientation {
let curDeviceOrientation = UIDevice.current.orientation
let exifOrientation: CGImagePropertyOrientation

switch curDeviceOrientation {
case UIDeviceOrientation.portraitUpsideDown: // Device oriented vertically, home button on the top
exifOrientation = .left
case UIDeviceOrientation.landscapeLeft: // Device oriented horizontally, home button on the right
exifOrientation = .up //反転を削除
case UIDeviceOrientation.landscapeRight: // Device oriented horizontally, home button on the left
exifOrientation = .down
case UIDeviceOrientation.portrait: // Device oriented vertically, home button on the bottom
exifOrientation = .right //修正
default:
exifOrientation = .up
}
return exifOrientation
}

とすると、推論の精度も上がります。
Macの場合、MacBookを立てて使う人はいないのでこのコードが使われることもなく、デバイスの向きが問題となることもありませんが、iPhoneの場合は縦でも横でも使いますし、iPad Proだと横向きで使う人が多く、iPad miniだと縦向きで使う人が多かったりと、事情が複雑です。Exifタグとの関係、AVFoundationとの関係などでも、方向の問題はぐちゃぐちゃで難解です。
この発見がだれかの役に立ちますように。
タグ:vision
posted by MacLab. at 22:41| Comment(0) | TrackBack(0) | 技術情報
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

※ブログオーナーが承認したコメントのみ表示されます。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/189343167
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック