概要
HuggingFaceが公開しているLerobotを用いて、so‑101+ACTによるpick&placeタスクを改めて実装しました。
タスクの精度向上を目的にOAK-DのDepthデータを画像データに落とし込んで、ACTで学習をさせています。
先に結論を書いてしまいますが、上手にdepthデータを活用できず精度向上に繋げられませんでした。。。
失敗した体験談の記事になりますが、この記事が誰かの助けになれば幸いです。
参考させていただいた記事:
- SO-ARMとACTで実践する模倣学習
- ロボティクスモデルの精度向上の挑戦 〜前処理モデル追加編(深度推定による精度向上)〜
- githubにあるHuggingFace lerobotにて、depthについてのissue
環境
Linux 22.04
Lerobotバージョン:0.4.2
コミットハッシュ:75ab388ecd28537093c7989d49a36b4dbf7921a2
OAK-Dが動かせる状態(オートフォーカスのモデルを使っていました。)
Lerobotのdepthデータの取り扱いについて
- 「LeRobot の標準データセット(Hub に上げる LeRobot Dataset)として“深度画像/点群”をそのまま扱う」ことは、現時点では未対応らしい、チャッピーに教えてもらった。
ただ、参考にさせていただいた記事によるとdepthデータを画像データに置き換えてACTに渡して学習して貰えれば、いい感じになるそう(すみません、詳しく読んで言語化できていません。)
pick&placeを簡単に精度向上させたい!
- 家にdepthデータを取得できるOAK-Dが眠ってるからこれで解決や!!
depthデータを画像に変換してACTの学習・推論に使用すればうまくいくんじゃね!?
ということで、実際にdepthデータを取得して、画像データに変換して学習し、推論させたときの映像が下記です。
。
。
。
「なんか、、、微妙だね、、」
う~ん、期待通りには動いてくれませんでした。
そもそも私の勝手な思い込みで「人の目だったら距離がなんとなく分かるし、depth(深度)データを取得したら動作って良くなるんじゃね?」と思い込んでいたのが間違いでした。
今回もChatGPTに相談したら下記のように説明してもらいました。
- ChatGPT君
人間:
・距離を「固定値」として使っていない
・距離を:おおよそ 手前/奥 近い / 遠い と 曖昧に扱い、脳で勝手に補正する
Depth:
・常に数値
・常に同じ重み
・補正行動を伴わない
人間は距離だけを認識して行動しているのではなくて、空間を認識して行動しているよね。
実行したいタスクが距離に依存していれば、depthデータが活躍するね!
、、、、おっしゃるとおりですわ
取得している画像を見ててもワークに対してso-101が覆いかぶさってしまい、途中でワークを見失っていそうです。参考にさせていただいた記事でもカメラの位置が大事であることが記載されています。
また、depth情報を取得して学習させている記事でも、カメラ画角内にワークが見えているので、depthはあくまで補助的な役割だと割り切り、まずはワークをしっかりカメラ画角内に入れることが大切だと再認識しました。
そもそも、カメラで見えている情報をもとにso-101を操作したほうがより良い学習データにできるはずですが、それも怠ってデータ作ってしまっていたと思います。。。
今回得られたこと
- 失敗体験談と前段で記載しましたが、RealSenseではなくOAK-Dから取得した画像データをlerobotに組み込んだことや、学習データの作成方法のコツについて身を持って体験できたのでヨシ!としておきます。
あと、以前模倣学習を行ったときに比べてLerobotのversionも更新されており、GR00Tやπ0.5 0.6も使用できそうなので、実際に手を動かそうと思います。
LerobotでOAK-Dを使う方法について
- 需要があるなしは置いておいて、今回作成したプログラムをここに置いておきます。
リンクを作成したことを忘れて、フォルダを削除してしまう場合がありますのでご了承ください。
oakdフォルダ
so101_followerフォルダ
oakdフォルダに関しては、lerobot/src/lerobot/cameras/ の階層にコピペして貰えばいいと思います。
so101_followerフォルダに関しては、/lerobot/src/lerobot/robots/のso101_followerconfig_so101_follower.pyとso101_follower.pyを置き換えて貰えばいいかと思います(ちょっとどこ変更したか忘れました、、、適当ですみません。)
CLIを実行する際には、下記のようにコマンドが実行できます。
lerobot-record \
--robot.cameras="{ front: {type: oakd, mxid_or_name: xxx, width: 640, height: 480, fps: 30, use_depth: true}}"
mxid_or_name: xxx に関しては、下記コマンドでOAK-Dの固有番号が取得できるはずですので、それを記載してください。
python3 - << 'EOF'
import depthai as dai
for dev in dai.Device.getAllAvailableDevices():
print(dev.getMxId())
EOF
use_depth:xxx に関してはfalseにすればdepthを取得しない状態で使うことも可能です。
まとめ
- 目的にしていた模倣学習の精度向上についてはうまく行きませんでしたが、新たな知見が得られたので良かったです。
- 今度はカメラ位置を調整し、ある程度タスクの成功率が高い状態で、depthデータも含めた学習・推論を行って精度がどのように変化するか観測してみたいですね。
- 久々にso-101を触りましたが、実機が動くのは面白い!!
以上です。
また記事を上げると思うので、よかったら読んでください。
おまけ
うまく動作していることもありました。