masato-ka's diary

日々思ったこととか、やったことの備忘録。

Action Chunking Transformerのピッキング位置に対する汎化能力の検証

1. この記事について

ACTを使用した模倣学習では学習データと違った状況にどれだけ対応させられるかは、実用的なタスクや使用を行う場合に重要になります。例えばピッキングでは学習時のデータには現れない対象部の位置でもうまくピッキングが可能になるかが重要になります。

以下のポストはACTを位置や対象物の形状に対して上述のような汎化をさせたと主張しています。

この記事ではACTのピッキング位置に対する汎化性能について検証します。具体的にはブロックのピック&プレースタスクのピッキング位置が、学習データに現れない位置だった場合でもピッキングできることを確認します。

2. 検証概要

この検証では、モデルの汎化性能を未知の位置でのピッキングに対するロバスト性として測定します。具体的には、学習データでは指定した位置で物体をピッキングさせ、評価時にはその位置に含まれない場所でのピッキング性能を確認します。検証方法については後述します。

過去の経験から、従来のデータ収集では学習時以外の位置での性能向上が見込めないと感じていました。そのため、汎化能力を高めるための戦略を検討しています。前記のポストではいくつかの対策を施していますが、今回はデータの取得方法とACTモデルのデコーダー層に焦点を当てます。

まず、1つの位置について10エピソードを厳格に収集します。また、ACTのデコーダ層数が1層のモデルと7層のモデルを比較します。データの品質向上が課題と考えられまた、ACTモデルはパラメーターサイズが小さく、過学習の可能性もあるためです。

参考として前述のXポストに記載されていたACTの汎化に対して実施した内容をまとめます。

▼ 元ポストで実施された内容

1.100episode 10episod/position->採用

テーブル上にマーカーをつけ、各ポジションで10エピソードずつピッキングのデータを記録し、合計で100エピソードのデータセットを作成しています。LeRobotの公式においてもピッキングの際は1箇所に付き10episode程度データをとることが推奨されています。

2.Decoderを7層に変更->採用

ACTの論文ではDecoder層は7層であると指定されていますが、オリジナル実装にはバグがあり最初の1層のみ利用するようになっています。それに倣いLeRobotのDecoder実装はデフォルトを1層としています。ACTの論文に合わせるため、LeRobotのACTConfigクラスの設定を書き換え、Decoder層を7層へ変更しました。

3.リーダーアームからデータを取得

ACTの論文ではエキスパートデータを収集する際はリーダーアームの値をとることになっています。その理由はフォロワーアーム側のエンコーダ値には外乱や重力などの影響を受けた値になりデモンストレーション時の入力値と乖離しするためです。しかし、LeRobotではフォトワーアーム側のエンコーダ値をデータとして記録します。こちらもリーダーアームのあたいを使うように変更されました。 SO-ARM10xの場合、誤差がそこまで大きならないと考え今回は省略

4.Temporaly assenbleを有効化

ACTにはTemporaly assembleというアクションチャンクの加重平均をアクションに採用する手法が取られています。LeRobotでは無効化されているため、有効化して実験しています。 ピッキング位置の汎化に対して大きく影響するか不明なため、今回は省略

5.照明はコンスタントになるよう人工光を設定

データに対する外乱を低減させるために、室内照明などの人工光で作業を実施しています。 今回の実験環境でも外光が入らない環境で実施しました。

6.データ拡張を実施(詳細不明、カラージッター?)

具体的にどういったデータ拡張を施しているのかわかりませんが、おそらく、LeRobotの標準で用意されているデータ拡張を有効化して利用していると読み取れます。

7.画像のリサイズ処理を前処理で全部やってしまう。(学習速度の向上に寄与)

画像サイズを前処理で小さくすることで学習速度の向上を実施したと記載があります。

3. 検証方法

収集したデータセットを用いて、デコーダー1層と7層の2モデルを作成し、ピッキング精度を実機で評価しました。9ヶ所の学習データ取得位置に加え、学習データに含まれない16箇所でも評価し、成功率をヒートマップで可視化して空間パターンを分析しています。

▼検証条件

検証条件は以下のとおりです。

  1. 学習データ数: 90エピソード(10episode/position x 9箇所)
  2. 学習モデル: ACT(LeRobot実装) Decoder 1層と7層を比較
  3. 学習ステップ数: 10万step
  4. その他ハイパーパラメータ: LeRobot標準値を採用
  5. カメラ
    1. フロントカメラ 640x480@2MP
    2. リストカメラ 640x480@2MP

▼検証環境

検証環境は、前方から俯瞰で撮影するフロントカメラと、グリッパ先端を撮影するリストカメラの2台を使用しました。ピッキング対象は3cm3の青いEVAブロックで、ロボットはこれをピッキングして左手の青いカップに入れます。

学習データ用のピッキングポジションにはテープで目印をつけました。この目印はロボット設置位置を中央として左右に10cm、縦に7.5cmの間隔の設定です。

▼学習データと取得方法

今回取得した学習データはHuggingFaceへ公開されています(masato-ka/SO100_evaluate_generalize_pick_pos )。90エピソード取得しました。

