Πώς να ρυθμίσετε την ανίχνευση περιεχομένου NSFW με το Machine Learning

Η διδασκαλία ενός μηχανήματος για την αναγνώριση άσεμνου περιεχομένου δεν ήταν δύσκολη αναδρομικά, αλλά ήταν σίγουρα δύσκολη την πρώτη φορά.

Εδώ είναι μερικά μαθήματα που αντλήθηκαν, και μερικές συμβουλές και κόλπα που αποκάλυψα κατά τη δημιουργία ενός μοντέλου NSFW.

Αν και υπάρχουν πολλοί τρόποι με τους οποίους αυτό θα μπορούσε να εφαρμοστεί, η ελπίδα αυτής της ανάρτησης είναι να παρέχει μια φιλική αφήγηση, έτσι ώστε οι άλλοι να καταλάβουν πώς μπορεί να είναι αυτή η διαδικασία.

Εάν είστε νέοι στο ML, αυτό θα σας εμπνεύσει να εκπαιδεύσετε ένα μοντέλο. Εάν είστε εξοικειωμένοι με αυτό, θα ήθελα πολύ να μάθω πώς θα κάνατε να φτιάξετε αυτό το μοντέλο και να σας ζητήσω να μοιραστείτε τον κωδικό σας.

Το σχέδιο:

  1. Λάβετε πολλά και πολλά δεδομένα
  2. Επισημάνετε και καθαρίστε τα δεδομένα
  3. Χρησιμοποιήστε το Keras και μεταφέρετε τη μάθηση
  4. Βελτιώστε το μοντέλο σας

Λάβετε πολλά και πολλά δεδομένα

Ευτυχώς, κυκλοφόρησε ένα πολύ ωραίο σετ σεναρίων για ένα σύνολο δεδομένων NSFW. Ο κωδικός είναι απλός έρχεται ήδη με κατηγορίες δεδομένων με ετικέτα. Αυτό σημαίνει ότι απλώς με την αποδοχή των προεπιλογών αυτού του scraper δεδομένων θα μας δώσετε 5 κατηγορίες που αντλούνται από εκατοντάδες δευτερεύουσες μετρήσεις.

Οι οδηγίες είναι αρκετά απλές, μπορείτε απλά να εκτελέσετε τα 6 φιλικά σενάρια. Δώστε προσοχή σε αυτά καθώς μπορείτε να αποφασίσετε να αλλάξετε τα πράγματα.

Εάν έχετε περισσότερες δευτερεύουσες μετρήσεις που θέλετε να προσθέσετε, πρέπει να επεξεργαστείτε τις διευθύνσεις URL προέλευσης πριν εκτελέσετε το βήμα 1.

Π.χ. - Εάν επρόκειτο να προσθέσετε μια νέα πηγή ουδέτερων παραδειγμάτων, θα προσθέσατε στη λίστα subreddit στο nsfw_data_scraper/scripts/source_urls/neutral.txt.

Το Reddit είναι ένας μεγάλος πόρος περιεχομένου στον Ιστό, δεδομένου ότι τα περισσότερα subreddits ελέγχονται ελαφρώς από τους ανθρώπους για να είναι στοχευμένοι για αυτό το subreddit.

Επισημάνετε και καθαρίστε τα δεδομένα

Τα δεδομένα που λάβαμε από τον αποξεστήρα δεδομένων NSFW έχουν ήδη επισημανθεί! Αλλά περιμένετε κάποια λάθη. Ειδικά επειδή το Reddit δεν έχει επιμεληθεί τέλεια.

Η επικάλυψη είναι επίσης αρκετά κοινή, αλλά μπορεί να διορθωθεί χωρίς αργή ανθρώπινη σύγκριση.

Το πρώτο πράγμα που μου αρέσει να τρέχω duplicate-file-finderείναι το ταχύτερο ακριβές ταίριασμα και διαγραφή αρχείων. Τροφοδοτείται στο Python.

Qarj / διπλότυπο-εύρεση αρχείων

Βρείτε διπλά αρχεία. Συμβάλλετε στην ανάπτυξη Qarj / duplicate-finder αρχείων δημιουργώντας έναν λογαριασμό στο GitHub. github.com

Σε γενικές γραμμές, η πλειοψηφία των διπλών αντιγράφων με αυτήν την εντολή.

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

