Kết quả đánh giá qua mã hóa liên khung

Một phần của tài liệu Nghiên cứu về định dạng nén video VP8 (Trang 63 - 79)

Như đã được đệ cập trong phần 3.3.3, các bài so sánh trong bảng 3.10 được thể hiện và các kết quả được tập hợp. Cấu hình thứ 8 trong bảng 3.10 được mã hóa đầu tiên ở tốc độ bít trung bình. Với đoạn phim Ice, tốc độ bít trung bình là 500 Kbps và với Parkrun là 1300 Kbps. Tốc độ bít đầu ra với đoạn phim Ice là 358 Kbps và là 1426 Kbps với Parkrun.

Hình 4.17 thể hiện PSNR của đoạn phim Ice và Parkrun đo được. Từ viết tắt “BF” thể hiện các khung hình hai chiều. Có 3 khả năng có thể xảy ra cho từng đoạn phim là: không có khung B, nhiều khung B (16 đối với H.264 và khung altref với VP8), hoặc khung B có trọng số (trọng số 100 với x264 và việc sử dụng bộ lọc ARNR với VP8). Việc sử dụng khung B, cấu hình 1, cố gắng để đạt được việc mô phỏng VP8 theo H.264. Điều này do sự giới hạn số lượng khung hình có thể tham chiếu được là 1 và không sử dụng khung B.

Trong hai đoạn phim Ice và Parkrun, dường như là H.264 vượt trội hơn nếu không sử dụng khung B theo PSNR. Số trung vị với Ice là giống nhau nhưng VP8 có trung bình thấp hơn và dải biến đổi lớn hơn. Với Parkrun, trung vị VP8 chỉ xấp xỉ tứ phân vị thứ nhất của H.264, nhưng giá trị trung bình thì tương đương. Điều

63 Vương Gia Thiết

này chỉ ra rằng VP8 có độ dốc PSNR cao hơn H.264 và vị trí của tứ phân vị thứ 3 cho thấy điều này.

Đối với các bài so sánh sử dụng khung B, lợi thế của H.264 dựa vào từng đoạn phim. Với Ice, VP8 và H.264 đều thể hiện tốt hơn ngoại trừ việc tăng lên của PSNR nhỏ nhất. Tuy nhiên, khi khung B được đánh trọng số, giá trị trung bình và trung vị của H.264 tăng lên và vượt qua VP8. Đối với Parkrun, khung altref của VP8 không cho kết quả tăng lên. Còn với H.264 thì cải thiện đáng kể, giá trị trung bình tiệm cận tứ phân vị thứ 3 và trung vị của nó cao hơn của VP8. Trong đoạn phim này, lượng khung B lớn tạo nên sự khác biệt hơn về chất lượng.

Trong hình 4.18, VP8 và H.264 cũng thể hiện một kết quả tương tự theo SSIM. Đối với Ice, các kết quả nếu không sử dụng khung B, hoặc nếu khung P và B có trọng số bằng nhau thì đặc tính thống kê đối với VP8 rất bé. Khi khung B trọng số lớn được sử dụng, H.264 tốt hơn VP8. Đối với phim Parkrun, H.264 tốt hơn VP8 ở cả 3 trường hợp.

SSIM của H.264 cũng tăng lên khi sử dụng khung B và khi sử dụng thuật toán dự đoán trọng số, sự khác biết càng lớn hơn. Tứ phân vị thứ nhất của H.264 lớn hơn giá trị trung bình và trung vị của VP8 trong khi giá trị nhỏ nhất của H.264 xấp xỉ giá trị trung vị của VP8.

Các bảng dữ liệu PSNR và SSIM thô của đoạn phim Ice và Parkrun có thể xem ở phụ lục. Sở dĩ sử dụng bảng dữ liệu vì đồ thị không thể biểu diễn hết cho các bài so sánh.

