Dans les applications pour travailler avec des images, la tĂąche de redimensionner les jeeps (images compressĂ©es Ă l'aide de l'algorithme JPEG) est assez courante. Dans ce cas, vous ne pouvez pas redimensionner immĂ©diatement et vous devez d'abord dĂ©coder les donnĂ©es d'origine. Il n'y a rien de compliquĂ© et de nouveau Ă cela, mais si vous devez le faire plusieurs millions de fois par jour, l'optimisation des performances d'une telle solution, qui devrait ĂȘtre trĂšs rapide, est particuliĂšrement importante.

Ce problĂšme est souvent rencontrĂ© lors de l'organisation de l'hĂ©bergement Ă distance pour un rĂ©fĂ©rentiel d'images, car la plupart des appareils photo et des tĂ©lĂ©phones prennent des photos au format JPEG. Chaque jour, les archives photo des principaux services Web (rĂ©seaux sociaux, forums, hĂ©bergement de photos et bien d'autres) sont reconstituĂ©es avec un nombre important de ces images, de sorte que la question de savoir comment stocker ces images est extrĂȘmement importante. Pour rĂ©duire la taille du trafic sortant et amĂ©liorer le temps de rĂ©ponse Ă la demande d'un utilisateur, de nombreux services Web stockent des dizaines de fichiers pour une seule image dans diffĂ©rentes rĂ©solutions. La vitesse de rĂ©ponse est bonne, mais ces copies prennent beaucoup de place. Il s'agit d'un problĂšme majeur, bien qu'il existe d'autres inconvĂ©nients Ă cette approche.
L'idĂ©e de rĂ©soudre ce problĂšme n'est pas de stocker sur le serveur beaucoup d'options pour l'image originale dans diffĂ©rentes rĂ©solutions, mais de crĂ©er dynamiquement l'image souhaitĂ©e avec les dimensions donnĂ©es Ă partir de l'original prĂ©parĂ© prĂ©cĂ©demment, et le plus rapidement possible. Ainsi, en temps rĂ©el, vous pouvez crĂ©er une image de la rĂ©solution souhaitĂ©e et l'envoyer immĂ©diatement Ă l'utilisateur. Il est trĂšs important que la rĂ©solution de cette image puisse ĂȘtre effectuĂ©e immĂ©diatement afin que l'appareil de l'utilisateur ne redimensionne pas l'Ă©cran, car cela ne sera tout simplement pas nĂ©cessaire.
L'utilisation de formats autres que JPEG comme base pour l'organisation d'un tel rĂ©fĂ©rentiel d'images ne semble pas justifiĂ©e. Bien sĂ»r, il existe des formats standard largement utilisĂ©s qui offrent une meilleure compression avec la mĂȘme qualitĂ© (JPEG2000, WebP), mais la vitesse d'encodage et de dĂ©codage de ces images est trĂšs faible par rapport au JPEG, il est donc logique de choisir JPEG comme format de base pour stocker les photos originales, qui, si nĂ©cessaire, sera mis Ă l'Ă©chelle en temps rĂ©el aprĂšs rĂ©ception d'une demande de l'utilisateur.
Bien sĂ»r, en plus des jeeps, chaque site a le plus souvent des images PNG et GIF, mais gĂ©nĂ©ralement leur nombre relatif est petit et les photos dans ces formats sont extrĂȘmement rares. Par consĂ©quent, ces formats n'auront pas d'impact significatif sur la tĂąche en question dans la plupart des cas.
Description de l'algorithme de redimensionnement à la volée
Ainsi, les donnĂ©es d'entrĂ©e sont des fichiers JPEG et pour obtenir un dĂ©codage rapide (cela est vrai Ă la fois pour le CPU et le GPU), les images compressĂ©es doivent avoir des marqueurs de redĂ©marrage intĂ©grĂ©s. Ces marqueurs sont dĂ©crits dans la norme JPEG et une partie des codecs peut fonctionner avec eux, les autres savent comment ne pas les remarquer. Si les jeeps n'ont pas de tels marqueurs, ils peuvent ĂȘtre ajoutĂ©s Ă l'avance Ă l'aide de l'utilitaire jpegtran. Lorsque des marqueurs sont ajoutĂ©s, l'image ne change pas, mais la taille du fichier devient lĂ©gĂšrement plus grande. En consĂ©quence, nous obtenons le schĂ©ma de travail suivant:
- Obtenez des données d'image de la mémoire du processeur
- S'il y a un profil de couleur, obtenez-le dans la section EXIF ââet enregistrez
- Copiez l'image sur la carte vidéo
- Décoder JPEG
- Nous faisons un redimensionnement selon l'algorithme de Lanczos (diminution)
- Netteté
- Nous encodons l'image en utilisant JPEG
- Copier l'image sur l'hĂŽte
- Ajoutez le profil de couleur d'origine au fichier résultant.
Vous pouvez prendre une décision plus précise lorsque, avant le redimensionnement, le gamma inverse est superposé à chaque composant du pixel de sorte que le redimensionnement soit dans un espace linéaire, puis appliquez à nouveau le gamma, mais aprÚs le sharpe. La différence réelle pour l'utilisateur est faible, mais elle existe, et le coût de calcul d'une telle modification est minime. Il suffit d'insérer la superposition du gamma inverse et direct dans le schéma de traitement général.
Il existe Ă©galement une solution possible lorsque le dĂ©codage des jeeps est effectuĂ© sur un processeur multicĆur Ă l'aide de la bibliothĂšque libjpeg-turbo. Dans ce cas, chaque image est dĂ©codĂ©e dans un flux CPU sĂ©parĂ© et toutes les autres actions sont effectuĂ©es sur la carte vidĂ©o. Avec un grand nombre de cĆurs de processeur, cela peut se produire encore plus rapidement, mais il y aura une sĂ©rieuse perte de latence. Si la latence lors du dĂ©codage d'une jeep sur un seul cĆur de processeur est acceptable, cette option peut ĂȘtre trĂšs rapide, en particulier dans le cas oĂč les jeeps d'origine ont une petite rĂ©solution. Au fur et Ă mesure que la rĂ©solution de l'image d'origine augmente, le temps de dĂ©codage de la jeep dans un flux de processeur augmente, de sorte que cette option ne peut convenir qu'aux petites rĂ©solutions.
Exigences de base pour la tĂąche de redimensionnement Web
- Il est conseillé de ne pas stocker des dizaines de copies de chaque image dans différentes résolutions sur le serveur, mais de créer rapidement l'image souhaitée avec la bonne résolution dÚs la réception de la demande. Ceci est important pour réduire la taille du stockage, sinon vous devrez stocker de nombreuses copies différentes de chaque image.
- Le problĂšme doit ĂȘtre rĂ©solu le plus rapidement possible. Il s'agit d'une question sur la qualitĂ© du service fourni en termes de rĂ©duction du temps de rĂ©ponse Ă une demande de l'utilisateur.
- La qualitĂ© de l'image envoyĂ©e doit ĂȘtre Ă©levĂ©e.
- La taille du fichier pour l'image envoyĂ©e doit ĂȘtre aussi petite que possible et sa rĂ©solution doit correspondre exactement Ă la taille de la fenĂȘtre dans laquelle elle apparaĂźt. Les points suivants sont importants ici:
a) Si la taille de l'image ne correspond pas Ă la taille de la fenĂȘtre, l'appareil utilisateur (tĂ©lĂ©phone, tablette, ordinateur portable) effectuera un redimensionnement matĂ©riel aprĂšs dĂ©codage avant d'afficher l'image Ă l'Ă©cran. Dans OpenGL, ce redimensionnement matĂ©riel se fait uniquement selon l'algorithme bilinĂ©aire, ce qui provoque souvent l'apparition de moirĂ© (taches) et d'autres artefacts dans les images contenant de petits dĂ©tails.
b) Le redimensionnement de l'écran consomme en outre l'énergie de l'appareil.
c) Si vous utilisez une série d'images pré-mises à l'échelle pour résoudre le problÚme, il n'est pas toujours possible d'obtenir exactement la bonne taille, ce qui signifie que vous devrez envoyer une image d'une résolution plus élevée. L'augmentation de la taille de l'image entraßne davantage de trafic, ce que j'aimerais également éviter.
Description du programme général de travail
- Nous recevons des images des utilisateurs dans tous les formats et dans toutes les résolutions. Les originaux sont stockés dans une base de données distincte (si nécessaire).
- Hors ligne, à l'aide d'ImageMagick ou d'un logiciel similaire, enregistrez le profil de couleurs, convertissez les images originales originales au format BMP ou PPM standard, puis redimensionnez-les en résolution 1K ou 2K et compressez en JPEG, puis ajoutez les marqueurs de redémarrage avec l'intervalle fixe spécifié à l'aide de l'utilitaire jpegtran.
- Nous composons une base de données de ces images 1K ou 2K.
- DĂšs rĂ©ception d'une demande de l'utilisateur, nous obtenons des informations sur l'image et la taille de la fenĂȘtre oĂč cette image doit ĂȘtre affichĂ©e.
- Nous trouvons l'image dans la base de données et l'envoyons au resizer.
- Le redimensionneur reçoit le fichier image, décode, redimensionne, tranchant, encode et insÚre le profil de couleur d'origine dans la jeep résultante. AprÚs cela, il donne l'image à un programme externe.
- Sur chaque carte vidéo, vous pouvez exécuter plusieurs threads et installer plusieurs cartes vidéo sur votre ordinateur, ce qui permet une mise à l'échelle des performances.
- Tout cela peut ĂȘtre fait sur la base de cartes vidĂ©o NVIDIA Tesla (par exemple, P40 ou V100), car les cartes vidĂ©o NVIDIA GeForce ne sont pas conçues pour un fonctionnement continu Ă long terme, et NVIDIA Quadro a de nombreuses sorties vidĂ©o qui ne sont pas nĂ©cessaires dans ce cas. Pour rĂ©soudre ce problĂšme, les exigences de taille de mĂ©moire GPU sont minimales.
- De plus, à partir de la base de données avec des images préparées, vous pouvez allouer dynamiquement un cache pour les fichiers fréquemment utilisés. Là , il est logique de stocker les images fréquemment utilisées selon les statistiques de la période précédente.

