Kuinka määrittää NSFW-sisällön tunnistus koneoppimisen avulla

Koneen opettaminen sopimattoman sisällön tunnistamiseksi ei ollut vaikeaa jälkikäteen, mutta se oli varmasti kovaa ensimmäisellä kerralla.

Tässä on joitain opittuja asioita ja joitain vinkkejä ja temppuja, jotka paljastin rakentaessani NSFW-mallia.

Vaikka tämä olisi voitu toteuttaa monin tavoin, tämän viestin toivo on tarjota ystävällinen kertomus, jotta muut voivat ymmärtää, miltä tämä prosessi voi näyttää.

Jos olet uusi ML-yritys, tämä innostaa sinua kouluttamaan mallia. Jos olet perehtynyt siihen, haluaisin kuulla, kuinka olisit rakentanut tämän mallin, ja pyytää sinua jakamaan koodisi.

Suunnitelma:

  1. Hanki paljon ja paljon tietoa
  2. Merkitse ja puhdista tiedot
  3. Käytä Kerasia ja siirrä oppiminen
  4. Tarkenna malliasi

Hanki paljon ja paljon tietoa

Onneksi NSFW-tietojoukolle julkaistiin todella siisti joukko kaavintakomentosarjoja. Koodi on yksinkertainen, ja siihen on jo merkitty tietoluokkia. Tämä tarkoittaa, että pelkästään hyväksymällä tämän datakaavijan oletusarvot saat viisi luokkaa, jotka on vedetty sadoista aliasennuksista.

Ohjeet ovat melko yksinkertaisia, voit yksinkertaisesti suorittaa 6 ystävällistä komentosarjaa. Kiinnitä huomiota heihin, kun saatat päättää muuttaa asioita.

Jos sinulla on lisää aliedostoja, jotka haluat lisätä, sinun on muokattava lähde-URL-osoitteita ennen vaiheen 1 suorittamista.

Esim. - Jos haluat lisätä uuden neutraalien esimerkkien lähteen, lisäät sen subbreddit-luetteloon nsfw_data_scraper/scripts/source_urls/neutral.txt.

Reddit on loistava sisällön lähde verkossa, koska useimmat subreddit ovat ihmisten poliisin valvonnassa, jotta ne ovat tavoitettavissa kyseiselle subredditille.

Merkitse ja puhdista tiedot

NSFW-datakaaviosta saamamme tiedot on jo merkitty! Mutta odota joitain virheitä. Varsinkin kun Reddit ei ole täysin kuratoitu.

Kopiointi on myös melko yleistä, mutta korjattavissa ilman hidasta ihmisen vertailua.

Ensinnäkin haluan suorittaa on duplicate-file-findermikä on nopein tarkka tiedostojen haku ja poisto. Se toimii Pythonissa.

Qarj / duplicate-file-finder

Etsi päällekkäisiä tiedostoja. Osallistu Qarj / duplicate-file-finder -kehitykseen luomalla tili GitHubiin. github.com

Voin yleensä saada enemmistön kaksoiskappaleista, jotka koputetaan tällä komennolla.

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

Nyt tämä ei ota kuvia, jotka ovat "olennaisesti" samoja. Tätä varten suosittelen Macpaw-työkalun nimeltä "Gemini 2" käyttöä.

Vaikka tämä näyttää erittäin yksinkertaiselta, älä unohda kaivaa automaattisia kopioita ja valitse KAIKKI kaksoiskappaleet, kunnes Gemini-näyttösi ilmoittaa "Ei mitään jäljellä" näin:

On turvallista sanoa, että tämä voi viedä äärimmäisen paljon aikaa, jos sinulla on valtava tietojoukko. Henkilökohtaisesti suoritin sen jokaisessa luokituksessa ennen kuin suoritin sen ylätason kansiossa kohtuullisten ajonaikojen säilyttämiseksi.

Käytä Kerasia ja siirrä oppiminen

Olen tarkastellut Tensorflow'ta, Pytorchia ja raakaa Pythonia tapana rakentaa koneoppimismalli alusta alkaen. Mutta en halua löytää jotain uutta, haluan tehdä tehokkaasti jotain olemassa olevaa. Joten menin käytännölliseksi.

Löysin Kerasin käytännöllisimmäksi sovellusliittymäksi yksinkertaisen mallin kirjoittamiseen. Jopa Tensorflow on samaa mieltä ja pyrkii parhaillaan olemaan enemmän Keras-tyyppisiä. Ja vain yhdellä näytönohjaimella aion tarttua suosittuun olemassa olevaan malliin + painot ja harjoitella yksinkertaisesti sen päällä jonkin verran siirto-oppimista.

Pienen tutkimuksen jälkeen valitsin Inception v3 -painotetun imagenetillä. Minulle se on kuin menen jo olemassa olevaan ML-myymälään ja ostan Aston Martinin. Ajelemme vain ylimmän kerroksen, jotta voimme käyttää mallia tarpeisiimme.

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

Kun malli oli paikallaan, lisäsin vielä 3 kerrosta. 256 piilotettu neuronikerros, jota seuraa piilotettu 128 neuronikerros, jota seuraa viimeinen 5 neuronikerros. Jälkimmäinen on lopullinen luokittelu viiteen viimeiseen luokkaan, jota modemaattina 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)

Visuaalisesti tämä koodi muuttuu seuraavaksi:

Some of the above might seem odd. After all, it’s not everyday you say “glorot_uniform”. But strange words aside, my new hidden layers are being regularized to prevent overfitting.

I’m using dropout, which will randomly remove neural pathways so no one feature dominates the model.

Additionally, I’ve added L2 regularization to the first layer as well.

Now that the model is done, I augmented my dataset with some generated agitation. I rotated, shifted, cropped, sheered, zoomed, flipped, and channel shifted my training images. This helps with assuring the images are trained through common noise.

All the above systems are meant to prevent overfitting the model on the training data. Even if it is a ton of data, I want to keep the model as generalizable to new data as possible.

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.

Jos voisin valmistaa yhden virheen ... pitäisin Jeffin. Mutta valitettavasti olemme saavuttaneet 93% tarkkuuden!

Yhteenvetona

Se on saattanut viedä paljon aikaa, mutta se ei ollut vaikeaa, ja oli hauskaa rakentaa malli. Ehdotan, että tartut lähdekoodiin ja kokeile sitä itse! Yritän luultavasti jopa kouluttaa mallia uudelleen muiden kehysten kanssa vertailua varten.

Näytä mitä sinulla on. Myötävaikuttaa tai? Tähti / katso repo, jos haluat nähdä edistymisen: https://github.com/GantMan/nsfw_model

Gant Laborde on Infinite Redin teknologiastrategia, julkaistu kirjailija, dosentti, maailmanlaajuinen julkinen puhuja ja hullu tutkija koulutuksessa. Taputa / seuraa / twiitti tai vieraile hänen luonaan konferenssissa.

Onko sinulla hetki? Katso lisää:

Vältä painajaisia ​​- NSFW JS

Asiakaspuolen siveettömän sisällön tarkistus soul shift.infinite.red 5 asiasta, jotka imevät etätyöstä

Etätyön + ehdotettujen ratkaisujen sudenkuopat shift.infinite.red