VP8 không có sự khác biệt gì giữa cấu hình 9 và 10. Điều này chỉ ra rằng các tham số bộ lọc ARNR gần như không có tác dụng đối với dữ liệu đầu ra. Có 3 chế độ ARNR có thể có: trái sang phải, trên xuống dưới, trung tâm và được đánh số từ 1 tới 3 tương ứng. Hơn nữa, các bài so sánh thể hiện rằng không có kiểu nào có một độ lệch chuẩn từ các kiểu còn lại.

64 Vương Gia Thiết

Hình 4.17. So sánh mã hóa nội khung theo PSNR

Hình 4.18. So sánh mã hóa nội khung theo SSIM

Từ các kết quả so sánh, VP8 thể hiện chất lượng không thua kém gì so với H.264 Baseline, thậm chí còn hơn nhiều. Tuy nhiên so với H.264 High Profile, chất lượng VP8 của các đoạn phim trên web có độ phân giải trung bình hoàn toàn có thể so sánh được về mọi mặt. Như vậy, xét trên tổng thể thì VP8 thể hiện là một bộ mã hóa tốt trên băng thông thấp với độ phân giải trung bình.

65 Vương Gia Thiết

KẾT LUẬN

VP8 là một bộ mã hóa hình ảnh mạnh mẽ phù hợp cho cá nhân cũng như tổ chức để có thể thay thế cho H.264. Chất lượng của các đoạn phim trên web có độ phân giải trung bình hoàn toàn có thể so sánh được với H.264 về mọi mặt. So với H.264 Baseline, VP8 hơn hẳn về mặt chất lượng ở cùng một tốc độ bit. Thiết lập phần cứng của VP8 thì sẵn có và có thể đến với các điện thoại thông minh trong tương lai.

VP8 cho dù có cơ chế phân đoạn đơn giản hơn H.264 nhằm giảm sự mất tác dụng của việc lượng tử hóa và lựa chọn bộ lọc vòng thích nghi nhưng vẫn không thể chiến thắng được H.264 ở phân giải cao ví dụ như phân giải HD. Bộ mã hóa entropy của VP8 xấp xỉ với hiệu năng của bộ mã CABAC của H.264 mặc dù thiếu việc thích nghi sau mỗi bít. Việc dự đoán nội khung khá phức tạp nhưng cũng thể hiện tốt như của H.264 High trong các bài so sánh dự đoán nội khung.

Thiết lập hiện tại của bộ mã VP8, vpxenc, không chính xác định được tốc độ bít theo yêu cầu của người dùng và vì thế có thể mất đi tính thực thi khi có yêu cầu đặc biệt về băng thông. Thiết lập hiện tại chưa thể thể hiện được lợi thế của khung hình tham chiếu thay thế và có thể đạt lợi ích từ việc sử dụng các khung altref như khung B.

Hƣớng cải tiến cho VP8

VP8 rõ ràng có nhiều thuận lợi từ những cải tiến của nó. Do vậy để có thể cải thiện những khuyết điểm hiện tại, VP8 cần có một số cải tiến tập trung vào bộ tối ưu méo tốc độ, khung altref, và phân đoạn.

Cải tiến bộ tối ưu méo tốc độ:

Như đã nói ở trên, VP8 thiếu bộ tối ưu méo tốc độ chất lượng cao, dẫn đến các tốc độ bít thấp hơn so với yêu cầu. Hơn nữa, dường như là VP8 sử dụng băng thông một cách tùy ý. Để tốt hơn, VP8 nên sử dụng băng thông ở cuối các đoạn

66 Vương Gia Thiết

phim bởi vì điều này sử dụng ít băng thông để đạt được tốc độ bít trung bình mong muốn.

Sử dụng các khung tham chiếu phụ tốt hơn:

Việc cải tiến về mặt sử dụng các khung altref sẽ tăng hiệu quả nén lên đến 10% hoặc cao hơn, Hơn nữa, lựa chọn ẩn các khung altref là ý tưởng khá hay nhưng tất cả dữ liệu sẽ được thể hiện tại các header. Việc cải tiến sẽ cần nghiên cứu sâu hơn để làm sao sử dụng khung altref thật hiệu quả, còn không thì tốt nhất sử dụng chúng như B-frame.

Sử dụng phân đoạn tốt hơn:

Sự thiếu sót cơ bản của VP8 đối với phân giải HD là giới hạn của 4 phân đoạn nhằm thích nghi nhiều tham số với các vùng ảnh khác nhau. Chúng tôi tin rằng có thể tăng các khung altref để sử dụng như các đoạn phụ từ bộ mã hóa. Bộ mã hóa đưa ra một chuỗi khung với các nội dung giống nhau - một số trong đó sẽ được điều khiển dễ dàng bằng các khung dự đoán hướng đi và sử dụng khung altref nhằm dự đoán tỉ lệ khung lớn. Đối với mỗi đoạn trong khung hình được mã hóa, do có 4 đoạn nguồn có thể có từ khung altref, nên có 16 trường hợp dự đoán.

Đề xuất

Khả năng hỗ trợ và thiết kế của VP8 là thông dụng dù chưa thực sự hoàn thiện. Chất lượng của VP8 chỉ tốt hơn so với H.264 ở độ phân giải thấp và tốc độ bít thấp.

VP8 hoàn toàn có đủ khả năng để trở thành chuẩn nén ảnh có cấu hình phần cứng chất lượng cao và chi phí thấp vì VP8 có mã nguồn mở do Google cung cấp. Vì Google phát triển trên nền tảng của Android mà hiện đang là nền tảng dẫn đầu cho các dòng điện thoại thông minh, cho nên VP8 hoàn toàn có thể quảng bá và được sự hỗ trợ tốt nhất. VP8 hoàn toàn đánh bại H.264 Baseline ở các độ phân giải của dòng điện thoại thông minh ví dụ như iPhone. Vì vậy, điều này có thể tăng tốc độ phát triển của VP8 trên truyền hình hội nghị và xem phim trên web.

67 Vương Gia Thiết

VP8 có chất lượng trung bình với đoạn phim HD khi so sánh với H.264 High. Điều này chỉ ra rằng VP8 có độ trễ trong ứng dụng phim truyền hình mà H.264 đang là chuẩn chung.

68 Vương Gia Thiết

TÀI LIỆU THAM KHẢO

[1] Đề tài “Chuẩn mã hóa video tiên tiến H.264” Thạc sĩ Hoàng Văn Tú.

[2] H.264 and MPEG-4 Video Compression, Iain E. G. Richardson, The Robert Gordon University, Aberdeen, UK.

[3] Multi-Rate VP8 Video Encoding, Dag Haavi Finstad.

[4] Truyền thông đa phương tiện, Nguyễn Trung Thành.

[5] https://vi.wikipedia.org/wiki/M%C3%A3_h%C3%B3a_Huffman.

[6] https://en.wikipedia.org/wiki/Peak_signal-to-noise_ratio.

[7] R. A. Farrugia and C. J. Debono, “A Hybrid Error Control and Artifact Detection Mechanism for Robust Decoding of H.264/AVC Video Sequences,” Circuits and Systems for Video Technology, IEEE Transactions on, vol. 20, pp. 756–762, May 2010.

[8] An Analysis of VP8, a New Video Codec for the Web, Sean A. Cassidy, November, 2011.

[9] F. D. Simone, L. Goldmann, J.-s. Lee, T. Ebrahimi, and E. P. F, “Performance analysis of VP8 image and video compression based on subjective evaluations,” in SPIE Optics and Photonics, Applications of Digital Image Processing XXXIV, (San Diego), 2011.

[10] Tài liệu xử lý ảnh học viện Bưu chính viễn thông, 2006.

[11] Google, “VP8 Reference Implemenation libvpx,” 2014.

[12] Canalys, “Googles Android becomes the worlds leading smart phone platform,” 2011.