Τώρα, αυτό δεν τραβάει εικόνες που είναι «ουσιαστικά» ίδιες. Για αυτό, υποστηρίζω τη χρήση ενός εργαλείου Macpaw που ονομάζεται "Gemini 2".

Ενώ αυτό φαίνεται εξαιρετικά απλό, μην ξεχάσετε να ανακαλύψετε τα αυτόματα αντίγραφα και επιλέξτε ΟΛΑ τα διπλότυπα έως ότου η οθόνη Gemini δηλώσει "Τίποτα δεν απομένει" έτσι:

Είναι ασφαλές να πούμε ότι αυτό μπορεί να πάρει πολύ χρόνο εάν έχετε ένα τεράστιο σύνολο δεδομένων. Προσωπικά, το έτρεξα σε κάθε ταξινόμηση πριν το τρέξω στον γονικό φάκελο για να διατηρήσω λογικούς χρόνους εκτέλεσης.

Χρησιμοποιήστε το Keras και μεταφέρετε τη μάθηση

Έχω εξετάσει το Tensorflow, το Pytorch και το Raw Python ως τρόπους δημιουργίας ενός μοντέλου μηχανικής μάθησης από το μηδέν. Αλλά δεν θέλω να ανακαλύψω κάτι νέο, θέλω να κάνω αποτελεσματικά κάτι προϋπάρχον. Έτσι πήγα ρεαλιστικά.

Βρήκα τον Keras ως το πιο πρακτικό API για τη σύνταξη ενός απλού μοντέλου. Ακόμη και η Tensorflow συμφωνεί και εργάζεται επί του παρόντος για να μοιάζει περισσότερο με τον Keras. Επίσης, με μια μόνο κάρτα γραφικών, θα πάρω ένα δημοφιλές προϋπάρχον μοντέλο + βάρη και θα εκπαιδεύσω απλώς πάνω του με κάποια εκμάθηση μεταφοράς.

Μετά από λίγη έρευνα, επέλεξα το Inception v3 σταθμισμένο με το imagenet. Για μένα, είναι σαν να πηγαίνεις στο προϋπάρχον κατάστημα ML και να αγοράσεις το Aston Martin. Θα ξυρίσουμε απλώς το επάνω στρώμα, ώστε να μπορούμε να χρησιμοποιήσουμε αυτό το μοντέλο για τις ανάγκες μας.

conv_base = InceptionV3( weights="imagenet", include_top=False, input_shape=(height, width, num_channels) )

Με το μοντέλο στη θέση του, πρόσθεσα 3 ακόμη επίπεδα. Ένα 256 κρυφό στρώμα νευρώνων, ακολουθούμενο από ένα κρυφό στρώμα 128 νευρώνων, ακολουθούμενο από ένα τελικό στρώμα 5 νευρώνων. Το τελευταίο είναι η απόλυτη ταξινόμηση στις πέντε τελικές κατηγορίες με εποπτεία από το softmax.

# Add 256 x = Dense(256, activation="relu", kernel_initializer=initializers.he_normal(seed=None), kernel_regularizer=regularizers.l2(.0005))(x) x = Dropout(0.5)(x) # Add 128 x = Dense(128,activation='relu', kernel_initializer=initializers.he_normal(seed=None))(x) x = Dropout(0.25)(x) # Add 5 predictions = Dense(5, kernel_initializer="glorot_uniform", activation="softmax")(x)

Οπτικά αυτός ο κωδικός μετατρέπεται σε αυτό:

Μερικά από τα παραπάνω μπορεί να φαίνονται περίεργα. Σε τελική ανάλυση, δεν λέτε καθημερινά το «honot_uniform». Αλλά παράξενα λόγια, τα νέα μου κρυμμένα στρώματα τακτοποιούνται για να αποφευχθεί η υπερβολική τοποθέτηση.

Χρησιμοποιώ την εγκατάλειψη, η οποία θα αφαιρέσει τυχαία τις νευρικές οδούς, ώστε κανένα χαρακτηριστικό να μην κυριαρχεί στο μοντέλο

Επιπλέον, έχω προσθέσει την κανονικοποίηση L2 στο πρώτο στρώμα επίσης.

Τώρα που το μοντέλο τελείωσε, αύξησα το σύνολο δεδομένων μου με κάποια αναταραχή. Περιστράφηκα, μετατόπισα, περικοπή, περικοπή, ζουμ, αναστροφή και το κανάλι άλλαξε τις εικόνες της προπόνησής μου. Αυτό βοηθά στο να διασφαλιστεί ότι οι εικόνες εκπαιδεύονται μέσω κοινού θορύβου.

