---
# System prepended metadata

title: '[研究日誌0311] Imitation Learning 模仿學習DAY1'
tags: [研究日誌]

---

# [研究日誌] Imitation Learning 模仿學習DAY1


# 前言
2025/03/11（二）11：36
上週測試完Isaaclab的基本範例程式後，進行Imaitation learning(IL)的程式運行，目前理解IL是RL下的一種分支，其目的在於透過模仿學習到正確的夾取方式，比起RL架構下的自由搜索，更直接的給予一種優解輔助學習，讓RL訓練速度有效提昇。故本篇嘗試運行IL範例程式，紀錄可能遇到的問題及運行結果紀錄。
* 網址支援
https://isaac-sim.github.io/IsaacLab/main/source/overview/teleop_imitation.html

# Imaitation Learning(IL)理解

### 模仿學習（Imitation Learning）概念
模仿學習（Imitation Learning, IL）是一種機器學習方法，讓 AI 模型透過學習「專家行為數據」來學習策略，而不是透過強化學習（Reinforcement Learning, RL）自己探索環境。

在機器人控制、自駕車 等應用中，模仿學習被廣泛使用，因為它能夠比 RL 更快學習適合的行為，避免強化學習初期隨機探索時的低效率。
      ![image](https://hackmd.io/_uploads/HkjvSOCikg.png)

### 模仿學習的基本流程：
1.收集專家數據（Expert Demonstrations）

    來自人類操控（如 VR 控制機械手臂）。
    來自已有的最佳控制器（如 PID 控制）。
    來自強化學習訓練過的 Agent。

2.訓練代理人（Agent）學習專家行為 

    透過監督學習（Supervised Learning）讓 AI 學會複製專家的決策。

3.策略部署與微調

    讓 Agent 在環境中測試，並進一步使用強化學習來微調行為（如果需要）。
------------------------
    
### 模仿學習的主要方法：
**1.行為克隆（Behavior Cloning, BC）**

📌 原理：把模仿學習當作 監督學習，讓 AI 學會模仿專家。

    類似影像分類的方式，用 (觀察, 行動) 配對數據 訓練神經網路。
    不需要環境回饋 (Reward)，只要有大量示範數據。
    
**2. 逆向強化學習（Inverse Reinforcement Learning, IRL）**

📌 原理：學習「專家是如何決策的」而不是直接模仿行動。

    強化學習是用 Reward 來學習策略，但 IRL 是用 專家的行為來學習 Reward 函數。
    適合複雜場景，因為專家行為可能會根據隱藏的策略改變。

**3. DAGGER（Dataset Aggregation, 交互式數據收集）**

📌 原理：混合行為克隆與專家指導，讓 AI 在訓練過程中持續更新數據集。

    傳統行為克隆 無法應對新環境變化，但 DAGGER 讓專家在訓練中持續提供指導。
    解決行為克隆過擬合的問題，適合機械手臂、自駕車等應用。

-----------------------------------
# 跑Imaitation Learning(IL)範例程式
task Isaac-Stack-Cube-Franka 紅藍綠三方塊的夾取堆疊任務，任務目標為操控手臂（Spacemouse、keyboard or joystick)這裡選擇鍵盤來操控手臂，由下到上分別為藍色、紅色、綠色為順序堆疊，前面提到我需要親自操控一次來提供手臂夾取的成功案例，因此第一步驟需要演示成功的步驟並儲存成dataset.hdf5檔案。

## Collecting demonstrations

```
# step a: create folder for datasets
mkdir -p datasets
# step b: collect data with a selected teleoperation device. Replace <teleop_device> with your preferred input device.
# Available options: spacemouse, keyboard
./isaaclab.sh -p scripts/tools/record_demos.py --task Isaac-Stack-Cube-Franka-IK-Rel-v0 --teleop_device <teleop_device> --dataset_file ./datasets/dataset.hdf5 --num_demos 10
# step a: replay the collected dataset
./isaaclab.sh -p scripts/tools/replay_demos.py --task Isaac-Stack-Cube-Franka-IK-Rel-v0 --dataset_file ./datasets/dataset.hdf5
```
### 1. 創建數據集資料夾

```
mkdir -p datasets 
```
創建一個 datasets/ 目錄，用來儲存收集到的專家數據。如果資料夾已存在，則不會報錯。

### 2. 收集專家數據

```
./isaaclab.sh -p scripts/tools/record_demos.py --task Isaac-Stack-Cube-Franka-IK-Rel-v0 --teleop_device <teleop_device> --dataset_file ./datasets/dataset.hdf5 --num_demos 10
```
    執行 record_demos.py → 這是一個 錄製專家示範 的腳本。
    --task → 訓練的機械手臂任務（Isaac-Stack-Cube-Franka-IK-Rel-v0）。
    --teleop_device <teleop_device> → 設定專家控制方式：
        spacemouse：使用 SpaceMouse 進行機械手臂控制。
        keyboard：使用鍵盤來控制機械手臂。
    --dataset_file ./datasets/dataset.hdf5 → 把專家示範儲存成 HDF5 格式的數據集。
    --num_demos 10 → 收集 10 個示範數據。

✅ 這條指令的用途：

    讓專家手動控制機械手臂，讓它學習如何 堆疊方塊。
    所有的觀察 (state)、行動 (action) 會被儲存到 dataset.hdf5。
    這是 模仿學習 (Imitation Learning, IL) 的第一步。

### 3. 重播已收集的數據

