Рубрики
Без рубрики

Как настроить обнаружение содержимого NSFW с помощью машинного обучения

Автор оригинала: Gant Laborde.

Преподавание машины распознавать неприличный контент, не было трудно ретроспективать, но он наверняка был в первую очередь.

Вот некоторые извлеченные уроки, а некоторые советы и трюки я обнаружил при создании модели NSFW.

Хотя есть много способов, которыми это могло быть реализовано, надежда на этот пост состоит в том, чтобы предоставить дружественное повествование, чтобы другие могли понять, какой этот процесс может выглядеть так.

Если вы новичок в ML, это вдохновляет вас на тренировку модели. Если вы знакомы с этим, я хотел бы услышать, как вы бы поехали о создании этой модели и попросите вас поделиться своим кодом.

План:

  1. Получить много и много данных
  2. Этикетка и очистить данные
  3. Используйте KERAS и Transfer обучение
  4. Уточните свою модель

Получить много и много данных

К счастью, для набора данных NSFW был выпущен действительно крутой набор соскобных скриптов Отказ Код прост уже поставляется с помеченными категориями данных. Это означает, что просто принятие этих данных Scraper по умолчанию даст 5 категорий, вытянутых из сотен субжидов.

Инструкции довольно просты, вы можете просто запустить 6 дружественных сценариев. Обратите внимание на них, так как вы можете решить изменить вещи.

Если у вас есть больше подчизблений, которые вы хотели бы добавить, вам следует редактировать исходные URL-адреса перед запуском шага 1.

Reddit – это отличный ресурс контента вокруг Интернета, поскольку большинство уклончиков слегка поливают людьми, чтобы быть нацеленным на этот подчиненный.

Этикетка и очистить данные

Данные, которые мы получили от скребка данных NSFW, уже помечены! Но ожидайте некоторых ошибок. Тем более что, поскольку Reddit не прекращается.

Дублирование также довольно распространено, но фиксируемое без медленного сравнения человека.

Первое, что мне нравится бежать, это Дубликат-файл-поиск который является самым быстрым точным файловым совпадением и удалением. Он включен в Python.

Qarj/duplicate-file-finder Найти дубликаты файлов. Способствовать разработке Qarj/Duplicate-File-File, создавая учетную запись в GitHub. github.com.

Как правило, я могу получить большинство дубликатов, выбитых с этой командой.

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

Теперь это не ломает изображения, которые «по существу» одинаковы. Для этого я защищаю, используя Инструмент MACPAW под названием «Gemini 2».

Хотя это выглядит Super Simple, не забудьте выкопать автоматические дубликаты и выберите все дубликаты, пока ваш экран Gemini не объявляет «ничего оставшегося», как:

Это безопасно сказать, что может предпринять экстремальное количество времени, если у вас есть огромный набор данных. Лично я запустил его на каждую классификацию, прежде чем я запустил его на родительской папке, чтобы сохранить разумные занятия.

Используйте KERAS и Transfer обучение

Я посмотрел на Tensorflow, Pytorch и Raw Python в качестве способов построить модель обучения машины с нуля. Но я не хочу открыть что-то новое, я хочу эффективно сделать что-то ранее существовавшее. Поэтому я пошел прагматично.

Я обнаружил, что KERAS является самым практичным API для написания простой модели. Даже Tensorflow соглашается и в настоящее время Работа, чтобы быть более похожим на керас Отказ Также, только с одной видеокартой, я собираюсь захватить популярную ранее существующую модель + веса, а просто тренируйся на ней с некоторым учением передачи.

После небольшого исследования я выбрал Влияние 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)

Визуально этот код превращается в это:

Некоторые из вышеперечисленных могут показаться странным. В конце концов, это не каждый день вы говорите «Glorot_uniform». Но странные слова в стороне, мои новые скрытые слои регулируются, чтобы предотвратить переопределение.

