MODULE 4 — Computer Vision và Learning (Lecture 17–23)

Bản ôn nhanh theo module

MODULE 4 — Computer Vision và Learning (Lecture 17–23)

📚 Học sâu: Lectures/ Lec17–23. File này = ôn nhanh.

pixel ──► pinhole/GSD ──► flow ──► detect ──► CNN ──► RL đúng tầng ↑ độ phủ đồi chè gắn h & sidelap ở đây (Lec 17)

Mục tiêu module.
Biến lưới điểm ảnh thành tín hiệu hữu ích cho điều khiển / lập kế hoạch / RL; kết thúc bằng Lecture 23 — đặt Reinforcement Learning đúng chỗ trong stack robotics (giả định bạn đã vững RL, nên trọng tâm là cầu nối, không phải giáo trình RL từ đầu).

Luồng module:

Lec 17  Camera & hình học ảnh
Lec 18  Optical flow (tín hiệu chuyển động trên ảnh)
Lec 19  Deep learning cho vision (nhận vật / bbox)
Lec 20  SGD (tối ưu thực dụng)
Lec 21  Overfitting & regularization (+ domain gap)
Lec 22  CNN
Lec 23  RL trong ngữ cảnh robotics / UAV

Nếu bạn đã vững deep learning: đọc nhanh Lec 19–22, không bỏ Lec 17–18 và Lec 23.


Lecture 17 — Nhập môn thị giác robot

0. Mục tiêu học

Hiểu camera cho dữ liệu gì; nắm mô hình pinhole và sự mất chiều sâu; phân biệt intrinsic / extrinsic.

1. Câu hỏi trung tâm

Camera cung cấp gì, và làm sao biến ma trận cường độ sáng thành thông tin hình học hoặc ngữ nghĩa?

2. Trực giác

Camera không trả về “ống PVC” hay “lối đi trống”. Nó chỉ trả về một bảng số — cường độ sáng từng pixel. Não người (hoặc thuật toán) phải dịch bảng số đó thành cạnh, dòng chảy, vật thể, khoảng cách gần đúng.

Với UAV: ảnh còn bị rung, đổi sáng, motion blur — khó hơn ảnh tĩnh trong ImageNet.

3. Cốt lõi kỹ thuật

3.1. Mô hình pinhole

\[ u = f \frac{X}{Z}, \qquad v = f \frac{Y}{Z} \]
Điểm 3D \((X,Y,Z)\) chiếu xuống ảnh \((u,v)\). Chiều sâu \(Z\) bị mất trong phép chiếu → suy 3D từ một ảnh 2D là bài ill-posed, trừ khi có thêm giả định, stereo, chuyển động, hoặc học từ dữ liệu.

3.2. Intrinsic và extrinsic

  • Intrinsic \(K\): tiêu cự, tâm ảnh, (có thể) hệ số méo — thuộc về chiếc camera.
  • Extrinsic \((R,t)\): pose của camera trong thế giới (hoặc ngược lại).
  • UAV: camera gắn thân → extrinsic gắn với attitude của drone. Khi drone nghiêng, “phía trước trên ảnh” không còn là phía trước theo mặt đất theo cách trực giác cũ.

4. Sơ đồ

Thế giới (X,Y,Z)
        │  phép chiếu pinhole
        ▼
Ảnh (u,v)
        │
        ├─► vision cổ điển: cạnh, flow, hình học
        └─► learning: CNN → bbox / depth / semantics
                │
                ▼
        tín hiệu cho control / planning / RL policy

5. Demo ý tưởng — mất chiều sâu

Hai điểm \((1,0,2)\) và \((2,0,4)\) với \(f=1\) cho cùng \(u=0.5\).
Một pixel không đủ để biết vật gần hay xa — trừ khi bạn có thêm giả định kích thước vật, stereo, hoặc parallax khi máy bay dịch chuyển.

