Releases: NyxAwroo/IMG-Dataset-Refiner
v4.3
📝 Changelog - IMG Dataset Refiner
v4.3.2 Pro (UI/UX — Panels thématiques, Favoris repositionnés, double toggle latéral, Recette IA durcie)
Cette mise à jour est principalement esthétique et ergonomique, plus une correction comportementale ciblée sur la génération de recette globale par IA. Aucune logique métier critique n'a été touchée. La structure Gradio reste fonctionnellement identique à v4.3.1, ce qui préserve la stabilité acquise sur les onglets et la galerie.
🤖 Recette IA : filtre strict + triggers en tête + extraction n-grams (correction comportementale)
Symptôme corrigé : le bouton 🤖 Remplir par IA depuis les captions pouvait renvoyer une recette polluée par des phrases descriptives complètes recopiées par le LLM (typiquement les sorties VLM type "The image is a close-up portrait of a woman with..."). Au lieu de mots-clés courts, on obtenait des pavés inutilisables comme recette globale. Second cas non couvert au début : pour des captions en prose pure (sans virgules type tag, comme les sorties brutes des VLM type "The image shows a young man lying on the beach with his tentacles wrapped around his body. He is wearing a black wet suit..."), aucun mot-clé n'était extrait du tout — l'IA n'avait quasiment rien à choisir.
Causes identifiées :
_shared_caption_candidatessplittait les captions sur la virgule sans valider la longueur — une description sans virgule devenait un seul "tag" géant rejeté ensuite, donc zéro candidat exploitable.- Le prompt envoyé au LLM autorisait implicitement les phrases longues.
- Le parser
_parse_ai_recipe_tagsfiltrait par appartenance àallowed_tagsmais sans contrôle de format. - Le trigger word/concept n'était pas explicitement placé en tête.
Corrections apportées :
- Nouveau filtre
_is_valid_keyword(tag)(constantesKEYWORD_MAX_WORDS = 6,KEYWORD_MAX_CHARS = 50) appliqué à la fois côté candidats et côté parser. Rejette : phrases > 6 mots, tournures VLM (The image,appears to,is wearing,il y a,on voit,porte un, etc.), fragments terminés par un point. - Nouvelle fonction
_detect_trigger_words(dataset, candidates)qui repère les triggers LoRA (patterns leetspeakD4lle,photosh00tsP0ses-S2, identifiants à underscoremy_concept,ohwx_man) en début de captions, et les épingle en première position de la recette générée, indépendamment de ce que renvoie le LLM. - Nouveau : extracteur de n-grams (1, 2 et 3 mots)
_extract_keyword_ngrams(caption)qui fonctionne sur les captions en prose pure (sorties VLM non structurées). Découpe la caption en phrases via la ponctuation, tokenise, retire les stopwords bilingues FR/EN (the,is,a,on,le,la,est,dans...) et extrait toutes les séquences continues de tokens utiles. Sur une caption comme"The image shows a young man lying on the beach with his tentacles wrapped around his body. He is wearing a black wet suit...", l'extracteur produit désormais :young man,beach,tentacles,black wet suit,wet suit,purple,cloudy sky,dark,mysterious, etc. Avec plusieurs captions du même dataset, ces n-grams sont comptés inter-images, ce qui fait remonter naturellement les concepts vraiment partagés en tête de la liste de candidats envoyée au LLM. - Les deux passes (split par virgule + extraction n-grams) sont fusionnées dans
_shared_caption_candidates. Aucune régression sur le formattag1, tag2, tag3historique — il continue de fonctionner exactement comme avant, le n-gram ajoute juste de la matière quand la prose est pure. - Prompt LLM entièrement réécrit : règles strictes numérotées, exemple de bonne réponse, exemple de mauvaise réponse, mention explicite du nombre maximum de mots par tag, interdiction des verbes conjugués de description, et injection des triggers détectés en hint.
candidate_limitétendu (max(limit * 5, 120)au lieu demax(limit * 4, 80)) pour que le LLM voie davantage de contexte sur les concepts distinctifs rares.
Résultat attendu sur les deux scénarios problématiques :
- Dataset Dalle (format tags) :
D4lle, Dall-e style, AI generated, romantic atmosphere, dramatic lighting, portrait, dark background, ...au lieu d'un pavé contenant des phrases entières recopiées. - Dataset tentacles (format prose VLM) : à partir d'un ensemble de captions descriptives, l'IA reçoit maintenant les n-grams
young man,wet suit,black wet suit,tentacles,purple tentacles,cloudy sky,dark,mysterioustriés par fréquence inter-images, et peut produire une vraie recette globale.
Le trigger (s'il existe) est forcé en tête, les phrases descriptives sont systématiquement rejetées, et l'analyse repart automatiquement derrière comme avant grâce au .success() qui clique hidden_calc_btn.
🧹 Déduplication intelligente de la recette finale (anti-doublons)
Symptôme corrigé : le LLM produisait parfois des recettes contenant des variantes du même concept ou des inclusions évidentes, par exemple D4lle, AI, AI generated, Dall-e, Dall-e style — 5 entrées dont 3 redondantes.
Corrections apportées :
- Nouvelle fonction
_normalize_tag_for_dedup(tag)qui rapproche les variantes orthographiques : minuscules, suppression de la ponctuation interne (tirets, underscores, espaces), normalisation pluriel (portraits→portrait,photoshoots→photoshoot) et leetspeak (0→o, 1→i, 3→e, 4→a, 5→s, 7→t). Résultat :D4lle,Dall-eetDallese normalisent tous endalleet sont reconnus comme identiques. - Nouvelle fonction
_are_orthographic_variants(a, b, threshold=0.82)qui utilisedifflib.SequenceMatchersur les formes normalisées. Seuil prudent (82 %) pour ne pas fusionner des concepts vraiment distincts commestudio lightingvsdramatic lighting. - Nouvelle fonction
_deduplicate_recipe(tags, freq_lookup)qui applique 3 passes : doublons exacts, variantes orthographiques (mergées en gardant la variante la plus fréquente sur le dataset), et inclusion stricte d'un tag court "générique" dans un tag plus long. La liste_GENERIC_SHORT_TAGScouvre les mots trop vagues pour rester seuls quand une version spécifique existe :ai,art,photo,image,man,woman,body,style,look,mood, etc. —darkn'y est pas car il garde sa valeur même à côté dedark mysterious. - Règle 7 ajoutée au prompt LLM : interdiction explicite des doublons, avec exemples (
AI+AI generated,Dall-e+Dall-e style,D4lle+Dall-e). - L'assemblage final récupère un pool large (triggers + IA + fallback × 3) puis déduplique, puis coupe à
limit— garantit que la recette demandée a bien le bon nombre de mots-clés après dédup, et non avant.
Résultat démontré sur le cas exact rapporté :
- Avant :
D4lle, AI, AI generated, Dall-e, Dall-e style - Après :
D4lle, AI generated, Dall-e style
Concepts distincts préservés (testé) :
dark+dark mysterious→ tous deux gardés (darkn'est pas générique)purple+purple tentacles→ tous deux gardésstudio lighting+dramatic lighting→ tous deux gardés (vraiment différents)D4lle+Dall-e style→ tous deux gardés (similarité 67 %, sous le seuil)
🎨 Encarts colorés thématiques (CSS uniquement)
Cinq zones fonctionnelles reçoivent un fond semi-transparent et un liseré gauche coloré, pour aider l'œil à comprendre instantanément à quel groupe d'usage appartient chaque bloc :
- 🟡 Jaune —
#dataset_header: chargement du dataset (chemin, Parcourir, drop zone, Charger, et désormais Favoris). - 🔵 Bleu —
#recipe_header: recette globale (charger / sauver / supprimer recette, mots-clés, IA). - 🟢 Vert —
#left_panel: galerie & sélection. - 🟣 Violet — bloc Serveur et Modèles Locaux dans l'onglet Assistant IA Local (via une nouvelle classe
panel-purpleposée sur la colonne existante). - 🟦 Cyan —
#right_panel: bibliothèque de mots (Mass Batch).
Les couleurs sont assez transparentes (6 à 12 %) pour rester confortables sur un thème sombre, et chaque panneau réagit légèrement au survol pour renforcer la lisibilité du groupe actif sans distraire.
⭐ Section Favoris déplacée dans la zone Chargement (jaune)
La section Favoris se trouvait précédemment en bas de la colonne Recette globale (bleue), ce qui était trompeur : un favori est un dataset rapide à recharger, pas une recette. Le bloc Accordion Favoris (dropdown + boutons Ajouter / Retirer) a donc été remonté dans #dataset_header, juste après le bouton Charger le Dataset. Les variables, événements et fichier favorites.json sont inchangés ; seule la position visuelle change.
📂 Volet pliable pour l'Assistant de Traduction
L'Assistant de Traduction (onglet Visualiseur & Édition) — l'ancien gr.Group devient un gr.Accordion fermé par défaut, habillé d'un liseré rouge léger pour rappeler la zone rouge de la maquette. Le contenu (moteur, langues, bouton de traduction complète, insertion rapide) reste strictement identique.
▶ Toggle latéral droit pour la Bibliothèque
La précédente tentative en accordion vertical a été remplacée par un toggle horizontal symétrique au bouton ◀ Masquer la Galerie déjà présent.
- Nouveau bouton
Masquer la Bibliothèque ▶ajouté en haut du panneau central, à côté du toggle gauche, sur une mêmegr.Row(#panel_toggles_row). - Mécanisme identique à celui de la galerie : un petit JS ajoute / retire la classe
collapsedsur#right_panel, déclenchant une transition CSS de largeur vers 0 et une opacité 0. - La zone centrale (visualiseur, captions, onglets) s'étend dynamiquement à droite, comme elle le fait déjà à gauche. Les couleurs cyan du panneau droit sont neutralisées en mode replié pour ne pas laisser de bordure résiduelle.
- Symétrie esthétique : le bouton de gauche po...
IMG Dataset Refiner v4
📝 Changelog - IMG Dataset Refiner
v4.0 Pro (Mise à jour d'Ergonomie et de Productivité)
Cette mise à jour se concentre sur l'accélération radicale du flux de travail manuel et la fiabilisation de l'interface face aux limitations strictes de Gradio 4.
📚 Nouveau : Bibliothèque de mots (Mass Batch Custom)
- Module 100% sur mesure : Remplacement de l'ancien tableau par une liste cliquable personnalisée (HTML/JS) immunisée contre les blocages de Gradio.
- Sélection visuelle : Les mots cochés s'illuminent en orange instantanément.
- Édition de masse : Nouveaux modes pour Ajouter, Retirer ou Remplacer des mots spécifiques sur toute une sélection d'images d'un seul clic.
- Mise à jour en temps réel : L'application de la bibliothèque rafraîchit immédiatement l'éditeur de texte et la galerie visuelle.
🌍 Traduction Avancée & Live
- Aperçu Live Natif : Le visualiseur de traduction en temps réel utilise désormais un composant natif stylisé en CSS (vert) pour une stabilité parfaite.
- Traduction Globale : Nouveau bouton permettant de traduire l'intégralité du caption actuel vers l'anglais et de le sauvegarder automatiquement.
- Analyse contextuelle : Le traducteur lit désormais la phrase entière au lieu de la découper mot à mot, garantissant une meilleure détection de la langue de départ (ex: lumière traduit correctement en light).
✨ UI, UX & Navigation
- Navigation "Mains sur le clavier" : Ajout des raccourcis PageUp et PageDown pour passer à l'image précédente/suivante sans jamais perdre le focus de frappe dans la zone de texte.
- Tri Dynamique : Ajout d'une option au-dessus de la galerie pour trier les images par ordre alphabétique croissant (A-Z) ou décroissant (Z-A).
- Interface "Desktop" : Suppression forcée par CSS des en-têtes et pieds de page natifs de Gradio (menu hamburger) pour une interface plus propre et immersive. La barre "Recette Globale" a été rapatriée en haut de l'écran.
🛠️ Correctifs & Optimisations (Gradio 4)
- Backups Intelligents : Le script ne génère plus de fichiers .bak inutiles si le fichier .txt d'origine est complètement vide.
- Contournement de Sécurité JS : Les événements onclick bloqués par Gradio ont été remplacés par un système global d'attributs data-idx couplé à un horodatage (Date.now()), garantissant une réactivité parfaite aux clics.
- Fenêtres de confirmation : Réparation des pop-ups JavaScript de confirmation (Batch & Undo) qui faisaient perdre les données en mémoire sous Gradio 4.
- Internationalisation (100%) : Tous les nouveaux modules, alertes Javascript et messages système sont désormais liés aux fichiers fr.json et en.json pour une bascule linguistique instantanée et totale.
v3
📝 Changelog - IMG Dataset Refiner (v3.0 Pro)
This major update transforms the tool into a true professional Data Engineering suite for AI models. It brings visual analysis capabilities, automated image processing, and local Artificial Intelligence assistance.
🤖 AI New Features (Local Assistant via API)
- Ollama / LM Studio Integration: Native support to run language models (LLM) and vision models (VLM) directly on the dataset via local API.
- Auto-Tagging / Super OCR (VLM): Full generation of captions or precise extraction of text embedded in the image.
- Reality Check & Hallucination Hunter (VLM): The AI compares text to the image and automatically removes tags describing invisible elements.
- Concept Isolator (VLM): The AI describes the environment and ignores the central subject, ideal for preparing training data for character LoRAs.
- Visual Translator (Booru ↔ Natural): Intelligent conversion of tag lists into fluent complete sentences (optimized for Flux and SD3).
- Tag Sorting & Standardization: Restructuring tags by order of importance and automatic correction of semantic errors.
- Custom Prompt & Templates: Ability to create your own AI queries (with the {tags} variable), choose the injection mode (Replace, Add) and save your own AI recipes.
- Advanced Error Management: The tool silently ignores API crashes/timeouts on certain images to continue batch processing, and generates a detailed final report.
- Semantic Bias Analysis: Generation of a detailed report by an LLM on the quality and potential biases of your dataset.
🖼️ Pre-processing & Image New Features
- Visual Duplicate Tracking (Perceptual Hashing): New scanner powered by ImageHash capable of detecting near-identical images (even if cropped or resized). Side-by-side interface for easy deletion.
- Mass Resizing & Formatting: Fast conversion of an entire folder (e.g., to 1024x1024 in WebP) via Pillow.
- Smart Face Crop (OpenCV): Intelligent crop option that detects faces to automatically center the crop around the main subject.
- Automatic Alpha Management: Automatic conversion of transparent backgrounds (PNG) into pure white backgrounds, a required standard for training.
- Batch Renaming: Built-in tool to rename all images and their associated .txt files with a common prefix.
🧬 Analytics & UX New Features
- Name Change: "Datasets Images EditSelect" officially becomes "IMG Dataset Refiner".
- Intellisense (Autocomplete): Injection of a native JavaScript script in the viewer. The tool now automatically suggests existing keywords from your dataset while typing!
- Co-occurrence Matrix (Concept Bleeding): New interactive Plotly chart to spot if two tags (e.g., a character and a clothing item) appear together too often.
- Resolution Analyzer (Bucketing): New scatter plot to check the dimension distribution of your images against standard training "buckets".
- Exclusion Matrix (Anti-Heatmap): List of ultra-frequent tags that are never associated, to detect gaps in the dataset.
- Logical Contradiction Hunter: Offline verification script that flags glaring inconsistencies (e.g., day and night on the same image).
- Onboarding & Contextual Tools: Added quick start guide dropdown menus and interactive tooltips to guide new users.
v2
📝 Changelog - Datasets Images EditSelect (v2.0)
This major update focuses on ergonomics, execution speed (workflow), and full compatibility with the new versions of Gradio (v4+). The application transitions from a classic clickable tool to a truly ultra-responsive "desktop-like" software.
🚀 Major Features
- Selection System Overhaul (Windows Style): * Image selection no longer causes the gallery to blink (100% JavaScript processing).
- Support for [Ctrl + Click] to add/remove individual images.
- Support for [Shift + Click] to select a complete range of images at once.
- Support for [Ctrl + A] to select everything instantly.
- Fix: A single click now instantly displays the image in the viewer while resetting the selection.
- Context Menu (Right Click): * Added a native flyout menu on gallery images for quick actions without moving the mouse: Save, Add to stats, Clear selection.
- Silent Save (Auto-Save): * No more need to click "Save". When navigating to another image (via arrows or click), the tool detects changes to the caption and automatically saves the file in the background (creating a .bak security backup).
⚡ Ergonomics & Tables ("Excel-like")
- Indestructible Drag & Drop: Rewrote the Drag & Drop system in the recipe tables to withstand Gradio 4's dynamic reloads.
- "Excel-like" Editing:
- A single click on a table cell simulates a double-click and instantly selects all the text. Typing a new number overwrites the old one without needing to use the Backspace key.
- Smart Swap 2.0: If a tag's priority is changed to an already occupied number, the old tag automatically takes the vacant spot (zero duplicates). Added protection against out-of-bounds indices.
- Quick Input Panel: Added dropdown menus under the recipe table to instantly change priorities and targets.
- Movement buttons: Added ⬆️ Move Up, ⬇️ Move Down, and 🗑️ Delete buttons to reorganize the table without using the mouse.
⌨️ Keyboard Shortcuts (Secured)
- AZERTY/QWERTY Independence: Shortcuts now use e.code to guarantee they work regardless of the keyboard language.
- New shortcuts:
- [Alt + Up/Down Arrow]: Move the selected row in the table.
- [Ctrl + F]: Place the cursor directly in the search bar.
- Dynamic legend: Added an insert reminding the shortcuts under the image viewer, updated according to the chosen language (FR/EN).
🐛 Bug Fixes (Gradio 4+ fixes)
- Keyword infinite loop: Statistics calculation no longer triggers on every typed letter, but only when typing a comma ,, hitting the Enter key, or leaving the box. No more unwanted deletions!
- HTML highlighting bug ("Background"): Fixed a flaw where keywords (like "background" or "color") corrupted the HTML <mark> tag used for highlighting. The Regex engine now processes the longest words first and in a single pass.
- Ghost buttons (Gradio 4): Replaced visible=False with CSS display: none !important for Python/JS synchronization buttons, as Gradio 4 was completely destroying DOM elements, making scripts inoperative.
- CivitAI copy button: Removed the obsolete parameter show_copy_button=True which caused crashes on launch, and generated a purely formatted Markdown table instead.
- col_count warning: Updated the deprecated parameter col_count to column_count for a clean terminal.
- Startup bug: Secured interface functions (MSG[lang].get) to prevent KeyError: None crashes if Gradio initialization occurs before the languages are fully loaded.
🌍 Internationalization
- Complete update of the fr.json and en.json files to integrate instructions related to Drag & Drop, new keyboard shortcuts, and automatic saving.