Lors d'un dernier article (FFMPEg2Theora, guide par l'exemple), j'ai utilisé une méthode visuelle subjective pour comparer la qualité d'encodage de deux vidéos. En poussant un peu plus mes recherches sur le sujet, je suis tombé sur le projet Qpsnr qui propose une méthode analytique basée sur le calcul des mesures PSNR ou SSIM sur les vidéos. Nous allons donc voir comment installer le logiciel, puis l'utiliser sur des vidéos de test encodées avec des paramètres différents.
Définition des mesures PSNR et SSIM
PSNR
" PSNR (sigle de Peak Signal to Noise Ratio) est une mesure de distorsion utilisée en image numérique, tout particulièrement en compression d'image. Il s'agit de quantifier la performance des codeurs en mesurant la qualité de reconstruction de l'image compressée par rapport à l'image originale. " (source Wiki)
Valeurs entre 0 (vidéos différentes) et l'infini (vidéos identiques). C'est une échelle logarithmique.
SSIM
" SSIM (Structural SIMilarity) est une mesure de similarité entre deux images numériques. Elle a été développée pour mesurer la qualité visuelle d'une image compressée, par rapport à l'image originale. L'idée de SSIM est de mesurer la similarité de structure entre les deux images, plutôt qu'une différence pixel à pixel comme le fait par exemple le PSNR. L'hypothèse sous-jacente est que l'œil humain est plus sensible aux changements dans la structure de l'image. " (source Wiki)
Valeurs entre 0 (vidéos différentes) et 1 (vidéo identique).
Installation de Qpsnr
Le logiciel est en cours de développement, lors de mes tests, j'ai remarqué qu'il plantait assez souvent sur mon portable qui ne dispose que de 1 Go de RAM, par contre il est relativement stable sur mon PC desktop (sous GNU/Linux Ubuntu 9.04) qui dispose de 4 Go de RAM.
La procédure pour installer le logiciel:
sudo aptitude install g++ libavcodec-dev libswscale-dev libavformat-dev mkdir qpsnr cd qpsnr wget http://qpsnr.youlink.org/data/qpsnr_0.2.1.tar.bz2 bzip2 -d qpsnr_0.2.1.tar.bz2 tar xvf qpsnr_0.2.1.tar make sudo scp qpsnr /usr/local/bin/
Utilisation de Qpsnr
L'utilisation du logiciel se fait en ligne de commande, il faut disposer de la vidéo originale (la source à partir de laquelle les autres vidéos ont été encodées et la base de comparaison) et les vidéos encodées. Comme le logiciel utilise la librairie libavcodec, tous les codecs reconnus par votre système d'exploitation peuvent être utilisés.
Par exemple pour comparer deux vidéos (source.vob et encoder.mp4) en utilisant la mesure PSNR:
qpsnr -a avg_psnr -r source.vob encoder.mp4
Un autre exemple pour comparer trois vidéos (source.vob, encoder-HQ.mp4 et encoder-LQ.mp4) en utilisant la mesure SSIM:
qpsnr -a avg_ssim -r source.vob encoder-HQ.mp4 encoder-LQ.mp4
On obtient en sortie un fichier de données au format texte (les données étant séparées par des virgules). On a une ligne toutes les 25 images (donc environ toutes les secondes pour une vidéo à 25 fps) et 3 colonnes. La première colonne donne le numéro de la frame, la seconde la valeur PSNR (ou SSIM) pour les 25 dernières images de la première vidéo encodée, la troisième la valeur PSNR (ou SSIM) pour les 25 dernières images de la deuxième vidéo encodée...
Exemple pour une sortie de mesure PSNR sur 3 vidéos:
25,48.8008,44.482,43.0306,
50,48.2734,43.5805,41.6518,
75,48.1068,43.5727,41.6081,
100,48.0688,43.6024,41.5615...
Comparaison du paramétrage du codec H.264
Nous allons illustrer l'utilisation de Qpsnr pour comparer l'impact des paramètres du codec H.264 (cliquer ici pour avoir une procédure d'installation de la dernière version de l'encodeur x264) sur une vidéo d'exemple, un extrait du film Big Buck Bunny en MPEG-2 TS 1080p (que j'ai récupéré sur le site suivant). Avant d'appliquer les opérations suivantes, je l'ai transformé dans un format MPEG-2 PS à 1080p/24 fps à partir de Avidemux (MPEG-2 Requant: valeur 1.0, filtre Resample fps: valeur 24.0, conteneur MPEG2-PS). Attention, de l'avis de son auteur, Qpsnr est très sensible au fait que les vidéos à comparer est le même nombre d'images par seconde. Il utilise la librairie libavcodec qui est assez sensible sur ce point pour certains codecs.
J'ai ensuite encodé la vidéo au format H.264, en utilisant un script maison testvideocodec.sh (basée sur l'encodeur x264) et ceci dans trois configurations (si vous souhaitez affiner les paramètres d'encodage il faut éditer le script):
- HQ: --tune animation --crf 20 --psnr --ssim
- MQ: --tune animation --crf 25 --psnr --ssim
- LQ: --tune animation --crf 30 --psnr --ssim
./testvideocodec.sh big_buck_bunny_1080p_mpeg2_extract.mpg
On se retrouve donc avec les fichiers suivants:
Taille Compression Fichier
335316992 N/A ...mpeg2_extract.mpg
37432211 1/9 ...HQ-x264.mp4
19240731 1/17 ...MQ-x264.mp4
10750710 1/31 ...LQ-x264.mp4
On lance ensuite le script testvideoquality.sh qui va comparer les 3 vidéos (HQ, MQ et LQ) par rapport à l'original (big_buck_bunny_1080p_mpeg2_extract.mpg). Il va générer les fichiers de données .psnr et .ssmi ainsi que des graphes GNUPlot correspondants:
./testvideoquality.sh big_buck_bunny_1080p_mpeg2_extract.mpg
On obtient les résultats suivants:
Valeurs données par x264 Valeurs données par Qpsnr PSNR SSIM PSNR SSIM Fichiers - - - - ...mpeg2_extract.mpg 46.1 0.990 40.4 0.966 ...HQ-x264.mp4 43.4 0.984 38.7 0.960 ...MQ-x264.mp4 40.7 0.973 36.8 0.950 ...LQ-x264.mp4
Ainsi que les graphes suivants montrant l'évolution des mesures PSNR et SSIM à travers le temps (valeurs données par Qpsnr):
PSNR / SSIM
Conclusion
Nous avons posés les bases d'une méthode analytique pour la comparaison de la qualité de vidéos. Cela ouvre la porte à la comparaison automatique de codecs et/ou de paramétrages de ces codecs. L'utilisation du logiciel est encore un peu délicate, il y a ici un beau projet de développement d'une interface graphique permettant de simplifier les taches données dans cet article.
Avant de conclure, je voudrai remercier Emanuel Oriani (l'auteur de Qpsnr) pour son support réactif dans l'utilisation de son logiciel.
46,4 0.989