はじめに
生成AIの一部としても活用されているCLIPをHailo上に実装して動かしてみました。
さまざまな使用用途が期待されるCLIPに興味がある方はぜひご覧ください。
CLIPについて
CLIPはOpenAIによって公開された言語と画像のマルチモーダルなモデルとなります。
通常の物体検出AIはあらかじめ決まったもの(人物、自動車など)を検出するためにラベリングしたデータセットを用意して学習させることが必要になります。CLIPは画像と関連したテキストで学習をおこなっており、入力されたテキストをエンコードし、画像との類似度を見ていきます。(CLIPを解説した記事はいろいろありますので詳細はそちらを参照ください)
簡単に言うと決まったキーワードじゃなくても再学習なしで検出してくれる(かもしれない)という、より汎用性のあるモデルとなります。例えば、「赤い服の人」を見つけたい場合に「赤い服の人」を学習することなしに画像に対して「赤い服の人」なのかどうかを類推します。やりたいことに対して都度学習が発生するのは実際の運用においてハードルが高いので、こういった汎用性の高いモデルは期待されている技術です。
Hailoへの実装方法
Github上にHailo向けのCLIPの環境が整っていますので、こちらに沿ってインストールしていきます。
https://github.com/hailo-ai/hailo-CLIP
システム環境としては以下リンク先の記事でセットアップしたHailo AI software Suiteの環境をそのまま使います。
①AI Software Suiteに必要なハードウェアとインストール
CPU:Core™ i9
Memory:32GB
OS:Ubuntu 22.04
Hailo AI software Suite:2024-04
まずは、Hailo AI Software SuiteのDocker内に入っていただき、必要なパッケージをインストールします。
$ sudo apt-get -y install libblas-dev nlohmann-json3-dev
次に適当なフォルダーで、以下左図のようにgit clone用のアドレスを取得いただき、git cloneします。
$ git clone https://github.com/hailo-ai/hailo-CLIP.git
そうすると"hailo-CLIP"というフォルダーができているはずなのでそこに入ります。
$ cd hailo-CLIP
そして以下を実行します。
$ source setup_env.sh

最後に以下でインストールを実行します。
$ python3 -m pip install -v -e .
(弊社では以下のような依存関係のエラーが確認できましたが、特に動作には問題なさそうでしたのでそのまま進めています)

以上でインストールは完了です。
CLIPを動かしてみよう!
まずはデモが用意されているので、それを動かしてみます。
$ clip_app --input demo
以下のように、ラズパイや Xenomorph(調べると映画 ”エイリアン” シリーズに登場する地球外生命体らしいです)などの変わったキーワードでも識別できています。
次に、自由に動かしてみたいと思います。
いろいろ設定できるようですのでヘルプを確認します。
$ clip_app --help

いくつか説明を加えさせていただきます。
--detector person
人を検出してから人に対してのみCLIPをかけるモードです。人の検出はYolov5sが使用されています。
人の属性や行動などを検出したいときに使うモードです。
--disable-runtime-prompts
今回の実装ではCLIPのImage encodingはHailo上で実行されますが、Text encodingはHost CPU側で実行されます。キーワードをリアルタイムに変更しながら処理することはCPUの負荷が増えますので、このオプションを加えることで事前にText encodingされた情報で識別します。実際のアプリケーションではこのモードで動かすのが妥当かと思われます。
--json-path
事前にText encodingされた情報(jsonファイル)を指定できます。
事前にText encodingをするためにtext_image_matcherというツールが準備されています。

"--output"でjsonファイルの名前とパスを指定しておいて、"--texts-list"でキーワードを指定できるようになっています。
キーワードは最初の一つ目が実際に検索したいものであとはネガティブキーワードになります。CLIPの使いこなしにはこのネガティブキーワードが重要で、検索したいものと反するものを入れておくと精度が上がっていくようです。例えば「赤い服の人」を見つけたければ「青い服の人」「黒い服の人」などをネガティブキーワードに加えていきます。
では、実際に動かしていきましょう。
今回は、「赤い服の子供」を探してみたいと思います。
まずはText encodingされたjsonファイル作りです。
$ text_image_matcher --output red_clothes_child.json --texts-list "red clothes child" "adult" "white clothes" "black clothes" "blue clothes“
探したいキーワードを"red clothes child"としています。
それ以降に続くのがネガティブキーワードで、今回は"adult" "white clothes" "black clothes" "blue clothes"を入れてみました。

上記で作った json ファイルを使って実際にCLIPをかけてみます。
$ clip_app --input ./sample_redclothes.mp4 --detector person --json-path ./red_clothes_child.json --disable-runtime-prompts
実際の動作は以下の動画にてご確認ください。
ご覧いただいた動画の最後の方に「赤い服の子供」が登場し、高いスコアが出ていることが確認できます。
(ただ安定して高いスコアがでていないように思われますので、キーワードやネガティブキーワードの工夫が必要かもしれません)
次に、「倒れている人」を検出してみたいと思います。
・Text encoding
$ text_image_matcher --output ./falling_down.json --texts-list "falling down" "standing" "running" "walking“
・CLIP実行
$ clip_app --input ./sample_fallingdown.mp4 --detector person --json-path ./falling_down.json --disable-runtime-prompts
よいサンプル動画が見つからなかったので、サッカーのゴールキーパーのキャッチングで代用しておりますが、飛び込んでキャッチするシーンで「倒れている人」として認識できています。
最後に道路の動画から「バス」を検出します。
・Text encoding
$ text_image_matcher --output bus.json --texts-list "bus" "car" "automobile" "sedan" "saloon" "SUV“
・CLIP実行
$ clip_app --input ./sample_bus.mp4 --json-path ./bus.json --disable-runtime-prompts
(今回は、対象物が人ではないので--detector personのオプションは外しています)
バスが通っているときのスコアが、高くなっていることが分かります。
まとめ
CLIPを試してみましたが、自由なキーワードで検出できるというのはおもしろく、さまざまな応用の可能性を感じました。
例えば、「警備ロボットで人の特徴を伝えればその人を探してくれる」とか、「監視カメラの映像から必要なところだけを抜き出す」など、人手不足が問題視されている中、さまざまな使い方ができそうです。さらに、それを Hailo を使ったエッジ端末で実現できるとこも良いポイントです。
ご興味がありましたら、ぜひお試しください。
お問い合わせ
本記事に関してご質問がありましたら以下より問い合わせください。
Hailo メーカー情報Topへ
Hailo メーカー情報Topページへ戻りたい方は、以下をクリックください。