6. Gắn với RL–UAV

  • Observation ảnh: thiếu thông tin + thường không Markov nếu chỉ một frame → cần frame stack, RNN, hoặc belief.
  • Có thể giảm khó bằng preprocess: depth ước lượng, segmentation, optical flow — đổi raw pixel thành đặc trưng có cấu trúc.
  • Paper cần nói rõ: policy nhận RGB thô, depth, hay vector state đã qua ước lượng?

7. Lỗi thường gặp

  • Coi ảnh “đã chứa đầy đủ state” như trong một số env giả lập.
  • Quên calibration (intrinsic) khi dùng hình học (đo góc, ray).
  • Giả định camera cố định kiểu xe tự lái, trong khi UAV xoay rất mạnh.

8. Checklist

  1. Vì sao một ảnh mất chiều sâu?
  2. Intrinsic khác extrinsic chỗ nào?
  3. Vì sao một frame ảnh thường chưa đủ cho điều khiển ổn định?

Lecture 18 — Optical Flow

0. Mục tiêu học

Hiểu phương trình brightness constancy, aperture problem, ý tưởng Lucas–Kanade; biết time-to-contact dùng để tránh va chạm.

1. Câu hỏi trung tâm

Pixel đang trôi đi đâu, nhanh bao nhiêu — và dùng tín hiệu đó thế nào để tránh đụng?

2. Trực giác

Ngồi tàu nhìn cửa sổ: cây gần xẹt rất nhanh, núi xa trôi chậm. Não dùng tốc độ trôi trên võng mạc để đoán khoảng cách và tốc độ tiếp cận.
Drone cũng có thể dùng optical flow để cảm nhận “tường phía trước đang lớn dần” — tức sắp đụng.

3. Cốt lõi kỹ thuật

Giả định cường độ sáng bảo toàn theo chuyển động nhỏ:
\[ I_x u + I_y v + I_t = 0 \]
Một phương trình cho hai ẩn \((u,v)\) → aperture problem (nhìn qua lỗ nhỏ không biết vật trượt dọc cạnh hay vuông góc cạnh).

Lucas–Kanade (LK): giả định flow gần như không đổi trong một cửa sổ quanh điểm đang xét → xếp chồng nhiều phương trình → giải bình phương tối thiểu.

Time-to-contact (xấp xỉ):
\[ \tau \approx \frac{Z}{\dot{Z}} \propto \frac{1}{\text{divergence}(\text{flow})} \]
Flow phía trước “bung ra” mạnh → \(\tau\) nhỏ → cần phanh hoặc né.

Lab 3 của khóa gốc: quay video từ Crazyflie, tính LK offline.

4. Sơ đồ

  t                t+Δt
 ░░██░░   →      ░██░░░     mũi tên flow sang trái
 tường chiếm dần khung hình → divergence tăng → tránh / giảm tốc

5. Demo — ước lượng flow 1D bằng gradient

import numpy as np

I0 = np.array([0, 0, 1, 2, 3, 2, 1, 0, 0], dtype=float)
I1 = np.array([0, 0, 0, 1, 2, 3, 2, 1, 0], dtype=float)  # dịch phải ~1 mẫu
Ix = 0.5 * (I0[2:] - I0[:-2])
It = I1[1:-1] - I0[1:-1]
u = np.zeros_like(Ix)
mask = np.abs(Ix) > 0.3
u[mask] = -It[mask] / Ix[mask]
print("flow ước lượng:", np.round(u, 2))

6. Gắn với RL–UAV

  • Flow / proxy chiều sâu là đặc trưng cổ điển trước khi nhảy sang end-to-end pixel→action.
  • Reward có thể phạt divergence cao phía trước — inductive bias tránh va chạm, sample-efficient hơn phạt đụng nhị phân muộn.
  • Hữu ích khi onboard không chạy nổi mạng nặng theo thời gian thực.

