Az NSFW tartalomérzékelés beállítása a Machine Learning segítségével

A gép megtanítása az illetlen tartalom felismerésére utólag nem volt nehéz, de az első alkalommal bizony nehéz volt.

Íme néhány tanulság, valamint néhány tipp és trükk, amelyeket felfedeztem egy NSFW modell felépítése során.

Habár sokféle módon megvalósítható ez, ennek a bejegyzésnek az a reménye, hogy barátságos elbeszélést adjon, hogy mások is megértsék, milyen lehet ez a folyamat.

Ha még nem ismeri az ML-t, ez arra ösztönöz, hogy modellt képezzen. Ha ismeri, szívesen megtudnám, hogyan járt volna el a modell felépítésében, és megkérem, hogy ossza meg a kódot.

A terv:

  1. Szerezzen sok-sok adatot
  2. Címkézze fel és tisztítsa meg az adatokat
  3. Használja a Keras-t és adja át a tanulást
  4. Finomítsa modelljét

Szerezzen sok-sok adatot

Szerencsére egy nagyon jó kaparó szkriptkészlet jelent meg egy NSFW adatkészlet számára. A kód egyszerű, már címkézett adatkategóriákkal is rendelkezik. Ez azt jelenti, hogy ha elfogadjuk ennek az adatkaparónak az alapértelmezett értékeit, akkor 5 kategóriát kapunk, több száz alfeladatból.

Az utasítások meglehetősen egyszerűek, egyszerűen futtathatja a 6 barátságos szkriptet. Figyeljen rájuk, mivel úgy dönthet, hogy megváltoztatja a dolgokat.

Ha további alprogramokat szeretne hozzáadni, akkor az 1. lépés futtatása előtt szerkesztenie kell a forrás URL-eket.

Pl. - Ha új semleges példák forrását adná hozzá, akkor hozzáadná a subbreddit listához nsfw_data_scraper/scripts/source_urls/neutral.txt.

A Reddit nagyszerű tartalomforrás az interneten, mivel a legtöbb szubrédditet az emberek enyhén rendben tartják, hogy az adott albreddit célpontja legyen.

Címkézze fel és tisztítsa meg az adatokat

Az NSFW adatkaparóról kapott adatok már fel vannak címkézve! De számítson néhány hibára. Főleg, hogy a Reddit nem tökéletesen gondozott.

A sokszorosítás szintén meglehetősen gyakori, de lassú emberi összehasonlítás nélkül javítható.

Az első dolog, amit futtatni szeretek, duplicate-file-finderaz a leggyorsabb pontos fájlegyeztetés és törlés. Pythonban működik.

Qarj / duplicate-file-finder

Ismétlődő fájlok keresése. Hozzon létre hozzájárulást a Qarj / duplicate-file-finder fejlesztéséhez egy fiók létrehozásával a GitHubon. github.com

Általában megkaphatom a duplikátumok többségét ezzel a paranccsal.

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

Ezzel nem lehet olyan képeket rögzíteni, amelyek „lényegében” ugyanazok. Ehhez a „Gemini 2” nevű Macpaw eszköz használatát szorgalmazom.

Bár ez nagyon egyszerűnek tűnik, ne felejtsen el ásni az automatikus duplikátumokba, és válassza ki az MINDEN duplikátumot, amíg az Ikrek képernyőn a „Semmi sem marad fenn” kijelentést így mondja ki:

Biztonságos azt mondani, hogy ez rendkívül sok időt vehet igénybe, ha hatalmas adatkészlete van. Személy szerint az egyes besorolásokon futtattam, mielőtt a szülő mappán futtattam az ésszerű futásidő fenntartása érdekében.

Használja a Keras-t és adja át a tanulást

A Tensorflow-t, a Pytorch-ot és a nyers Python-t úgy néztem meg, hogy miként lehet a gépi tanulási modellt a semmiből felépíteni. De nem valami újat akarok felfedezni, hanem valami létezőt szeretnék hatékonyan megtenni. Szóval pragmatikus lettem.

A Kerast találtam a legpraktikusabb API-nak egy egyszerű modell megírásához. Még a Tensorflow is egyetért, és jelenleg azon dolgozik, hogy inkább Keras-szerű legyen. Ezenkívül csak egy grafikus kártyával fogok egy népszerű, már létező modellt + súlyokat, és egyszerűen edzek a tetején némi transzfertanulással.

Kis kutatás után az Inception v3-at választottam imagenettel súlyozva. Számomra ez olyan, mintha elmennék a már meglévő ML üzletbe, és megvenném az Aston Martint. Csak leborotváljuk a legfelső réteget, hogy ezt a modellt igényeinkhez felhasználhassuk.

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

A modell helyén további 3 réteget adtam hozzá. 256 rejtett neuronréteg, amelyet rejtett 128 neuronréteg követ, majd egy utolsó 5 neuronréteg. Ez utóbbi a végső osztályozás az öt utolsó osztályba, amelyet a softmax moderál.

# 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)

Vizuálisan ez a kód erre változik:

A fentiek némelyike ​​furcsának tűnhet. Végül is nem mindennapi azt mondod, hogy „glorot_uniform”. De különös szavakat eltekintve, az új rejtett rétegeimet rendszeresítik a túlillesztés megakadályozása érdekében.

A lemorzsolódást használom, amely véletlenszerűen eltávolítja az idegpályákat, így egyetlen jellemző sem uralja a modellt.

Ezenkívül az első réteghez hozzáadtam az L2 szabályozást is.

Most, hogy elkészült a modell, néhány generált agitációval bővítettem az adatkészletemet. Elforgattam, eltoltam, levágtam, elcsúsztattam, nagyítottam, megfordítottam, és a csatorna eltolta az edzésképeimet. Ez segít abban, hogy a képeket közös zajjal képezzék ki.

A fenti rendszerek célja, hogy megakadályozzák a modell túlterhelését az edzésadatokon. Még akkor is, ha rengeteg adatról van szó, szeretném, hogy a modell az új adatokra a lehető legáltalánosabb legyen.

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.

Ha sikerülne egy hibát előállítanom ... megtartanám Jeffet. De sajnos 93% -os pontosságot értünk el!

Összefoglalva

Lehet, hogy sok időbe telt, de nem volt nehéz, és szórakoztató volt egy modellt felépíteni. Javaslom, hogy fogd meg a forráskódot, és próbáld ki te is! Valószínűleg megpróbálom összehasonlítani a modellt más keretrendszerekkel is.

Mutasd meg, mit tudsz. Hozzájárulni vagy? Csillagozd / nézd meg a repót, ha szeretnéd látni a haladást: https://github.com/GantMan/nsfw_model

Gant Laborde az Infinite Red vezető technológiai stratégiája, publikált szerző, adjunktus, világméretű nyilvános előadó és őrült tudós képzésben. Tapsolni / követni / tweetelni, vagy meglátogatni őt egy konferencián.

Van egy perced? Nézzen meg még néhányat:

Kerülje a rémálmokat - NSFW JS

Client-side indecent content checking for the soulshift.infinite.red5 Things that Suck about Remote Work

The Pitfalls of Remote Work + Proposed Solutionsshift.infinite.red