Einen Instagram-Roboter bauen

Inhaltsverzeichnis

  1. Datenaufnahme
  2. Wiederkehrendes neuronales Netz
  3. GPT-2
  4. Automatisierte Buchung
  5. Web-App

Datenaufnahme

Ich habe dieses Projekt mit dem vagen Ziel gestartet, ein Python-Programm zu erstellen, um Benutzeraktivitäten auf meinem persönlichen Instagram-Konto zu simulieren, mit dem ursprünglichen Ziel, Bilder mit Untertiteln programmgesteuert zu veröffentlichen. Ich hatte zuvor mit dem GPT-2-Modell von Open AI gearbeitet, das mit einer Monkey-See-Monkey-Do-Methode zum Generieren von Text (für die Beschriftung) basierend auf den Trainingsdaten arbeitet. Vor diesem Hintergrund wusste ich, dass der erste Schritt darin bestand, einen anständigen Trainingsdatensatz von Instagram aufzunehmen. Ich hatte keine Ahnung, wie ich die Beschriftung von GPT-2 dazu bringen würde, tatsächlich relevant für das Foto im Beitrag zu erscheinen.

Leider waren die API-Funktionen von Instagram für mein Projekt stark eingeschränkt. Die Lösung bestand darin, einen Selen-basierten Web-Scraper zu verwenden, um echte Instagram-Posts von der Registerkarte „Explore“ zu entfernen. Diese Trainingsdaten wurden verwendet, um den Untertitel erzeugenden Teil des Bots zu trainieren, sodass er tendenziell auf diese Daten ausgerichtet ist. Ich würde davon ausgehen, dass Instagram dazu neigt, die Registerkarte "Explore" jedes Benutzers basierend auf seinem Surfverhalten anzupassen. Da ich jedoch kein Instagram verwende, habe ich meine Registerkarte "Explore" als nahe an der Standardeinstellung angesehen. Aus irgendeinem Grund gehören dazu viele Mykologie- und Harry-Stile. Ich weiß nicht warum. Infolgedessen neigen die endgültigen Untertitel dazu, sie zu kennzeichnen.

Webscraper in Aktion, diesmal auf bestimmten Tags

Der ursprüngliche Plan hier war, die verkratzten Daten in meinen persönlichen S3-Bucket hochzuladen. Ich stellte jedoch fest, dass nach 10.000 verkratzten Posts die tatsächlichen Fotos in ungefähr 1,3 GB Daten und die zugehörigen Metadaten (Bildunterschriften, Zeitstempel, Benutzernamen, Auswahl von Kommentaren) übersetzt wurden. etc.) auf ca. 25Mb. Dies wurde leicht von meinem lokalen Computer erledigt.

Wiederkehrendes neuronales Netz

Durch hartnäckiges Googeln habe ich diesen Artikel gefunden, der ein wiederkehrendes neuronales Netzwerk verwendet, um automatisch Bildunterschriften für Fotos zu generieren. Ich habe festgestellt, dass die grundlegende Codierung in mehreren Artikeln im Internet enthalten ist, daher bin ich mir nicht sicher, wem ich die anfängliche Arbeit zuschreiben soll, aber dieser Link ist der, den ich verwendet habe. Ich sollte auch beachten, dass ich kein Datenwissenschaftler bin. Ich musste jedes Modell oft als eine Black Box behandeln, die die Effizienz der Codierung einschränkte.

Dieses Netzwerk wird auf dem Flickr 8K-Datensatz trainiert, der aus 8.000 Fotos mit jeweils fünf Bildunterschriften besteht, die beschreiben, was auf dem Foto enthalten ist. Leider wird dieser Datensatz nicht mehr von der University of Illinois gehostet, es ist jedoch nicht schwierig, ihn zu googeln, um ihn an anderer Stelle zu finden. Ich habe dieses Modell auf meinem eigenen PC mit einer Nvidia RTX2070 Super-GPU, deren Ausführung weniger als eine halbe Stunde dauerte, auf meinem eigenen PC trainiert (es macht großen Spaß, die richtige Version von Tensorflow und den zugehörigen Bibliotheken in einer Reihe zu platzieren und ordnungsgemäß zu installieren).