7. Lỗi thường gặp

  • Quên giả định chuyển động nhỏ / độ sáng không đổi (ánh sáng nhấp nháy, bóng đổ → flow giả).
  • Dùng flow làm “odometry chính xác tuyệt đối” — thực tế có drift và outlier.
  • Nhầm optical flow với scene flow 3D.

8. Checklist

  1. Aperture problem là gì?
  2. Lucas–Kanade thêm giả định nào để giải được \((u,v)\)?
  3. Time-to-contact liên hệ thế nào với divergence?

Lecture 19 — Deep Learning cho thị giác

0. Mục tiêu học

Nắm pipeline học có giám sát cho robot vision; hiểu visual servoing đơn giản từ bounding box (đúng tinh thần Lab 4 khóa gốc).

1. Câu hỏi trung tâm

Thay vì viết tay quy tắc “cạnh thế này là ống”, làm sao học ánh xạ ảnh → nhãn / hộp bao từ dữ liệu?

2. Trực giác

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.

3. Cốt lõi kỹ thuật

  • Học có giám sát: tối thiểu hóa loss \(\mathcal{L}(\hat{y}, y)\) theo \(\theta\) bằng gradient.
  • Tác vụ thường gặp trên robot: detection, semantic/instance segmentation, depth estimation, visual odometry / pose.
  • Lab 4 (tinh thần khóa): mạng pretrained (ví dụ COCO) phát hiện người/cốc → lấy bbox → lệnh bám theo (visual servoing):
ảnh ──► CNN ──► bbox (c_x, c_y, w, h)
                 │
                 ├─ u_yaw  ∝ (c_x - W/2)     # lệch trái/phải → quay
                 └─ u_fwd  ∝ (h_ref - h)     # bbox nhỏ → tiến gần hơn

Đây chưa phải RL: chỉ là 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.

4. Gắn với RL–UAV

Hai trường phái thiết kế:

(A) Perception cố định + RL trên đặc trưng (B) End-to-end ảnh → action
Ưu Ít sample hơn, dễ debug 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ị khi mới dựng nghiên cứu: bắt đầu theo (A), chỉ chuyển (B) khi baseline (A) đã rõ giới hạn.

5. Lỗi thường gặp

  • Dùng detector SOTA nặng trên companion yếu → trễ vòng lặp → control mất ổn định; lúc đó “model kém” không phải nguyên nhân chính.
  • Fine-tune detection trên domain drone (góc nhìn trên cao / nghiêng) khác hẳn ảnh COCO ngang tầm mắt.

6. Checklist

  1. Visual servoing từ bbox hoạt động ra sao?
  2. Trade-off chính giữa perception cố định và end-to-end?
  3. Latency suy luận ảnh hưởng control thế nào?

Lecture 20 — Stochastic Gradient Descent (SGD)

0. Mục tiêu học

Hiểu vì sao dùng mini-batch; vai trò learning rate; liên hệ SGD supervised với ước lượng gradient trong RL.

1. Câu hỏi trung tâm

Tối ưu loss trên hàng triệu tham số bằng cách nào thì thực tế chạy được?

2. Trực giác

Chỉnh radio: không cần nghe cả album mới vặn nút. Nghe vài giây → vặn nhẹ → nghe tiếp.
SGD: mỗi bước chỉ dùng một mini-batch, cập nhật
\[ \theta \leftarrow \theta - \alpha \nabla_\theta \mathcal{L}_{\text{batch}}(\theta). \]

3. Cốt lõi kỹ thuật

  • Full-batch gradient: hướng “đúng” hơn theo loss toàn tập, nhưng đắt và đôi khi dễ kẹt vùng phẳng kém tổng quát.
  • SGD / mini-batch: gradient ồn, nhưng thường thoát vùng xấu; cần lịch learning rate hợp lý.
  • Momentum / Adam: nhớ hướng cập nhật trước đó, giảm giật.
  • Learning rate là siêu tham số số một: quá lớn → nổ; quá nhỏ → bò.

