• Zuhause
  • Artikel
  • So richten Sie die NSFW-Inhaltserkennung mit Machine Learning ein
Veröffentlicht am 26-02-2019

So richten Sie die NSFW-Inhaltserkennung mit Machine Learning ein

Es war im Nachhinein schwierig, einem Gerät das Erkennen unanständiger Inhalte beizubringen, aber es war beim ersten Durchgang sicher schwierig.

Hier sind einige Lektionen und einige Tipps und Tricks, die ich beim Erstellen eines NSFW-Modells aufgedeckt habe.

Obwohl es viele Möglichkeiten gibt, wie dies umgesetzt werden könnte, besteht die Hoffnung in diesem Beitrag darin, eine freundliche Erzählung bereitzustellen, damit andere verstehen können, wie dieser Prozess aussehen kann.

Wenn Sie neu bei ML sind, werden Sie dazu inspiriert, ein Modell zu trainieren. Wenn Sie mit dem Modell vertraut sind, würde ich gerne hören, wie Sie dieses Modell erstellt hätten und Sie bitten, Ihren Code zu teilen.

Der Plan:

  1. Holen Sie sich jede Menge Daten
    1. Beschriften und bereinigen Sie die Daten
    2. Verwenden Sie Keras und übertragen Sie das Lernen
    3. Verfeinern Sie Ihr Modell
    4. Holen Sie sich jede Menge Daten

      Glücklicherweise wurde für ein NSFW-Dataset ein wirklich cooler Satz Scraping-Skripts veröffentlicht. Der Code ist einfach und wird bereits mit beschrifteten Datenkategorien geliefert. Dies bedeutet, dass wir durch das Akzeptieren der Standardeinstellungen dieses Data Scrapers 5 Kategorien erhalten, die aus Hunderten von Subreddits stammen.

      Die Anweisungen sind recht einfach, Sie können einfach die 6 freundlichen Skripts ausführen. Achten Sie darauf, da Sie eventuell Änderungen vornehmen möchten.

      Wenn Sie weitere Subreddits hinzufügen möchten, sollten Sie die Quell-URLs bearbeiten, bevor Sie Schritt 1 ausführen.

      Z.B. - Wenn Sie eine neue Quelle für neutrale Beispiele hinzufügen würden, würden Sie die Liste der Subreddits in nsfw_data_scraper / scripts / source_urls / neutral.txt hinzufügen.

      Reddit ist eine großartige Ressource für Inhalte rund um das Web, da die meisten Subreddits von Menschen leicht überwacht werden, um für dieses Subreddit das Ziel zu sein.

      Beschriften und bereinigen Sie die Daten

      Die Daten, die wir vom NSFW-Datenschaber erhalten haben, sind bereits gekennzeichnet. Aber erwarten Sie einige Fehler. Zumal Reddit nicht perfekt kuratiert ist.

      Die Vervielfältigung ist auch recht häufig, aber ohne langsamen menschlichen Vergleich fixierbar.

      Das erste, was ich gerne ausführen möchte, ist der Duplikate-Datei-Finder, der am schnellsten exakt übereinstimmt und gelöscht wird. Es wird in Python betrieben.

      Im Allgemeinen kann ich mit diesem Befehl eine Mehrheit der Duplikate ausschalten.

      python dff.py --path train / path --delete

      Nun werden Bilder nicht gefangen, die "im Wesentlichen" gleich sind. Dafür plädiere ich für ein Macpaw-Werkzeug namens „Gemini 2“.

      Das sieht zwar sehr einfach aus, aber vergessen Sie nicht, die automatischen Duplikate zu durchforsten, und wählen Sie ALLE Duplikate aus, bis Ihr Gemini-Bildschirm "Nothing Remaining" wie folgt anzeigt:

      Es ist sicher zu sagen, dass dies extrem Zeit in Anspruch nehmen kann, wenn Sie über ein großes Datensatz verfügen. Ich persönlich habe es für jede Klassifizierung ausgeführt, bevor ich es im übergeordneten Ordner ablegte, um angemessene Laufzeiten zu erhalten.

      Verwenden Sie Keras und übertragen Sie das Lernen

      Ich habe Tensorflow, Pytorch und rohen Python als Möglichkeiten betrachtet, ein maschinelles Lernmodell von Grund auf zu erstellen. Aber ich suche nicht nach etwas Neuem, ich möchte etwas Bestehendes tun. Also bin ich pragmatisch gegangen.

      Ich habe festgestellt, dass Keras die praktischste API zum Schreiben eines einfachen Modells ist. Selbst Tensorflow stimmt zu und arbeitet derzeit daran, Keras-ähnlicher zu sein. Mit nur einer Grafikkarte greife ich mir ein beliebtes, vorbestehendes Modell + Gewichte an und trainiere es einfach mit etwas Transferlernen.

      Nach ein wenig Recherche entschied ich mich für Inception v3 mit Imagenet. Für mich ist das so, als würde man in den bereits vorhandenen ML-Laden gehen und den Aston Martin kaufen. Wir müssen nur die oberste Schicht abschneiden, damit wir dieses Modell für unsere Bedürfnisse verwenden können.

      conv_base = InceptionV3 (
        Gewichte = "Imagenet",
        include_top = False,
        input_shape = (Höhe, Breite, Anzahl_Kanäle)
      )

      Nachdem das Modell installiert war, fügte ich drei weitere Schichten hinzu. Eine 256 versteckte Neuronenschicht, gefolgt von einer versteckten 128 Neuronenschicht, gefolgt von einer letzten 5 Neuronenschicht. Letzteres ist die endgültige Einstufung in die fünf von Softmax moderierten Abschlussklassen.

      # 256 hinzufügen
      x = dicht (256, Aktivierung = 'relu', kernel_initializer = initializers.he_normal (seed = None), kernel_regularizer = regularizers.l2 (.0005)) (x)
      x = Aussetzer (0,5) (x)
      # 128 hinzufügen
      x = dicht (128, Aktivierung = 'relu', kernel_initializer = initializers.he_normal (Seed = None)) (x)
      x = Aussetzer (0,25) (x)
      # 5 hinzufügen
      Vorhersagen = dicht (5, kernel_initializer = "glorot_uniform", Aktivierung = 'softmax') (x)

      Einige der oben genannten Dinge scheinen merkwürdig. Meine neuen verborgenen Ebenen werden reguliert, um eine Überanpassung zu verhindern.

      Ich verwende Dropout, das neuronale Pfade zufällig entfernt, sodass keine Funktion das Modell dominiert.

      Zu früh?

      Außerdem habe ich der ersten Ebene auch eine L2-Regularisierung hinzugefügt.

      Nun, da das Modell fertig ist, habe ich meine Datenmenge mit einiger Bewegung erhöht. Ich drehte, verschob, schnitt, schimmerte, zoomte, drehte mich um und veränderte meine Trainingsbilder. Dies hilft dabei sicherzustellen, dass die Bilder durch übliches Rauschen trainiert werden.

      Alle oben genannten Systeme sollen ein Überanpassen des Modells an den Trainingsdaten verhindern. Auch wenn es sich um eine Unmenge von Daten handelt, möchte ich das Modell für neue Daten so allgemein wie möglich verallgemeinern.

      Ich habe ein Modell!

      Nachdem ich dies längere Zeit ausgeführt hatte, hatte ich eine Genauigkeit von 87% für das Modell! Das ist eine ziemlich gute Version! Lass es uns großartig machen

      Verfeinern Sie Ihr Modell

      Grundlegende Feinabstimmung

      Sobald die neuen Ebenen trainiert sind, können Sie einige tiefer liegende Ebenen in Ihrem Inception-Modell für ein erneutes Training freigeben. Mit dem folgenden Code wird alles ab dem Layer conv2d_56 entsperrt.

      set_trainable = False
      für die Ebene in conv_base.layers:
          Wenn layer.name == 'conv2d_56':
              set_trainable = True
          wenn set_trainable:
              layer.trainable = True
          sonst:
              layer.trainable = False

      Ich habe das Modell lange mit diesen neuen nicht gesperrten Schichten ausgeführt, und nachdem ich exponentiellen Abfall (über eine geplante Lernrate) hinzugefügt hatte, konvergierte das Modell mit einer Genauigkeit von 91% in meinen Testdaten!

      Mit 300.000 Bildern war es unmöglich, Fehler in den Trainingsdaten zu finden. Aber mit einem Modell mit nur 9% Fehler konnte ich die Fehler nach Kategorien aufschlüsseln und dann nur etwa 5.400 Bilder betrachten! Im Wesentlichen könnte ich das Modell verwenden, um falsche Klassifizierungen zu finden und den Datensatz zu bereinigen!

      Technisch würde dies nur falsche Negative finden. Nichts zu tun, um die falschen Positiven zu voreingenommen zu machen, aber mit etwas, das NSFW-Inhalte erkennt, stelle ich mir vor, dass Rückruf wichtiger ist als Präzision.

      Der wichtigste Teil der Raffination

      Selbst wenn Sie viele Testdaten haben, werden diese normalerweise aus dem gleichen Bereich gezogen. Der beste Test besteht darin, anderen die Verwendung und Überprüfung Ihres Modells zu erleichtern. Dies funktioniert am besten in Open Source und einfachen Demos. Ich habe http://nsfwjs.com veröffentlicht, was der Community dabei geholfen hat, Vorurteile zu erkennen, und genau das tat die Community!

      Die Community hat ziemlich schnell zwei interessante Anhaltspunkte für eine Befangenheit erhalten. Der Spaß war, dass Jeffrey Goldblum immer falsch eingestuft wurde, und der nicht so spaßige war, dass das Modell zu sehr auf Frauen reagierte.

      Sobald Sie mit Hunderttausenden von Bildern begonnen haben, ist es für eine Person (wie moi) schwer zu erkennen, wo ein Problem liegt. Selbst wenn ich tausend Bilder im Detail nach Befangenheit durchsucht hätte, hätte ich nicht einmal die Oberfläche des Datensatzes insgesamt gekratzt.

      Deshalb ist es wichtig, sich zu äußern. Die falsche Klassifizierung von Jeff Goldblum ist ein unterhaltsamer Datenpunkt, aber das Identifizieren, Dokumentieren und Einreichen eines Tickets anhand von Beispielen wirkt leistungsfähig und gut. Ich konnte an der Korrektur der Voreingenommenheit arbeiten.

      Mit neuen Bildern, verbessertem Training und besserer Validierung konnte ich das Modell innerhalb weniger Wochen neu trainieren und ein viel besseres Ergebnis erzielen. Das resultierende Modell war in der Wildnis weitaus genauer. Nun, es sei denn, Sie haben genauso viel gelacht wie ich über die Jeff Goldblum-Ausgabe.

      Wenn ich einen Fehler herstellen könnte… würde ich Jeff behalten. Aber wir haben eine Genauigkeit von 93% erreicht!

      In Summe

      Es hat zwar viel Zeit gekostet, aber es war nicht schwer und es hat Spaß gemacht, ein Modell zu bauen. Ich schlage vor, Sie schnappen sich den Quellcode und probieren Sie es selbst aus! Ich werde wahrscheinlich sogar versuchen, das Modell zum Vergleich mit anderen Frameworks neu zu trainieren.

      Zeig mir was du hast. Contribute oder Star / Watch / Repo, wenn Sie den Fortschritt sehen möchten: https://github.com/GantMan/nsfw_model

      Gant Laborde ist Chief Technology Strategist bei Infinite Red, einem veröffentlichten Autor, außerplanmäßigen Professor, weltweiter öffentlicher Redner und verrückter Wissenschaftler in Ausbildung. Klatsche / folge / twittere oder besuche ihn auf einer Konferenz.

      Haben eine Minute Schauen Sie sich noch ein paar weitere an: