Communitygithub.com

starx1n9/video-watermark-remover-skill

Supprimez les logos fixes, les bugs d'angle, les filigranes et les sous-titres incrustés des vidéos localement avec ProPainter video inpainting. Détection automatique, prévisualisation du masque, correction, contrôle qualité et livraison. Déclenchement : «去掉视频里的 logo/角标/台标/水印» / «去字幕» / «把片头片尾的商标去掉» / «remove watermark/logo/subtitles from video».

Qu'est-ce que video-watermark-remover-skill ?

Cette compétence permet de supprimer des logos fixes, des bugs d'angle, des filigranes et des sous-titres incrustés dans des vidéos en utilisant ProPainter, un modèle de inpainting vidéo. Elle fonctionne uniquement sur les éléments dont la position ne change pas dans la vidéo. Le workflow complet comprend la détection automatique de l'élément à supprimer, la création d'un masque (ROI) que l'utilisateur doit confirmer visuellement, l'inpainting via ProPainter (utilisant le GPU NVIDIA, recommandé 4 Go+ VRAM), le contrôle qualité avec des métriques numériques (résidus, scintillement, coutures, erreurs hors zone) et une inspection visuelle des images par pages. Elle génère une vidéo nettoyée, des images avant/après, et un document de coordonnées pour repositionner un nouveau logo ou sous-titres. Les limites incluent l'absence de suivi automatique pour les logos mobiles ou les sous-titres non centrés ; dans ces cas, l'utilisateur doit fournir des plages temporelles et utiliser des options manuelles. La compétence est conçue pour les plateformes locales (Python, ffmpeg, PyTorch) et nécessite une configuration initiale via des scripts dédiés.

Compatible avec✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/starx1n9/video-watermark-remover-skill/tree/HEAD/skills/video-watermark-remover

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Suppression de logo / sous-titres de vidéo (video-watermark-remover)

Utilise ProPainter pour restaurer les logos, bugs d'angle et sous-titres fixes (incrustés dans la vidéo) en découpant uniquement la ROI autour de l'élément, en la restaurant, puis en la réincorporant avec un fondu. Les pixels en dehors de la ROI restent intacts.

⚠ La licence de ProPainter est S-Lab License 1.0 : usage non commercial uniquement. Pour un usage commercial, contactez les auteurs. Utilisez-le uniquement sur des contenus dont vous avez le droit de modifier.

0. Environnement (première utilisation)

Les scripts se trouvent dans scripts/. Le répertoire de travail doit être celui du skill (celui contenant SKILL.md).

python scripts/setup_env.py      # Vérifie ffmpeg / PyTorch (CUDA), clone une version figée de ProPainter, génère config.json
python scripts/selftest.py       # Synthétise une vidéo de test, exécute le pipeline complet, compare avec la vérité terrain, affiche PASS/FAIL
  • Si config.json n'existe pas, setup_env.py indique ce qui manque et comment l'installer. PyTorch nécessite que l'utilisateur installe la version CUDA adaptée à sa carte graphique.
  • Ne poursuivez pas si l'auto-test échoue ; corrigez d'abord l'environnement.
  • Ci-dessous, python fait référence à l'interpréteur indiqué dans config.json (celui utilisé lors de setup).

Ce que l'utilisateur doit fournir

ÉlémentObligatoireDescription
Fichier vidéo✅Une ou plusieurs vidéos
Élément à supprimer✅Description en langage naturel : "logo en haut à gauche", "gros logo au centre", "sous-titre en bas"
Indice de positionOptionnelNécessaire uniquement si plusieurs éléments de même nature existent
Plage temporelleOptionnelPar défaut, détection automatique ; nécessaire uniquement si vous voulez conserver une partie
Intention ultérieureÀ suggérerNouveau logo, nouveau sous-titre, sous-titre avec fond. Si fond, un simple flou suffit (pas de restauration)

Ne posez pas de questions sur les options non nécessaires.