[13] Younghyeon Park, Hoyoung Lee, and Byeungwoo Jeon, “Performance Analysis of Open Web Video Codec VP8”, 2012.

[14] Dag Haavi Finstad, “Multi-Rate VP8 Video Encoding”, UNIVERSITY OF OSLO - Department of Informatics, 2011.

69 Vương Gia Thiết

[15] VideoLAN, “Open Source H.264 Implemenation x264,” 2011. [16] https://vi.wikipedia.org/wiki/H.264/MPEG-4_AVC.

[17] J. Bankoski, P. Wilkins, and Y. Xu, “Technical Overview of VP8, an Open Source Video Codec for theWeb,” 2011.

[18] http://webmproject.org/

70 Vương Gia Thiết

PHỤ LỤC Phụ lục A. Đoạn mã so sánh video

# ! /usr /bin /perl use Cwd;

use File::Basename ;

use File::Temp qw/tempfile /;

use Time::HiRes qw( gettimeofday tv_interval) ; my $QPSNR = “qpsnr”;

my $KEYFRAMES = “keyframes ” ;

my $ logfile = “$ENVfHOMEg/ thesis/results/raw”; my %info = ( vp8 => { bin => “vpxenc”, ext => “webm”, oflag => “ - o”, iflag => “-- threads=1”, builddir => “$ENVfHOMEg/build/libvpx-v0.9.6/ ”, bitrate_factor => 1.0,

passes => “--fpf=/tmp/vpxfp --passes=2 --pass=”, } ,

h264 => {

bin => ”x264 ”, ext => “mkv”, oflag => “-o”,

iflag => “--threads 1 --quiet –no-progress ”, builddi r => “$ENVfHOMEg/build/x264/” , bitrate_factor => 1000.0,

passes => “--stats /tmp/264fp --pass ”, }

71 Vương Gia Thiết

) ;

my $encoding = shift @ARGV; my $twopass = 0 ;

my $inputfile = shift @ARGV; my $outfile ;

my $basename ; my $index = 0 ;

if ( $encoding =˜ /ˆ jm$/i ) {

$outfile = shift @ARGV;

$basename = basename ($outfile) ;

$basename =˜ s / ˆ (. +) \. ([ ˆ .] ) +/$1 /; # truncate extension goto QPSNR;

}

if ($inputfile =˜ /ˆ twopass$/i ) {

$twopass = 1;

$inputfile = shift @ARGV;

print “Two pass enabled : \ “$inputfile \”\n” ; }

$index = shi f t @ARGV;

$basename = basename ( $inputfile) ;

$basename =˜ s / ˆ (. +) \ . ([ˆ .]) +/$1 /; # truncate extension $basename .= $index ;

$index = shift @ARGV;

$basename = basename ($inputfile) ;

$basename =˜ s / ˆ (. +) \. ( [ ˆ . ] ) +/$1 /; # truncate extension $basename .= $index ;

72 Vương Gia Thiết

my ( $seconds , $microseconds ) = gettimeofday ; my $enc output ;

if ( $twopass ) {

print “ Invoking : $enc->{bin} $enc->{passes}1 $tmp\n” ; system( “$enc->{bin} $enc->{passes}1 $tmp 2>&1” ) ; print “ Invoking : $enc->{bin} $enc->{passes}2 $tmp\n” ; $enc_output = „ $enc->{bi} $enc-{passe} 2 $tmp 2>&1‟; }

else {

print “ Invoking : $enc-->fbing $tmp\n” ; $enc output = „$enc->{bin} $tmp 2>&1„; }

my ($osec , $omicro) = gettimeofday ;

my $time = ( $osec - $seconds ) + ( $omicro - $microseconds ) / ( 1000.0 * 1000.0) ;

QPSNR:

my $psnr = „$QPSNR -a psnr -r $inputfile $outfile 2>/dev/null‟ ; my $ssim = „$QPSNR -a ssim -r $inputfile $outfile 2>/dev/null‟ ; my $keyframes = „$KEYFRAMES $outfile 2>/dev/null‟ ;

