← Articles

GUITAR AI / HARD CASES / COMPUTER VISION

AIが失敗する場面ばかり集めて学習させたら、かなり改善した

モデルを変える前に、モデルが何を間違えているのかを集め直した。

Research / Development
Real 633枚とHard Case追加後のReal 1,868枚でギター画像セグメンテーション性能を比較した図

ギターを切り抜くAIを作り始めたころ、精度が足りなければ、もっと良いモデルを試せばいいと思っていました。

実際、モデル側でもいろいろ試しています。でも実際の演奏映像を見続けていると、別のことが気になってきました。

失敗する場面が、毎回だいたい同じなのでは?

手がネックに重なる。腕がボディの前を通る。長袖とギターが接触する。背景や人だけのフレームをギターだと誤認する。 きれいに写っているギターではなく、境界が曖昧になる場面で繰り返し崩れていました。

そこで今回は、平均的な画像をさらに増やすのではなく、AIが苦手な条件そのものを集めて学習データへ追加することにしました。

最初のReal Dataは633枚だった

実写の演奏環境から作った最初の学習データは633枚でした。 自分のギターを実際に持った状態を学習できるので、Synthetic Dataだけより現実の条件に近づけます。

ただし、633枚の中にすべての難しい条件が十分入っているわけではありません。 普通に写っているフレームが多ければ、モデルは普通の場面では上手くなります。 それでも、実際に使いたい動画の中で数秒おきに現れる難しい境界が弱いまま残ります。

START633Real train
+
TARGETED1,235Hard-case train
=
REAL1,868training images

ここで重要なのは、単に633枚を1,868枚へ増やしたことではありません。追加した1,235枚を、これまで失敗していた条件に寄せたことです。

「難しい画像」を先に決めるのではなく、失敗から探した

Hard Caseと言っても、「暗い画像」「ぼけた画像」のような一般的な難易度だけを決めて集めたわけではありません。 実際の推論結果を見て、モデルが崩れる条件を拾っていきました。

01手で隠れる

指や手のひらがネックへ重なり、ギター境界が途中で消える。

02腕と接触する

腕がボディ前面を横切り、肌とギターの境界が近づく。

03袖が触れる

長袖とギターが接触し、色や形だけでは分離しにくくなる。

04ギターがいない

人だけ・背景だけの場面でFalse Positiveが出る条件も確認する。

このやり方だと、Datasetを作る基準が「いろいろな写真を集める」から、「現在のモデルが間違える分布を埋める」へ変わります。

1枚ずつMaskをゼロから塗るのは重い

実写データを増やすには、画像だけでなく正解Maskも必要です。 1,000枚以上を毎回ゼロから手で塗るのは、個人開発ではかなり重い作業になります。

そこで、Mask作成にはSAM3を補助として使いました。 SAM3に候補Maskを作らせ、その結果を人が確認し、必要なところを修正してGround Truthにします。

SAM3でギターMask候補を作り、人が確認修正して教師データにする工程
SAM3の出力をそのまま教師データにはせず、候補Maskとして利用し、最後は人が確認・修正する。

この方法で追加したHard-case画像は全体で1,918枚です。 そのうち1,235枚を学習用へ入れ、683枚をHard-case validationとして分けました。

TRAIN1,235

Real633へ追加し、Real1868を作る。

HARD VAL683

学習には入れず、難しい条件での比較に使う。

Real 633 → 1,868で、Hard Case性能が大きく変わった

同じHard Val 683枚で比較すると、Real633で学習した条件と、Hard Caseを加えたReal1868ではかなり差が出ました。

Hard Val IoU0.2300 → 0.4868+0.2568
BF1@20.1874 → 0.4529+0.2655
Real633とReal1868のHard-case validation性能比較
Hard Val 683枚で、IoUは0.2300→0.4868、BF1@2は0.1874→0.4529へ改善した。

IoUだけでなくBF1@2も大きく上がっているので、 ギター領域を大まかに見つけるだけでなく、難しい条件での境界も改善しています。

この結果だけから「Hard Exampleを増やせばどんなSegmentationでも必ず改善する」とは言えません。 また、追加した各条件のうちどれが何ポイント効いたのかも、この比較だけでは分かりません。

ただ、今回のGuitar AIでは、現在の失敗条件を観察し、その条件を狙ってDatasetへ戻すというループがかなり有効でした。

モデルを複雑にする前に、Datasetを疑う価値があった

AI開発をしていると、精度が伸びないときに新しいArchitectureやLossへ目が向きます。 もちろんモデル側の改善も必要です。

でも今回のように、失敗が特定の条件へ偏っているなら、 その条件が学習データに十分存在しているかを見る方が先かもしれません。

推論する→失敗を見る→条件を集める→再学習する

Datasetを一度作って固定するのではなく、モデルの失敗を次のデータ収集指示に使うという考え方に変わったのが、今回いちばん大きな変化でした。

それでも、長袖はまだ難しい

Hard Caseを増やしても、すべて解決したわけではありません。 現在も特に難しいのが、長袖、腕、手、ギターが密着する境界です。

長袖や腕とギターの接触境界で残っているセグメンテーション失敗例
改善後にも残る失敗例。長袖・手・腕とギターが接触する条件は、引き続き重点的に見ています。

ここは今後も、失敗条件を分けながらReal Dataを追加していく必要があります。

次は、RealとSyntheticを混ぜる

第二号ではSynthetic Dataを5,000枚作り、今回はReal DataのHard Caseを増やしました。 次に試したのは、この2つをどう組み合わせるかです。

Real1868へSynthetic positive 623枚を追加した条件をSYN25と呼んでいます。 Hard Val 683では、さらにIoU 0.6249、BF1@2 0.6127まで伸びました。

ただし、Syntheticを大量に入れればいいわけではありません。 RealとSyntheticをどういう比率・役割で混ぜるかは別の問題でした。