```
./isaaclab.sh -p scripts/tools/replay_demos.py --task Isaac-Stack-Cube-Franka-IK-Rel-v0 --dataset_file ./datasets/dataset.hdf5
```
    執行 replay_demos.py → 這是一個 回放已記錄示範 的腳本。
    --task → 測試 Isaac-Stack-Cube-Franka-IK-Rel-v0 任務。
    --dataset_file ./datasets/dataset.hdf5 → 載入之前錄製的數據，讓 AI 嘗試執行相同的行為。

✅ 這條指令的用途：

    回放剛剛收集的數據，看看機械手臂是否能模仿專家行為。
    如果回放時的行為 與示範數據一致，代表收集的數據是 有效的。
    
# 數據展示

官方建議的理想數據是
1.保持路線簡短（意味著政策決策越少），從而使訓練變得越容易。

2.不要沿著任意的軸線前進，而是直接朝著目標前進。

3.不要停頓，執行平滑、連續的動作。

**但是鍵盤操作上會有限制，因此造成數據蒐集的困難，等訂購的SpaceMouse控制器到貨在看是否能有效解決此問題。為避免無效率的資料，我這邊最終使用官方提供的dataset1.hdf5來進行下一步訓練**

## Generating additional demonstrations

Isaac Lab Mimic 是 NVIDIA Isaac Lab 內的一個 模仿學習 (Imitation Learning, IL) 模組，主要用來 讓機械手臂模仿人類示範的行為，並訓練出高效能的控制策略。
其流程為：
**1. 收集示範數據** 上述資料蒐集已提到

```
./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/record_demos.py --task Isaac-Stack-Cube-Franka-IK-Rel-Mimic-v0 --teleop_device keyboard --dataset_file ./datasets/dataset.hdf5 --num_demos 10
```
**2. 標註示範數據** 自動或手動標記數據，使 AI 能夠區分不同的動作類型（如抓取、移動、放置）。
```
./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/annotate_demos.py --input_file ./datasets/dataset.hdf5 --output_file ./datasets/annotated_dataset.hdf5 --task Isaac-Stack-Cube-Franka-IK-Rel-Mimic-v0 --auto
```
**3. 訓練 AI 模仿學習模型** 標註後使用行為克隆 (BC, Behavior Cloning) 訓練 AI，讓它學習模仿你的示範
```
./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/train_bc.py --task Isaac-Stack-Cube-Franka-IK-Rel-Mimic-v0 --dataset_file ./datasets/annotated_dataset.hdf5
```
**4. 測試 AI 是否學會模仿**
```
./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/play.py --task Isaac-Stack-Cube-Franka-IK-Rel-Mimic-v0 --num_envs 1 --load_checkpoint ./datasets/trained_model.pt
```

---------------------------------
# 驗證結果展示

1.先行生成10次成功案例（generated_dataset_small.hdf5），測試成功率，若滿意再進行大規模生成。

2.使用 Isaac Lab Mimic 產生一些額外的示範，生成成功100次的generated_dataset_large.hdf5

> 

3.此範例中使用Robomimic實現的 BC 代理來訓練策略。可以使用任何其他框架或訓練方法。

```
./isaaclab.sh -p scripts/imitation_learning/robomimic/train.py --task Isaac-Stack-Cube-Franka-IK-Rel-v0 --algo bc --dataset ./datasets/generated_dataset.hdf5
```
預設情況下，訓練腳本將每 100 個 epoch 儲存一個模型檢查點。訓練好的模型和日誌會保存到 logs/robomimic/Isaac-Stack-Cube-Franka-IK-Rel-v0/bc

## 結果
透過使用生成的模型進行推理，我們可以在相同的環境中視覺化策略的結果：

```
./isaaclab.sh -p scripts/imitation_learning/robomimic/play.py --task Isaac-Stack-Cube-Franka-IK-Rel-v0 --num_rollouts 50 --checkpoint /PATH/TO/desired_model_checkpoint.pth
```
放成果展示影片（還無法放影片展示抱歉）

![1741662638886](https://hackmd.io/_uploads/HJxpIORjJe.png)
--------------------------------

# 小結

本日（3/11）進行IL的範例實做，透過imiatation learning學習專家行為並檢視是否能效率學習夾取堆疊動作。

紀錄一些問題
- [x] 1.目前沒有Reward，成功率接近50％，可能是專家行為不足導致，增加獎勵來使成功率上升，是否是DAGGER?（先讓RL探索，在修改）

> 以50％的成功率再次訓練BC，讓它跑完最終model_final，結果請看3/12日誌

- [ ] 2.* 錯誤訊息 ModuleNotFoundError: No module named 'omni.kit' 表示 Isaac Sim 的 Python 模組尚未安裝 或 未正確載入。
* 檢視訓練成果的loss，加入reward並實時檢視訓練結果
* 了解模仿學習背後的機制，好後續做修改使用。

> 目前沒有使用到python做修改，先放置

- [x] 3.可視化結果最終結果時發生閃退，待解
./isaaclab.sh -p scripts/imitation_learning/robomimic/play.py --task Isaac-Stack-Cube-Franka-IK-Rel-v0 --num_rollouts 10 --checkpoint /home/q500/IsaacLab/logs/robomimic/model_epoch_300.pth

> 這原因是沒有指到絕對路徑（解決）

明日繼續。

-----------------------------------------
參考資料：
https://blog.csdn.net/cf2SudS8x8F0v/article/details/103077409
### 
### **下一篇 [研究日誌] Imitation Learning 模仿學習DAY2**
https://hackmd.io/Y7hkczi-TI6KZdQ4jTYdMQ