はじめに
以前こちらの投稿 で、Cloudmersiveの画像加工APIを使って、人物の写真から顔を検出し自動でボカシをいれるというフローをご紹介しました。
処理の全体像については松本典子さんの記事が非常に丁寧に詳しく解説されているので、そちらをご覧ください。
さて、以前の方法のネックは、なんといっても数式の複雑さと、API実行回数の多さでした。特にAPI実行回数についてはサブスクリプションで上限が決まっているので、複数人の顔が入っているような画像の加工には不向きでした。 (このため、私の投稿でも「検出された顔の1つ目」を対象に処理をしています)
これらの問題の原因は、Logic Apps/Power Automate で利用できるCloudmersiveのアクション「Composite two images together(2つの画像の合成)」で、合成する位置が非常にザックリとしか指定できなかったからです。(center, top-left, bottom-rightなど)
そんな中、Cloudmersiveに新しいAPIが追加されているのを発見しました。それが今回利用する「Composite two images together precisely (2つの画像を精密に合成)」 です。
残念ながらまだLogic Apps/Power Automateのアクションには追加されていませんので、APIを直接HTTPアクションで実行しますが、これを利用することで数式の一番複雑な部分が排除され、API実行回数も劇的に減少する ことがわかりました。
上図はボカシを入れるフローの新旧処理を比較したものです。複数人の顔を検出した場合にはすべての顔に対してループ処理が発生しますが、ループの中で実行されているCloudmersiveのアクションが、5回→3回に減っています。
例えば5人の顔が映っている写真を処理した場合には、1回 + 5人×5回 = 26回 APIが呼び出されていました。 新フローでは 1回 + 5人×3回 = 16回 と、10回もAPIが呼ばれなくなっている(消費量が減っている)ことがわかります。
これなら複数人入っている画像でもなんとか使えそうですね!
新API実行に関して
全体の処理はほぼ共通なので、ここでは新API実行部分をご紹介します。
新しいAPIの「精密に合成」とは、合成時のXY座標を指定できるという意味です。単純な合成のAPIでは、合成する位置が非常にザックリだったため透明な背景と一度合成して、位置合わせをしていました。
しかし新しいAPIでは、合成位置をパラメータで指定できるので、顔検出時に取得された顔の座標をそのまま使うことで、ボカシ後の画像と元画像の合成が1アクションで完了することになります。
また、以前の方法では一番面倒だった数式
左上のX : div(sub(variables('width'),add(outputs('Compose')?['LeftX'],outputs('Compose')?['RightX'])),2) 左上のY : div(sub(variables('height'),add(outputs('Compose')?['TopY'],outputs('Compose')?['BottomY'])),2) 幅 : div(add(variables('width'),add(outputs('Compose')?['LeftX'],outputs('Compose')?['RightX'])),2) 高さ : div(add(variables('height'),add(outputs('Compose')?['TopY'],outputs('Compose')?['BottomY'])),2)
これも不要になります。
現時点ではCloudmersiveコネクターのアクションに含まれていないため、HTTPで実行しており、そのBodyを構成するのに少し手間がかかりますが (詳しくは前回の投稿、 これもコネクターに含まれれば他のアクション同様にうまく隠ぺいされると思います。
フロー全体の処理
最後に、N人の顔を検出した場合の注意点も含めて、フローの全体を載せておきます。
ご参考までに。
リンクまとめ
ASCII.jp:人物写真の顔をAIが検出し、ぼかしてツイートするLogic Appsを作ろう (1/3)
Image Recognition and Processing API | API Reference
Power Automate の HTTPアクションで multipart/form-data でデータを送る場合の備忘録 - MoreBeerMorePower