Я использую Dastout, что случайным образом удалит нейронные пути, чтобы ни одна особенность не доминирует в модели.

Кроме того, я также добавил регуляризацию L2 на первый слой.

Теперь, когда модель сделана, я дополнил мой набор данных с некоторой сгенерированной агитацией. Я повернул, сдвинул, обрезанный, прозрачный, увеличенный, перевернутый, и канал сместил моих учебных изображений. Это помогает с уведомлением изображения обучаются через общий шум.

Все вышеперечисленные системы предназначены для предотвращения перегрузки модели на данные тренировки. Даже если это тонна данных, я хочу сохранить модель как можно более обобщенной для новых данных.

После долгого запуска я получил около 87% точности на модели! Это довольно хорошая версия один! Давайте сделаем это здорово.

Уточните свою модель

Базовая тонкая настройка

Как только новые слои обучаются, вы можете разблокировать некоторые более глубокие слои в вашей модели создания для переподготовки. Следующий код разблокирует все после слоя 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

Я провел модель в течение длительного времени с этими недавно разблокированными слоями, и, как только я добавил экспоненциальную распад (через запланированную скорость обучения), модель сходится на точность 91% на моих тестовых данных!

С 300 000 изображений нахождение ошибок в тренировках было невозможно. Но с моделью только с ошибкой 9% я мог бы сломать ошибки по категориям, а затем я смогу посмотреть только на 5 400 изображений! По сути, я мог бы использовать модель, чтобы помочь мне найти неправильные классификации и очистить набор данных!

Технически, это только найдет ложные негативы. Ничего не делая для удаления на ложных срабатывающих положениях, но с чем-то, что обнаруживает содержание NSFW, я представляю, что вспоминание важнее, чем точность.

Самая важная часть переработки

Даже если у вас много тестовых данных, он обычно вытащен из того же скважины. Лучший тест – это легко использовать и проверять свою модель. Это работает лучше всего в открытом исходном котеле и простых демо. Я выпустил http://nsfwjs.com Что помогло сообществу определить предвзятость, и сообщество сделало только что!

Сообщество получило два интересных показателя предвзятости довольно быстро. Веселое было то, что Джеффри Голдблум продолжал разбиться И не так весело, что модель была чрезмерно чувствительной к самкам.

Как только вы начнете попасть в сотни тысяч изображений, это трудно для одного человека (например Moi ), чтобы определить, где может быть проблема. Даже если я подробно посмотрел на тысячу изображений для смещения, я бы даже поцарапал поверхность набора данных в целом.

Вот почему важно говорить. Неверное классификация Джеффа Goldblum – это развлекательная точка данных, но выявление, документирование и подача билета с примерами делает что-то мощное и хорошее. Я смог приступить к работе при исправлении предвзятости.

С новыми изображениями, улучшенной тренировкой и лучшей проверкой я смог переосчитать модель в течение нескольких недель и достичь гораздо лучшего результата. Полученная модель была гораздо более точной в дикой природе. Ну, если вы не смеялись так сильно, как я делал вопрос о выпуске Джеффа Голдблюма.

Если бы я мог изготовить один недостаток … Я бы сохранил Джефф. Но увы, у нас на 93% точности!

В итоге

Это могло взять много времени, но это было не сложно, и было весело построить модель. Я предлагаю вам взять исходный код и попробовать его для себя! Я, вероятно, даже попытаю переосмыслить модель с другими рамками для сравнения.

Гэнт Лаборда является главным технологическим стратегом в Бесконечный красный , опубликованный автор, доцент по всему миру, общедоступный докладчик и безумный ученый в обучении. Clap/Follow/ Tweet или посетить его На конференции Отказ

Иметь минуту? Проверьте еще несколько:

Избегайте кошмаров – NSFW JS Клиентская сторона непристойного контента, проверка на душу Shift.infinite.red 5 вещей, которые сосут от удаленной работы Ловушки дистанционной работы + предлагаемые решения Shift.infinite.red.