Test de floutage par manipulation des données JPEG... et suite!

J’ai avancé aujourd’hui sur l’application d’un floutage par manipulation directe des données JPEG.

Je rappelle que la compression JPEG traite les images par petits blocs de 8x8 pixels.

J’ai tiré parti de cette caractéristique pour:

  • extraire une zone à flouter en la limitant aux limites alignés tous les 8 pixels
  • réduire la quantité d’information au minimum: un bloc se retrouve avec tous ses pixels d’une couleur
  • remplacer les blocs correspondants dans l’image d’origine

L’avantage:

  • aucune décompression / recompression de l’image, qui dégrade la qualité de celle-ci et qui nécessite des calculs (donc du CPU)

Voici un exemple, appliqué sur l’image que sort YOLO avec les objets détectés et le taux de confiance.

Ceci permet de mieux repérer les zones floutées:

Tout se fait à l’aide de jpegtran avec les options “crop” et drop", qui sont un peu comme un copier coller, et “scans” qui permet de réduire la quantité d’informations et donc d’obtenir de gros pâtés uniformes de 8x8.

Voici le code magique…

#! /bin/bash

# blur JPEG pictures by manipulating JPEG MCU (8x8 pixels blocks)

ORIGINAL=$1
OUT=$2
W=$3
H=$4
X=$5
Y=$6

TMP=/dev/shm/$BASHPID.jpg

jpegtran -crop "$W"x"$H"+"$X"+"$Y" "$1" | jpegtran -scans scans.txt > $TMP
jpegtran -drop +"$X"+"$Y" $TMP "$1" > $TMP-
mv $TMP- $2
rm $TMP

Vous pouvez voir toute une série ici : https://label-studio.cquest.org/projects/5/data?tab=7

Cela va servir à repérer les images avec des faux négatifs (floutages absents) afin d’améliorer le prochain entraînement, mais on verra ça un peu plus tard :wink:

1 « J'aime »

Côté perfs… un petit test sur un série de 145 images:

  • 51s pour la détection d’objets
  • 13s pour le floutage

Cela donne environ 2 images traitées par seconde.

J’ai bien avancé sur l’API de floutage basée sur notre modèle entraîné et le floutage par manipulation de blocs JPEG.

Avec 1 GPU (Tesla P4 ou GTX 1070), on arrive à traiter 8 à 10 images par seconde.
Avec les 2 GPU, cela monte à 16 images par seconde.

Le modèle actuel permet d’avoir 5 threads dans un GPU avec 8Go de RAM.

Il y a encore quelques pistes d’optimisation à explorer, mais un peu plus complexes.

Plus de détails ci-dessous, car les tests sont faits sur la future infra de l’instance OpenStreetMap France :

API testable par exemple avec:

http --f POST https://api.cquest.org/blur/ picture@original.jpg -d -o blurred.jpg

2 « J'aime »

Pour faciliter des tests… j’ai mis en place un formulaire minimaliste qui permet d’envoyer une photo et d’avoir en retour la version floutée :

https://api.cquest.org/blur/

Un message a été scindé en un nouveau sujet : Exemples de résultat de floutage