my @blines = split /\n/ , $psnr ; my @slines = split /\n/ , $ssim ; my @klines = split /\n/ , $keyframes ; my @psnr_stats ;

my @ssim_stats ;

open STATS, “ >” , “$basename . stats” or die “Can‟t open $basename . stats : $1 ” ; my ( $s , $k ) ;

73 Vương Gia Thiết

my @iframes ; # frames where there are key frames

# Average, Minimum, Maximum, Median, 1st Quartile, 3rdQuartile, Variance my $avg_ssim = my $min_ssim = my $max_ssim = my $med_ssim = my $fqt_ssim = my $tqt_ssim = my $var_ssim = 0.0 ;

my $avg_psnr = my $min_psnr = my $max_psnr = my $med_psnr = my $ fqt_psnr = my $tqt_psnr = my $ar_psnr = 0.0 ;

my $avg_num = scalar ( @slines ) - 1 ; foreach ( @blines ) { chomp ; print STATS $- ; $s = shift @slines ; $k = shift @klines ; chomp $s ; chomp $k ; s / ˆ .*, (.+) , $/$1 /; $s =˜ s / ˆ.*, (. +) , $/$1 /; if ( $k =˜ m/ ˆ (\d+) , n s*(\d+) $ /) { push @iframes , $1 if ( $2 > 0 ) ; } if ( $s =˜ m/ ˆ (\d + ( \.\d+) ? ) $/ && $s > 0 ) { push @ssim_stats , ( $s + 0.0 ) ;

# print “ssim: ” . ( $ssim_stats [ scalar ( @ssim_stats ) 1 ] ) . “psnr: ” ; $avg ssim += $s ;

}

if (/ ˆ (\d + ( \. \d+) ? ) $/ i && $_ > 0 ) {

74 Vương Gia Thiết

push @psnr_stats , ( $_ + 0.0 ) ;

# print “ ” . ( $psnr_stats [scalar ( @psnr_stats ) 1 ] ) . “ \n ” ; $avg_psnr += $_ ;

}

print STATS $s . “ , \ n” ; }

$keyframes = join „ : ‟ , @iframes ; # Join the list together

if (scalar ( @ssim_stats ) != scalar ( @psnr_stats ) || scalar ( @ssim_stats ) <= 0 ) {

print „SSIM: ” . scalar ( @ssim_stats ) .“ ”.“PSNR: ” . scalar (@psnr_stats) . ” \n”; my $max = scalar ( @ssim_stats ) ;

$max = scalar (@psnr_stats ) if ( scalar ( @psnr_stats ) > scalar ( @ssim_stats ) ) ; for ( my $i = 0 ; $i < $max ; $i ++) { print “ ” . ( $i + 1 ) . “ , ” ; if ( $i < scalar ( @psnr_stats ) ) { print $psnr_stats [ $i ] . “ , ” ; } else { print “XXX, ” ; } if ( $i < scalar ( @ssim_stats ) ) {

print $ssim_stats [$i] . “ , ” ; }

else {

75 Vương Gia Thiết

print “XXX, ” ; }

print “\n” ; }

die “ Size not equal” ; }

@ssim_stats = sort { $a <= > $b } @ssim_stats ; @psnr_stats = sort { $a <= > $b } @psnr_stats ; $avg_ssim /= scalar ( @ssim_stats ) ;

$avg_psnr /= scalar ( @psnr_stats ) ; $min_ssim = $ssim_stats [ 0 ] ; $min_psnr = $psnr_stats [ 0 ] ;

