Bài 4

HRNet — High-Resolution Network

HRNet (High-Resolution Network) thay đổi tư duy thiết kế backbone: thay vì hạ độ phân giải dần rồi khôi phục lại, mạng giữ biểu diễn độ phân giải cao xuyên suốt và chạy song song nhiều nhánh ở các độ phân giải khác nhau. Nhờ vậy biểu diễn cuối vừa giàu ngữ nghĩa, vừa chính xác về vị trí — lý tưởng cho các bài toán cần định vị chính xác như ước lượng tư thế người (pose estimation) và phân vùng ảnh (segmentation).

1. Vấn đề của kiến trúc cổ điển
Tại sao high → low → high lại làm mất thông tin

Phần lớn backbone kinh điển — VGG, ResNet, GoogLeNet — được thiết kế cho bài toán phân loại ảnh. Triết lý của chúng là hạ độ phân giải dần (high resolution → low resolution) qua các tầng pooling và strided convolution. Mỗi lần giảm kích thước không gian, mạng đánh đổi chi tiết vị trí để lấy đặc trưng ngữ nghĩa giàu hơn và trường tiếp nhận (receptive field) rộng hơn. Với phân loại, điều này hợp lý: ta chỉ cần biết "trong ảnh có con mèo", không cần biết con mèo nằm ở pixel nào.

Gọi đầu vào có kích thước \(H \times W\). Sau bốn lần giảm độ phân giải, bản đồ đặc trưng tụt xuống còn \(\tfrac{1}{32}\) kích thước — tức \(\tfrac{H}{32} \times \tfrac{W}{32}\). Với ảnh \(512 \times 512\), feature map chỉ còn \(16 \times 16\): mỗi điểm trên đó tương ứng với cả một vùng \(32 \times 32\) pixel của ảnh gốc. Thông tin vị trí ở mức pixel gần như đã biến mất.

Vấn đề nảy sinh khi ta chuyển sang bài toán dự đoán dày đặc (dense prediction) — segmentation, pose estimation, depth estimation — nơi cần một nhãn (hoặc tọa độ) cho từng pixel. Lúc này phải khôi phục lại độ phân giải đã mất, theo kiểu encoder–decoder (U-Net): encoder hạ dần độ phân giải, decoder upsample dần để dựng lại bản đồ \(H \times W\).

Nhưng quá trình low → high này chỉ là tái tạo thông tin không gian đã bị nén mất, chứ không hồi sinh được độ chính xác gốc. Dù U-Net dùng skip connection để bơm chi tiết từ encoder sang decoder, biểu diễn ở "đáy chữ U" vẫn rất thô về không gian. Kết quả: biên đối tượng trong segmentation bị nhòe, tọa độ keypoint trong pose estimation bị lệch vài pixel — sai số nhỏ nhưng tai hại với các bài toán đòi hỏi vị trí pixel chuẩn.

Mấu chốt: kiến trúc cổ điển vứt bỏ độ phân giải cao rồi cố dựng lại. Mỗi vòng nén–giải nén là một lần rò rỉ thông tin vị trí không thể lấy lại hoàn toàn.
2. Ý tưởng cốt lõi của HRNet
Luôn giữ high-res, chạy song song nhiều độ phân giải

HRNet lật ngược tư duy bằng hai nguyên tắc đơn giản nhưng mạnh mẽ:

Gọi nhánh đầu tiên có độ phân giải \(\tfrac{1}{4}\). Qua mỗi stage, HRNet thêm một nhánh mới có độ phân giải bằng một nửa nhánh thấp nhất hiện có, tạo ra dãy độ phân giải \(\tfrac{1}{4}, \tfrac{1}{8}, \tfrac{1}{16}, \tfrac{1}{32}\) chạy song song. Số kênh (channels) tăng dần khi độ phân giải giảm — đúng tinh thần "không gian nhỏ thì ngữ nghĩa dày".

Ý nghĩa: nhánh high-res giữ vị trí chính xác; các nhánh low-res nhìn rộng và trừu tượng hơn nên giàu ngữ nghĩa. Thay vì ép một biểu diễn duy nhất gánh cả hai vai trò ở hai thời điểm khác nhau, HRNet để chúng cùng tồn tại và bổ trợ lẫn nhau.

Nhớ một câu: HRNet không hạ rồi khôi phục, mà luôn giữ high-res song song với các nhánh phân giải thấp.
3. Hợp nhất đa tỉ lệ lặp lại
Repeated multi-scale fusion

Nếu các nhánh chỉ chạy song song mà không "nói chuyện" với nhau thì mỗi nhánh sẽ phiến diện: nhánh cao thiếu ngữ nghĩa, nhánh thấp thiếu chi tiết. Bí quyết của HRNet là repeated multi-scale fusion — các nhánh trao đổi thông tin nhiều lần dọc theo mạng, chứ không chỉ gộp một lần ở cuối.

Tại mỗi module fusion, mọi nhánh nhận đóng góp từ mọi nhánh khác. Cụ thể, để đưa đặc trưng từ độ phân giải này sang độ phân giải kia, cần khớp kích thước không gian và số kênh:

HướngPhép biến đổiMục đích
Cao → thấp (downsample)Strided convolution \(3 \times 3\) (lặp lại để giảm \(\times 2, \times 4, \dots\))Bơm chi tiết không gian từ nhánh cao xuống nhánh thấp
Thấp → cao (upsample)Bilinear upsampling + convolution \(1 \times 1\)Bơm ngữ nghĩa từ nhánh thấp lên nhánh cao
Cùng độ phân giảiĐường nối thẳng (identity)Giữ nguyên đặc trưng của chính nhánh đó

