Zephyrnet-logo

Voeg een nieuwe dimensie toe aan uw foto's met Python

Datum:

Voeg een nieuwe dimensie toe aan uw foto's met Python

Lees dit en ontdek hoe u uw foto's nieuw leven kunt inblazen met een 3D Ken Burns-effect.


By Dylan Roy, Ingenieur en zijprojectjunkie



Afbeelding door auteur

Een achtergrondverhaal

 
Nadat ik enkele foto's had bekeken van een recente kampeertrip die ik een paar weken geleden had gemaakt. Ik besloot een aantal van mijn oude vakantiefoto's te maken en er een diavoorstelling van te maken met wat Python. Maak je geen zorgen, ik heb dit initiatief ondernomen in de wetenschap dat Google Photos en het Apple-equivalent dit al heel goed doen. Dit was eigenlijk alleen maar bedoeld om mijn verslaving aan het bouwen van zijprojecten te voeden.

Toen ik de beschikbare opties doorzocht, kwam ik een papier tegen met een code waarmee je foto's zou worden gemaakt en een overgang zou worden toegevoegd die een 3D Ken Burns-effect op je foto's toepast. Het Ken Burns-effect krijgt het 3D-aspect uiteraard gratis bij video, maar is minder overtuigend bij foto's vanwege die ontbrekende dimensie. Dus in het volgende artikel hoop ik je zover te krijgen dat je het kunt proberen en deze extra dimensie aan je foto's kunt toevoegen, zoals ik dat kon.

Concepts

 
Hier zijn enkele concepten die de moeite waard zijn om te kennen vanwege hun relevantie voor wat we willen bereiken. Hoewel we ons hiervan niet bewust hoeven te zijn, passen de AI-modellen de 3D-dimensie toe op ons Ken Burns-effect door perspectief toe te voegen door de grootte van de objecten op de foto correct te schalen door hun diepte te schatten. Terwijl het effect door de foto beweegt, moet het model de ontbrekende objecten en texturen die niet in het 2D-beeld verschijnen door middel van inschilderen reconstrueren.

Ken Burns-effect - Zoomen en pannen over foto's geeft het gevoel van beweging. Het is vernoemd naar een Amerikaanse documentairemaker die dit effect vaak gebruikte. De schrijvers van dit artikel hebben hieraan de derde dimensie toegevoegd die normaal gesproken op foto’s zou ontbreken.



CC BY-SA 3.0, via Wikimedia Commons

 

Diepteschatting — Beschrijft de methode voor het verkrijgen van een maat voor de afstand van de objecten in een scène. Als u dit effectief doet, resulteert dit in een overtuigende overgang die elk object met de parallax zal schalen.

inschilderen — Dit beschrijft de methode voor het reconstrueren van het deel van het beeld dat niet bestaat vanwege het veranderende perspectief van deze overgang. In afbeeldingen en video's verwijst deze techniek ook naar het repareren van beschadigde, verslechterende of ontbrekende delen van een kunstwerk die worden ingevuld om een ​​compleet beeld te presenteren.

DIY

 
Gelukkig hebben de auteurs van dit artikel, Simon NiklausLange meiJimei YangFeng Liu, hebben ons voorzien van een codebasis waarmee we dit effect op onze foto's kunnen toepassen met enkele vooraf getrainde modellen. Ik heb gemerkt dat ze niet goed werken voor foto's met veel scherpe randen op de voorgrond, maar behoorlijk indrukwekkende resultaten opleveren op een aantal van de foto's waarmee ik het heb getest.

Ik zal niet ingaan op de details van hoe dit wordt bereikt, aangezien de auteurs dit doen in hun paper, Github Repo en YouTube-video, die allemaal aan het einde van de sectie met bronnen zijn verstrekt.

Ik ga je stap voor stap door de aanpak die we volgen om deze 3D-scènes te maken, maar als je het gewoon blindelings zelf wilt proberen, heb ik aan het einde van deze sectie alle code die we gaan gebruiken toegevoegd aan een Google Colab die u kunt kopiëren en onmiddellijk kunt gebruiken.

Voordat u hier zelf doorheen stapt, raad ik u aan een nieuwe Google Colab te openen, omdat ik in de codevoorbeelden die ik doorneem een ​​aantal Colab-specifieke functionaliteiten gebruik om het gebruiksgemak te vergroten.

Installatieomgeving en installatievereisten

 
De eerste stap om dit zelf werkend te krijgen, is door hun repository te importeren die deze implementatie en vooraf bewaarde modellen bevat. Dus wat er hieronder gebeurt, is dat we de repository klonen, ernaartoe navigeren, onze uitvoermap maken en de vereiste bibliotheken installeren. In Google Colab zijn veel van de vereisten al vooraf geladen wanneer u een nieuwe runtime start, dus er ontbraken er slechts twee.

!git clone https://github.com/sniklaus/3d-ken-burns.git# Move into the downloaded repository
%cd 3d-ken-burns# Make a directory for the videos
!mkdir videos
video_dir = "./videos/"# Install dependencies
!pip install moviepy gevent


Upload foto's

 
In dit stadium hoeft u alleen maar op een eenvoudige manier foto's naar uw bron-/afbeeldingsmap te uploaden. Je hoeft dit niet echt in je notitieblok op te nemen om verder te komen, omdat je je bestanden gewoon naar de overeenkomstige mappen kunt slepen met de Colab-interface, maar het is een behoorlijk leuke handige cel.

