Scribble at 2024-05-11 09:33:45 Last modified: unmodified

添付画像

AIによる画像解析や物体認識テクノロジーに欠かせない機能として、YOLOが挙げられます。YOLOに代表される物体検出手法は、すでに日常生活やビジネスにおけるさまざまなシーンで活用されており、今後のさらなる発展が期待できるでしょう。

YOLOとは?他の手法との違いやメリット・デメリットについて解説

Stable Diffusion を始めとする画像生成 AI に関連する解説サイトやブログ記事の大半が、国内だろうと海外だろうと他人の事例を見様見真似で試した結果を報告しているに過ぎない未熟な情報で席巻されている。したがって、彼らが「画像生成 AI」という文言で解説しているのは、このうちの前半である「画像生成」しかも Web UI や Comfyui といったフロントエンドの使用法でしかない。もちろん、基本的なことだけやって楽しんだりテストするだけならいいが、分散モデルのアーキテクチャーを正確に理解して運用し、趣味だろうと業務だろうと丁寧に取り組もうというのであれば、画像を出すということだけに特化しているようなブログ記事をどれだけ眺めていてもだめだ。

明白な実例を挙げると、Stable Diffusion Web UI には拡張機能を追加できる。その中でも "ADetailer" という拡張機能は有名だ(https://github.com/Bing-su/adetailer)。これは、生成している途中の画像について、特に目や手や人物全体などを追加して描きこんでくれる。その際に特別なプロンプトを追加できるので、シードを固定して同じ構図の画像で顔を対象にして描き直すといった手順を使って、同じ構図の画像でも人物の表情だけ変えるといったことが可能になる。もちろん、 ADetailer の大半の用途は顔、とりわけ目を綺麗に描くということにあり、これを紹介しているページの約半分くらいは(Stable Diffusion の分散モデルは、特にカメラから人物までの距離がある場合に目の描画が雑になる傾向があるので)、目を補正する方法として ADetailer を紹介している。

だが、ADetailer の紹介記事の殆ど、僕が検索してざっと眺めた限りでは 100 % と言ってもいいが、それらはお互いにコピペし合っているだけのガラクタみたいな解説であり、拡張機能のインストール手順くらいは参考にしてもいいが、この拡張機能を正確に理解するためのリソースとしては全く信用に値しない。なぜなら、それらの全てにおいて、たとえば「モデル」の説明はこうなっているからだ。

・face_yolov8n.pt(顔部分のみ修正)

・face_yolov8s.pt(顔部分のみ修正)

これは ADetailer で選択できる「モデル」の一部だが、ではこれら二つのモデルにはどういう違いがあるのだろうか。残念ながら、face_yolov8n.pt と face_yolov8s.pt の違いを説明している事例は一つとしてない。したがって、読んでいる人の殆どは face_yolov8n.pt でよいという説明にしたがって face_yolov8n.pt だけを使っていることだろう。なら、別に全てのモデルを列挙する必要なんてない筈である。どのみち ADetailer をインストールすれば、UI を操作するだけでモデルの一覧は目があれば誰でも見える。ブログ記事であらかじめ列挙してもらわなくてもいい。列挙するからには、それらにどういう意味があるのか、列挙するだけの意味がある説明をしなくてはいけない。そういう説明もしないで自分が知っていることを並べるだけで「情報」になると思っているような人は、大学のレポートなどでも真っ赤っ赤に添削される運命にある。(同じような話を https://www.markupdancing.net/archive/note.html?date=b416136c1e080e7cdbd243912cfdfcc7 でも書いた)。その文章においてどういう意味や効果があるのかも感ぜずに、ただ自分がそれに関連して知っているというだけのことを無意味に並べ立てても許されるのは、日本の小学生が夏休みに書く自由研究の作文みたいな、読む方も大学院すら出ていない学校教員という場合だけだ。

ということで、ここではそういう無意味なパラメータの列挙を並べられて困惑している人々と一緒に、簡単だが事の詳細をたどってみよう。まず何と言っても、画像生成のことしか考えていないブログ記事をいくら検索しても駄目である。ここは基本に戻るべきだ。この場合の「基本」とは、もちろん ADetailer の情報なのだから、ADetailer を公開している開発者のサイトへアクセスすることである。それは、表面的なことしか解説していないブログ記事でも、それらの多くが https://github.com/Bing-su/adetailer という URL を示しているので、そこへブラウザでアクセスすればよい。すると、GitHub でホストされている開発者のリポジトリが表示される。記載内容は英語だが、いまどき高校生の半分は英検準2級くらいあるようなので、分からなければ Google 翻訳などを使えばよい。ここが ADetailer の公開場所なのであるから、ここが最も基本的な情報を提供してくれている。そして、僕らのようなシステムあるいはウェブ・アプリケーションのエンジニアは GitHub の扱いに慣れている(というか、僕も GitHub に仕事で開発したプログラムなりアプリケーションのソース・コードをホストしてもらっている)ので何も躊躇はしないが、初めてアクセスするという方は、このページに掲載されている ADetailer の概要を翻訳するなりして眺めることをお勧めする。これは、ソフトウェアで言うところの readme.txt みたいなものだからだ。そして、次に ADetailer のソース・コードを眺めてゆく。いちいち細かく解説していられないので、先にどこを見たら良いかだけ書いておくと、

https://github.com/Bing-su/adetailer/blob/main/adetailer/common.py

この common.py という Python のソース・コードを見るとよいだろう。このコードは、ADetailer を導入したときの挙動を記述していて、67行目あたりから

"face_yolov8n.pt": hf_download("face_yolov8n.pt")

のようなモデルの一覧が登録されて、それらをアップデートするかどうか判定するといったコードが書かれていることが分かるだろう。このコードによると、Hugging Face という AI 専門の GitHub みたいなサイトから、必要なファイルをダウンロードするといった内容が記述されている。(具体的には https://huggingface.co/Bingsu/adetailer)

これが分かれば、次に Hugging Face(https://huggingface.co/)へアクセスしてみる。ほぼテキストとアイコンだけのシンプルな画面デザインとなっていて、初めてアクセスした人の多くは途方に暮れてしまいそうなほど愛想のないつくりだが、やることは単純だ。モデルの名称である "face_yolo..." というキーワードを検索すればいいだけである。すると、幾つか候補は出てくるが、ここではどれかを選んでページにアクセスすることが目的なのではない。そうではなく、"face_yolo..." といったモデルで公開されているのは、検索結果の右側に記載されているように、"YOLO"("v8" とか "v5" といったヴァージョン表記はともかく)というものなのだと分かればいいのだ。すると、次に "YOLO" というキーワードで検索してみれば、冒頭でリンクしてある、AI の情報を理屈から詳しく紹介してくれている記事が見つかる。ここでようやく、ADetailer で使っている "face_yolov8n.pt" といったモデルは、YOLO という物体検知技術で開発されたモデルなのだと分かるわけである(もう少し詳しく YOLO について知りたい場合は、https://docs.ultralytics.com/ja を参照するのがいい)。そして、ADetailer に採用されている幾つかのモデルは、この YOLO のライセンスに従って開発された、顔や手の識別に特化したモデルなのだ。

そして、実際に face_yolov8n.pt のようなモデルをダウンロードしている Hugging Face の https://huggingface.co/Bingsu/adetailer へアクセスすると、例えば face_yolov8n.pt と face_yolov8s.pt の違いは "mAP 50" あるいは "mAP 50-95" という指標の数値が違うということで区別できる。では、この "mAP" とはなんだろうか。

"mAP" は "mean average precision" の略語であり、物体検知の精度を表す指標だ。一定の区画で算出した値から「顔であるかどうか」を判別した結果と、実際に顔として出力しているという結果とを比べて、どのていどの範囲の画像が顔として検知されるかを色々なパラメータで調整できる。もちろん、画像の精度や変化率とも関係があるので、これを監視カメラによる個人の識別などに応用する場合は、僕らが話題にしている静止画の物体検知とは異なるパラメータを使うのだろう。いずれにしても、こういう物体検知の仕組みで使われる精度にかかわる指標(の平均 = mean)が "mAP" だと分かればよい。そして、この値がモデルの挙動としてどう影響するかという、ここでの最も重要なポイントについて簡単に説明するなら、まず "mAP 50" というのは仮説と実際の近さを表していて、これはつまり「算出した値から顔と判定した範囲と、実際に顔として出力している範囲が 50 % だけ一致している」という意味になる。よって、mAP 50 において face_yolov8n.pt は 66 % の一致度、そして face_yolov8s.pt は 71 % の一致度となっていることが分かる("mAP 50-95" は色々な閾値で計算された値のこと)。この二つの違いは、どの範囲を顔として検知するかという判定基準のシビアさの違いなのである。もちろん、判定値と生成している途中の値とができるだけ同じ範囲で一致するように範囲を広げると、それだけ一致度は下がる。広い範囲の画像を比較しなくてはならず、そして広い範囲を比較すると、顔でないものまで処理して顔の一部だと誤判定するリスクが高くなるからだ。

というわけで、mAP 50 という半分ていどの精度でよいというスピード重視の判定では、これの数値が高い方がモデルの性能としては「良い」と言えるわけなので、face_yolov8n.pt よりも face_yolov8s.pt を選ぶのが無難だと言える。ただし、これら二つのモデルが「顔」として検知する際に異なる部位を検知の基準にしているような場合は、単純な比較はできなくなる。たとえば一方では耳を検知の基準にしていなくて、他方では口を検知の基準に含めずに顔かどうかを判定しているような場合だ。だが、face_yolov8n.pt と face_yolov8s.pt については、そこまでの違いがあるかどうかは分からない。

  1. もっと新しいノート <<
  2. >> もっと古いノート

冒頭に戻る


※ 以下の SNS 共有ボタンは JavaScript を使っておらず、ボタンを押すまでは SNS サイトと全く通信しません。

Twitter Facebook