Ebook Robotics · RL–UAV
Lecture 19 — Deep Learning cho thị giác
Chương D** · Lab 4: detect → visual servoing — perception gặp control
Chế độ Slide · phím ← → · F toàn màn · Esc về đọc · S mở slide
Chương D** · Lab 4: detect → visual servoing — perception gặp control
Chương D · Lab 4: detect → visual servoing — perception gặp control
| # | Câu hỏi | Trả lời ngắn |
|---|---|---|
| 1 | Tại sao cần? | Quy tắc tay (cạnh/threshold) yếu với đa dạng ngoại hình; cần nhận vật/người/mục tiêu/hàng chè. |
| 2 | So với cái khác? | Vs flow cổ điển: có ngữ nghĩa. Vs end-to-end RL: (A) perception cố định + RL trên feature thường ổn định hơn lúc đầu. |
| 3 | Giải quyết gì & thế nào? | Học \(f_\theta\): ảnh→bbox/mask; servoing: lệch bbox → lệnh yaw/tiến theo vòng kín. |
| 4 | Kết quả ra sao? | Pipeline realtime perception–control; encoder / bbox làm obs cho RL. |
| 5 | Nên dùng khi nào? | Tracking mục tiêu; có data/pretrained; companion đủ FPS. |
| 6 | Không nên khi nào? | Mạng quá chậm làm vỡ vòng điều khiển; domain COCO ≠ góc camera drone mà không fine-tune. |
🖼️ Hình nhanh: Detect rồi bám — lệch tâm khung → quay; bbox nhỏ → tiến.
```
ảnh t CNN/detector bbox
┌─────────┐ ──► ┌─★────┐ cx lệch phải
│ ★ │ │ mục │ → u_yaw > 0 (quay phải)
│ mục │ └──────┘ h < h_ref → u_fwd > 0
└─────────┘★ Vòng kín: ảnh → detect → lỗi hình học → lệnh → ảnh mới
(chưa phải RL — nhưng là tổ tiên perception–control)
```🇻🇳 Chuyện thật (sân A/B): Detector tìm khoảng trống luống chè (hoặc người / xe trong phố đặc) → bbox lệch tâm → yaw; bbox nhỏ → tiến — đó là visual servoing, chưa cần policy RL.
Domain COCO ≠ góc camera nghiêng trên drone: mAP cao trên laptop không cứu được nếu latency phá vòng điều khiển.
Chốt: perception có ngữ nghĩa + vòng kín hình học trước; RL chỉ cắm khi obs và tầng action đã trung thực.../00C.
Hình gốc hoặc minh họa cho ebook — không cắt từ slide Princeton. Dùng Present: bật Slide · F toàn màn.
Dạy trẻ nhận mèo bằng hàng nghìn ảnh, không bằng công thức hình học của tai mèo.
Mạng \(f_\theta(\text{ảnh})\) học biểu diễn trung gian rồi cho ra lớp, bbox, mask, hoặc depth.
Với UAV: bạn không muốn viết tay “cạnh thế này là ống PVC dưới nắng chiều”. Bạn muốn detector nói “bbox ống ở đây”, rồi vòng điều khiển giữ ống lệch tâm trong ngưỡng an toàn — hoặc policy RL nhận vector bbox thay vì 84×84 pixel thô.
Bay trên đồi chè: detector/segmenter có thể trả “mặt hàng chè còn chưa phủ” → tín hiệu coverage ngữ nghĩa hơn chỉ đếm footprint hình học (Lec 17).
\[ \theta^\star \approx \arg\min_\theta\ \mathbb{E}_{(x,y)}\big[\mathcal{L}(f_\theta(x), y)\big] \]
Tác vụ thường gặp trên robot: detection, semantic/instance segmentation, depth estimation, visual odometry / pose.
┌──────────────────────────────────────────┐
│ │
▼ │
camera ảnh ──► [CNN detect] ──► bbox (cx,cy,w,h)│
│ │
├─ u_yaw ∝ (cx − W/2) │
└─ u_fwd ∝ (h_ref − h) │
│ │
▼ │
low-level (PID/LQR) ──► drone ─┘
Ý: lệch ngang → quay; bbox nhỏ (mục tiêu xa / nhỏ trên ảnh) → tiến gần. Đây chưa phải RL — chỉ feedback trên đặc trưng thị giác. Nhưng nó dạy tích hợp perception–control theo thời gian thực.
| (A) Perception cố định + RL trên đặc trưng | (B) End-to-end ảnh → action | |
|---|---|---|
| Obs | bbox / mask / embedding đóng băng | RGB (stack) |
| Ưu | Ít sample hơn, dễ debug, latency kiểm soát được | Tiềm năng trần cao hơn |
| Nhược | Đặc trưng có thể không đủ cho task | Sim-to-real và sample cost nặng |
| Khuyến nghị lúc đầu | ★ Bắt đầu đây | Chỉ khi (A) đã rõ giới hạn |
(A) ảnh → [detector đóng băng] → z_feat → π_θ → a
(B) ảnh ──────────────────────────► π_θ → a
"""
Demo Lec19: vòng visual servoing toy từ bbox.
Giả lập mục tiêu trên ảnh; điều khiển yaw/fwd tỉ lệ; xem lỗi giảm.
"""
import numpy as np
W, H = 160, 120
h_ref = 40.0
kp_yaw, kp_fwd = 0.02, 0.05
# Trạng thái "thế giới ảnh": tâm mục tiêu và chiều cao bbox
cx, cy, h = 40.0, 60.0, 20.0 # lệch trái, còn nhỏ (xa)
history = []
for t in range(25):
err_x = cx - W / 2
err_h = h_ref - h
u_yaw = -kp_yaw * err_x # feedback âm trên lỗi ảnh: kéo cx về W/2
u_fwd = kp_fwd * err_h # bbox nhỏ → tiến
# Động học ảnh cực giản: lệnh yaw dịch cx; tiến làm h tăng
cx = np.clip(cx + 8.0 * u_yaw, 0, W)
h = np.clip(h + 6.0 * u_fwd, 5, H)
history.append((err_x, err_h, u_yaw, u_fwd))
err_x_f, err_h_f, _, _ = history[-1]
print("err_x đầu → cuối:", round(history[0][0], 1), "→", round(err_x_f, 1))
print("err_h đầu → cuối:", round(history[0][1], 1), "→", round(err_h_f, 1))
print("u_yaw,u_fwd cuối:", round(history[-1][2], 3), round(history[-1][3], 3))
print("→ Lỗi hình học giảm: đó là vòng perception–control, chưa cần RL.")
🧪 Kỳ vọng demo:
-|err_x|và|err_h|giảm rõ sau ~25 bước.
- Lệnh cuối gần 0 khi bbox gần giữa và gầnh_ref.
- Bài học: trước khi gắn RL, vòng servoing cổ điển đã phải ổn với latency giả lập.
| Thành phần | Câu hỏi paper-ready |
|---|---|
| Detector | Pretrained COCO hay fine-tune drone view? FPS? |
| Servoing / RL | Ai xuất \(u\): P-control hay \(\pi_\theta\)? |
| Fail | Mất track → hover / RTL / exploratory yaw? |
| ✅ Nên | ❌ Không nên | |
|---|---|---|
| Detection + servoing | Tracking mục tiêu rõ ràng | Thay thế toàn bộ planner khi cần né phức tạp |
| (A) feature + RL | Ít data, debug được | Feature đóng băng thiếu tín hiệu task |
| (B) end-to-end | Đã có baseline (A) rõ giới hạn | Ngày đầu nghiên cứu / companion yếu |
| Nghĩa phủ / năng lượng | Seg coverage → metric trung thực | Chạy mạng nặng làm bay lâu hơn vì phải chậm / hover chờ suy luận |
⚡ Nhớ một câu: Detect cho ngữ nghĩa; servoing đóng vòng ảnh→lệnh — RL chỉ nên ngồi lên feature khi vòng này đã thở được realtime.
🔗 Sang bài sau mang theo: Mọi \(f_\theta\) đều cần tối ưu tham số → Lec 20 về SGD / learning rate (dụng cụ chung cho CNN và deep RL).
Trước: Lec18 — Optical Flow · Sau: Lec20 — SGD