テーブル上の白テープで示された学習データ取得位置に、ロボットの正面左上から順にL1からL9と名付けました。それぞれの位置で10回のエピソードにわたり、ブロックの姿勢を変えながらロボットの動作データを収集しました。ブロックの姿勢には、正面を向く「並行姿勢」、傾きを持つ「傾き姿勢」、ロボットに対して角を向ける「対角姿勢」の3種類があり、傾き姿勢は左右の2パターンがあるため、合計4つの姿勢となります。

training_data_position.jpeg

▼モデルの学習

模倣学習モデルにはAction Chunking Transformerを使用し、LeRobotの実装を利用しました。Decoderレイヤー以外はデフォルト設定を適用し、Decoderレイヤーを1層と7層の2種類のモデルで学習しました。学習はGoogle ColaboratoryのA100 GPUを用いて、いずれも10万ステップ行いました。

◽️Decoder Layer 1 100k steps

Image.png

Image.png

◽️Decoder Layer 7 100k steps

Image.png

Image.png

モデルの評価

モデルの汎化性を確認するため、学習データに含まれていないピッキング位置で評価を行います。使用する評価位置は1から16までナンバリングされ、学習時の位置の間に設定しています。合計25箇所で評価し、各位置でブロックの姿勢を「並行」「傾き(左向き)」「対角」の3種類に変え、各姿勢で1回ずつ試行します。したがって、1モデルにつき25箇所×3姿勢=75試行を実施します。

ピッキング動作は、ロボットがテーブル上でグリッパを開閉する一連の流れと定義し、3回以内の試行で成功すれば成功、3回以上かかるかピックできなければ失敗とします。試行中に対象物が移動しても手動での修正は行わず、成功時には何回目の動作で成功したかも記録します。

ACT汎化精度実験手順.heic

4. 評価結果

今回の実験設定では1層モデルと7層モデルではピッキング精度に優位な差は見らませんでした。成功数の絶対値は1層モデルの方が大きです。

advanced_statistical_analysis.png

次にタスクが成功しやすい位置の偏りがあるか調べるため、タスク成功率をヒートマップとして可視化しました。Decoder 1層のモデルの結果は全体的に満遍なくピッキングできていますが、画像中央上の学習データに含まれていない位置では成功率が落ちています。

redframe_comparison_10k_act_standard.jpeg

Decoder 7層モデルは1層モデルが苦手とした画像中央上の位置での成功率が改善していますが、画像下方、画像右下での成功率が低くなります。

redframe_comparison_10k_7L_act_standard.jpeg

また、両モデルともフロントカメラの真下での成功率が落ちていますが、カメラマウントなどが影響して成功率が落ちている可能性が考えられます。

5. 考察

ピッキングタスクの設定ではDecoder 1層と7層モデルではピッキング成功率に優位な差はみされませんでした。一方、同一の学習データを使用しているにもかかわらずDecoderの層数の違いにより、ピッキングが失敗しやすい位置が変わっていることがわかります。結果は省略しますがDecoder 7層モデルで8万ステップ学習させたモデルを検証しましたが、位置に対する成功率の傾向は変化しませんでした。

1層モデルに着目すると、ある程度学習データ外の位置に対しても成功率が確保されていることが伺えますが、やはり学習データに含まれている位置よりは成功率が全体に低くなります。

単純なピッキングタスクにおいてはACTのDecoder層は1層でも問題なく性能を発揮します。また十分な量のデータを取得することで学習データ近傍の位置に対してある程度の汎化性能を確保しますが、学習データと同一の位置よりも成功率は低下します。

ピッキングタスクの設定では、Decoderの1層と7層モデル間に成功率の優位な差は見られませんでした。ただし、層数の違いによりピッキングが失敗しやすい位置が変化しました。7層モデルを8万ステップ学習させた結果、成功率の傾向は変わりませんでした。1層モデルでは、学習データ外の位置に対しても一定の成功率がありましたが、学習データ内の位置よりは低下しました。単純なピッキングタスクでは、1層のDecoderでも高い性能を発揮します。十分なデータを取得すれば、学習データ近傍でのピッキング性能は確保できますが、学習データと同一の位置での成功率と比較すると下がるようです。

▼性能改善に向けて

ピッキングの成功率は、十分なデータ量を確保することで向上しますが、学習データ外の位置での成功率は低下します。全体的に、タスクの成功率を向上させる方法を検討します。

方法1. 追加データの学習

最も有望だと思われるのでは、ピッキング成功率が低い箇所で追加データを取得し、元のデータと合わせて再学習する法です。学習位置の「密度」をあげることでピッキング能な領域のカバー率を上げていくという考え方です。

この場合、元の学習データにデータを合わせて再学習する必要があります。ために差分のデータを用いて、学習済みのモデルにFine-Tuningしただけでは破滅的な忘却が発生しました。

方法2. ACTのパラメーターチューニング

今回の検証でもデータセットの動きにかなりフィットした、過学習のような挙動を観測する場合がありました。学習データにフィットしすぎることで学習外の状況にうまく対応できていない可能性があります。Decoder層の値だけでなく、バッチサイズを増やす、ステップ数を見直すなど、ACTのハイパーパラメータ自体も調整が必要かもしれません。

方法3. SmolVLAなどの他のモデルの使用

ACT以外のモデ流を使うことで性能が向上することが期待できます。SmolVLAやDiffusionPolicyなどのモデルの利用も今後検討してみます。