Aller au contenu

[Projet] Script d'automatisation du stacking avec Siril - Retour d'expérience & aide au debug


Messages recommandés

Posté

Bonjour à tous,

 

Je travaille actuellement sur un script d'automatisation pour le traitement d'images astro (EAA/SaaS). Le but est de créer un pipeline "tout-en-un" qui prend des fichiers brutes en entrée et sort une image finale, sans intervention humaine, et que je compte utiliser dans un SaaS que je développe depuis quelques mois. Je me suis dis que je pouvais partager la partie empilement car elle peut être utilisée de façon indépendante de mon SaaS.

 

Le concept : Le script scanne un répertoire, identifie les caméras/filtres via les headers FITS, associe les bons masters (darks/flats/bias) et orchestre siril-cli pour le pré-traitement, l'alignement et l'empilement.

Le script est fait en langage Python, et soucis: je suis principalement un développeur PHP/Symfony/NuxtJS de métier....du coup python est un peu galère :D (pourquoi y a pas d'accolade, de point-virgules...pourquoi ce langage plante en cas de mauvaise indentation raaaah ).

Je rencontre une difficulté technique récurrente sur certains jeux de données (notamment sur des séquences typées "CLEAR" ou avec des configurations spécifiques) : une erreur Reading sequence failed dans les logs de Siril. Malgré plusieurs tentatives de normalisation des noms de fichiers, le pipeline perd parfois le fil entre l'étape de calibration et de pré-traitement.

 

Je recherche des personnes qui aimerait bien le tester (avec leurs propres données par exemple) et qui saurait m'aider à régler ce problème avec siril-cli entre les fonctions `calibrate` et `preprocess`., ainsi que fixer le fond que je trouve trop clair (dès que je modifie les arguments de `subsky` ça part en cacahouète...)

 

Le code est disponible ici : Github

Merci d'avance pour vos conseils, vos tests et retours ^^.

 

Je vous fournis 3 exemples d'images que j'ai réussi à générer

- M16, 40 lights prises en CLEAR par un collègue de mon club astro

- M1 en SHO

- NGC2359 en HOO

Les sources de M1 et NGC2359 ont été prises sur ce lien

 

 

m16_20260604-161938_full.jpg

m1_20260605-131304_full.webp

ngc2359_20260605-131539_full.webp

Posté

J'ai reussi à debug le probleme des fichiers .seq non trouvés. Je me focalise maintenant sur les traitements de qualité de rendus et de couleurs.
Par exemple pour le subsky, voici ma fonction
 

def get_subsky_command(
    master_dark_path: str = None,
    master_flat_path: str = None,
    master_bias_path: str = None
) -> str:
    """
    Adjust subsky parameters according to the available calibration quality.
    Optimized to clean residual vignetting in corners in the absence of Flat,
    while preserving the center of the image (no dark halo).
    """

    missing = []
    if not master_dark_path: missing.append("dark")
    if not master_flat_path: missing.append("flat")
    if not master_bias_path: missing.append("bias")

    has_flat = "flat" not in missing
    nb_missing = len(missing)

    # Base parameters depending on flat availability
    if has_flat:
        base_cmd = 'subsky -rbf'
        common_params = '-smooth=0.4 -samples=50'
        tolerance = 1.2 if nb_missing == 0 else 1.4
        return f'{base_cmd} -tolerance={tolerance} {common_params}'
    else:
        base_cmd = 'subsky'
        degree = 3
        if nb_missing == 1:
            tolerance, smooth, samples = 1.4, 0.70, 60
        elif nb_missing == 2:
           tolerance, smooth, samples = 1.5, 0.75, 65
        else:  # nb_missing == 3
            tolerance, smooth, samples = 1.6, 0.85, 70
        return f'{base_cmd} {degree} -tolerance={tolerance} -smooth={smooth} -samples={samples}'

En fonction du nombre de DOF présentsles valeurs changent.

Le résultat avec M16 (40 lights CLEAR + un master dark) & M1 en Sho. Je n arrive pas à comprendre ces especes de cercles présent aussi dans les .fit compilés.

 

m16_20260610-101809_full.thumb.webp.22911186b75e19ec465491565b259b95.webp

m1_20260610-103830_full.webp

Posté (modifié)
il y a 9 minutes, HamHam a dit :

J'ai reussi à debug le probleme des fichiers .seq non trouvés. Je me focalise maintenant sur les traitements de qualité de rendus et de couleurs.
Par exemple pour le subsky, voici ma fonction
 

def get_subsky_command(
    master_dark_path: str = None,
    master_flat_path: str = None,
    master_bias_path: str = None
) -> str:
    """
    Adjust subsky parameters according to the available calibration quality.
    Optimized to clean residual vignetting in corners in the absence of Flat,
    while preserving the center of the image (no dark halo).
    """

    missing = []
    if not master_dark_path: missing.append("dark")
    if not master_flat_path: missing.append("flat")
    if not master_bias_path: missing.append("bias")

    has_flat = "flat" not in missing
    nb_missing = len(missing)

    # Base parameters depending on flat availability
    if has_flat:
        base_cmd = 'subsky -rbf'
        common_params = '-smooth=0.4 -samples=50'
        tolerance = 1.2 if nb_missing == 0 else 1.4
        return f'{base_cmd} -tolerance={tolerance} {common_params}'
    else:
        base_cmd = 'subsky'
        degree = 3
        if nb_missing == 1:
            tolerance, smooth, samples = 1.4, 0.70, 60
        elif nb_missing == 2:
           tolerance, smooth, samples = 1.5, 0.75, 65
        else:  # nb_missing == 3
            tolerance, smooth, samples = 1.6, 0.85, 70
        return f'{base_cmd} {degree} -tolerance={tolerance} -smooth={smooth} -samples={samples}'

En fonction du nombre de DOF présentsles valeurs changent.

Le résultat avec M16 (40 lights CLEAR + un master dark) & M1 en Sho. Je n arrive pas à comprendre ces especes de cercles présent aussi dans les .fit compilés.

 

m16_20260610-101809_full.thumb.webp.22911186b75e19ec465491565b259b95.webp

m1_20260610-103830_full.webp

 

Hello @HamHam

 

Je n'ai pas testé ton script mais je pense que ces cercles sont dus au fait que l'image sur laquelle tu travailles est en 16 bits (au lieu de 32).

Ce genre de chose est très caractéristique d'une plage de valeurs trop limité pour afficher correctement une image linéaire. 

 

Nico

Modifié par nico1038
  • J'aime 1
Posté

J ai ajouté une détection si 16 ou 32 bits sur le premier light et je l'applique sur `save "../stacked_{filter_name}.fit" -format=XX` mais pour le moment ça n'a pas l'effet escompté 

Je joins deux logs (y a énormement de blabla dedans, mais le contenu du script .ssf généré est en début de log).

m16.logm1.log

Posté (modifié)
Il y a 2 heures, HamHam a dit :

J ai ajouté une détection si 16 ou 32 bits sur le premier light et je l'applique sur `save "../stacked_{filter_name}.fit" -format=XX` mais pour le moment ça n'a pas l'effet escompté 

Je joins deux logs (y a énormement de blabla dedans, mais le contenu du script .ssf généré est en début de log).

m16.log 203.98 Ko · 1 download m1.log 4.51 Mo · 0 downloads

 

Je ne suis pas sûr de comprendre ce que tu veux dire? Les lights brutes sont en 16 bits, ça c'est normal. Par contre, dès que tu empiles quelques images alors la profondeur de 16 bits n'est plus suffisante et le fichier empilé doit alors être sauvegardé en 32 bits pour ne pas perdre d'information.

 

Donc par exemple sur M16, ton fichier stacked_CLEAR.fit doit absolument être sauvegardé en 32 bits.

 

Si tu pouvais partager le fichier, je pourrais vérifier mais je suis a peu prés sûr que le fonde de ciel de ton image représente seulement une poignée de valeur discrètes et c'est ce qui provoque ces artefacts lorsque tu retires le gradient.

 

Modifié par nico1038
Posté

Salut,

 

Je viens d'essayer ton script et ça marche bien, pas problème avec le fond de ciel pour moi.

Pour sauvegarder en 32bit c'est dans les préférences Siril, options FITS. Peut-être ajouter la commande set32bits dans le script Siril.

 

J'ai quand même fait deux petites modification pour que ça marche :

- ajouter "setext fit" à la création du script de stack parce que j'ai .fits par défaut et il ne trouvait pas les fichiers après preprocess. C'est peut-être l'erreur que tu as entre preprocess et calibrate ?

- pour register, remplacer -weight_from_noise par -weight=noise pour que ça marche avec Siril 1.4.

 

En tout cas merci pour ton travail :)

Rejoignez la conversation !

Vous pouvez répondre maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous pour poster avec votre compte.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   1 membre est en ligne

×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.