Chọn mức chất lượng AVIF khá dễ nếu chỉ quan tâm đến dung lượng tệp. Điều khó hơn là quyết định mức suy giảm chất lượng hình ảnh có thể chấp nhận được. Giá trị chất lượng 40 không có nghĩa là điểm chất lượng cảm nhận bằng 40, cũng không bảo đảm mọi ảnh đều cho kết quả như nhau. Các ảnh nguồn khác nhau có thể phản ứng rất khác nhau với cùng một cấu hình bộ mã hóa.
SSIMULACRA2 giúp thu hẹp khoảng cách đó bằng cách so sánh ảnh nén sau khi giải mã với ảnh tham chiếu. Nhưng nếu tìm kiếm toàn bộ các mức chất lượng cho từng ảnh, một quy trình chuyển đổi vốn đơn giản có thể trở thành khối lượng công việc mã hóa tốn kém. Khi mục tiêu là chất lượng ảnh web hợp lý chứ không phải tối ưu tuyệt đối từng tệp, có một cách đơn giản hơn: hiệu chỉnh một mức chất lượng AVIF trên tập mẫu đại diện, kiểm tra kết quả bằng mắt, rồi áp dụng mức đó cho phần còn lại của bộ ảnh.
Mức chất lượng AVIF và điểm SSIMULACRA2 là hai con số khác nhau
Tùy chọn quality truyền cho bộ mã hóa AVIF là một chỉ dẫn về việc nén ảnh. SSIMULACRA2 là phép đo kết quả sau khi mã hóa. Không thể coi hai thang đo này là một: AVIF quality: 40 không đồng nghĩa với SSIMULACRA2 = 40, 60 hay bất kỳ điểm cố định nào khác.
Để đo chất lượng một ảnh đã mã hóa, hãy giải mã ảnh đó rồi so sánh với ảnh tham chiếu:
ssimulacra2 reference.png encoded-decoded.png
Điểm SSIMULACRA2 càng cao thì mức độ tương đồng về cảm nhận thị giác càng lớn. Tài liệu chính thức mô tả điểm khoảng 50 là chất lượng trung bình và khoảng 70 là chất lượng cao. Ngưỡng 60 có thể là mục tiêu thực dụng hữu ích, nhưng đó là lựa chọn về tiêu chuẩn chất lượng, không phải định nghĩa chung cho mọi ảnh thế nào là chấp nhận được. Hãy luôn xem trực tiếp những kết quả tiêu biểu ở kích thước hiển thị thực tế.
Vì sao tối ưu toàn diện từng ảnh lại tốn kém
Một bộ tối ưu hóa nghiêm ngặt có thể mã hóa cùng một ảnh nhiều lần với các mức chất lượng khác nhau, dùng SSIMULACRA2 chấm điểm từng phương án rồi giữ lại tệp nhỏ nhất đạt yêu cầu. Cách này thường tận dụng khả năng nén hiệu quả hơn, vì ảnh dễ nén có thể đạt ngưỡng ở mức chất lượng thấp, còn ảnh khó nén cần mức cao hơn.
Nhược điểm nằm ở số lần mã hóa. Nếu có N ảnh và mỗi ảnh cần thử K phương án mã hóa để tìm mức chấp nhận được, tổng số lượt mã hóa sẽ vào cỡ N × K, chưa kể giải mã và tính điểm. Trên thực tế, mã hóa AVIF ở mức nỗ lực cao có thể chiếm phần lớn chi phí xử lý; bản thân phép tính SSIMULACRA2 không nhất thiết là phần tốn kém nhất.
Chọn một mức chất lượng cho mỗi thư mục giúp giảm công việc tìm kiếm, nhưng vẫn phải lấy mẫu, đo đạc và duy trì các cấu hình khác nhau cho từng nhóm. Với bộ ảnh có yêu cầu phân phối nhất quán và chấp nhận được một số trường hợp ngoại lệ, độ phức tạp tăng thêm có thể không đáng.
| Chiến lược | Công việc hiệu chỉnh | Đánh đổi chính |
|---|---|---|
| Chất lượng thích ứng theo từng ảnh | Thử nhiều phương án mã hóa cho mỗi ảnh | Kiểm soát chi tiết, chi phí hiệu chỉnh cao nhất |
| Chất lượng thích ứng theo nhóm | Thử nhiều phương án mã hóa trên mẫu của từng nhóm | Ít công việc hơn nhưng cấu hình phức tạp hơn và kết quả phụ thuộc từng nhóm |
| Một mức chất lượng cố định | Thử các phương án mã hóa trên tập mẫu hiệu chỉnh giới hạn | Vận hành đơn giản, chấp nhận một số ảnh bị nén quá mạnh hoặc chưa được nén đủ |
Phân biệt quan trọng: điểm trung bình và tỷ lệ đạt ngưỡng
Trước khi chọn mức chất lượng, cần xác định thế nào là “đủ tốt”. Hai mục tiêu thoạt nhìn tương tự có thể dẫn đến cấu hình bộ mã hóa rất khác nhau:
- Mục tiêu điểm trung bình: điểm SSIMULACRA2 trung bình trên tập mẫu nên vào khoảng 60.
- Mục tiêu tỷ lệ đạt ngưỡng: khoảng 90% ảnh phải đạt SSIMULACRA2 ≥ 60, còn các ảnh khác có thể thấp hơn ngưỡng này.
Hai mục tiêu đó không tương đương. Khi tính trung bình, điểm cao của một ảnh đơn giản có thể bù cho điểm thấp của một ảnh khó. Ví dụ, một nửa số ảnh đạt 75 điểm và nửa còn lại đạt 55 điểm thì điểm trung bình là 65, nhưng chỉ một nửa số ảnh đạt ngưỡng 60.
Với quy trình xử lý ảnh web thông thường, nơi phần lớn ảnh cần trông chấp nhận được và có thể chịu được một tỷ lệ nhỏ ảnh không đạt, mục tiêu tỷ lệ đạt ngưỡng thường hữu ích hơn. Hãy đo:
pass_rate = count(scores >= 60) / count(all_scores)
Đồng thời ghi lại phân bố điểm của các ảnh không đạt và xem xét những ảnh trông tệ nhất. Tập mẫu có 9% ảnh đạt 59 điểm khác đáng kể với tập mẫu có 9% ảnh chỉ đạt 30 điểm, dù tỷ lệ đạt ngưỡng của hai tập là như nhau.
Một lần hiệu chỉnh thực tế đã cho thấy điều gì
Trong một đợt hiệu chỉnh AVIF mang tính thăm dò, quy trình thích ứng đã chọn các mức chất lượng khác nhau cho từng nhóm ảnh, trải từ khoảng giữa dải 30 đến giữa dải 40. Điều này đúng như dự đoán: một số nhóm có ảnh vượt ngưỡng SSIMULACRA2 đã chọn từ khá sớm, trong khi vài mẫu khó cần mức chất lượng bộ mã hóa cao hơn đáng kể.
Tuy nhiên, quy tắc thích ứng đó khắt khe hơn yêu cầu phân phối thực tế. Nó cố gắng để gần như mọi ảnh được thử trong từng nhóm đều vượt ngưỡng và chỉ cho phép rất ít ngoại lệ. Cách này bảo vệ chất lượng của những ảnh khó, nhưng cũng có thể đẩy mức chất lượng của cả nhóm lên cao chỉ vì một mẫu cá biệt.
Khi xem xét lại số đo theo một mục tiêu khác—khoảng chín trên mười ảnh đạt SSIMULACRA2 từ 60 trở lên—một mức chất lượng AVIF cố định khoảng 39–40 trở thành phương án dung hòa có vẻ hợp lý. Trong phép so sánh đó, mức 39 thiên về dung lượng đầu ra nhỏ hơn, còn mức 40 tạo thêm khoảng an toàn cho những ảnh có điểm gần ngưỡng. Các giá trị này được rút ra từ dữ liệu hiệu chỉnh và phân tích tiếp theo; việc chuyển đổi toàn bộ ở mức chất lượng cố định và kiểm định độc lập trên toàn bộ kho ảnh chưa được thực hiện. Mức lợi ích chính xác về dung lượng tệp khi chọn 39 thay vì 40 cũng chưa được xác định.
Bài học không phải là chất lượng AVIF 39 hoặc 40 phù hợp ở mọi nơi. Điều cốt lõi là một cấu hình cố định có thể hợp lý khi đáp ứng phân bố chất lượng đã được lựa chọn rõ ràng. Bộ mã hóa khác, cơ cấu ảnh nguồn khác, quy trình xử lý màu khác hay ngưỡng cảm nhận khác đều có thể dẫn đến câu trả lời khác.
Cách hiệu chỉnh mức chất lượng AVIF một lần
- Chọn tỷ lệ không đạt có thể chấp nhận. Ví dụ, yêu cầu khoảng 90% ảnh đạt SSIMULACRA2 ≥ 60. Hãy xác định đây là mục tiêu linh hoạt hay điều kiện phát hành bắt buộc.
- Tạo tập mẫu thực sự đại diện. Bao gồm nhiều kích thước ảnh, định dạng nguồn, dải chuyển màu, cạnh sắc, kết cấu và ảnh ít chi tiết. Lấy mẫu ngẫu nhiên từ khối lượng công việc thực tế và lấy mẫu phân tầng nếu có nhóm ảnh dễ bị bỏ sót. Chọn tệp chỉ theo số byte nén trên mỗi điểm ảnh là một quy tắc kinh nghiệm hữu ích để bao phủ nhiều trường hợp, chứ không bảo đảm tính đại diện về cảm nhận thị giác.
- Thử một khoảng nhỏ các mức chất lượng bộ mã hóa. Hãy bắt đầu với vài phương án gần một mức đã cho kết quả nhìn bằng mắt chấp nhận được, thay vì thử cả thang chất lượng. Chẳng hạn, thử các giá trị gần nhau như 38, 39, 40 và 42 trên cùng một tập ảnh.
- Giữ nguyên toàn bộ quy trình mã hóa. Cố định độ phân giải, hướng ảnh, chuyển đổi màu, cách triển khai bộ mã hóa, mức nỗ lực mã hóa, lấy mẫu phụ sắc độ, độ sâu bit và các bước tiền xử lý. Nếu thêm hình mờ, ảnh tham chiếu cũng phải có cùng hình mờ và trải qua các phép biến đổi giống hệt trước khi đem so sánh với ảnh đã nén.
- Ghi lại cả điểm và dung lượng. Với mỗi phương án, tính tỷ lệ ảnh đạt ít nhất 60 điểm, phân bố các điểm dưới ngưỡng và tổng số byte sau mã hóa trên cùng một tập mẫu. Không suy ra mức tiết kiệm băng thông chỉ từ con số chất lượng.
- Kiểm tra các ảnh không đạt. Xem kỹ khuôn mặt, chữ, đường nét mảnh, dải chuyển màu và những chi tiết quan trọng đối với cách ảnh sẽ được hiển thị. Kiểm tra ở kích thước hiển thị thực tế, không chỉ đối chiếu khi phóng to.
- Chọn mức chất lượng thấp nhất đáp ứng yêu cầu, rồi kiểm định. Thử mức được chọn trên một tập mẫu ngẫu nhiên độc lập, chưa tham gia vào quá trình lựa chọn. Nếu việc không đạt mục tiêu 90% gây hậu quả đáng kể, hãy chừa biên an toàn và xem xét nghiêm túc sai số do lấy mẫu. Nếu có thể chấp nhận đôi khi có ảnh không đạt, mức chất lượng thấp hơn để nén mạnh hơn có thể là lựa chọn hợp lý.
Hiệu chỉnh một lần không có nghĩa là bỏ qua những thay đổi về sau. Hãy kiểm tra lại trên một tập mẫu nhỏ khi cơ cấu ảnh nguồn, kích thước ảnh, phiên bản bộ mã hóa, phép biến đổi khi phân phối ảnh hoặc yêu cầu thị giác thay đổi.
Ví dụ so sánh tối giản với Sharp và SSIMULACRA2
Ví dụ rút gọn này sử dụng bộ mã hóa AVIF của Sharp để tạo hai phương án từ cùng một ảnh đầu vào. Đây chỉ là đoạn mã minh họa cho việc hiệu chỉnh, không có nghĩa mọi dự án đều nên dùng các tùy chọn mã hóa hay mức chất lượng này. Hãy chạy dưới dạng mô-đun ES sau khi cài đặt sharp.
import sharp from 'sharp';
const source = 'sample.png';
const encoding = {
effort: 9,
chromaSubsampling: '4:4:4',
bitdepth: 8,
tune: 'iq',
lossless: false
};
// Use the same orientation and color conversion in both paths.
await sharp(source)
.rotate()
.toColourspace('srgb')
.png()
.toFile('reference.png');
for (const quality of [39, 40]) {
const encoded = `candidate-q${quality}.avif`;
await sharp(source)
.rotate()
.toColourspace('srgb')
.avif({ ...encoding, quality })
.toFile(encoded);
await sharp(encoded)
.png()
.toFile(`candidate-q${quality}.png`);
}
Sau đó, so sánh các phương án đã giải mã với ảnh tham chiếu được chuẩn bị sẵn:
ssimulacra2 reference.png candidate-q39.png
ssimulacra2 reference.png candidate-q40.png
Để thử nghiệm thực tế, hãy tự động hóa quy trình này trên toàn bộ ảnh trong tập mẫu và thu thập cả điểm lẫn dung lượng tệp cho từng phương án. Nếu quy trình sản xuất của bạn thay đổi kích thước, cắt ảnh, chồng lớp phủ hoặc biến đổi ảnh theo cách khác, hãy áp dụng chính những thao tác đó lên ảnh tham chiếu dùng để so sánh. Nếu không, SSIMULACRA2 sẽ đo cả một phần ảnh hưởng của các phép biến đổi, thay vì chỉ đo suy giảm chất lượng do nén.
Khi đã chọn xong mức chất lượng dùng chung, mã hóa trong môi trường sản xuất trở thành việc chuyển đổi AVIF một lượt như thông thường. Bạn không còn phải tìm kiếm mức chất lượng cho từng ảnh hoặc thư mục. Cách này loại bỏ việc mã hóa thử đi thử lại, nhưng không loại bỏ chi phí của một lượt mã hóa vẫn cần thiết cho mỗi ảnh đầu ra.
Khi nào một mức chất lượng AVIF cố định không phù hợp
Mức cố định là một sự đánh đổi, không phải phương án tối ưu cho mọi trường hợp. Mã hóa thích ứng vẫn có giá trị khi mức chất lượng tối thiểu của từng ảnh được quy định trong hợp đồng, không thể chấp nhận lỗi hiển thị, nguồn ảnh khác biệt rất lớn hoặc việc tiết kiệm từng byte đủ quan trọng để bù cho chi phí tính toán và độ phức tạp triển khai tăng thêm.
Đặc biệt cần thận trọng với bộ ảnh gồm nhiều loại nội dung. Ảnh chụp, đồ họa phẳng, chữ nhỏ và ảnh nguồn đã qua nén không nhất thiết phản ứng giống nhau. Nếu một nhóm nội dung liên tục không đạt tiêu chí chấp nhận, một số ít cấu hình riêng theo định dạng hoặc nội dung có thể hiệu quả hơn cả hai thái cực: một mức chất lượng chung cho tất cả hoặc tối ưu đầy đủ từng ảnh.
Cũng cần phân biệt tốc độ của bộ mã hóa với tốc độ hiệu chỉnh. Dùng một mức chất lượng giúp tránh thử nghiệm lặp lại, nhưng mã hóa toàn bộ ảnh với effort rất cao vẫn có thể tiêu tốn nhiều tài nguyên tính toán. Cấu hình bộ mã hóa với mức nỗ lực thấp hơn cũng là một hướng tối ưu hợp lệ, miễn là bạn hiệu chỉnh lại: mối quan hệ giữa mức chất lượng và điểm đo có thể thay đổi khi thay đổi tùy chọn mã hóa.
Nguyên tắc thực tế
Hãy sử dụng SSIMULACRA2 như công cụ hiệu chỉnh, chứ không nhất thiết là bước bắt buộc trong quy trình sản xuất đối với mọi ảnh. Chọn mục tiêu chất lượng phản ánh cách ảnh thực sự được xem, mã hóa một tập mẫu đại diện ở vài mức gần nhau, so sánh cả điểm cảm nhận thị giác lẫn số byte, kiểm tra các ảnh không đạt rồi chốt mức thấp nhất đáp ứng giới hạn chấp nhận của bạn.
Trong một đợt hiệu chỉnh mang tính thăm dò, mức chất lượng AVIF khoảng 39–40 có vẻ là điểm dừng hợp lý. Đó là quyết định dựa trên một ngưỡng và mức chấp nhận sai lệch cụ thể, không phải cấu hình mặc định dùng được ở mọi nơi hay kết quả đo kiểm đã được xác nhận trên toàn bộ kho ảnh. Bài học có thể áp dụng rộng hơn rất đơn giản: khi thời gian và tài nguyên tính toán có hạn, một mức chất lượng cố định đã được kiểm định cẩn thận thường thực tế hơn việc liên tục tối ưu từng ảnh riêng lẻ.