Instant-ID の入力画像にアニメ、漫画画像を設定すると "Exception: Insightface: No face found in image." が発生する現象と、対処法、検証結果を紹介します。
Instant-ID を利用するとキャラクターの顔の特徴を把握して、キャラクターの特徴を持った画像を生成できます。
入力画像に写真の画像を利用した場合はほとんど問題は発生しませんが、入力画像をアニメ、漫画画像にした場合、Preprocessorの実行時に次のエラーが発生します。
画像によってはエラーが発生しない場合もあるため、どのような画像を入力画像に設定すればよいかを検証します。
様々な入力画像でPreprocessorの実行を試してみた結果、以下の傾向がありそうです。
下図の画像を用意します。ややリアルな全身のイラスト画像です。背景が暗いほうがエラーが発生しにくいため、背景を暗くしています。
入力画像に設定しInstant-IDのPreprocessorを実行します。エラーは発生せず顔の位置が検出できています。
続いて、上半身の画像を用意します。ややリアルなイラスト画像です。
入力画像に設定しInstant-IDのPreprocessorを実行します。こちらもエラーは発生せず顔の位置が検出できています。
続いて先ほどの上半身の画像をグレースケール化し、入力画像に設定します。
Instant-IDのPreprocessorを実行します。こちらもエラーは発生せず顔の位置が検出できています。
さらにトリミングして胸から上の画像にした場合を確認します。先ほどの画像をトリミングして胸から上までの画像にして、入力画像に設定します。
Instant-IDのPreprocessorを実行します。こちらもエラーは発生せず顔の位置が検出できています。
ポスタリゼーションを適用して、8階調まで減色した画像での結果を確認します。
Instant-IDのPreprocessorを実行します。こちらもエラーは発生せず顔の位置が検出できています。
先ほど用意した胸から上の画像を線画化します。下図の画像に線画化できました。
入力画像に設定しInstant-IDのPreprocessorを実行します。この画像ではエラーが発生しました。
背景が白い画像ではエラーが出る可能性が高いため、階調を反転した画像に変更します。
入力画像に設定しInstant-IDのPreprocessorを実行します。この画像ではエラーは発生せず顔の位置が検出できています。
線の本数が少なくシンプルな線画の場合の結果を確認します。
先ほどの線画の主要な線をなぞって取り出します。下図の画像を作成しました。
諧調を反転させた画像を、入力画像に設定しInstant-IDのPreprocessorを実行します。この画像ではエラーは発生しました。
線を細くしてみます。下図の画像を準備しました。
諧調を反転させた画像を、入力画像に設定しInstant-IDのPreprocessorを実行します。この画像でもエラーは発生しました。
線の細さではエラーの状況は変化しなかったため、線の本数を増やしてエラーが解消されるか確認します。
線を増やした下図の画像を入力画像に設定しInstant-IDのPreprocessorを実行します。この画像でもエラーは発生しました。
さらに線を増やした下図の画像を入力画像に設定しInstant-IDのPreprocessorを実行します。この画像ではエラーは発生しませんでした。
髪の毛以外の線は減らしても影響ないかと考え、シャツの線を減らしてみましたが、下図の画像では、エラーが発生します。
エラーになる率が高いアニメ塗りの画像での検証もします。
下図の画像を用意し、Instant-IDのPreprocessorを実行します。エラーが発生しました。
背景を暗くした場合の動作確認をします。下図の画像でInstant-IDのPreprocessorを実行した場合も、エラーが発生しました。
写真やリアルな画像では、エラーが発生しないことや、先の検証結果から、線画でも線の本数が多い場合にはエラーが出ないため、
今回も線の数を増やす方法をためしてみます。線を増やした画像を用意し、Instant-IDのPreprocessorを実行しましたが、エラーが発生しました。
シンプルな画像の場合、イメージが変化するほど線数を増やす必要がありそうなため、この方法はあきらめます。
写真やリアルな画像では、エラーが発生しないため、エッジが明瞭な画像ではエラーが発生するのではないかという推測の元、
画像をぼかして境界線がシャープにならない状態にします。
下図の画像を用意し、Instant-IDのPreprocessorを実行します。この画像の場合、エラーが発生せずに顔の位置が検出できています。
先の画像ではぼかしが大きすぎて顔の特徴がわかりにくくなってしまうため、ぼかしの量を調整して下図の画像を用意しました。
こちらの画像でもエラーが発生せずに顔の位置が検出できます。
シンプルな画像ではException: Insightface: No face found in image.
が発生し、ある程度エッジの本数が多い画像を入力する必要があることがわかりました。
シンプルなアニメ、イラスト画像ではエラーが発生するため、自分で画像を用意する場合にはある程度書き込み量を増やした画像を用意する必要がありそうです。
また、全身画像かバストアップ画像かの違いはそれほど大きな違いはなさそうです。一般的には首が描画されていないと検出率が落ちるとされているため、
首が含まれていたほうが良さそうです。加えて、線画時には背景が白い画像ではエラーになりましたので、背景が暗い画像のほうがエラーが出にくい状況も
確認できました。
アニメ塗りの画像の場合はエラーが高い確率で発生します。これは、エッジがシャープすぎる画像では顔の検出が逆に失敗しやすくなるためと考えられます。
対処法として、画像をぼかすと顔の検出率が高まりエラーの発生を防げます。