Miniprojet: indices

Miniprojet: indices

by Jean-Philippe Pellet -
Number of replies: 2

Bonjour,

Voici quelques indices concernant le miniprojet sur la base des questions auxquelles nous avons répondu ces deux dernières semaines.

Les fonctions to_grayscale et apply_kernel n'ont pas le droit de modifier l'image qu'elles reçoivent en paramètre. Elles doivent les deux créer une nouvelle image (de même taille) via la fonction new_image_grey et retourner cette nouvelle image.

Si vous avez des soucis parce que np.sqrt doit prendre des racines de valeurs négatives et qu'il y a une erreur ou un avertissement dans le terminal, cela signifie qu'il y a un overflow dans la représentation intermédiaire de sobel_x² + sobel_y². Pour régler ceci, allez modifier dans la fonction new_image_grey de miniprojectutils.py cette ligne:

      return np.zeros((height, width), dtype=np.int16)

pour avoir ceci à la place:

      return np.zeros((height, width), dtype=np.int32)

Cela réserve 32 bits par pixel, ce qui sera suffisant à tous les coups pour stocker ces valeurs intermédiaires.

Si votre code est très lent (plus de 15-20 secondes juste pour apply_kernel par exemple), c'est fort probablement que votre fonction clamp_index fait trop de travail. (Elle n'a pas besoin de créer de liste, notamment!) Attention également que votre clamp_index retourne toujours une valeur: si d'aventure elle retourne None et que vous utilisez ce None comme index, vous aurez des surprises dans vos valeurs de retour.

Attention au (a) de find_seam: vous devez créer une liste de liste de PixelData, où chaque cellule aura sa valeur par défaut, qui sera modifiée au (b) et (c). Une valeur par défaut de PixelData s'obtient avec simplement PixelData(). Mais vous devez faire créer une telle valeur pour chaque pixel de l'image que vous traitez. Vous ne pouvez pas en créer une seule et ensuite l'insérer x fois dans une liste, car cette liste pointera alors x fois vers la même instance de PixelData. En fait, c'est un cas de figure très similaire à ce que nous avions fait à la semaine 5 pour créer une matrice n × m qui contenait de 0 partout — sauf qu'ici, ce ne sont pas des 0, mais des PixelData().

Quand vous avez quelque chose qui fonctionne, vous pouvez modifier à l'envi votre fonction seam_carving, mais les fonctions que vous avez eu à implémenter vous (rgb_to_grey, to_grayscale, clamp_index, apply_kernel et find_seam) doivent faire le travail tel que décrit ces deux dernières semaines (n'optimisez par exemple pas find_seam de manière à déjà supprimer le seam de l'image passée en paramètre). Pour tester votre code, nous allons en effet appeler ces fonctions directement (sans passer par seam_carving), et il faut qu'elles fonctionnent comme décrit.

Bonne suite de travail,

Jean-Philippe Pellet

In reply to Jean-Philippe Pellet

Re: Miniprojet: indices

by Jean-Philippe Pellet -
En complément à mon dernier message: j'ai uploadé dans la section de la semaine passée les fichiers de résultats attendus pour le miniprojet. Cela vous sert à comparer votre output.

Dans chaque fichier zip (un par image d'input), vous trouvez:
  • grey.jpg — le résultat de to_greyscale
  • smooth.jpg — le résultat du lissage
  • sobel — le résultat après l'application du filtre Sobel
  • highlight_{0,1}.jpg et highlight_{0,1}_grey.jpg — les images montant les deux premiers seams trouvés
  • step_{0,199,399}.jpg — trois images montrant le résultat après l'itération 0, 199 et 399 (selon le code de base, vous êtes censés vous arrêter à 199, mais ça peut être intéressant de voir ce que ça donne avec deux fois plus de pixels enlevés pour montrer les limites du système)
  • {highlights,highlights_grey,steps}.mp4 — trois vidéos qui sont le montage des images intermédiaires correspondantes

Encore une fois, ne vous mettez pas martel en tête si votre résultat n'est pas 100%, pixel par pixel, le même que celui qui est attendu, il peut y avoir de petites différences d'implémentation qui donnent des résultats légèrement différents, comme discuté au cours (choix entre plusieurs seams équivalents, représentations intermédiaires, arrondis…) et, pour autant que l'implémentation de vos fonctions suivent les consignes, vous ne serez pas pénalisés pour ça, le cas échéant.

Meilleures salutations,

Jean-Philippe Pellet
In reply to Jean-Philippe Pellet

Re: Miniprojet: indices

by Jean-Philippe Pellet -
Un indice supplémentaire: certains d'entre vous ont un overflow quand vous cherchez le seam, sur la ligne qui calcule la nouvelle énergie nécessaire pour arriver sur un pixel comme la comme du pixel parent optimal et de l'énergie du pixel en question, potentiellement comme ceci:

  cells[...][...].min_energy + img_grey[..., ...]

Pour corriger ce problème, faites plutôt ceci:

  cells[...][...].min_energy + int(img_grey[..., ...])

La raison est que la première version utilise un int de numpy, qui peut avoir un overflow, alors que la seconde utilise un int Python, qui n'a pas d'overflow.