Nén Hình Ảnh Hoạt Hình Hiệu Quả - nói dối e blog

Nén Hình Ảnh Hoạt Hình Hiệu Quả

Hôm qua, mình tình cờ phát hiện một dự án cực kỳ thú vị trên GitHub có tên , cho phép phóng đại hình ảnh hoạt hình lên gấp 2 lần với chất lượng đáng kinh ngạc. So với việc dùng các bộ lọc phóng đại truyền thống, kết quả của waifu2x thực sự vượt trội. Mình đã thử nghiệm phóng đại liên tục một hình ảnh hoạt hình nhỏ lên đến 8 lần qua nhiều chu kỳ xử lý, và chất lượng vẫn giữ được rất tốt.

Trong nhóm chat kỹ thuật của công ty, có đồng nghiệp nêu ý tưởng: Liệu chúng ta có thể trích xuất thuật toán này để tối ưu hóa việc nén tài nguyên hình ảnh trong game không? Đặc biệt với các hình hoạt hình, nếu lưu trữ ở định dạng nhỏ gọn rồi giải nén khi tải hoặc cài đặt, sẽ tiết kiệm đáng kể không gian lưu trữ. Cảm thấy ý tưởng này rất tiềm năng, mình đã dành thời gian nghiên cứu sâu hơn.

Cơ chế phóng đại của thuật toán này dựa trên mô hình học sâu được huấn luyện từ tập dữ liệu đặc thù. Về mặt kỹ thuật, hoàn toàn khả thi để tách riêng phần thuật toán và xây dựng phiên bản chỉ chạy trên CPU mà không phụ thuộc vào CUDA. Tuy nhiên trong quá trình nghiên cứu mã nguồn, mình phát hiện một chi tiết đặc biệt cần ghi chú lại ngay.

Khác với luận văn gốc, dự án mã nguồn mở này tập trung chuyên biệt vào hình ảnh hoạt hình. Ngoài việc sử dụng dữ liệu huấn luyện toàn ảnh hoạt hình, mình còn để ý đến một chi tiết quan trọng: Chương trình trước tiên chuyển đổi ảnh RGB sang định dạng YUV, sau đó chỉ xử lý kênh Y (độ sáng). Trong khi đó các kênh UV (màu sắc) đơn giản được nhân bản 4 lần mà không qua xử lý đặc biệt.

Điều này hoàn toàn hợp lý vì hình ảnh hoạt hình thường có các khối màu lớn, nên mắt người ít nhạy cảm với sự thay đổi tinh tế của màu sắc. Vậy nếu chúng ta lưu trữ hình ảnh trực tiếp ở định dạng YUV420, liệu có thể giảm kích thước file xuống còn 50% mà không ảnh hưởng đáng kể đến chất lượng không?

Mình đã thực hiện thí nghiệm trên tài nguyên game bằng công cụ ImageMagick. Kết quả cho thấy sau khi chuyển đổi sang YUV420 rồi chuyển ngược lại thành RGB, chất lượng hình ảnh gần như không thay đổi với mắt thường. Việc chuyển đổi từ YUV420 sang RGB cũng rất đơn giản - thậm chí có thể thực hiện trực tiếp trong shader để tiết kiệm bộ nhớ video (dù hiệu quả kinh tế cần được cân nhắc kỹ lưỡng). Đây có lẽ là phương pháp tối ưu nhất để nén tài nguyên hình ảnh với tổn thất chất lượng tối thiểu.

P/s: Nếu bạn muốn tự mình kiểm chứng, hãy dùng lệnh sau để thử nghiệm với một hình ảnh 1024x1024:

1
convert image.png -size 1024x1024 -depth 8 -sampling-factor 4:2:0 -interlace plane yuv:image.raw

Sau đó chuyển đổi ngược lại bằng:

1
convert -size 1024x1024 -depth 8 -sampling-factor 4:2:0 -interlace plane yuv:image.raw image2.png

Bạn có thể nhờ các họa sĩ chuyên nghiệp đánh giá mức độ tổn thất chất lượng có thể chấp nhận được hay không. Về phần mềm giải nén và chuyển đổi trong game, cần phát triển riêng để hỗ trợ thêm kênh alpha.

Ghi chú lại những phát hiện này để phục vụ nghiên cứu sâu hơn trong tương lai.

0%