Với RL: policy gradient / actor-critic cũng là gradient ascent trên kỳ vọng reward, nhưng ước lượng gradient ồn hơn nhiều so với supervised → cần baseline, advantage normalization, GAE, clip (PPO), v.v.

4. Demo — SGD trên hàm bậc hai nhiễu

import numpy as np

rng = np.random.default_rng(0)
theta, lr = 0.0, 0.3
for i in range(25):
    y = 3 + rng.normal() * 0.5          # một mẫu quanh mục tiêu 3
    g = (theta - y)                     # grad của 0.5 (θ - y)^2
    theta -= lr * g
print("θ ≈", round(theta, 3))

5. Gắn với RL–UAV

Sample inefficiency của RL đến một phần từ gradient ồn + dữ liệu không i.i.d.
Khi debug học không ra: kiểm tra lr, scale reward/advantage, độ dài rollout, normalize obs — trước khi đổ lỗi kiến trúc mạng.

6. Lỗi thường gặp

  • Đổi thuật toán RL liên tục trong khi lr/reward scale đang vỡ.
  • So sánh hai thuật toán với budget mẫu khác nhau rồi kết luận “thuật toán A hơn”.

7. Checklist

  1. Vì sao dùng mini-batch thay full-batch?
  2. Adam khác SGD thuần ở ý tưởng nào?
  3. Vì sao gradient RL thường ồn hơn supervised?

Lecture 21 — Overfitting và Regularization

0. Mục tiêu học

Nhận dấu hiệu overfit; biết các kỹ thuật chống overfit; phân biệt overfit cổ điển với domain gap trong robotics.

1. Câu hỏi trung tâm

Vì sao mô hình “thuộc lòng” tập huấn luyện rồi thất bại ở môi trường mới — và chữa bằng gì?

2. Trực giác

Học thuộc 50 câu quiz ≠ hiểu bài. Gặp đề lạ (gió mạnh, ánh sáng khác, map khác) là toang.
Overfit = khớp cả nhiễu / đặc thù tập train. Regularization = ép mô hình đơn giản hơn, mượt hơn, hoặc bất biến hơn với thay đổi không liên quan nhiệm vụ.

3. Cốt lõi kỹ thuật

  • Dấu hiệu: train loss giảm, validation loss tăng (hoặc success trên train maps cao, test maps đổ).
  • Công cụ cổ điển: weight decay (\(L_2\)), dropout, early stopping, data augmentation, thêm dữ liệu đa dạng.
  • Robotics / UAV nhấn mạnh domain gap: sim ↔ real, sáng ↔ tối, mass/pin/wind khác.
    Công cụ tương ứng: domain randomization, fine-tune thật, bất biến (invariance) , chứng minh tổng quát hóa (ví dụ hướng PAC-Bayes / invariant policy — gần tinh thần nghiên cứu IRoM).
Loss
 │ train ╲
 │        ╲________
 │ val ╲     ╱  vùng overfit
 │      ╲___╱
 └───────┼──────────► epoch
       nên early stop quanh đây

4. Gắn với RL–UAV

  • Policy overfit một seed gió / một layout map là thất bại kinh điển.
  • Eval bắt buộc: held-out maps, nhiều mức gió, nhiễu cảm biến, (nếu được) thay đổi khối lượng.
  • Báo cáo chỉ “success 95% trên env train” mà không có held-out → chưa đủ cho nghiên cứu.

5. Lỗi thường gặp

  • Data augmentation ảnh (flip màu) không giải quyết gap động lực học (mass, latency).
  • Randomize quá mạnh khiến task không còn học được — cần lịch randomization có kiểm soát.

6. Checklist

  1. Ba dấu hiệu overfit trong RL–UAV?
  2. Ba kỹ thuật chống overfit / gap?
  3. Domain gap khác overfitting cổ điển ra sao?

Lecture 22 — Convolutional Neural Networks (CNN)

0. Mục tiêu học

