Transkripte
1. Einführung: Hier ist ein Face-Swap. Du hast das in Fotos, Videos, Schnappschüssen gesehen, du nennst es. Es ist albern, lustig und manchmal verdammt richtig gruselig. Sie können Gesichter mit Ihrem Freund,
einer Berühmtheit, Ihrem Baby oder sogar Ihrem Hund austauschen . Lasst uns diesen Face-Swap bauen. Hallo, ich bin Aldo, Informatik-Dozent und Doktorand an der UC Berkeley. Ich helfe dem Computer zu sehen, Computervision für virtuelle Realität und selbstfahrende Autos zu
studieren. Ich habe über 15.000 Studenten geschnitten und ich kann es kaum erwarten, Ihnen die Magie zu zeigen. In dieser Klasse lernen Sie die Grundlagen der Computervision kennen. Ich setze diese Klasse für alle Interessierten; Programmierer, Designer, Geschäftsführer, jeden, wenn Sie Python nicht kennen, kein Problem. Holen Sie sich mit meinem Coding 101, Python für Anfänger Kurs. Kennen Sie AML nicht? Das ist auch in Ordnung. Nehmen Sie meine künstlichen Intelligenz Meisterklassen Werkzeuge für maschinelles Lernen. Am Ende dieser Klasse werden Sie Bilder,
Bildverarbeitung, Gesichtserkennung und vieles mehr verstehen . Sie verfügen auch über eine voll funktionsfähige Face-Swaping-Desktop-Anwendung , die Gesichter für Bilder austauschen kann, um die Teile zu rahmen. Dies dauert nur eine Stunde; nichts zu installieren, kein kompliziertes Setup. Sie brauchen nur einen Laptop mit Internet. Sie werden im Handumdrehen mit einem Face Swapper und Computer-Vision-Know-How weggehen. Ich hoffe, du bist aufgeregt, weil ich weiß, dass ich es bin. Lasst uns das machen.
2. Was ist Computer Vision?: Beginnen wir mit der Antwort, was ist Computer Vision? Hier ist die Definition. Computervision, breit definiert ist das Sehvermögen für KI. Es gibt eine Reihe von Computer-Vision-Aufgaben, die dies widerspiegeln, wie die Objekterkennung, die alle Objekte in der Szene wie die Blume auf der linken Seite einordnet und klassifiziert. Super Auflösung, die Details halluziniert, um Ihre Bilder schärfer zu machen, wie die scharfe Farbe auf der rechten Seite, kontrastiert mit den verschwommenen Büschen auf der linken Seite. Keypoint-Schätzung, die Schlüsselpunkte wie Gelenke und Gliedmaßen identifiziert, wie die antike Tänzerin auf der linken Seite. Wir können jetzt erneut beantworten, was Computer Vision in einer angewandten Weise ist? Computer Vision ist eher die Extraktion von Informationen aus oder die Erzeugung von Bildern. Um dieses Feld besser zu verstehen, schauen
wir uns jedoch den Rahmen für
maschinelles Lernen an , den wir in unserer KI-Meisterklasse behandelt haben. Wenn Sie diesen Kurs noch nicht absolviert haben, empfehle
ich dies zu tun. In unserer KI-Meisterklasse diskutierten
wir über die Aufteilung unseres ML-Wissens in vier Kategorien. Daten, Modell, Ziel und Algorithmus. Daten beschreiben die Ein- und Ausgänge, was wir lernen und was wir vorhersagen. Modell beschreibt, wie Vorhersagen zu machen. Ziel beschreibt das Ziel, wofür das Modell optimiert wird. Schließlich beschreibt der Algorithmus, wie das Modell lernt. Wir haben den Algorithmus nicht viel besprochen, und wir werden ihn diesmal wieder überspringen. In der Computervision sind die Daten immer visuell, nämlich Bilder und Videos. Wir können zusätzlich andere verwandte Signale wie Audio oder Tiefe auf Bildern und Videos verwenden. Wir konzentrieren uns auf die Daten in dieser Lektion. Unsere Modelle in der klassischen Computervision und im Deep Learning extrahieren
heute Muster aus dem Bild mit Hilfe eines Tools namens Filtern. Wir werden das in späteren Lektionen besprechen. Schließlich ist unser Ziel in der Regel, die Genauigkeit zu maximieren. Wie üblich werden wir die Algorithmen überspringen. Um den Rest der Computervision zu verstehen, müssen
wir verstehen, wie Bilder dargestellt werden. Was ist ein Bild? Wie wird ein Bild als Zahlen dargestellt? Schauen wir uns ein Beispiel an. Wir können ein Schwarz-Weiß-Bild mit Zahlen konstruieren, wobei Null dem Schwarz entspricht und eins Weiß entspricht. Konzentrieren Sie sich auf die Trennlinie zwischen Einsen und Nullen. Welche Form siehst du? Diese Matrix von Zahlen als Bild zu speichern gibt uns dies. Es stellt sich heraus, dass es ein Diamant ist. Was ist, wenn wir Graustufenbilder wollen, nicht nur Schwarz-Weiß? Nun, immer noch Null für Schwarz und eins für Weiß verwenden, können
wir auch einen beliebigen Wert zwischen Null und eins wie 0.1,0.26 oder 0.74391 verwenden. Zahl näher an Null sind dunkler und Zahlen näher an eins oder heller. Dies ermöglicht es uns, Weiß,
Schwarz und jeden Grauton darzustellen . Betrachten Sie zum Beispiel Folgendes, können Sie sagen, was das ist? Auch hier entspricht jede Zahl der Helligkeit eines Pixels. Diese Schachtel mit Zahlen als Bild zu speichern, gibt uns diese, einen Pokey Ball. Dies ist unmöglich, nur aus den Zahlen in der vorherigen Folie zu sehen, aber Sie wissen jetzt, wie Schwarzweiß- und Graustufenbilder numerisch dargestellt werden. Um Farbe einzuführen, benötigen wir eine Möglichkeit, weitere Informationen zu codieren. Hier ist, wie. hat
jedes Bild eine Höhe und Breite. Dieses Bild ist h von w. Jedes Pixel, wie wir zuvor in einem Graustufenbild gesehen haben, hat einen Wert. Wir können äquivalent sagen, dass unser Bild die Dimensionen H bis W nach dem anderen hat. Das Upgrade dieses Graustufenbildes auf ein Farbbild beinhaltet Folgendes. Für eine Farbdarstellung stellen
wir die Farbe jedes Pixels mit drei Werten zwischen Null und eins dar. Eine Zahl entspricht dem Rotgrad, eins zum Grüngrad und die letzte zum Blaugrad. Wir nennen dies den RGB-Farbraum. Das bedeutet, dass
wir für jedes Pixel in unserem Bild drei Werte haben, R, G und B. Als Ergebnis unsere Bilder jetzt H x W um drei. So erhalten Sie ein Farbbild wie dieses. In Wirklichkeit reicht jeder Wert von 0- 255 statt 0-1. Aber die Idee ist die gleiche. Verschiedene Zahlenkombinationen entsprechen verschiedenen Farben, wie 171, 180, 190 voll hellblau oder 200, 199,188, voll hellbraun. Zusammenfassend wird jedes Bild als Zahlenfeld mit drei Dimensionen,
Höhe, Breite und drei Farbkanälen dargestellt . direkte Bearbeitung dieses Zahlenfeldes entspricht der Bearbeitung des Bildes, und so werden Bilder als Zahlen dargestellt. Zusammenfassend haben wir Computervision als das
Extrahieren von Informationen aus oder das Erzeugen von Bildern definiert . Wir haben ML-Abstraktionen für Computer Vision,
Daten, Modell, Ziel und Algorithmus behandelt . Schließlich diskutierten wir, wie Bilder numerisch dargestellt werden. Mit all diesem Wissen sind
Sie gut ausgestattet, um mit Bildern zu arbeiten zu kodieren. Für eine Kopie dieser Folien und mehr Ressourcen Mischung checkout diese URL. Das schließt dieses Intro ab. Lassen Sie uns in der nächsten Lektion codieren.
3. Grundlagen zu Code OpenCV: Willkommen zur ersten Kodierungsstunde dieses Kurses. Lassen Sie uns unsere Hände mit etwas Code schmutzig machen. Wenn Sie eine kurze Einführung in die Programmierung in Python wünschen, Sie
unbedingt meinen Python-Kurs für Anfänger überprüfen, bevor Sie diese Lektion beginnen. Sie können das Video hier pausieren, um auf diese URL zuzugreifen. Auf einem hohen Niveau werden wir ein Bild erzeugen, dann werden wir unsere Webcam versuchen. Das Ziel ist es, grundlegende OpenCV-Dienstprogramme zu erforschen. Beginnen Sie mit dem Zugriff auf diese URL. Dies wird eine Umgebung für uns aus der Ferne schaffen
, so dass wir keine Einrichtung auf unseren Computern durchführen müssen. Du wirst auf der rechten Seite sehen, ich habe das schon getan. Für dieses Tutorial empfehle ich dringend, Google Chrome zu verwenden. Leider habe ich den Code in
ein paar verschiedenen Browsern getestet und nur Google Chrome wird derzeit unterstützt. Ihr Ziel wird es sein, dieses Bild zu erzeugen. Schritt eins besteht darin, die numerische Darstellung des Bildes wie folgt zu erstellen. Erinnern Sie sich von vorher, dass Einsen und Nullen ein Schwarz-Weiß-Bild
machen können , wie wir besprochen haben, Null hier ist schwarz und eins ist weiß. In Wirklichkeit liegen
die Zahlen jedoch zwischen 0 und 255, daher verwenden wir 255 für Weiß und Null für Schwarz. Lassen Sie uns dieses Array jetzt im Code erstellen. Auf der rechten Seite werde
ich auf das X klicken, nun, ich bin hier oben rechts, damit wir dieses Vorschaufenster schließen können. Klicken Sie auf der linken Seite auf Neue Datei und geben Sie generate.py ein. Dies wird eine neue Datei für uns erstellen. Lassen Sie uns jetzt diesen Datei-Browser minimieren. Ich werde jetzt meinen Code vergrößern, damit Sie besser sehen können, was ich tue. Um zu starten,
importieren Sie numpy in Ihrer generate.py, die Ihre linearen Algebra-Dienstprogramme enthält. Nach Konvention haben wir später numpy in np umbenannt. Importieren Sie dann OpenCV, das Ihre Computer Vision und Bilder Utilities enthält. Zuerst erstellen wir eine numerische Darstellung unseres Bildes. Gehen Sie voran und geben Sie Bild gleich einem numpy Array und dieses numpy Array wird in einer Liste von Listen nehmen , die die Zahlen, die wir auf der linken Seite haben, angibt. Geben Sie diese Zahlen jetzt ein. Definieren Sie nach der Eingabe der Zahlen einen Datentyp. Dieser Datentyp wird eine vorzeichenlose Ganzzahl sein. Dieser Datentyp ist hier wichtig. Wir setzen den Datentyp auf eine vorzeichenlose Ganzzahl da alle unsere Ganzzahlen in diesem Bild positiv sind. Dies ist für OpenCV oder cv2 erforderlich, um Ihr Array erfolgreich als Bild zu speichern. Als nächstes werden wir die Größe unseres Bildes ändern. Hier ist, wie Sie die Größe ändern, rufen Sie cv2.resize für das Bild auf, um die Größe zu ändern und die gewünschte Größe des Bildes zu übergeben. In diesem Fall ist unser Bild groß. Wir wollen also eine Breite von 90 Pixeln und eine Höhe von 150 Pixeln. Aber wenn wir diesen Code ausführen, wären
wir sehr enttäuscht. Unsere hochdimensionierten Acht würde so hässlich aussehen. Stattdessen wollen wir eine scharfe Acht. Also werden wir mit einer anderen Größenänderungstechnik, die als Nächste Nachbarn bezeichnet wird, eine Up-Size. Um dies zu tun, fügen wir ein drittes Argument zu unserer Größenänderungsfunktion hinzu. Auch hier ist die Größenänderung. Wir übergeben das Bild, um die endgültige Größe zu ändern, und das dritte Argument weist cv2 an, die nächste Nachbar Up-Sampling-Technik zu verwenden. Lassen Sie uns das jetzt im Code versuchen. Wir werden jetzt schreiben, Bild ist gleich cv2.resize Bild Komma 90, 150. Dann schließlich die Interpolationsmethode, die CV2.inter_next ist. Sie werden leider sehen, dass mein Code auf der rechten Seite abgeschnitten ist. Dies hier besagt, dass die Interpolation gleich CV2.inter_next ist. unser Bild in der Größe geändert wurde, bleibt es nur, es zu speichern. Um das Bild zu speichern, verwenden Sie cv2.imwrite, wie hier gezeigt. Das erste Argument ist der Pfad, und das zweite Argument ist das Bild. Lass uns das versuchen. Sie nach Ihrem vorhandenen Code GebenSie nach Ihrem vorhandenen Codecv2.imwrite
den Pfad des Bildes und des Bildes selbst ein und das war's. Wir sind jetzt bereit, diesen Code auszuführen. Wir haben unseren Code in einer Python Datei namens generate.py geschrieben. In früheren Python Lektionen, insbesondere in Repl.it, würden
wir die grüne Ausführungstaste oben auf dem Bildschirm drücken, um die Python-Datei auszuführen. Wir haben keine schöne grüne Schaltfläche, also machen wir dies manuell und führen unsere Python Datei über die Befehlszeile aus. Um die Befehlszeile zu starten, öffnen Sie Ihren Datei-Browser auf der linken Seite, indem Sie auf den Pfeil klicken. Sobald Sie dies getan haben, sehen Sie unten links das Dialogfeld eines Werkzeugs, klicken Sie auf Extras und wählen Sie in der Dropdown-Liste Terminal aus. In diesem Terminal sehen Sie etwas Setup, wie ich hier sehe. Ich werde etwas verkleinern. Sobald Sie dieses Terminal sehen, können
Sie jetzt Ihren Befehl eingeben. Insbesondere ist der Befehl Python und das Argument ist der Dateipfad, der in diesem Fall generate.py ist. Gehen Sie weiter und geben Sie Python generate.py ein und drücken Sie die Eingabetaste. Nachdem Sie Ihren Code ausgeführt
haben, sollten Sie eine 8.png in der linken Seitenleiste sehen. Klicken Sie darauf, um Ihr generiertes Bild zu sehen und voila, Sie haben Ihr erstes Bild generiert. Lassen Sie uns nun anfangen, die Webcam-Ausgaben zu manipulieren. Navigieren Sie zu dieser URL. Sobald Sie die Seite geladen haben, schließen Sie die Vorschau auf der rechten Seite, indem Sie oben rechts auf das X klicken. Auf der linken Seite erstellen
wir nun eine neue Datei. In diesem Teil der Lektion ist es
unser Ziel, unsere OpenCV-Dienstprogramme mit der Webcam zu verbinden. Beginnen wir mit dem Starten einer minimalen Web-App mit einer benutzerdefinierten Bibliothek, die nur für diesen Kurs namens Web OpenCV erstellt wurde. auf der rechten Seite Klicken Sieauf der rechten Seiteauf Neue Datei und geben Sie app.py ein. Hier werde ich diese Sidebar minimieren, indem ich auf den Pfeil oben links klicke. In diesem Teil der Lektion ist es
unser Ziel, mithilfe der OpenCV-Dienstprogramme, die in dieser Lektion zur Verfügung gestellt werden, eine Verbindung mit unserer Webcam herzustellen. Beginnen wir mit dem Starten einer minimalen Web-App mit einer benutzerdefinierten Bibliothek, die nur für diesen Kurs namens Web OpenCV erstellt wurde. Importieren Sie webopencv als WCV. Dann importieren wir OpenCV für unsere allgemeinen Computer Vision Utilities. Also importieren Sie cv2. Als Nächstes instanziieren wir Ihre Webanwendung. Sie können dies tun, indem Sie in app ist gleich wcv.WebApplication. Schließlich können Sie Ihre Webanwendung app.run ausführen, und das war's. Um eine Vorschau Ihrer neuen Anwendung anzuzeigen, klicken Sie oben links auf Anzeigen. Für mich habe ich meinen Bildschirm so sehr minimiert, dass ich nur eine Sonnenbrille sehen kann. Klicken Sie auf In neuem Fenster. Das ist mein neues Fenster. Leider ist die Spitze abgeschnitten, in diesem neuen Fenster, klicken Sie auf Anzeigen und dann auf Zulassen. Wenn Sie fertig sind, klicken Sie auf Stopp, um die Webcam zu stoppen. Wenn Sie sich Sorgen um den Datenschutz machen, machen Sie sich keine Sorgen, die Daten auf dieser Webcam werden nur von Ihrem Computer an Ihren eigenen Glitch-Server
kommuniziert, was Sie gerade programmieren. Also nur Ihr Code und der Server verarbeitet Ihre Webcam. Niemand sonst sieht es. Sie sind jetzt der Entwickler. Fügen Sie nun Ihre erste Bildtransformation zur Web-App hinzu. Diese Transformation schreibt letztendlich Text auf das empfangene Bild. Aber für jetzt, lasst uns gehen, um zu transformieren, dass nichts tut. Erstellen Sie eine Funktion namens Hello. Es nimmt zwei Argumente, das Bild und ein anderes Objekt namens Frame, und gibt das Bild zurück. Alle Transformationen außer Bilder als Eingabe und geben das verarbeitete Bild zurück. Wir brauchen auch einen Dekorator namens app.transform. Wir werden die technischen Details überspringen, wie ein Dekorateur funktioniert. Für jetzt, nur wissen, dass diese Dekorator-Register mit unserer Web-App transformiert werden. Jede registrierte Transformation wird in unserer Webschnittstelle angezeigt. Darüber hinaus wird der rosafarbene Text als Name der Transformationen verwendet. Lassen Sie uns das jetzt im Code versuchen. unter dem Punkt, wo Ihre App definiert ist, Fügen Sieunter dem Punkt, wo Ihre App definiert ist,Ihren brandneuen Dekorator mit dem Transformationsnamen Hallo hinzu. Wir werden jetzt ein Schlüsselwortargument anwenden, Standard ist wahr. Dadurch wird sichergestellt, dass die Hello Transformation automatisch angewendet wird, wenn die Webcam geladen wird. Definieren Sie Ihre Hello-Funktion, die das Bild und ein anderes Argument namens Frame einnimmt, und schließlich das Bild zurückgibt. Wenn Sie nun die Seite in einem neuen Fenster aktualisieren, wird die Hello Transformation standardmäßig ausgewählt. Hier haben wir Hallo. Als Nächstes schreiben wir einen HelloWorld-Text auf den Webcam-Live-Feed. Hier ist, wie man das macht. Hier ist das Bild, das kommentiert werden soll. Der Text, den wir anzeigen möchten, die Position des Textes, die Schriftart, die wir verwenden möchten, und die Schriftgröße effektiv. Dies wird tatsächlich als Maßstab in Bezug auf die Standardschriftgröße angegeben. Schließlich haben wir die Farbe in RGB. Also hier 255, 0, 0 bedeutet rot. In der Hello Funktion wird nun Text auf das Bild direkt über, wo Sie zurückkehren oder Bildtyp und CV2.putText hinzufügen. Wir werden das Bild,
die Hello World-Zeichenfolge,
die Position, die Schriftart übergeben die Hello World-Zeichenfolge, . Wir geben ihm eine Schriftgröße von eins. Schließlich verwenden wir die Farbe Grün. Hier verwenden wir 0, 255, 0. Navigieren Sie nun zu Ihrer Web-App. Klicken Sie auf Start, und Sie sehen den Text „Hallo Welt“ angewendet. Da gehen wir. Hier sind die Schritte, die wir behandelt haben. Wir haben OpenCVS,
Image-Schreiben und Text-Add-Dienstprogramme behandelt . Keine Notwendigkeit, diese auswendig zu lernen. Du kannst sie immer nachsehen. Ich wollte Ihnen nur etwas Übung für die Arbeit mit diesen Dienstprogrammen geben. Für eine Kopie dieser Folien, des fertigen Codes
und weiterer Ressourcen, stellen Sie sicher, dass Sie diese URL auschecken. Das ist es für die OpenCV-Grundlagen.
4. So funktionieren Gesichtswechsler: Graben wir uns in das Gesicht Swaps. Etwas, das so aussieht. Wie funktioniert das? Lassen Sie mich das erklären. Wir beginnen mit der Aufschlüsselung dieses
Face-Swaping-AI-Produkt in Unterprobleme. Was ist ein Face Swap? In unserer einfachen Version des Gesichtswechsels führt
ein Gesichtswechsel zwei Schritte durch, erkennt alle Gesichter und tauscht Pixel für diese Gesichter aus. Lassen Sie uns jetzt ausführlicher über diese beiden Schritte sprechen. erste Schritt, die Gesichtserkennung, zusammengefasste Gesichtserkennung nimmt ein Bild wie dieses ein und zeichnet Kästchen um Gesichter. Lassen Sie uns diese Kastenzeichnungsalgorithmen jetzt genauer beschreiben. Wir führen die Gesichtserkennung ein, indem wir die assoziierten Daten, das
Modell, das Ziel und den Algorithmus beschreiben . Als Auffrischung, hier ist, was jeder dieser Begriffe bedeutet. Erstens, Daten. Unser Gesichtserkennungsmodell akzeptiert ein Bild und prognostiziert eine Box, die das Gesicht enthält. Diese Felder werden mit vier Zahlen dargestellt. Jede Beschreibung des Feldes enthält die obere linke Ecke, x und y sowie die Höhe und Breite. Diese vier Zahlen definieren eindeutig ein Feld. Ein Flächenerkennungsmodell prognostiziert diese vier Koordinaten für eine Fläche. Zweites Modell, das spezielle Gesichtserkennungsmodell, das wir verwenden werden, wird als Haarkaskadenklassifikator bezeichnet. Wir werden dieses Modell in einer späteren Lektion ausführlicher besprechen. Drittes Ziel, das Ziel unseres Modells ist es, die Genauigkeit der Gesichtserkennung zu maximieren. Um die Genauigkeit zu messen, verwenden wir eine Metrik, die als Schnittpunkt über Vereinigung oder IoU bezeichnet wird. Lassen Sie uns darüber sprechen, wie IoU berechnet wird. Hier erfahren Sie, wie IoU oder Schnittpunkt über Vereinigung funktioniert. Sagen Sie, diese rote Box ist unsere vorhergesagte Box, das Blau ist unsere Grundwahrheit. Intuitiv, je weniger sich diese beiden Boxen überlappen, desto geringer sollte die Genauigkeit sein. Je mehr sie sich überlappen, desto höher sollte unsere Genauigkeit sein. Wir berechnen die Überlappung in rosa Ihre größeren Boxen
zu mischen, um automatisch höhere Genauigkeit zu erhalten. Wir teilen uns auch durch die in Grün bezeichnete Gewerkschaft. Diese Kreuzung über Vereinigung oder IoU ist, wie wir die Genauigkeit für Objekt-Detektoren messen. Schließlich, wie üblich, überspringen
wir den Algorithmus. Damit ist unsere Einführung in die Gesichtserkennung abgeschlossen. In einer späteren Lektion werden wir die Gesichtserkennung ausführlicher besprechen. Moment gehen wir mit dem zweiten Schritt des Gesichtswechsels über, dem Austausch selbst. Der zweite Schritt ist ein Pixel-Swap, wir müssen etwas Größenänderung vornehmen, falls die beiden erkannten Gesichter unterschiedliche Größen haben, aber das ist ansonsten ziemlich einfach. Sehen wir uns nun ein Beispiel für diese beiden Schritte zusammen an. Erkennen Sie zuerst beide Flächen und tauschen Sie sie dann aus. Zugegeben, das sieht nicht überzeugend aus. Für diese Klasse werden wir diesen einfachen Face-Swap erstellen, aber lassen Sie mich erklären, wie Industrie-Grade Face-Swaps dies realistischer machen. Lassen Sie uns die Face-Swaping-KI-Produktaufschlüsselung wiederholen. Das war unser vorheriges Verständnis des Gesichtswechsels. Erstens, anstatt nur Gesichter zu erkennen, werden nun Schlüsselpunkte im Gesicht erkannt. Hier ist ein visuelles Beispiel für Gesichtspunkte. Gesichtspunkte können sinnvolle Teile des Gesichts entsprechen, wie die Nasenbrücke, Bereich direkt über einer Augenbraue, Grübchen und mehr. Mit unseren Schlüsselpunkten verziehen
wir dann Pixel, so dass jeder Bereich
des Gesichts in den entsprechenden Bereich einer zweiten Phase verzogen wird. Um dies zu visualisieren, sagen wir, wir haben jetzt zwei Gesichter, wir haben die Gesichtspunkte von vorher für die Person auf der linken Seite. Wir haben auch die gleichen Gesichtspunkte für die Person auf der rechten Seite. Konzentrieren wir uns auf die drei Schlüsselpunkte um ihr linkes Auge. Diese Schlüsselpunkte bilden Dreiecke, zu Gesicht Swap wird das Dreieck auf der linken Seite zum Dreieck auf der rechten Seite verziehen. Nach einigen Bildmischtechniken haben
wir dann einen fotorealistischen Gesichtswechsel, etwa so. Das war's. Wir haben eine minimale Version des Face-Swap abgedeckt, zwei Schritten besteht, die Gesichter
erkennen und die Pixel austauschen. Wir haben auch die professionellen Face-Swap-Techniken behandelt, die von
beliebten Apps für eine Kopie dieser Folien und mehr Ressourcen verwendet werden ,
stellen Sie sicher, dass Sie diese URL auschecken und jetzt wissen Sie, wie Face-Swaps funktionieren. Lassen Sie uns noch einmal codieren, um unseren eigenen Face Swap zu bauen.
5. Code Gesichtserkennung: In dieser Lektion experimentieren wir mit einem Gesichtsdetektor. Auf hohem Niveau werden wir Gesichter in einem Bild erkennen und dann Gesichter in unserer Webcam erkennen. Das Ziel ist es, Weltraumerkennungsprogramme zu erforschen. Beginnen Sie mit dem Zugriff auf diese URL, wie ich es auf der rechten Seite getan habe. Dies wird eine Umgebung für uns aus der Ferne schaffen, so dass
wir wie zuvor keine Einrichtung auf unseren Computern durchführen. Auf der rechten Seite hier, um sich auf unsere Entwicklung vorzubereiten, werde
ich diese Vorschau auf
der rechten Seite schließen , indem ich oben rechts auf das x klicke. Im Datei-Browser klicke ich auf Neue Datei gebe
dann detect.py ein. Dann wird dies automatisch detect.py in unserem Editor öffnen. Ich werde unseren Datei-Browser minimieren, indem ich auf diesen Pfeil nach links klicke. Dann werde ich hineinzoomen, damit du besser sehen kannst, was ich tue. Wir beginnen damit, ein einziges Bild zu lesen und zu schreiben. Um das Bild zu lesen, verwenden Sie cv2.imread wie hier gezeigt. Das erste Argument ist der Pfad des zu lesenden Bildes. Lassen Sie uns dies versuchen, in Ihrer neuen Python Datei, beginnen Sie mit dem Importieren von OpenCV, importieren Sie cv2. Dann lesen Sie das Bild kids.jpg. Hier geben wir in Bild ist gleich cv2.imread und kids.jpg. Um das Bild zu speichern, verwenden Sie cv2.imwrite, wie hier gezeigt. Das erste Argument ist der Pfad und das zweite Argument ist das Bild. Versuchen wir es jetzt, schreiben Sie das Bild in eine neue Datei namens out.jpg, cv2.imwrite in out.jpg, und fügen Sie dann das Bild rechts ein. Dann öffnen wir unseren Datei-Browser wieder und
klicken Sie auf der linken Seite auf Tools am unteren Rand und dann auf Terminal. Warten Sie, bis das Setup abgeschlossen ist. Sobald die Einrichtung abgeschlossen ist, werden
Sie mit einer Eingabeaufforderung wie dieser begrüßt. Hier werden wir in Python detect.py eingeben. Drücken Sie die Eingabetaste Dadurch wird das gerade geschriebene Python -Skript ausgeführt. Das Skript liest kids.jpg
und speichert diese in out.jpg. Um zu überprüfen, öffnen Sie out.jpg auf der linken Seite. Hier sehen Sie, dass out.jpg mit kids.jpg übereinstimmt. Lassen Sie uns jetzt unseren Gesichtsdetektor instanziieren. Wenn Sie eine Aktualisierung darüber wünschen, was Instanziierung ist oder welche Objekte sind,
stellen Sie sicher, dass Sie meine objektorientierte Programmierklasse auf Zwischenebene auschecken. Sie können das Video hier pausieren, um auf diese URL zuzugreifen. Instanziieren Sie den Flächendetektor und übergeben Sie die Modellparameter. Hier werden die Modellparameter in einer Datei namens parameters.xml gespeichert. Sie in Ihrem Datei-Browser KlickenSie in Ihrem Datei-Browsernoch einmal auf detect.py. Hier werde ich wieder mein Terminal auf der Unterseite schließen, indem auf das x klicke. Ich werde auch meinen Datei-Browser minimieren. Du brauchst keines dieser Dinge zu tun. Ich erkläre nur das Video, damit Sie meinen Code besser sehen können. Direkt über dem Bild werden
wir jetzt den Gesichtsdetektor instanziieren. Detector ist gleich CV2.CascadeClassifier. Auch hier lautet das Argument parameters.xml. Verwenden wir nun den Gesichtsdetektor, um Gesichter zu erkennen. Wir werden dies tun, indem Sie die Methode DetectMultiScale verwenden, das Bild an diese Methode übergeben
und zusätzlich ein neues Schlüsselwortargument namens ScaleFactor gleich 1.3 übergeben. Wir werden später besprechen, was dieser ScaleFactor bedeutet. Moment werden wir
beide Argumente übergeben und die Methode gibt dann eine Reihe von Rechtecken zurück, jedes Rechteck entspricht einer Fläche im Bild. Versuchen wir es jetzt. Nachdem Sie Ihren Gesichtsdetektor definiert haben und nachdem Sie das Bild geladen haben, werden
wir nun alle Gesichter erkennen, indem Sie ausführen, Rechtecke sind gleich dem Detector.DetectMultiScale, und wie wir dort auf der linken Seite geschrieben haben, wir gehen, um das Bild und den ScaleFactor zu übergeben. Lassen Sie uns schließlich Rechtecke auf dem Bild zeichnen, die den erkannten Gesichtern entsprechen. Hier ist, wie man das macht. Rufen Sie die cv2.rectangle Funktion auf. Hier gehen wir in das Bild, um Rechtecke zu zeichnen, die Koordinaten für die obere linke Ecke des Rechtecks, Koordinaten für die untere rechte Ecke des Rechtecks, die Farbe des Rechtecks Rand. Denken Sie daran, dass die erste Zahl hier
die Menge an Rot, die zweite die Menge an Grün und die letzte die Menge an Blau mit der Menge von 0 bis 255 darstellt. Infolgedessen bedeutet 0, 255, 0 grün. Hier gibt es eine Subtilität. Das Farbschema hat nicht eigentlich RGB, sondern BGR für OpenCV, aber wir lassen dieses Detail vorerst nicht. Aber wenn Sie versuchen, diese Farben zu ändern, wäre
das der Grund, warum die erste Zahl tatsächlich den Grad des Blaus steuert. Schließlich definieren wir die Linienbreite für den Rand des Rechtecks, der zwei Pixel breit ist. Lassen Sie uns das jetzt im Code versuchen. Auf der linken Seite werden
wir alle Rechtecke durchlaufen. Hier wissen wir, dass Rechteck ein Tupel von
vier Zahlen ist , wie wir in der vorherigen Lektion gesprochen haben. Wir können jetzt schreiben x, y, w, h ist gleich Rechteck. Diese Syntax ermöglicht es uns, x der ersten Zahl zuzuweisen, y zur zweiten, w zur dritten und h zur vierten. Zeichnen Sie nun das Rechteck mit der Funktion, die wir besprochen haben. CV2. Rechteck, das Bild, die Startkoordinate, die Endkoordinate, die Farbe Grün und schließlich die Rahmenbreite. Wenn Sie dies noch nicht getan haben, öffnen Sie den Dateibrowser auf der linken Seite, klicken Sie auf Extras und wählen Sie Terminal. Auf der Unterseite sehen Sie etwas Setup. Sobald Ihr Terminal bereit ist, geben Sie python detect.py in das Terminal ein. Dadurch wird das gerade geschriebene Python -Skript für Gesichtserkennung ausgeführt. Nachdem Sie dieses Skript ausgeführt haben, klicken Sie auf out.jpg auf der linken Seite, Sie sehen, dass das Bild nun Rechtecke um jede Fläche gezeichnet hat. Wir werden nun die Gesichtserkennung wiederholen, aber für unsere eigene Webcam. Beginnen Sie mit dem Zugriff auf diese URL. Sobald Ihre Seite geladen ist, wie zuvor, minimieren Sie Ihre Vorschau, indem Sie auf das x oben rechts klicken. Jetzt haben wir bereits eine Datei für uns erstellt. Dies ist aus der vorherigen Lektion. Ich werde den Datei-Browser auf der linken Seite schließen, indem ich auf den Pfeil nach links klicke. Zu Beginn ändern wir die Bildrate unseres webbasierten Video-Feeds. Dies verhindert, dass unsere Webanwendung zu viel hinkt. Fügen Sie dem Konstruktor wie folgt ein Schlüsselwortargument Framerate hinzu. In unserem Code werde ich Framerate gleich 5 eingeben. Darüber hinaus werden wir CV2.putText löschen, wir werden dies später ersetzen. Wie zuvor werden wir den Gesichtsdetektor instanziieren. Sie wie zuvor ÜbergebenSie wie zuvordie Modellparameter bei parameters.xml in diesen CascadeClassifier. Direkt über der Definition der App, werde
ich Detektor eingeben ist gleich CV2.CascadeClassifier parameters.xml. Erkennen Sie als Nächstes alle Flächen im Bild. Wir konfigurieren die Gesichtserkennung leicht, wie vor dem Übergeben des Bildes, um Gesichter
zu erkennen und wie bevor zusätzlich in ScaleFactor übergeben wird, ist gleich 1.3. Dieser ScaleFactor ermöglicht es uns, großformatige Gesichter zu erkennen. So wurde zum Beispiel der Gesichtsdetektor trainiert, um Gesichter dieser Größe zu erkennen. Hier ist das blaue Quadrat das Bild, der Kreis ist eine abstrakte Darstellung eines Gesichts. Während der Inferenz würde ein größeres Gesicht wie dieses normalerweise
vermisst werden , da unser Detektor nicht für so große Gesichter trainiert ist. Um dies zu umgehen, skalieren wir das Bild um 30 Prozent und führen den Detektor darauf aus. Wiederholen Sie dies, skalieren Sie das Bild um weitere 30 Prozent und führen Sie den Detektor erneut darauf aus. In diesem letzten Schritt ist unser Gesicht während der Inferenz die gleiche Größe wie
die Gesichter während des Trainings, so dass unser Detektor in der Lage ist, das Gesicht zu erkennen. Dies ist, was DetectMultiScale bedeutet. Lassen Sie uns das jetzt programmieren. Benennen wir diese Transformation zunächst von „Hallo Welt“ in „Gesichter suchen“ um. Wir benennen die Funktion auch in find_faces um. Als nächstes finden Sie alle Gesichter im Bild, wie wir es zuvor getan haben. Wir werden auch den Skalierungsfaktor hinzufügen, wie wir bereits erwähnt haben, um den Detektor robuster zu verschiedenen Gesichtsgrößen zu machen, sind
Rechtecke gleich detector.detectMultiscale, und wir werden das Bild und einen ScaleFactor von 1.3 übergeben. Zeichnen Sie schließlich Rechtecke um alle Gesichter wie zuvor. Hier ist wieder, wie man ein Rechteck in OpenCV zeichnet. Lasst uns das jetzt machen. Wir werden alle Rechtecke durchlaufen. Wir werden das Rechteck in vier Variablen zerlegen, wie wir es vorher getan haben. Schließlich werden wir Rechtecke um alle Gesichter zeichnen. Nun, beachten Sie, dass wir diese For-Schleife tatsächlich vereinfachen können. Da x, y, w, h gleich Rechteck ist, können
wir Rechteck tatsächlich durch diese vier Variablen ersetzen. Ich werde jetzt diese Zeile löschen. Hier haben wir für x, y, w, h in Rechtecken. Klicken Sie nun oben links auf Anzeigen. Für mich ist mein Fenster leider zu klein, also sieht es aus wie eine Sonnenbrille. Dadurch wird eine Vorschau Ihrer Webanwendung geöffnet. Ich werde wieder zoomen, so dass Sie sehen können. Ich werde dann auf Start klicken und Sie werden
eine Webcam-Feed außer mit Ihrem Gesicht Box sehen . Klicken Sie bei Bedarf erneut auf Zulassen. Das ist es für diese Lektion, Sie haben jetzt die Gesichtserkennung Dienstprogramme in OpenCV für eine Kopie dieser Folien,
den fertigen Code und weitere Ressourcen erkundet , stellen Sie sicher, dass Sie diese URL überprüfen.
6. So funktionieren Gesichtserkenner: Lassen Sie mich einen Schritt zurück, um zu erklären, wie Gesichtsdetektoren funktionieren. Wir beginnen damit, einfache Features wie Kanten zu erkennen. Nehmen Sie unser Bild aus der vorherigen Lektion. Angenommen, wir möchten einfache kleine Features wie Kanten extrahieren. Auf hohem Niveau wollen wir
diese kleinen Features in jedem möglichen Patch des Bildes finden . Nehmen wir an, jeder Patch ist zwei-mal zwei zu starten. Wir starten von oben links und fragen Haben wir das Feature hier gefunden? Was ist mit hier? Was ist mit hier? So weiter und so weiter, bis Sie das gesamte Bild abgedeckt haben. Wie finden Sie nun kleine Features wie Kanten in jedem dieser zwei mal zwei Patches? Betrachten Sie ein zwei-mal-zwei-Patch mit einer Kante und andere Patches ohne Kanten. Betrachten Sie nun ihre numerischen Darstellungen. Erinnern Sie sich, dass Schwarz Null ist und eins weiß ist, daher enthält das linke Feld sowohl Nullen als auch Einsen. Die mittlere Box enthält alle und die rechte Box enthält alle Nullen. Betrachten wir nun einen zwei-mal-zwei-Filter, der nur eine zwei-mal-zwei-Matrix von Zahlen ist. Multiplizieren Sie den Zwei-by-Zwei-Filter mit unserem Zwei-by-Zwei-Patch. Elementweise multiplizieren Sie das rote Negativ 1 mit der roten Null. Multiplizieren Sie das schwarze Negativ 1 mit der schwarzen Null. Multiplizieren Sie die grünen und multiplizieren Sie die blauen. Schließlich fügen Sie sie alle zusammen und wir bekommen zwei. Mach das gleiche für das mittlere Bild und wir bekommen Null. Mach das gleiche für das richtige Bild und wir bekommen wieder Null. Das ist perfekt. Unser Filter erzeugt positive Werte für vertikale Kanten und erzeugt Null für Bilder ohne Kanten. Dies ist jedoch nur für einen kleinen Zwei-mal-Zwei-Patch. Betrachten wir nun das gesamte Bild. Dies ist nun die numerische Darstellung unseres Diamantbildes. Wir werden jeden zwei-mal-zwei-Patch im Bild durchlaufen. Bei jedem Patch multiplizieren und summieren wir den Zwei-mal-Zwei-Filter mit einem Zwei-mal-Zwei-Patch. Dies gibt uns eine Matrix von Ausgängen, wo man eine Kante mit schwarz auf der linken Seite und weiß auf der rechten Seite bezeichnet. Negativ 1 bezeichnet eine Kante in umgekehrter Richtung. Als Bild visualisiert, haben
wir weiß wie linke Kante, schwarz wie eine rechte Kante und grau als keine Kante. Wir nennen es so, dass ein Filter mit dem Bild zusammenfließt. Dies funktioniert auch für generische Farbbilder. Hier ist ein Vogel auf der linken Seite. das Bild mit dem Kantenfilter zusammenfalten, wird das Bild auf der rechten Seite angezeigt, Kanten wie erwartet
hervorgehoben werden. Für den heutigen Gesichtsdetektor verwenden
wir Haar-Filter oder Haar-Funktionen. Einige Haar-Features finden Kanten wie die, die wir gerade ausprobiert haben. Andere finden Linien, andere finden abstrakte Muster. Es gibt eine Vielzahl von möglichen Filtern und es gibt auch viele, viele Patches in einem großen Bild. Ausführen aller Filter über alle Patches ist teuer. Lassen Sie uns das effizienter machen. Wir brauchen eine Möglichkeit, Rechenkosten zu sparen. Um dies zu tun, verwendet der Gesichtsdetektor in diesem Kurs eine Methode namens Kaskadierung. Um zu verstehen, wie kaskadierende CVS berechnen, müssen
wir die Intuition verstehen. Sieh dir das Bild in der roten Box an. Es ist im Grunde eintönig grün. Es enthält definitiv kein Gesicht, weil es alles eine Farbe und ziemlich langweilig ist. wir das wissen, könnten wir
zuerst einen einfachen Detektor ausführen , um alle kantenlosen Teile des Bildes zu finden. Das Zusammenführen eines Kantenfilters mit dem Bild gibt uns diese Ausgabe. Beachten Sie, dass dieser monotone Teil des Bildes, der links in rot eingefasst ist, komplett schwarz ist. Wir können nun diese Teile des Bildes ignorieren und
später Filter auf die interessanteren Teile des Bildes fokussieren , die grün dargestellt sind, und das ist die Intuition. Führen Sie einen kleinen Satz von Filtern des Bildes aus. Wir nennen diese Stufe 1. Bestimmen Sie, welche Teile interessant sind, indem
Sie die Pixel mit den höchsten Ausgabewerten auswählen . Führen Sie dann den nächsten Satz von Filtern auf die interessanten Teile aus. Verfeinern Sie, welche Teile des Bildes als interessant angesehen werden, und wiederholen Sie für den nächsten Satz von Filtern, verfeinern Sie, welche Teile des Bildes wieder interessant sind, und machen Sie dies weiter. Du könntest das auf unbestimmte Zeit wiederholen. In unserem Gesichtserkennungsmodell verwendet
das Modell heute 38 solcher Stufen. Diese kaskadierten Filter ermöglichen es uns dann, diese Erkennung durchzuführen. Insbesondere wird diese letzte Stufe der 38 Stufen hohe Werte für Flächen ausgeben. Zeichnen Sie einen Rahmen um Werte im Bild, die einen Schwellenwert überschreiten, visualisieren Sie
dann oben auf Ihrem Originalbild, und dort haben Sie es, eine erfolgreiche Gesichtserkennung. Lasst uns die Schritte zusammenfassen. Zusammenfassend haben wir diskutiert, wie einfache Features wie Kanten mithilfe von Filtern extrahiert werden können. Wir diskutierten dann, wie diese einfachen Features verwendet werden, um mit Hilfe eines Kaskadenmusters iterativ interessante Teile des Bildes zu
finden. Schließlich erzeugt die Kaskade hochwertige Ausgänge für Flächen. In der letzten Phase zeichnen
wir eine Box um hochwertige Ausgaben, und diese Felder identifizieren Gesichter im Bild. eine Kopie dieser Folien und weiterer Ressourcen zu erhalten, überprüfen Sie diese URL. Jetzt, da Sie wissen, wie Gesichtsdetektoren funktionieren, lassen Sie uns unseren Face-Swapper abschließen und fertig programmieren.
7. Code Gesichtswechsel: Jetzt haben wir Code, um unsere Webcam zu verarbeiten und Gesichter zu erkennen, sind
wir bereit, den Gesichtswechsel zu beenden. Auf hohem Niveau folgen wir dem gleichen zweistufigen Prozess wie zuvor. Zuerst testen wir den Gesichtswechsel auf einem Bild dann implementieren wir den Gesichtswechsel für Ihre Webcam. Beginnen Sie mit dem Zugriff auf diese URL, wie ich auf der rechten Seite habe. Dies wird
wieder eine Umgebung für uns aus der Ferne schaffen , so dass wir keine Einrichtung auf unseren eigenen Computern durchführen wollen. Vor einer neuen Funktion werden wir eine neue Datei erstellen. Auf der linken Seite hier, wenn Ihr Datei-Browser wie meins zusammengebrochen ist, gehen Sie weiter und klicken Sie darauf, um ihn zu erweitern. Auf der rechten Seite werde
ich meine Vorschau schließen, indem ich auf die obere rechte x klicke. In dieser Datei werde ich auf detect.py klicken, und das ist die Datei, die wir bearbeiten möchten. Gehen Sie weiter und schließen Sie die Datei, indem Sie oben links auf diesen Pfeil nach links klicken. In dieser Datei werden wir eine neue Funktion erstellen, Gesichter
tauschen, um Ihre Gesichtserkennung und Box-Zeichencode zu halten. Wir werden eine Funktion namens Swap-Gesichter über unserem aktuellen Code definieren. Diese Funktion wird in das Bild und den Gesichtsdetektor nehmen. Im Inneren werden wir diesen Code vom Erkennungscode bis zum Code der Box-Zeichnung nehmen. Ich schneide das aus und füge es dann in unsere neue Funktion ein. Sobald Sie es einfügen, müssen Sie die Einrückung anpassen. Für mich müssen die Zeilen 6 bis 10 noch einmal eingerückt werden. Jetzt werden wir die Rechtecke,
oder mit anderen Worten, die Gesichter in Zweiergruppen koppeln . Lassen Sie mich erklären, wie wir das machen. Tun Sie so, als ob die Rechteck-Liste nur Zahlen wie diese enthält. Dann werden Rechtecke von 2። 2 jede andere Zahl auswählen. In diesem Fall hätten wir 0, 2, 4. Als nächstes werden Rechtecke 1። 2 die erste überspringen dann jede andere Zahl auswählen. In diesem Fall hätten wir 1, 3, 5. Indizierung ist ein ziemlich kompliziertes Thema, also mach dir keine Sorgen, wenn du das nicht vollständig verstehst, weißt
nur, dass dies konzeptionell passiert. Schließlich sammelt zip das erste Element aus beiden Listen. In diesem Fall wird 0,1 dann das zweite Element aus beiden Listen sammeln, in diesem Fall 2,3. Schließlich ist der dritte Punkt aus beiden Listen machen 4,5. All dies zu sagen, dass kompliziert aussehende Ausdruck, zip Rechtecke mit einer Reihe von Spalten und Zahlen, wählen Sie alle zwei Rechtecke oder alle zwei Gesichter. Lassen Sie uns das jetzt programmieren. In Ihrem Code auf der linken Seite werden
wir diese for-Schleife ändern, so dass wir für Rechteck 1,
Rechteck 2 in zip haben , und dann den Ausdruck, den wir
vor Rechtecken 1። 2 und Komma hatten . Ich werde Enter drücken und hier werde ich unseren ursprünglichen Box-Zeichnungscode schreiben, übergeben und löschen. Lassen Sie uns nun beide Gesichter aus dem Bild extrahieren. Wir werden mit der Definition einer Hilfsfunktion beginnen. Unterhalb tauschen Gesichter, werden
wir get face selector definieren. Diese Funktion gibt bei einem Rechteck eine Maske
zurück, damit wir das Gesicht auswählen können. Zuerst werden wir das Rechteck in die vier Werte zerlegen, genau wie zuvor. Hier wird dann ein Slice-Objekt zurückkehren. einem Slice-Objekt können Sie einen Teil der Liste auswählen. In diesem Fall können Sie mit zwei Slices einen Teil eines 2D-Arrays oder mit anderen Worten
einen Teil des Bildes auswählen . Hier werden wir zwei Slice-Objekte zurückgeben. Das erste Slice-Objekt wird entlang der ersten Bemaßung oder der Y-Achse von y nach y plus h geschnitten. Das zweite Slice-Objekt wird entlang
der zweiten Bemaßung oder der X-Achse von x nach x plus Breite geschnitten . Jetzt werden wir diese get face selector Funktion verwenden, oben, mit unserer neuen Hilfsfunktion, konvertieren Sie das erste Rechteck in eine Gesichtsmaske innerhalb unserer for-Schleife. Hier werden wir Mask1 schreiben ist gleich Gesicht Selektor Rechteck zu bekommen1. Wiederholen Sie dasselbe für das zweite Rechteck. Verwenden Sie nun die Masken, um beide Flächen aus dem Bild auszuwählen. Fläche1 ist gleich Bild von mask1 und face2 ist gleich dem Bild von mask2. Da die beiden Flächen unterschiedliche Größen haben können, müssen
wir die Größe jeder Fläche so anpassen, dass sie in die andere passt. Hier ist konzeptionell, wie wir das machen werden. Angenommen, wir versuchen, die grüne Box innerhalb der blauen Box zu passen,
beachten Sie, dass die blaue Höhe kleiner als die grüne Höhe ist. Da die grüne Box größer ist, werden
wir sie verkürzen, so dass die Höhen beider Boxen gleich sind. In diesem Fall sagt uns das Verhältnis zwischen der blauen Höhe und der grünen Höhe, wie viel wir am grünen Rechteck schrumpfen mussten. Sagen Sie jetzt, dass die grüne Box breiter als die blaue Box ist,
beachten Sie, dass die blaue Breite kleiner ist als die grüne Breite. Wir werden es so verkleinern, dass die Breiten beider Rechtecke gleich sind. In diesem Fall sagt uns das Verhältnis zwischen der blauen Breite und der grünen Breite, wie viel wir das grüne Rechteck verkleinern mussten. Wir wissen nicht, ob das Rechteck zu groß oder zu breit ist also nehmen wir das Minimum beider Verhältnisse an, um sicher zu sein. Dadurch wird sichergestellt, dass das grüne Rechteck genug geschrumpft ist, ob es zu hoch oder zu breit ist, um in das blaue Rechteck zu passen. Lassen Sie uns das jetzt programmieren. Genau wie bevor wir anfangen, indem wir eine Hilfsfunktion
unter dem Gesichtselektor definieren , um zu finden, ändern Sie die Größe, um zu passen. Diese Funktion wird in zwei Gesichtern aufnehmen, face1 und face2. Zerlegen Sie zuerst die Gesichtsform, um die Breite und Höhe des Gesichts zu erhalten. Wir werden face1_height,
face1_width eingeben , Unterstrich ist, dass Sie face1.shape haben. Das Gesicht hat eigentlich drei Dimensionen für seine Form. Wenn Sie sich aus unserer vorherigen Lektion erinnern, sind
alle Bilder h mal w von 3. Wir brauchen diese letzte Dimension nicht, also verwenden wir einen Unterstrich. Unterstrich ist Konvention zum Ignorieren dieser Variablen. Wir werden dies auch mit der zweiten Fläche wiederholen, face2_h, face2_w ist gleich face2.shape. Berechnen Sie dann die erforderliche Menge, um die erste Fläche so zu verkleinern, dass sie in die zweite Fläche passt. Dies ist der Faktor, den wir bereits erwähnt haben. Faktor ist gleich dem Minimum zwischen der Fläche2 Höhe geteilt durch Fläche1 Höhe und dann der Fläche2 Breite geteilt durch die Fläche1 Breite. Schließlich ändern wir die Größe von face1. Hier ist die Größenänderungsfunktion, die wir in
der ersten Fläche nehmen und das zweite Argument ist, wenn erforderlich, Argument, obwohl wir nicht verwenden, so übergeben Sie keine für jetzt. Dann geben Sie den Faktor ein, der auf der x-Dimension skaliert werden soll, und dann den Faktor, der auf der y-Dimension skaliert werden soll. Endlich, geben Sie das zurück. Jetzt werden wir die Hilfsmethode verwenden, die Größe anpassen, um die Größe beider Flächen
so zu ändern, dass sie auf die andere passen. Beginnen Sie mit face1 oben in der for-Schleife wird in
resized1 eingeben entspricht der Größenänderung an face1, face2. Tun Sie dasselbe für die andere Flächengröße2 ist gleich der Größenänderung, um Fläche2 an Fläche1 anzupassen. Jetzt fügen wir tatsächlich jede Fläche auf die andere ein. Konzeptionell wird einfach das grüne Rechteck auf das blaue einfügen. Wieder beginnen wir mit der Hilfsmethode. Ich werde nach unten scrollen und unter Größe ändern, um zu passen wir definieren, stellen Sie sicher, Rücktaste, so dass Sie eine neue Funktion außerhalb starten, wir definieren anwenden, die in der Größe der Fläche und das Gesicht nimmt, auf dem sie eingefügt werden. Zerlegen Sie die Flächenform in ihre Höhe und Breite verkleinert1 Höhe, verkleinert1 Breite und Unterstrich, um zu ignorieren , dass die dritte Bemaßung gleich resize1.shape ist, und fügen Sie die Fläche dann auf Fläche2 ein. Hier face2, wir werden nun die Größe der Fläche auf Fläche2 einfügen. Schließlich geben Sie die zweite Fläche zurück. Auch hier ist die Indizierung ein ziemlich kompliziertes Thema. Wenn Sie also nicht verstehen, was diese Zeile bedeutet, machen Sie sich keine Sorgen. Moment müssen Sie nur wissen, wie er das
verkleinerte Gesicht auf die zweite Fläche eingefügt hat . Scrollen Sie zurück zu der for-Schleife, die wir jetzt verwenden, anwenden, um jedes Gesicht anzuwenden. Fügen Sie die veränderte Fläche2 auf Fläche1 ein. Mask1 entspricht der Größenänderung 2 Fläche1 anwenden. Wiederholen Sie das Gleiche für die andere Gesichtsbildmask2 ist gleich der Größenänderung1 Fläche2 anwenden. Für den letzten Schritt werden
wir tatsächlich unsere Swap-Gesichter
Funktion auf unser Bild und den entsprechenden Gesichtsdetektor anwenden , scrollen Sie nach unten bis zum Ende Ihrer Datei, nachdem Sie Ihren Detektor
instanziiert haben und lesen Sie Ihr Bild in. Wir rufen Tauschgesichter auf dem Bild und dem Gesichtsdetektor an. Jetzt sind wir mit dem Skript fertig. Klicken Sie auf den Datei-Browser auf der linken Seite, klicken Sie auf Extras und dann Terminal. Warten Sie auf ein Setup. Sobald das Setup abgeschlossen ist, geben Sie Python detect.py ein. Dadurch wird Ihr Gesicht Swaping-Code ausgeführt. Nach dem Ausführen dieses Skripts checkout out.JPEG auf der linken Seite. Sieht so aus, als hätte sich das Bild vielleicht nicht geändert, nun, schauen Sie näher. Die Kindergesichter sind tatsächlich ausgetauscht. Dies ist deutlicher, wenn ich zwischen dem Originalbild und dem ausgetauschten Bild wechsle. Hier ist das Originalbild und hier ist das ausgetauschte Bild. Lassen Sie uns jetzt Face-Swapping auf unsere Webcam anwenden. Beginnen Sie mit dem Zugriff auf diese URL. Sobald diese Seite geladen wurde, klicke
ich in der Vorschau auf der rechten Seite auf Schließen.
Ich empfehle, dasselbe zu tun, um mehr Platz zu schaffen. Auf der linken Seite werde
ich den Datei-Browser schließen, indem ich auf den Pfeil oben links klicke. Um zu beginnen, lassen Sie uns alle Hilfsfunktionen kopieren, die wir im letzten Schritt geschrieben haben. Ich werde sie direkt über unsere Gesichtsdetektorinstanziierung einfügen. Hier füge ich diese ein. Beachten Sie, dass es nicht wirklich wichtig ist, wo Sie diese Funktionen einfügen. Wenn Sie genau an der gleichen Stelle einfügen möchten, habe
ich es nach meinen Importen eingefügt, aber bevor der Gesichtsdetektor instanziiert wird. Lassen Sie uns nun eine neue Transformation für
unsere Webanwendung definieren , die auf den Webcam-Live-Feed angewendet werden soll. Nach all unseren vorhandenen Funktionen scrollen, werde
ich eine neue Transformation erstellen. Wie in einer vorherigen Lektion werden
wir den Web Open CV Decorator bei app.transform verwenden. Wir geben dieser Transformation einen Namen für Gesicht Swap und wir werden auch
diese neue Transformation zum Standard machen , indem Sie in Standard gleich true eingeben. Ich werde diesen Standard gleich
unten löschen, weil wir nicht zwei Standardtransformationen haben können. Wir definieren nun eine Face-Swap-Funktion, die sowohl das Bild als auch den Frame übernimmt, und rufen
dann die Hilfsmethode zum Auswechseln von Gesichtern auf, die Sie im letzten Abschnitt geschrieben haben. Geben Sie Swap-Flächen ein und übergeben Sie sowohl das Bild als auch den Gesichtsdetektor und geben Sie das Bild zurück. Endlich, das war's. Klicken Sie oben links auf Anzeigen. Für mich sieht es aus wie hatte Sonnenbrille Symbol. Wählen Sie dann in einem neuen Fenster, dies öffnet eine Vorschau Ihrer Webanwendung. Ich werde vergrößern, damit Sie sehen können, was los ist, und klicken Sie dann auf Start. In diesem Fall tausche ich mich mit einem Bild von mir selbst aus der Vergangenheit. Stellen Sie sicher, dass Sie auf Start und dann auf Zulassen klicken. Damit ist unser Face-Swap abgeschlossen. Du kannst diesen Gesichtstausch jetzt mit deinen Freunden und deiner Familie teilen. Machen Sie lustige Gesichter, teilen Sie so viele Bilder und haben Sie Spaß mit Ihrem eigenen Gesicht Swap-Anwendung. Gute Arbeit, um diese Lektion zu beenden, es war eine lange. Für eine Kopie dieser Folien, der fertige Code
und weitere Ressourcen stellen Sie sicher, dass Sie diese URL auschecken. In der nächsten Lektion finden Sie die nächsten Schritte, um mehr Computersicht zu erfahren.
8. Nächste Schritte: Herzlichen Glückwunsch. Du hast dein Meisterwerk zum Gesichttauschen beendet. Wir haben dargelegt, wie Bilder dargestellt werden, wie man Bedeutung aus Bildern extrahiert, Gesichtserkennungsmodelle und vieles mehr. Wenn dies Ihr Interesse an maschinellem Lernen und Computer Vision geweckt hat, folgen Sie mir auf Skillshare, um benachrichtigt zu werden, wenn die nächste Klasse startet. Wenn Sie auch an Data Science Themen interessiert sind, schauen Sie sich meine Data Science 101-Klasse an, das Spiel mit Daten oder die SQL 101-Klasse zum Abfragen und Entwerfen von Datenbanken an. Danke, dass Sie sich mir für diese Face-Swaping-Klasse angeschlossen haben. Herzlichen Glückwunsch noch einmal machen es bis zum Ende des Kurses und bis zum nächsten Mal.