なるように、なる

徒然なつぶやき、備忘録です。

YOLO v8 をTouchDesignerで使う

YOLO v8をTouchDesignerで使えるようにするためのメモです。
盛大にハマって2.5日かかりましたので。。

サンプルはこちら↓

github.com

環境

  • os: win11
  • TouchDesiner : 2023.11600 (python 3.11.1)
  • PCローカルのpython : 3.11.1
  • YOLO : v8
  • CUDA : 12.1
  • cuDNN : 8.9.7

ザックリ手順

  1. TouchDesignerと同じバージョンのpythonをPCにインストール
  2. PCのpython環境でYOLOをインストール
  3. YOLOのインストール先をTouchDesignerのPythonパスに指定する

参考

【TouchDesigner】PyTorchでセマンティックセグメンテーション

TouchDesignerと同じバージョンのpythonをPCにインストール

TDのバージョンによりPythonのバージョンが異なるので、ちゃんと確認します。
TD上でAlt+tでTextPortを開くとPythonのバージョンが先頭に表示されているはずです。

PCへのPythonのインストールは、自分はpyenvが好きです。
複数バージョンを利用する可能性がある人はぜひご利用ください。

【pyenv-win】pyenv のインストールと実行 #Python - Qiita

あとvenvも使うと良いです。比嘉先生の記事を置いておきます。

Extending TouchDesigner @MUTEK.JP

-> 方法3: venv で仮想環境を作成、pipでインストール

PCのpython環境でYOLOをインストール

以下の2つの記事を参考にしました(大感謝)。

Yolo V8の覚書 #Python - Qiita

yolov8をGPUで動作させる方法 - AIと電子工作系ブログ

CUDA&cuDNN

PyTorchとのかみ合わせがあるので、バージョンはしっかり意識して。
(自信がない人は自分と同じ12.1にしておきましょう)

CUDA12.1

https://developer.nvidia.com/cuda-12-1-0-download-archive

cuDNN (8.9.7 for CUDA 12.x)

https://developer.nvidia.com/rdp/cudnn-archive

YOLO v8

YOLO v8はultralyticsというパッケージをインストールすれば使えるようになります。
ただ、PyTorchがCPU版でインストールされるため、GPU版を入れなおす必要があります。

ここで大ハマリしたのですが、2024.05現在のPyTorchの最新版(2.3.0)だと、自分の環境ではネイティブPythonだとOKだけど、TDのPythonだとモジュール読み込み時にdllの依存が解決できないという問題が生じました。 (torch/lib/shm.dll)

自分がOKだったのは2.1.1です。2.2.0あたりでも平気そうな気がしますので、知見ある方は自分で良さそうなものを選んでみてください。
PyTorchの過去バージョンは↓から探せます。

https://pytorch.org/get-started/previous-versions/

pip install ultralytics
pip uninstall torch torchvision

pip install torch==2.1.1 torchvision==0.16.1 torchaudio==2.1.1 --index-url https://download.pytorch.org/whl/cu121
  or
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121

ここまでの環境構築が成功すると、↓が動くと思うので確認してみてください。

https://qiita.com/kotai2003/items/32329a90703394d39d5c#object-detection-with-webcam

YOLOのインストール先をTouchDesignerのPythonパスに指定する

TouchDesignerにローカルPCのPythonモジュールのパスを通す方法はいくつかあるので、比嘉先生の記事を再掲します。

http://satoruhiga.com/post/extending-touchdesigner/

-> 外部ライブラリのインストール

「方法2: モジュール探索パスの設定」についてですが、sys.path.append()よりもsys.path.insert(0, NEW_path) のほうが堅いと先生から教わったので、ここに書き残しておきます。

これでTouchDesingerのpythonでYOLOを使うことができるようになりました。

自分は今回初めてScriptTOPを触ったのですが、TD <-> numpyのための前処理・後処理が必要だったので、サンプルコードのままですが以下にコードを記載しておきます。

def onCook(scriptOp):
    input_image = scriptOp.inputs[0].numpyArray()
    image = input_image * 255
    image = image.astype('uint8')
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

    # image coordinate
    # opencv's : top/left
    # TouchDesigner : bottom/left
    image = cv2.flip(image, 0)

    results = model.predict(image)
    draw_image = results[0].plot()

    draw_image = cv2.cvtColor(draw_image, cv2.COLOR_RGB2BGR)
    draw_image = cv2.flip(draw_image, 0)
    scriptOp.copyNumpyArray(draw_image)

    return

はい!
あとはYOLOを勉強して好きなことをするだけです <-- イマココ

Home - Ultralytics YOLOv8 Docs

おしまい