YOLOとの格闘の一か月…

この1か月、物体検出に定評のあるYOLOと格闘しています。
以前から、AIへの取組として色々やっていましたが、物体検出分野のYOLOを本格的に取組むことにしました。

YOLOの書籍は、案外少ない気がします。Amazon Kindle unLimitedで読める書籍で「YOLO開発入門」「YOLO物体追跡入門」を読んでいましたので、入門知識はハンズオンで学んでいました。
さらに、Udemyの講座で、「 「「「【YOLOv8】 ディープラーニングによる初めての物体検出」、「AI開発のナビゲータ 物体検知AI編」あたりを学んだりしていました。

しかし、あくまで勉強の域を超えていません。実際の開発が具体化しないと、中々身にはつきません。

そんな折、「ある特定の物体の状態を把握する」(具体的には書けませんが)ことが必要な仕事の話があり、物体検出を実践するチャンス!と思い、この1か月、実際にどんな感じで実現できるかのパイロット実験を行う事にしました。

もちろん、仕事を受注したわけでもありませんが、TanaKafeWorksの仕事のスタイルは、具体化までにパイロット実験を行い、実現可能性などを評価したうえで、お客様とは、本当に仕事として行うかどうか、相談させてもらっています。
当然、パイロット実験は、TanaKafeWorks負担です。これはある意味小さな会社のリスクヘッジともいえるスタイルです。定年退職後に立ち上げた個人事業なので、引き受けきれないリスクへのヘッジをしながら、お客様のリスクの軽減のWin/Winの開発スタイルです。

特定の物体検出に必用なこと…

一般的な物体が対象であれば、既に学習済のモデルを使うことで、結構物体検出できてしまいます。
しかし、特定の物体、しかも状態を検出することが求められる場合、やはりモデルの学習が必要です。

とまあ、理屈は簡単ですが、実際にモデルを学習させるために、データとなる画像や動画、それに対応したアノテーションデータを準備する必要があります。
そうだろうなとは思いつつ、どうやればいいのか、AI初心者の私でも、手探り状態から一応できたのので、その流れを書いてみます。

Step1:画像を集めましょう

とにかく対象になるような画像を集めてみました。本格的な仕事としてではないので、類似したような画像をネットを集めてみました。
とはいえ、今後、アノテーションを行う事を考えると、多すぎても大変なので、とりあえず50枚くらい集めました。

この時点では、アノテーション作業をやったことがないので、その手間は全く知識なしでした。

Step2:アノテーションはどうやって行うの?

いざ、アノテーションを行うには、どうやれば良いか?ネットで調べてみると、Roboflowという便利な環境を見つけました。
このツールは、画像やアノテーション結果を公開上におくことができるのなら、無料で利用できそうです。

しかし、今回はネットで探してきた適当な画像での練習ですし、その後仕事になった時の実際の画像を考えると、公開におくことは難しいのが現実です。

そのため、ツールは、ローカル環境で使えるツールを探すことにしました。
Microsoftが、以前オープンソースでVoTTというツールを公開していました。
今でも公開されていますが、既にメンテナンスが終わっていて、動かすには、いろいろ面倒なことがあり、私の環境ではうまく動かすために、結構時間がかかりそうでした。

ということで、格闘する時間をお金で買うという選択をし、「LabelMe」というツールを購入し、アノテーション情報を、ローカル環境で作成することにしました。
ちなみに、MacでもWindowsでも、Linux(intel)でも使えます。
Mac版で、ツールに不具合がありましたが、サポートへコンタクトすると、直ぐに修正してもらいました。
安心のサポートです。

アノテーションツールは、使って慣れるが一番です。
色々思考錯誤しながら、だいたいの使い方を理解したら、YOLOのどういうモデルのためのアノテーションを作成するかを考えることが必要です。

Step3:YOLOで学習するために

アノテーションツールでは、Polygon,Rectangle,Circle,Line,Point,LineStrip,AI-Polygon,AI-Maskなどで、アノテーションができます。

しかし、YOLOのモデルで、どのような情報をアノテーションとして学習させるを、利用対象に合わせて検討が必要です。

物体をBOXで検出する場合、Rectangleになります。
物体の形を検出する場合、Polygonや、AI-Maskなどを使う事になります。
物体のポーズを検出する場合、RectangleとPointを組合わせることがよさそうです。

このようなアノテーションは、LabelMeのデータ保存形式であるJsonを、YOLOの形式に変換するツールは、今後提供が予定されていますが、MacやWindowsのバイナリ版では、まだ利用できないので、変換は、ChatGPTのコードを作成してもらいました。

アノテーションを行うと、json形式をYOLO txt形式へ変換をpythonで行いました。
ついでに、この変換結果を元に、dataset.yamlに、YOLOのアノテーション情報の基本ファイルも生成します。

Step4:YOLOモデルのtrain

学習データが準備できたら、早速、YOLOモデルの学習を行います。

pythonコードは、非常に単純で、ネットで検索すると簡単に見つけられます。
そのコードを、自分に最適な環境で実行しモデルを作成します。

私は、アノテーションは、ローカルでおこなっていますが、リソースの都合上、YOLOの実行は、Google Colaboratory A100 GPU環境で行いました。

50枚の画像を100エポックも、数分で終わります。

Step5:作成したモデルで実際の対象を検出してみる

出来上がった、モデルを、実行環境(今回はMac)で実行できました。

検出結果を、まずは目視できるように、save=True指定を行うと、元画像に、検出情報が書き込まれた画像が作られます。

大体検出できていました。若干対象の箇所のずれはありますが、50枚程度の学習なので、今後100枚とか500枚とかで精度が上がれば良いでしょう。

実際には、アプリで、この検出結果を数値として利用する必要があるので、物体の検出するポイントの座標を取出し、必要な計算を行うコードを追加作成し、後処理コードとして追加しておきます。

この後処理コードで出力した数値が、実態に合っているかを確認しましょう。

複数枚の画像で、実行してみた結果、大体いけそうなことを確認できました。

若干、改善すべき点なども見えたりしますので、ここまでくれば、核心部分としては良さそうです。

最後に…

具体的なコードを書きませんでしたが、ざっとこんな流れで、YOLOを使い、物体の状態の検出から、その得られた数値を元に、アプリで行うべき処理へ繋げられることの、実装作業ステップを確認できました。

実際には、検出精度を上げつための工夫や、条件を明確にすることが必要ですが、そんためには、クラウドのアノテーションツールの有料版で行うことも含めて、作業のための選択肢が明確になったというところです。

思った以上に、初心者でも実装できそうなことは、非常に驚きがあると感じました。