Dies ist der Teil des Bots, der für den Versuch verantwortlich ist, zu identifizieren, was auf dem Foto mit Untertiteln zu sehen ist. Infolgedessen wird seine Genauigkeit durch die zugrunde liegenden Flickr-Trainingsdaten verzerrt. Es ist in der Regel gut geeignet, Personen (ihr Geschlecht nach Haarlänge?), Hunde und Motorräder zu identifizieren, aber es ist etwas zufällig für etwas Abstrakteres oder etwas mit Text auf dem Foto selbst, da diese in den Trainingsdaten nicht vorhanden waren. Ein Teil des Spaßes für mich ist zu erraten, warum das Modell etwas beschriftet hat, das es getan hat, wenn es auf einen Nennwert keinen Sinn ergibt.

Dieses Modell spuckt eine Satzunterschrift aus, um zu beschreiben, was auf dem Foto zu sehen ist. Die Genauigkeit bei der Ausführung auf tatsächlichen Instagram-Posts ist bestenfalls zweifelhaft. Daher habe ich einige einfache NLP-Arbeiten durchgeführt, um die Substantive aus dieser Beschriftung zu analysieren, die dann als Schlüsselwörter für die eigentliche Untertitelgenerierung in GPT-2 eingegeben werden.

GPT-2

Das GPT-2 von Open AI ist bemerkenswert gut darin, Text zu generieren, der auf den Korpus abgestimmt ist, auf den Sie ihn fein einstellen. In diesem Fall habe ich es auf den 10.000 aktuellen Instagram-Untertiteln trainiert, die ich auf der Registerkarte "Erkunden" von Instagram abgerufen habe. Wie ich bereits erwähnt habe, ist dies stark auf Harry Styles und Mykologie ausgerichtet.

Dieser Teil des Projekts wäre ohne die Arbeit von Max Woolf, dessen gpt-2-einfache Bibliothek ich ausgiebig genutzt habe, nicht möglich gewesen. Vanilla GPT-2 kann ein Schlüsselwort als Ausgangspunkt für die Texterzeugung verwenden. Es wird jedoch buchstäblich als erstes Wort im generierten Text verwendet und basiert auf den Schlüsselwörtern des RNN. Dies hätte die zurückgegebene Beschriftung stark eingeschränkt.

Das Skript von Max Woolf zum Codieren von Trainingsdaten vor dem Einspeisen in GPT-2 war der Schlüssel zur Verknüpfung von GPT-2 und RNN. Trainingsdaten werden automatisch analysiert, um Schlüsselwörter zu kennzeichnen, sodass GPT-2 sie später in einem Format eingeben kann, das dem Regex-Pattern-Matching (den Nomen des RNN) ähnelt.

Ich habe dieses Modell wieder auf meiner eigenen Hardware trainiert, was ungefähr 45 Minuten bis eine Stunde dauerte, um es zu trainieren.

Automatisierte Buchung

Das letzte Puzzleteil bestand darin, jedes der Modelle aneinander zu reihen und auf Instagram zu posten (wieder ein super Spaß, alle abhängigen Bibliotheken in ihren kompatiblen Versionen zu installieren. Ich möchte nur betonen, wie viel Spaß das gemacht hat). Mit Selen habe ich einen Chrome-Treiber verwendet, um ein Mobiltelefon auf meinem Desktop zu simulieren und den Buchungsfluss zu durchlaufen. Ich hatte leider ein großes Problem damit, den eigentlichen Text der Beschriftung in das Texteingabefeld von Instagram zu bekommen.

Ein automatisierter Beitrag