Giải thích vì sao CNN phù hợp ảnh; hiểu receptive field; biết thực tế triển khai trên drone (companion computer).

1. Câu hỏi trung tâm

Kiến trúc nào phù hợp dữ liệu ảnh và vì sao?

2. Trực giác

Nhận mặt người: trước hết thấy cạnh mắt/mũi, sau mới ghép thành “đó là An”.
CNN bắt chước sự xếp tầng đó: lọc cục bộ → khái niệm lớn dần theo độ sâu.

3. Cốt lõi kỹ thuật

  • Convolution: chia sẻ trọng số, gần như đẳng biến tịnh tiến (translation equivariance), ít tham số hơn MLP trải phẳng mọi pixel.
  • Receptive field tăng theo độ sâu / stride / dilation.
  • Thực dụng: YOLO / Faster R-CNN (detection), U-Net / DeepLab (segmentation).
  • Trên Crazyflie: mạng thường chạy trên laptop/companion (≥ ~30 Hz ở Lab 4), không phải MCU bay.
ảnh → [conv + ReLU] × N → pool → … → head
       └─ cạnh ─┘     └─ bộ phận ─┘   └─ vật / bbox / depth

4. Gắn với RL–UAV

  • Mẫu chuẩn: CNN encoder + policy head (actor) ± value head (critic).
  • Đóng băng encoder pretrained (ImageNet/COCO/drone data) rồi RL chỉ train head: thường ít mẫu hơn train end-to-end từ đầu.
  • Nhớ ràng buộc tần số: policy 20 Hz với mạng 5 Hz là hai bài toán khác nhau.

5. Lỗi thường gặp

  • Dùng backbone quá lớn cho vòng điều khiển chặt.
  • Augmentation làm hỏng tín hiệu hình học cần cho điều khiển (ví dụ xoay ảnh tùy ý khi horizon quan trọng).

6. Checklist

  1. Vì sao conv thường hơn MLP trên ảnh?
  2. Receptive field nghĩa là gì?
  3. Trên UAV nhỏ, mạng nên chạy ở đâu và vì sao?

Lecture 23 — Reinforcement Learning trong ngữ cảnh Robotics

0. Mục tiêu học

Đặt RL đúng chỗ trong stack đã học; xây pipeline RL–UAV thực dụng; biết câu hỏi “paper-ready” trước khi train lớn.

1. Câu hỏi trung tâm

Khi không viết tay nổi controller/planner đủ tốt cho mọi tình huống — làm sao học hành vi từ tương tác và tín hiệu thưởng/phạt, mà vẫn tôn trọng vật lý và cảm biến thật?

2. Trực giác

Dạy chó ngồi: đúng được bánh, sai thì không. UAV: bay ổn / tới đích được thưởng; đụng / rơi bị phạt.
Khác supervised: không có nhãn action đúng từng bước, chỉ có tín hiệu thưa hoặc muộn.

Bạn đã vững RL — bài này không dạy lại PPO từ zero. Bài này buộc RL phải nói chuyện được với LQR, RRT, EKF, flow, reality gap.

3. Cốt lõi kỹ thuật (nhắc ngắn + cầu nối)