Limites (à vérifier avant de commencer ; prévenez l'utilisateur si dépassé)

  • ✅ Logo fixe, bug d'angle, semi-transparent, fondu, étiré dans les transitions.
  • ✅ Sous-titres fixes, centrés horizontalement, sur une seule ligne (incrustés), blancs ou foncés, avec ou sans ombre.
  • ⚠️ Logo mobile ou zoomant, sous-titres défilants, multi-lignes, non centrés : le script ne peut pas les suivre automatiquement. L'utilisateur doit fournir des plages temporelles, et utiliser --block/--grow-from manuellement ; le résultat sera moins bon.
  • ⚠️ Les textes originaux de la scène (panneaux, inscriptions à l'écran) superposés à l'élément à supprimer seront également effacés. Prévenez l'utilisateur dans la liste de reconnaissance.
  • Nécessite un GPU NVIDIA, 4 Go+ VRAM de préférence. CPU possible mais très lent.

Pipeline (8 étapes, ordre strict)

Les fichiers intermédiaires sont placés dans un répertoire temporaire $W. Le résultat final est placé à côté de la vidéo source, les images de contrôle qualité dans <dossier_vidéo>/qc/.

1. Détection

python scripts/probe.py IN1.mp4 [IN2.mp4] --out-dir $W

Analyse des images clés pour déterminer :

  • Où se trouve l'élément.
  • S'agit-il d'un bug d'angle ou d'un grand logo central.
  • Y a-t-il un fondu (noter l'intervalle d'affichage stable du logo), des fondus au noir, un zoom ou un flou de transition.
  • Y a-t-il des sous-titres.

2. Localisation (logo statique)

python scripts/locate_static.py --video IN1.mp4@début_stable:fin_stable [--video IN2.mp4@a:b] --out-dir $W
  • Les images de début et de fin doivent éviter les fondus, les noirs et les transitions.
  • Pour le même logo présent dans plusieurs vidéos, transmettez-les ensemble. Le script ne retient que les pixels qui sont immobiles dans toutes les vidéos, ce qui élimine les zones immobiles accidentelles de l'arrière-plan.
  • Consultez static_rel.png (plus c'est noir, plus c'est immobile). Déterminez la boîte englobante --box et le seuil : logo plein → 0,3–0,5 ; logo semi-transparent → 0,6–0,75.

3. Création du masque et validation obligatoire par l'utilisateur

Logo statique :

python scripts/mask_logo.py --rel $W/static_rel.npy --box x0,y0,x1,y1 --thresh 0,5 \
    [--block rectangle] [--clear zone --block zone] --preview IN1.mp4@image [--preview IN2.mp4@image] --out-dir $W
  • Pour les éléments fins (texte, rayons, lignes) tracez lettre par lettre, en laissant l'arrière-plan réel entre les traits pour que le modèle ait des références.
  • Utilisez --block rectangle uniquement dans deux cas : bloc plein massif, ou petit texte trop fin pour être tracé correctement (par exemple une petite ligne anglaise).
  • ❌ Ne couvrez pas entièrement un élément fin avec un bloc. Si la caméra s'approche lentement, la zone couverte n'aura presque plus d'arrière-plan visible, le modèle devra générer du contenu, ce qui produit des motifs en "écailles".
  • Vérifiez sur l'aperçu que les bords et les extrémités de l'élément ne sont pas omis. Les parties omises seront entraînées lors de la restauration, laissant une traînée colorée.

Sous-titres :

python scripts/mask_subtitle.py IN.mp4 --out-dir $W [--rows y0,y1] [--dark] [--shadow 0,0]
  • Sans --rows, le script détecte automatiquement les lignes dans les 40 % inférieurs de l'image. Si la détection échoue, spécifiez manuellement.
  • Surveillez les avertissements "proche du bord de l'image".

Confirmation utilisateur : Affichez mask_preview.png ou subtitle_mask_preview.png à l'utilisateur, accompagné d'une liste de reconnaissance. Utilisez les coordonnées imprimées par mask_logo.py, par exemple :

① Logo en haut à gauche : boîte de restauration (21,15)–(124,50), présent sur toute la durée ② Sous-titre en bas : y485–524, 47 occurrences ③ À 1:34, un panneau dans la scène tombe dans la zone de restauration et sera effacé

Ne passez à l'étape 5 qu'après confirmation de l'utilisateur.

4. Découpage en plans

python scripts/shots.py IN.mp4 --out $W/bounds.json [--extra 178]

Les coupes franches et les fondus enchaînés sont détectés. Sans découpage, les images fixes voient apparaître des taches colorées en forme de pilule provenant des couleurs des images adjacentes.

5+6. Restauration + assemblage

Pour les longues vidéos, lancez en arrière-plan, vérifiez régulièrement les logs et informez l'utilisateur de la progression.

python scripts/inpaint.py --video IN.mp4 (--mask $W/mask.npy | --masks $W/masks.npz) --bounds $W/bounds.json \
    --workdir $W/run --out OUT.mp4 [--mask-dilation 2] [--grow-from 178:14] [--workers 2]
  • --mask-dilation : défaut 2 ; pour logo semi-transparent avec halo, utilisez 4.
  • --grow-from image:pixels : à partir d'une certaine image, dilate le masque de quelques pixels supplémentaires pour couvrir l'étalement dû au zoom ou au flou de transition.
  • Pour supprimer à la fois logo et sous-titres dans la même vidéo, exécutez deux fois : la deuxième avec --video pointant vers la sortie de la première, sans fusionner les deux ROI en une seule grande boîte.
  • En cas d'interruption, relancez la même commande ; les segments déjà traités seront ignorés.
  • Le fichier de sortie est nommé original-nologo.mp4 ou original-nologo-nosub.mp4. Le script refuse d'écraser l'original.
  • Temps indicatif (RTX 3060, 2 workers) : vidéo 960×540 de 126 s, logo en haut à gauche ≈ 17 min, sous-titre ≈ 21 min ; logo central de 5 s ≈ 1 min.

7. Contrôle qualité

python scripts/qc.py --orig IN.mp4 --out OUT.mp4 (--mask .. | --masks ..) --bounds $W/bounds.json --workdir $W/run \
    [--residue blue] [--times 3,12,20] --out-dir <dossier_vidéo>/qc/xxx

Métriques numériques :

  • Résidu : la variance de la vidéo traitée doit être approximativement égale à celle de la zone extérieure.
  • Scintillement : le ratio médian ≈ 1 ou moins, très peu d'images avec des sauts.
  • Couture : ratio ≈ 1.
  • Erreur hors zone : < 2.
  • Couleur résiduelle : proche de 0.
  • Images entièrement noires : 0 image.

⚠ Même si toutes les métriques sont bonnes, vérifiez visuellement chaque page sheet_XX.png (taches, motifs d'écailles, textes résiduels, traînées colorées). En cas de problème, retournez à l'étape correspondante :

  • Tache : utilisez shots.py --extra pour ajouter des points de coupe.
  • Motif d'écailles : tracez lettre par lettre.
  • Traînée résiduelle : ajoutez --block.

Après correction, ne relancez que les parties affectées, puis refaites le contrôle qualité.

8. Livraison

  • Indiquez les chemins absolus de la vidéo nettoyée et des images de comparaison, et montrez before_after.png à l'utilisateur.
  • Pour concaténer plusieurs segments, utilisez python scripts/concat.py A.mp4 B.mp4 C.mp4 --out FULL.mp4 ; le script vérifie que le nombre total d'images correspond à la somme des parties.
  • Rédigez un document de coordonnées, modèle dans references/positions-template.md. Pour chaque élément, indiquez trois cadres : zone d'origine, zone réelle de restauration, zone externe avec fondu (zone recommandée pour un nouveau logo). Pour les sous-titres, utilisez union_box dans subtitle_info.json.
  • Listez les défauts connus avec leurs timestamps, ne les cachez pas.

Règles strictes (tirées de tests réels)

  1. La largeur et la hauteur de la ROI doivent être ≥ 160. Avec une hauteur de 96, ProPainter produit du noir dans la zone du masque, même en fp32. inpaint.py garantit cela lors de la sélection automatique de la ROI.
  2. Les transitions doivent être coupées. Ne couper que sur les cuts francs manque les fondus enchaînés ; ProPainter emprunte alors des pixels à travers le plan, créant des taches. Élargir le masque ou passer en fp32 ne résout pas le problème.
  3. Les éléments fins sont tracés lettre par lettre, pas couverts par un bloc.
  4. Les sous-titres doivent être rognés symétriquement centrés ; un même sous-titre utilise le même masque. Sans rognage symétrique, la bande lumineuse d'arrière-plan est incluse ; changer de masque pour le même sous-titre provoque un scintillement et un problème lors du fondu.
  5. Les métriques numériques peuvent manquer des défauts ; vérifiez visuellement chaque page de l'image en contact.
  6. Avant la restauration, l'utilisateur doit confirmer le masque. Ne pas écraser l'original, ne pas supprimer ses fichiers.
  7. Les processus enfants en arrière-plan n'affichent pas de fenêtre (déjà intégré). Lancez les longues tâches en arrière-plan et informez l'utilisateur de la progression.

Skills associés