Conv \(1 \times 1\) sau khi upsample dùng để chỉnh số kênh cho khớp (nhánh thấp có nhiều kênh hơn nhánh cao). Sau khi tất cả các luồng đã được biến đổi về cùng kích thước của nhánh đích, chúng được cộng lại (element-wise sum). Có thể viết gọn đặc trưng của nhánh \(r\) sau fusion là:

$$ Y_r = \sum_{s} \mathcal{T}_{s \to r}\big(X_s\big) $$

trong đó \(X_s\) là đặc trưng đầu vào của nhánh nguồn \(s\), còn \(\mathcal{T}_{s \to r}\) là phép biến đổi tương ứng (downsample nếu \(s \lt r\), upsample nếu \(s \gt r\), identity nếu \(s = r\)). Vì fusion lặp lại nhiều lần, sau vài stage mỗi nhánh đã hấp thụ thông tin của tất cả các độ phân giải.

Hệ quả quan trọng: biểu diễn high-res cuối cùng của HRNet vừa giàu ngữ nghĩa (đã hút từ các nhánh thấp) vừa chính xác về không gian (chưa từng bị nén mất). Đây chính là điều mà encoder–decoder không đạt được.

4. Kiến trúc theo stage
Thêm dần nhánh, xen module fusion

HRNet được tổ chức thành các stage. Mỗi stage chứa các khối residual để học đặc trưng trong từng nhánh, kết thúc bằng một (hoặc nhiều) module multi-scale fusion. Số nhánh tăng dần qua từng stage:

StageSố nhánhCác độ phân giảiGhi chú
Stem\(\tfrac{1}{4}\)2 conv stride-2 đưa ảnh về \(\tfrac{1}{4}\) trước khi vào nhánh chính
Stage 11\(\tfrac{1}{4}\)Chỉ có nhánh high-res
Stage 22\(\tfrac{1}{4}, \tfrac{1}{8}\)Thêm 1 nhánh thấp + fusion
Stage 33\(\tfrac{1}{4}, \tfrac{1}{8}, \tfrac{1}{16}\)Thêm 1 nhánh thấp + nhiều fusion
Stage 44\(\tfrac{1}{4}, \tfrac{1}{8}, \tfrac{1}{16}, \tfrac{1}{32}\)Đủ 4 nhánh, fusion dày đặc

Khi chuyển sang stage mới, một transition layer sinh nhánh phân giải thấp mới bằng strided conv (lấy độ phân giải bằng một nửa nhánh thấp nhất hiện có), đồng thời giữ lại tất cả các nhánh cũ. Trong mỗi stage, các nhánh chạy song song qua các block residual rồi gặp nhau ở module fusion. Cuối mạng, các độ phân giải được tổng hợp đa độ phân giải để tạo biểu diễn đầu ra.

HRNet — nhánh song song & hợp nhất đa tỉ lệ Scroll / zoom · Mở draw.io ↗
5. HRNetV1 vs V2 & cách lấy đầu ra
Dùng một nhánh hay ghép tất cả

Cùng một backbone, nhưng cách tổng hợp đầu ra ở cuối mạng quyết định phiên bản:

Phiên bảnCách lấy đầu raPhù hợp
HRNetV1Chỉ dùng đặc trưng của nhánh high-res (\(\tfrac{1}{4}\)) làm output, bỏ qua các nhánh thấpHuman pose estimation — nơi định vị keypoint là tất cả
HRNetV2Ghép (concatenate) tất cả các nhánh: upsample mọi nhánh thấp về \(\tfrac{1}{4}\) rồi nối kênh, tạo biểu diễn đa tỉ lệ phong phúSemantic segmentation, facial landmark
HRNetV2pTừ output V2, downsample tạo pyramid đa cấp kiểu FPNObject detection (làm backbone cho detector)

Nói cách khác: V1 tin rằng nhánh high-res sau nhiều vòng fusion đã đủ giàu ngữ nghĩa để định vị keypoint; còn V2/V2p khai thác triệt để cả bốn độ phân giải để phục vụ các bài toán cần cả vùng lẫn biên. Việc chọn phiên bản chỉ là thay đầu ra, phần thân backbone giữ nguyên.

6. Ứng dụng & so sánh cách giữ độ phân giải
HRNet vs U-Net vs DeepLab

HRNet đặc biệt mạnh ở các bài toán cần định vị chính xác:

So sánh ba triết lý giữ/khôi phục độ phân giải cho dense prediction:

Tiêu chíEncoder–Decoder (U-Net)Dilated Conv (DeepLab)HRNet
Cách giữ độ phân giảiHạ xuống rồi upsample khôi phục; skip connection bơm chi tiếtBỏ pooling cuối, dùng atrous/dilated conv giữ độ phân giải mà vẫn tăng receptive fieldLuôn giữ nhánh high-res song song, không nén rồi giải nén
Thông tin vị tríMất một phần ở đáy chữ U, dựng lại gần đúngGiữ tốt hơn, nhưng feature thường ở \(\tfrac{1}{8}\) ảnhGiữ tốt nhất ở \(\tfrac{1}{4}\), không qua nén
Ngữ nghĩaTốt (từ đáy encoder)Tốt (receptive field rộng nhờ dilation)Tốt nhờ fusion lặp lại với các nhánh thấp
Chi phí tính toánTrung bìnhCao (dilated conv ở độ phân giải lớn tốn FLOPs/bộ nhớ)Cao (nhiều nhánh song song)
Mẹo thực hành: hiếm khi cần train HRNet từ đầu. Hãy lấy HRNet đã pretrained trên ImageNet/COCO làm backbone (có sẵn trong timm, mmpose, mmsegmentation), gắn thêm head theo bài toán rồi fine-tune — vừa nhanh hội tụ vừa đỡ tốn tài nguyên.
← Bài trước
Bài 3: ResNet