MDP: \((S, A, P, r, \gamma)\). Policy \(\pi\), value \(V^\pi\), action-value \(Q^\pi\).
Phương trình Bellman:
\[ V^\pi(s) = \mathbb{E}\big[r + \gamma V^\pi(s') \mid s, \pi\big]. \]

Ba họ thuật toán (chỉ để định vị):
1. Value-based (DQN…): học \(Q\), lấy policy greedy.
2. Policy gradient / actor–critic (PPO, SAC…): học trực tiếp \(\pi_\theta\).
3. Model-based: học / dùng \(f\) rồi kế hoạch — họ hàng với MPC và LQR.

Cầu nối với những gì đã học

Khái niệm robotics trong ebook Khái niệm RL tương ứng
Cost LQR \(x^\top Q x + u^\top R u\) Reward \(r = -c\); \(P\) ~ value; \(u=-Kx\) ~ \(\pi^\star\) tuyến tính
Heuristic \(h\) trong A* Ước lượng cost-to-go / value
Belief Bayes State cho POMDP
Tracking controller tầng thấp Low-level đã ổn định; RL ở tầng nhiệm vụ
Reality gap (Lab LQR trên máy thật) Sim-to-real

Pipeline khuyến nghị cho NCS (đừng nhảy cóc)

[Simulator: dynamics + nhiễu cảm biến + trễ]
                │
                ▼
     obs z:  x̂(EKF)  hoặc  ảnh / flow / depth + vector goal
                │
                ▼
     action a:  velocity setpoint  hoặc  attitude + thrust
               (tránh motor PWM ngay ngày đầu)
                │
                ▼
     reward: tiến tới goal − λ_u‖u‖² − λ_c·collision − λ_smooth·jerk
                │
                ▼
     thuật toán: PPO / SAC  (+ residual trên LQR hoặc safety shield)
                │
                ▼
     deploy: domain randomization → fine-tune thật → fail-safe giám sát

4. Demo — REINFORCE siêu nhỏ (minh họa, không phải thuật toán production)

import numpy as np

# s ∈ [-1, 1], mục tiêu 0; action = gia tốc nhỏ; reward = -s^2
rng = np.random.default_rng(1)
theta = 0.0          # π(a|s) = N(theta * s, 0.5)
lr = 0.05

for ep in range(80):
    s, grads, rews = 0.8, [], []
    for t in range(20):
        mu = theta * s
        a = mu + 0.5 * rng.normal()
        grads.append(((a - mu) / (0.5 ** 2)) * s)   # ∂ logπ / ∂θ
        s = np.clip(s + 0.1 * a, -1, 1)
        rews.append(-(s ** 2))
    G, returns = 0.0, []
    for r in reversed(rews):
        G = r + 0.95 * G
        returns.append(G)
    returns = np.array(list(reversed(returns)))
    returns = (returns - returns.mean()) / (returns.std() + 1e-8)
    theta += lr * np.mean(np.array(grads) * returns)

print("theta ≈", round(theta, 3), " (thường âm: kéo s về 0)")

5. Câu hỏi nghiên cứu “paper-ready”

  1. RL thay tầng nào: waypoint, velocity, hay attitude?
  2. Baseline cổ điển đã công bằng chưa: LQR/PID, MPC, RRT+tracking?
  3. Observation: privileged state hay đúng cảm biến onboard?
  4. An toàn: shielding, control barrier function, residual LQR?
  5. Generalization: map giữ lại, gió, khối lượng — metric đo ra sao?

6. Lỗi thường gặp

  • Gọi mọi thứ “end-to-end RL” nhưng thực tế vẫn dùng state thật và controller tầng trong — hãy viết trung thực.
  • Reward chỉ “tới đích = +1” trên drone có quán tính → tín hiệu quá thưa, học chậm / nguy hiểm.
  • So RL với baseline cổ điển cấu hình yếu để “thắng dễ” — reviewer đọc robotics sẽ nhận ra.

7. Checklist

  1. Viết MDP task UAV của bạn: \(S\) hoặc \(Z\), \(A\), \(r\), ràng buộc.
  2. Nêu một baseline classical tương ứng từng phần (control / planning).
  3. Kế hoạch sim-to-real của bạn gồm những bước nào?

Tổng kết Module 4

Vision cổ điển (hình học + optical flow) cho tín hiệu có cấu trúc.
Deep learning cho ngữ nghĩa và perception giàu hơn.
SGD / overfitting / CNN là dụng cụ triển khai.
RL (Lecture 23) là lớp quyết định đặt trên dynamics – estimation – perception — không thay thế chúng nếu mục tiêu là bay thật và viết nghiên cứu đứng vững.

Bài tiếp: 05_BroaderTopics_Capstone.md.