← Articles

GUITAR AI / SYNTHETIC DATA / COMPUTER VISION

Synthetic Dataを25%だけ混ぜたら、実写のギター切り抜きがさらに良くなった

Syntheticだけでは足りなかった。でも、Realが強くなった後なら補助データとして効くかもしれない。

Research / Development
Real-onlyとSYN25の実演奏ギターセグメンテーション比較

第二号では、自分のギターからSynthetic Dataを5,000枚作りました。 でも、Syntheticだけで実際の演奏映像を完全にカバーするのは難しかった。

手がネックに重なる。腕がボディを横切る。袖がギターへ触れる。 こうした実写特有の条件は、背景合成だけでは十分に再現できません。

そこで第三号では、モデルが失敗するHard Caseを狙ってReal Dataを追加し、633枚から1,868枚まで増やしました。

Realが十分に強くなった状態なら、Syntheticは「代わり」ではなく「補助」として使えるのでは?

今回は、その考えを試した条件SYN25についてまとめます。

5,000枚全部は入れなかった

手元にはSynthetic Datasetが5,000枚あります。 ただし今回のSYN25では、その全量を学習へ追加したわけではありません。

基準となるReal Dataは1,868枚。 そこへSyntheticのPositive Sampleを623枚だけ追加しました。

REAL1,86875%
+
SYNTHETIC POSITIVE62325%
=
SYN252,491training images

623 ÷ 2,491 ≈ 25.0%なので、学習データ全体の約25%がSyntheticになる条件です。 そのため、この条件をSYN25と呼んでいます。

RealとSyntheticに、同じ役割を期待しない

この構成では、RealとSyntheticを同じ種類のデータとして考えていません。 設計上は、役割を少し分けて考えています。

REAL DATA実写の接触条件

手、腕、袖、ギターとの接触境界など、実際の演奏で起こる複雑な条件を持つ。

SYNTHETIC DATAギター側の多様性

背景、位置、角度、姿勢、スケールなどを増やしやすい。

SyntheticだけでRealを置き換えるのではなく、Realで実写の難しさを押さえた上で、Syntheticでギター側の変化を補うという考え方です。

Real633からReal1868、さらにSYN25へDatasetを増やした流れ
Real633 → Hard Caseを加えたReal1868 → Synthetic positive 623枚を加えたSYN25という流れ。

Hard Valでは、さらに伸びた

まず、第三号と同じHard-case validation 683枚で比較します。

Hard Val IoU0.4868 → 0.6249+0.1381
Hard Val BF1@20.4529 → 0.6127+0.1598

Real1868だけでも、Real633と比べればかなり改善していました。 そこへSyntheticを補助的に加えたSYN25では、Hard ValのIoUと境界指標BF1@2がさらに上がりました。

少なくとも今回の条件では、Hard Caseを集めたReal DataとSynthetic Dataは競合せず、追加した条件でさらに性能が伸びました。

難しいデータだけでなく、実際の演奏でも確認する

Hard Valだけで良くても、最終的に使いたい演奏映像で悪化してしまえば意味がありません。 そこで、正式なFinal Playing corrected180でもReal-onlyとSYN25を比較しました。

Final Playing corrected180におけるReal-onlyとSYN25の比較
正式なFinal Playing corrected180でReal-onlyとSYN25を比較。SYN25ではギター領域と境界の両方が改善した。
MetricReal-onlySYN25Δ
IoU0.78520.8322+0.0470
Dice0.87820.9071+0.0289
Precision0.89590.8960+0.0001
Recall0.86770.9219+0.0542
BF1@20.78070.8425+0.0618

IoU、Dice、Recall、BF1@2はいずれも改善しました。 一方でPrecisionは0.8959 → 0.8960とほぼ変わっていません。

少なくともこのcorrected180では、False Positiveを大きく増やさず、取りこぼしを減らした方向の改善が見えます。 Recallが0.8677から0.9219へ上がったことが、その傾向をよく表しています。

「Syntheticは駄目」ではなく、使う順番の問題だった

Synthetic Dataを最初に作ったときは、実写とのDomain Gapがかなり気になりました。 人がギターを持つ、手が重なる、服が触れる、といった条件は背景合成だけでは足りません。

そのため、Syntheticを増やせばそれだけで実演奏が解ける、という見方はしなくなりました。

Syntheticを作る→実写で失敗する→Real Hard Caseを増やす→Syntheticを補助で戻す

今回うまくいったのは、まずReal側で実写特有の問題を学習させ、その後にSyntheticを補助として混ぜた構成です。

これは「Synthetic Dataを作った5,000枚が無駄ではなかった」という意味でもありました。 最初の主役にはなれなくても、Real Dataが整った後に別の役割で使える可能性があります。

まだ残っている失敗はある

SYN25でもすべてのフレームを完全に切り抜けるわけではありません。 長袖、手、腕、ギターが密着する境界は引き続き難しい条件です。

SYN25でも残る長袖や腕とギターの接触境界の失敗例
現在も残る難しい条件。長袖、手、腕、ギターの接触境界は引き続き改善対象。

ここから先は、さらにReal Dataを増やすのか、モデル側を変えるのか、 あるいは両方をどう組み合わせるかを切り分けていく必要があります。

ここまでで、Datasetの作り方が一周した

最初は「データが足りないからSyntheticを大量に作る」から始まりました。 その後、実写で失敗し、Hard Caseを集め、最後にSyntheticを補助として戻しました。

Datasetは、一度作って終わるものではありませんでした。 実際の失敗を見ながら、RealとSyntheticの役割を変えていく。 今回の一連の実験で、そこがかなりはっきりしました。