Όλα τα παραπάνω συστήματα έχουν σκοπό να αποτρέψουν την υπερβολική τοποθέτηση του μοντέλου στα δεδομένα εκπαίδευσης. Ακόμα κι αν είναι ένας τόνος δεδομένων, θέλω να διατηρήσω το μοντέλο όσο το δυνατόν πιο γενικευμένο σε νέα δεδομένα.

After running this for a long time, I got around 87% accuracy on the model! That’s a pretty good version one! Let’s make it great.

Refine your model

Basic fine-tuning

Once the new layers are trained up, you can unlock some deeper layers in your Inception model for retraining. The following code unlocks everything after as of the layer conv2d_56.

set_trainable = False for layer in conv_base.layers: if layer.name == 'conv2d_56': set_trainable = True if set_trainable: layer.trainable = True else: layer.trainable = False

I ran the model for a long time with these newly unlocked layers, and once I added exponential decay (via a scheduled learning rate), the model converged on a 91% accuracy on my test data!

With 300,000 images, finding mistakes in the training data was impossible. But with a model with only 9% error, I could break down the errors by category, and then I could look at only around 5,400 images! Essentially, I could use the model to help me find misclassifications and clean the dataset!

Technically, this would find false negatives only. Doing nothing for bias on the false positives, but with something that detects NSFW content, I imagine recall is more important than precision.

The most important part of refining

Even if you have a lot of test data, it’s usually pulled from the same well. The best test is to make it easy for others to use and check your model. This works best in open source and simple demos. I released //nsfwjs.com which helped the community identify bias, and the community did just that!

The community got two interesting indicators of bias fairly quickly. The fun one was that Jeffrey Goldblum kept getting miscategorized, and the not-so-fun one was that the model was overly sensitive to females.

Once you start getting into hundreds of thousands of images, it’s hard for one person (like moi) to identify where an issue might be. Even if I looked through a thousand images in detail for bias, I wouldn’t have even scratched the surface of the dataset as a whole.

That’s why it’s important to speak up. Misclassifying Jeff Goldblum is an entertaining data point, but identifying, documenting, and filing a ticket with examples does something powerful and good. I was able to get to work on fixing the bias.

With new images, improved training, and better validation I was able to retrain the model over a few weeks and attain a much better outcome. The resulting model was far more accurate in the wild. Well, unless you laughed as hard as I did about the Jeff Goldblum issue.

Αν μπορούσα να κατασκευάσω ένα ελάττωμα… θα κρατούσα τον Τζεφ. Αλλά δυστυχώς, έχουμε φτάσει το 93% ακρίβεια!

Συνοψίζοντας

Ίσως χρειάστηκε πολύς χρόνος, αλλά δεν ήταν δύσκολο, και ήταν διασκεδαστικό να φτιάξεις ένα μοντέλο. Σας προτείνω να πάρετε τον πηγαίο κώδικα και να τον δοκιμάσετε μόνοι σας! Θα προσπαθήσω μάλλον να επανεκπαιδεύσω το μοντέλο με άλλα πλαίσια για σύγκριση.

Δείξε μου τι έχεις. Συνεισφέρετε ή; Αστέρι / παρακολουθήστε το repo εάν θέλετε να δείτε την πρόοδο: https://github.com/GantMan/nsfw_model

Ο Gant Laborde είναι Επικεφαλής Στρατηγικός Τεχνολογίας στο Infinite Red, δημοσιευμένος συγγραφέας, αναπληρωτής καθηγητής, παγκόσμιος δημόσιος ομιλητής και τρελός επιστήμονας στην εκπαίδευση. Χτυπήστε / ακολουθήστε / tweet ή επισκεφθείτε τον σε ένα συνέδριο.

Έχετε ένα λεπτό; Δείτε μερικά ακόμη:

Αποφύγετε τους εφιάλτες - NSFW JS

Άσεμνος έλεγχος περιεχομένου από πλευράς πελάτη για την αλλαγή της ψυχής. Infinite.red 5 πράγματα που απορροφούν για την απομακρυσμένη εργασία

Οι παγίδες της απομακρυσμένης εργασίας + προτεινόμενες λύσεις shift.infinite.red