ParamĂštres du programme
- Largeur et hauteur de la nouvelle image. Ils peuvent ĂȘtre quelconques et il vaut mieux les dĂ©finir explicitement.
- Mode d'amincissement JPEG (sous-échantillonnage). Il existe trois options: 4: 2: 0, 4: 2: 2 et 4: 4: 4, mais ils utilisent généralement 4: 4: 4 ou 4: 2: 0. La qualité maximale est de 4: 4: 4, la taille d'image minimale est de 4: 2: 0. L'amincissement est effectué pour les composants de différence de couleur, que la vision d'une personne ne perçoit pas aussi bien que la luminance. Chaque mode de décimation a son propre intervalle optimal pour que les marqueurs de redémarrage atteignent la vitesse de codage ou de décodage maximale.
- Qualité de compression JPEG et mode de décimation lors de la création d'une base de données d'images.
- La nettetĂ© se fait dans une fenĂȘtre 3x3, le sigma (rayon) peut ĂȘtre contrĂŽlĂ©.
- Qualité de compression JPEG et mode de décimation lors du codage de l'image finale. Typiquement, une qualité d'au moins 90% signifie que cette compression est "visuellement sans perte", c'est-à -dire les utilisateurs non formés ne devraient pas voir les artefacts de l'algorithme JPEG dans des conditions de visualisation standard. On pense que pour un utilisateur formé, 93 à 95% sont nécessaires. Plus cette valeur est élevée, plus la taille de la trame envoyée à l'utilisateur est grande et plus le temps de décodage et de codage est long.
Limitations importantes
Redémarrez les marqueurs. Nous pouvons décoder rapidement des images JPEG sur une carte vidéo uniquement s'il y a des marqueurs de redémarrage à l'intérieur. Dans la norme JPEG officielle, ces marqueurs sont décrits, il s'agit d'un paramÚtre standard. S'il n'y a pas de marqueurs de redémarrage, il est impossible de paralléliser le décodage de l'image sur la carte vidéo, ce qui entraßnera une vitesse de décodage trÚs faible. Par conséquent, nous avons besoin d'une base de données d'images préparées dans lesquelles se trouvent ces marqueurs.
Algorithme fixe pour le codec d'image. Le décodage et l'encodage d'images à l'aide de l'algorithme JPEG est de loin l'option la plus rapide.
La rĂ©solution des images dans la base de donnĂ©es prĂ©parĂ©e peut ĂȘtre quelconque, mais comme options, nous considĂ©rerons 1K et 2K (vous pouvez prendre 4K). Vous pouvez Ă©galement faire non seulement une diminution, mais Ă©galement une augmentation des images lors du redimensionnement.
Performance de redimensionnement rapide
Nous avons testĂ© l'application pour un redimensionnement rapide Ă partir du SDK Fastvideo sur la carte vidĂ©o NVIDIA Tesla V100 (OS Windows Server 2016, 64 bits, pilote 24.21.13.9826) sur des images 24 bits 1k_wild.ppm et 2k_wild.ppm avec une rĂ©solution de 1K et 2K (1280x720 et 1920x1080). Des tests ont Ă©tĂ© effectuĂ©s pour un nombre diffĂ©rent de threads s'exĂ©cutant sur la mĂȘme carte vidĂ©o. Cela ne nĂ©cessite pas plus de 110 Mo de mĂ©moire sur la carte vidĂ©o par flux. 4 flux ne nĂ©cessitent pas plus de 440 Mo.
Tout d'abord, nous compressons l'image originale en JPEG avec une qualité de 90%, avec un amincissement 4: 2: 0 ou 4: 4: 4. Ensuite, nous décodons et redimensionnons 2 fois en largeur et en hauteur, faisons une netteté, puis encodons à nouveau avec une qualité de 90% à 4: 2: 0 ou 4: 4: 4. Les données source sont en RAM, l'image finale y est placée.
Le temps de fonctionnement est compté à partir du début du chargement de l'image d'origine de la RAM jusqu'à l'enregistrement de l'image traitée dans la RAM. Le temps d'initialisation du programme et l'allocation de mémoire sur la carte vidéo ne sont pas inclus dans les mesures.
Exemple de ligne de commande pour une image 1K 24 bits
PhotoHostingSample.exe -i 1k_wild.90.444.jpg -o 1k_wild.640.jpg -outputWidth 640 -q 90 -s 444 -sharp_after 0,95 -repeat 200
Benchmark pour le traitement d'une image 1K dans un thread
Décodage (y compris le transfert de données vers la carte vidéo): 0,70 ms
Redimensionner deux fois (en largeur et en hauteur): 0,27 ms
Sharp: 0,02 ms
Encodage JPEG (y compris le transfert de données depuis la carte vidéo): 0,20 ms
Temps total par trame: 1,2 msPerformance pour 1K
| La qualité | Amincissement | Redimensionner | Streams | Fréquence d'images (Hz) |
1 | 90% | 4: 4: 4/4: 2: 0 | 2 fois | 1 | 868/682 |
2 | 90% | 4: 4: 4/4: 2: 0 | 2 fois | 2 | 1039/790 |
3 | 90% | 4: 4: 4/4: 2: 0 | 2 fois | 3 | 993/831 |
4 | 90% | 4: 4: 4/4: 2: 0 | 2 fois | 4 | 1003/740 |
Performance pour 2K
| La qualité | Amincissement | Redimensionner | Streams | Fréquence d'images (Hz) |
1 | 90% | 4: 4: 4/4: 2: 0 | 2 fois | 1 | 732/643 |
2 | 90% | 4: 4: 4/4: 2: 0 | 2 fois | 2 | 913/762 |
3 | 90% | 4: 4: 4/4: 2: 0 | 2 fois | 3 | 891/742 |
4 | 90% | 4: 4: 4/4: 2: 0 | 2 fois | 4 | 923/763 |
L'amincissement 4: 2: 0 pour l'image source réduit la vitesse, mais la taille des fichiers source et de destination diminue. Lors du passage à 4: 2: 0, le degré de parallélisme diminue de 4 fois, car maintenant le bloc 16x16 est considéré comme une seule unité, donc dans ce mode, la vitesse est inférieure à celle de 4: 4: 4.
Les performances sont principalement déterminées par l'étape de décodage JPEG, car à ce stade, l'image a la résolution maximale et la complexité de calcul de cette étape de traitement est plus élevée que toutes les autres.
Résumé
Les rĂ©sultats des tests ont montrĂ© que pour la carte vidĂ©o NVIDIA Tesla V100, la vitesse de traitement des images 1K et 2K est maximale lorsque 2 Ă 4 flux sont lancĂ©s en mĂȘme temps, et varie de 800 Ă 1 000 images par seconde par carte vidĂ©o. Le traitement des images 1K est plus rapide que 2K, et travailler avec des images 4: 2: 0 est toujours plus lent qu'avec 4: 4: 4. Pour obtenir le rĂ©sultat final sur les performances, vous devez dĂ©terminer avec prĂ©cision tous les paramĂštres du programme et l'optimiser pour un modĂšle spĂ©cifique de la carte vidĂ©o.
Une latence de l'ordre d'une milliseconde est un bon rĂ©sultat. Ă notre connaissance, une telle latence ne peut pas ĂȘtre obtenue pour une tĂąche de redimensionnement similaire sur le processeur (mĂȘme s'il n'est pas nĂ©cessaire de coder et de dĂ©coder les jeeps), c'est donc un autre argument important en faveur de l'utilisation de cartes vidĂ©o dans des solutions de traitement d'image hautes performances.
Jusqu'Ă 16 cartes graphiques NVIDIA Tesla V100 peuvent ĂȘtre nĂ©cessaires pour traiter un milliard de jeeps par jour avec des rĂ©solutions 1K ou 2K. Certains de nos clients utilisent dĂ©jĂ cette solution, tandis que d'autres la testent dans leurs tĂąches.
Le redimensionnement des jeeps sur une carte vidĂ©o peut ĂȘtre trĂšs utile non seulement pour les services Web. Il existe un grand nombre d'applications de traitement d'image hautes performances oĂč de telles fonctionnalitĂ©s peuvent ĂȘtre demandĂ©es. Par exemple, un redimensionnement rapide est souvent nĂ©cessaire pour presque tous les schĂ©mas de traitement des images reçues des camĂ©ras avant d'afficher une image sur un moniteur. Cette solution peut fonctionner pour Windows / Linux sur n'importe quelle carte graphique NVIDIA: Tegra K1 / X1 / X2 / Xavier, GeForce GT / GTX / RTX, Quadro, Tesla.
Avantages d'une solution de redimensionnement rapide sur une carte graphique
- Réduction significative de la taille de stockage des images sources
- Réduire les coûts primaires pour les coûts d'infrastructure (matériel et logiciel)
- Amélioration de la qualité de service grùce au temps de réponse court
- Réduction du trafic sortant
- Consommation d'énergie réduite sur les appareils des utilisateurs
- Fiabilité et rapidité de la solution présentée, qui a déjà été testée sur d'énormes ensembles de données
- Temps de développement réduit pour commercialiser de telles applications pour Linux et Windows
- ĂvolutivitĂ© d'une solution qui peut fonctionner Ă la fois sur une seule carte vidĂ©o et dans le cadre d'un cluster
- Retour sur investissement rapide pour de tels projets
Qui peut ĂȘtre intĂ©ressĂ©
La bibliothĂšque pour le redimensionnement rapide des jeeps peut ĂȘtre utilisĂ©e dans les services Web trĂšs chargĂ©s, les grandes boutiques en ligne, les rĂ©seaux sociaux, les systĂšmes de gestion de photos en ligne, le commerce Ă©lectronique, dans presque tous les logiciels de gestion des grandes entreprises.
Les développeurs de logiciels peuvent utiliser cette bibliothÚque, qui fournit une latence de l'ordre de plusieurs millisecondes pour redimensionner les jeeps avec une résolution de 1K, 2K et 4K sur une carte vidéo.
Apparemment, cette approche peut s'avérer plus rapide que la solution NVIDIA DALI pour le décodage rapide des jeeps, le redimensionnement et la préparation d'images au stade de la formation des réseaux de neurones pour le Deep Learning.
Que peut-on faire d'autre
- En plus du redimensionnement et de la netteté, vous pouvez ajouter un recadrage à l'algorithme existant, faire pivoter 90/180/270, appliquer un filigrane, contrÎler la luminosité et le contraste.
- Optimisation de la solution pour les cartes vidéo NVIDIA Tesla P40 et V100.
- Décodeur JPEG de performance d'optimisation supplémentaire.
- Mode rafale pour décoder les jeeps sur une carte vidéo.