from google.colab import filesuploads = files.upload()for filename in uploads.keys(): !mv ./$filename ./images/$filename


Converteer uw foto's

 
Dus als we niet al onze foto's die we leveren naar de twee mappen zouden willen converteren, en een eenvoudige voering zou als volgt zijn, waarbij alleen de autozoom.py interface om één foto te converteren.

python autozoom.py --in {input_image}.jpg --out {output_video}.mp4


Maar omdat we willen automatiseren wat we kunnen, kunnen we profiteren van bash en door de map bladeren en vervolgens op elke foto uitvoeren.

!for image in ./images/*; do python autozoom.py --in $image --out ./videos/$(basename $image | cut -f1 -d '.').mp4; done


Bekijk uw video

 
Zodra uw foto's zijn geconverteerd, wilt u misschien eerst de uitvoer bekijken. We gebruiken de functionaliteit van IPython om de functie te bouwen om de video te bekijken, en bieden ons vervolgens een selector waarmee we kunnen kiezen welke video we willen bekijken uit de video's in de map.

import os
from base64 import b64encodefrom IPython.display import HTML
import ipywidgets as widgetsdef video(path): mp4 = open(path,'rb').read() data_url = "data:video/mp4;base64," + b64encode(mp4).decode() return HTML(f'<video width=600 controls loop> <source src="{data_url}" type="video/mp4"></video>')files_list = os.listdir(video_dir)
video_list = widgets.Dropdown( options=files_list, value="" if not files_list else files_list[0], description='Video:', disabled=False,
)
display(video_list)


Converteer Mp4 naar geanimeerde GIF

 
Ik heb deze stap toegevoegd omdat ik de uitvoer van dit toegepaste effect in dit bericht wilde uploaden en insluiten, dus profiteer, net als bij al mijn inspanningen, van deze kennis en converteer uw mp4's naar geanimeerde GIF's zoals u wilt. Als bonus hebben we al geïmporteerd imageio als afhankelijkheid, dus u hoeft het niet te installeren. Hieronder gebruiken we deze functie en doorlopen we de doelmap op zoek naar mp4's om te converteren.

import imageio
import os, sysclass TargetFormat(object): GIF = ".gif" MP4 = ".mp4" AVI = ".avi"def convertFile(inputpath, targetFormat): """Reference: https://gist.github.com/michaelosthege/cd3e0c3c556b70a79deba6855deb2cc8""" outputpath = os.path.splitext(inputpath)[0] + targetFormat print("convertingrnt{0}rntornt{1}".format(inputpath, outputpath))reader = imageio.get_reader(inputpath) fps = reader.get_meta_data()['fps']writer = imageio.get_writer(outputpath, fps=fps) for i,im in enumerate(reader): sys.stdout.write("rframe {0}".format(i)) sys.stdout.flush() writer.append_data(im) print("rnFinalizing...") writer.close() print("Done.")for file in [x for x in os.listdir(video_dir) if x.endswith(".mp4")]: convertFile(f"{video_dir}{file}", TargetFormat.GIF)


Alle video's downloaden

 
Als u de bestandsverkenner niet wilt gebruiken om uw uitvoer te downloaden. De laatste stap is het doorlopen van de doelmap en het downloaden van elke video. Dit kan ook worden gedaan zoals we eerder deden toen we bash gebruikten om te herhalen en het effect toe te passen.

for file in os.listdir(video_dir): files.download(f"{video_dir}{file}")


Als alles goed is gegaan, zijn je foto's correct omgezet zoals een van de mijne die ik hier heb gemaakt toen ik van Bolonga genoot toen de tijden anders waren.



Afbeelding door auteur

 

Voor degenen die het zelf samenstellen van een Colab-notebook willen overslaan hier is de volledige implementatie waarvan u een kopie kunt makenen begin met het converteren van uw fotoalbums.

Key Takeaways

 
Omdat we op de schouders van reuzen staan, leven we in een tijdperk waarin we kunnen profiteren van de allernieuwste AI-technieken om ons te helpen dingen te doen waarvoor normaal gesproken iemand met specifieke kennis nodig is. In dit geval kunnen we de AI-technieken gebruiken die zijn ontwikkeld door Simon Niklaus en zijn team, in plaats van dat we geavanceerde bewerkingsvaardigheden hoeven te leren.

Andere berichten door Dylan

 
Maak prachtige architectuurdiagrammen met Python
Stop met het besteden van tijd aan het handmatig aanpassen van verkeerd uitgelijnde pijlen

 
Implementeer in Google Cloud Run met Github-acties
Een CI/CD-oplossing die naar nul kan worden geschaald met acties en cloud-run

 
Uw Github-profiel automatisch bijwerken met Python
Laat uw vaardigheden zien door uw Leesmij-profiel te automatiseren

Resources

 
Bio: Dylan Roy is een Engineer & Side Project Junkie die deelt waar hij aan werkt, zodat lezers zoals jij kunnen profiteren van zijn ervaringen. Abonneer je hier voor nog meer (dylanroy. com)

ORIGINELE. Met toestemming opnieuw gepost.

Zie ook:


PlatoAi. Web3 opnieuw uitgevonden. Gegevensintelligentie versterkt.

Klik hier om toegang te krijgen.

Bron: https://www.kdnuggets.com/2021/06/new-dimension-photos-python.html

spot_img

Laatste intelligentie

spot_img