GPT-2 ist gut genug, um Emojis in seine generierte Ausgabe aufzunehmen. Ich habe dies sehr geschätzt, da Emojis ein wichtiges Merkmal von Instagram-Untertiteln sind. Die send_keys-Methode der Chrome-Treiber unterstützt jedoch nur die Literaltasten auf Ihrer Tastatur und kann daher keine Emojis senden. Ich habe hier viele Dinge ausprobiert. Ich habe versucht, den Text mit Javascript in das Eingabefeld einzufügen. Ich habe versucht, Firefox zu simulieren (mobile Geräte können nicht simuliert werden). Die letzte, ruckelige Lösung, die ich verwende, besteht darin, den Text buchstäblich zu kopieren und in (über Python) einzufügen, indem ich STRG-C, STRG-V simuliere. Für jeden, der zu Hause mitmacht, bedeutet dies, dass wenn ich auf etwas anderes klicke, während ich diesen Teil des Programms ausführe, es kaputt geht. Aber wenn nicht, funktioniert es. Also ich nicht.

Web-App

Es war ein wirklich cooles Gefühl, einen ersten Beitrag fertigzustellen, aber ich dachte, ich würde noch einen Schritt weiter gehen, um eine Web-App zu erstellen, mit der andere Leute sie auch ausprobieren können. Dies bedeutete, eine Datenaufnahme-Pipeline neu zu konfigurieren, um einen einzelnen Post-Upload zu ermöglichen. Es gibt eine Menge Details, auf die ich hier eingehen könnte, aber ich habe es satt, diesen Beitrag zu schreiben, damit ich es einfach halte.

Schritt eins bestand darin, das Modell in eine Flask-App zu packen, die ich lokal ausführen konnte, zusammen mit einem Frontend. Jeder, der es verwendet, kann wahrscheinlich sagen, dass ich eine Back-End-Person bin, die zum ersten Mal an einem Front-End arbeitet. Es gibt viele kopiergefügte HTML-, CSS-, Javascript-Funktionen usw., und ich musste etwas über clientseitige und serverseitige Validierung, Eingabesanierung usw. lernen. Es ist chaotisch, aber es funktioniert.

Die Web-App. Es läuft auf einem Nicht-GPU-EC2, also ist es etwas langsam ...

Schritt zwei bestand darin, es in eine produktivere Gunicorn-App zu packen und sie und ihre Abhängigkeiten dann in einen Docker-Container zu packen. Hier erfahren Sie, wie Sie vergessen, eine virtuelle Python-Umgebung zu verwenden.

Schritt zwei (oder 3 oder 4 oder was auch immer) bestand darin, einen anderen Docker-Container zu erstellen, auf dem NGINX als Reverse-Proxy ausgeführt wird, und dann Docker beide Container zusammenzustellen, um sie erneut lokal auszuführen. Nachdem ich dies in Gang gebracht hatte, stellte ich das gesamte Paket auf einem EC2 bereit, der auf meinem AWS-Konto ausgeführt wird. Ursprünglich plante ich die Bereitstellung in einem ECS-Cluster mit einem vorhandenen Lastausgleichsmechanismus, wurde jedoch faul und wollte auch meine Ausgaben niedrig halten (um zu vermeiden, dass mehrere nicht freie EC2-Instanzen gleichzeitig ausgeführt werden). In Kombination mit einem von mir gekauften Domainnamen et-voila, einer Web-App-Version, die jeder ausprobieren kann.

Möglicherweise komme ich immer noch dazu, eine SSL-Verschlüsselung für die App oder Google Ad Sense einzurichten, damit ich hoffentlich die Kosten für den Betrieb des Servers wieder gutmachen kann, aber idk.

Sie können den Konten generierenden Posts unter @notdavidyu folgen. Die Web-App ist verfügbar, solange ich noch unter www.thegram9000.com dafür bezahlen möchte