Last updated on

YOLOv8の衝撃!!


アプリを作ったけど収益化はできなかった

WoLNamesBlackedOutというFF14の動画からユーザ名を隠すアプリを作ってみたものの、処理が遅く困っていました。

元々はこの仕組みで収益化ができないかとも考えていて、使っていたPythonのライブラリもできるだけApacheライセンスやMITライセンスのものを中心に利用していました。
いろいろ情報を集めて、試行錯誤しながら作ってみたのですが、使っているライブラリの下位にGPLライセンスやBSDライセンスのものがあったり、そもそもウェブサービスではなくwindowsのアプリだとお金を取れるほど私の技術力がないこともあって、やっぱりフリーかなー?と思いフリーにしたのですが。

 

Ultralytics YOLOv8を使ってみた!

フリーなら、小難しい物体検出フレームワークやモデルを使わなくても、YOLOv8を使ってもいいんじゃない?
YOLOでも以前のバージョンでは小さい物体は不得意だったらしいけど、YOLOv8は対応できるようになったらしいし、アプリに使うかどうかはともかく、とりあえず一度試してみよう!
という感じで軽い気持ちで使ってみたのですが・・・

 

Ultralytics YOLOv8、マジですごい!

プログラミングらしいプログラミングがいらない!

例えば学習をさせる時のコードは、

from ultralytics import YOLO

model = YOLO('yolov8n.pt')

if __name__ == "__main__":
    results = model.train(data='yolo_train.yaml', epochs=100)
    results = model.val()

これだけ。
あとは実行さえすれば、下の図みたいにライブラリが良い感じで学習を進めてくれる。

yolo_train.yamlも内容はなくて、アノテーションした画像へのパスくらいしか書いてない。

path: /coco_converted  # dataset root dir
train: images/train2017  # train images (relative to 'path') 4 images
val: images/val2017  # val images (relative to 'path') 4 images
test:  # test images (optional)
# Classes (80 COCO classes)
names:
  0: pc_name

YOLOv8は、アノテーションはYOLO形式でのデータ読み取りをするみたいですが、既にあったcoco形式のアノテーションをライブラリについていたユーティリティで変換できて、2行で変換できてしまう

from ultralytics.data.converter import convert_coco
convert_coco(labels_dir="\\datasets\\coco\\annotations")

じゃあ、学習結果を使うのは、というと、これも何もなくて、これだけ。
物体検出する対象は画像はもちろん、いきなり動画のmp4を渡しても、1フレームずつ物体検出し、AVIファイルにして返してくれる。
動画はファイルだけじゃなくて、youtubeのアドレスでもいいらしい。すげぇ・・・
プログラミングなんていらんかったんや\(^o^)/

from ultralytics import YOLO
model = YOLO("runs\\detect\\train26\\weights\\best.pt")
source = "d:\\My Documents\\My Videos\\Final Fantasy Xiv  A Realm Reborn 2024.06.02 - 17.29.52.09.Dvr(1).mp4"
results = model(source, save=True)

 

圧倒的な学習速度と、実行速度!

これまでMMDetectionでは、30分~丸一日くらいつかって学習させ、学習結果を使う時は、3~4FPSでゆっくり処理されていたのですが・・・
YOLOv8では、同じようなアノテーションデータを使っても10EPOCHも学習させたら十分に使える重みになっていて、時間にしたら5分くらいでほぼ完成状態!
学習結果を使って動画から物体検出をさせてみると、何の工夫もなしに13FPSくらいで動いてしまう!
当初は、TensorRTにすることで高速な処理になると思っていたのですが、Windowsでは事前compileに対応してないせいか、YOLOv8でのTensorRT化を使うと、逆に遅くなってしまいました。ライブラリの内部で既にtorch-tensorrtが使われているのかも?

上の雑な4行のコードだけで、YOLOv8が良い感じに処理してくれて、しかも学習も実行も速いなんて!

 

圧倒的な物体検出の精度!

MMDetectionでYOLOXやRTMDetを使ったときには、画像上で明らかに見えているようなものを、検出できないようなことがありました。またさっきまで検出していたものをポロリと検出できないこともあり、チラチラと検出が漏れたりすることがありました。
同じ系統であるYOLOv8なので、レスポンスは良くても精度はYOLOXと同じなのではー?

と思いましたが、これが精度も良いんです!
ちゃんと検出してくれる!

 

商売にしないと良いものはできない

YOLOv8は、AGPLのライセンスに乗っ取ってオープンソース、個人開発であれば無償で利用ができますが、オープンソースにせずに商用利用する場合にはライセンス料を支払う必要があります。ライセンス料さえ払えば商用利用もできますし、AGPLのコピーレフトも不要になります。
ただその分、Ultralytics社で研究開発を積み重ねてきたライブラリが利用でき、短い開発期間ですぐに実際の効果を出すことができそうです。
ゲームエンジンのように、コンピュータビジョンのエンジンとして商売しているだけあって、ド素人でもすぐに最先端の物体検出が実現できます。

やっぱり資本主義に揉まれて商売にできるものでないと、良いものはできないんだなー、お金は出すときは出さないといけないなー、と体感しました。
ほんと、これまでの苦労は一体何だったのか、と感じました。

オープンソースというほど現状ではオープンソースにしてないですが、WoLNamesBlackedOutへのYOLOv8の適用もたぶん問題ないと思います。
もう少し調べてから、適用できればと考えています。