$max_ssim = $ssim_stats [ scalar ( @ssim_stats ) - 1 ] ; $max_psnr = $psnr_stats [ scalar ( @psnr_stats ) - 1 ] ; $med_ssim = $ssim_stats [ scalar ( @ssim_stats ) / 2 ] ; $med_psnr = $psnr_stats [ scalar ( @psnr_stats ) / 2 ] ; $fqt_ssim = $ssim_stats [ scalar ( @psnr_stats ) * 1 / 4 ] ; $fqt_psnr = $psnr_stats [ scalar ( @psnr_stats )*1 / 4 ] ; $tqt_ssim = $ssim_stats [ scalar ( @psnr_stats )*3 / 4 ] ; $tqt_psnr = $psnr_stats [ scalar ( @psnr_stats )*3 / 4 ] ; # Compute the variance, unbiased

# https://controls.engin.umich.edu/wiki/index.php/Basicstatistics:mean, median, # average

for ( my $i = 0 ; $i < scalar ( @ssim_stats) ; $i ++) {

$var_ssim += ( $ssim_stats [ $i ] $avg _ssim )* *2 ; $var_psnr += ( $psnr_stats [ $i ] $avg_psnr )* *2 ; }

76 Vương Gia Thiết

$var_psnr /= ( scalar ( @psnr_stats ) 1 ) ; # Log

open LOG, “ >>” , “ $logfile /$encoding . csv ” or die “Couldn‟t open $logfile /$encoding . csv : $ ! ” ; my $bitrate ;

if ( $encoding ! ˜ /ˆ jm$/ i ) {

$bitrate = „ mediainfo $outfile‟ ;

if ( $bitrate =˜ m / Bit\ srate \s +: \s ( \d+ \. ? \d*) \s ? ( \d+) ? \s ( Kbps | Mbps ) /) { $bitrate = “ $1$2 ” ; if( $3 eq ”Mbps” ) { $bitrate *= 1000; } } else { print “\n \n<<<<<< \n” ; print $bitrate ; print “ \n \n>>>>>>\n” ;

die “Couldn‟t parse out put for bitrate ” ; }

my $currdir = getcwd ;

chdir $enc ->{builddir} or die “Couldn‟t cd to ” . $enc ->{builddir} . ” : $!” ; my $gitnum = „git log 2>/dev/null | head -n 1 „ ;

chomp $gitnum ;

if ( length ( $gitnum ) < 5 ) {

77 Vương Gia Thiết # Error if ( $enc ->{builddir} =˜ m /v ( \d+ \. \d+ \. \d+) /) { $gitnum = $1 ; } else {

die “Couldn‟t get git commit or version string from path ” ; }

} }

my $cmdline = join “ ” , @ARGV;

$cmdline .= $enc ->{passes} . ”X” if $twopass ; print LOG “ $inputfile , $index , $gitnum , $time , ” . “$outfile , $cmdline , ” .

“$min_psnr, $fqt_psnr, $med_psnr, $ tqt_psnr, $max_psnr, $avg_psnr, $var_psnr,”. “$min_ssim, $fqt_ssim, $med_ssim, $tqt_ssim, $max_ssim, $avg_ssim, $var_ssim,”.

“ $bitrate, $keyframes \n” ; close LOG;

78 Vương Gia Thiết

Phụ lục B. Các bảng dữ liệu giá trị p theo t-test

Bảng B.1. Các giá trị p của đoạn phim cảnh thành phố 720p theo SSIM

H.264 Baseline với VP8 H.264 High với VP8

Kết quả tổng thể 1,284611 x 10-55 1,270864 x 10-06

Old Town Cross 0 0

Stockholm 3,224369 x 10-26 2,353832 x 10-21

Ducks Take Off 0,000152 4,746303 x 10-62

In to tree 3,765971 x 10-228 2,656876 x 10-104

Bảng B.2. Các giá trị p của đoạn phim cảnh đông ngoài trời 1080p theo SSIM

H.264 Baseline với VP8 H.264 High với VP8

Kết quả tổng thể 2,097634 x 10-14 4,684079 x 10-05

Một phần của tài liệu Nghiên cứu về định dạng nén video VP8 (Trang 63 - 79)

Tải bản đầy đủ (PDF)

(79 trang)