كيفية إعداد الكشف عن محتوى NSFW باستخدام Machine Learning

لم يكن تعلم آلة التعرف على المحتوى غير اللائق أمرًا صعبًا في الماضي ، ولكنه كان صعبًا في المرة الأولى.

فيما يلي بعض الدروس المستفادة ، وبعض النصائح والحيل التي اكتشفتها أثناء بناء نموذج NSFW.

على الرغم من أن هناك الكثير من الطرق التي كان من الممكن تنفيذها ، إلا أن الأمل في هذا المنشور هو تقديم سرد ودي حتى يتمكن الآخرون من فهم كيف يمكن أن تبدو هذه العملية.

إذا كنت جديدًا في ML ، فسيُلهمك ذلك لتدريب نموذج. إذا كنت معتادًا على ذلك ، فأنا أحب أن أسمع كيف كنت ستستمر في بناء هذا النموذج وأطلب منك مشاركة الرمز الخاص بك.

الخطة:

  1. الحصول على الكثير والكثير من البيانات
  2. تسمية وتنظيف البيانات
  3. استخدام Keras ونقل التعلم
  4. صقل النموذج الخاص بك

الحصول على الكثير والكثير من البيانات

لحسن الحظ ، تم إصدار مجموعة رائعة من البرامج النصية للتجميع لمجموعة بيانات NSFW. رمز بسيط يأتي بالفعل مع فئات البيانات المسمى. هذا يعني أن مجرد قبول افتراضيات مكشطة البيانات هذه سيمنحنا 5 فئات تم سحبها من مئات النماذج الفرعية.

التعليمات بسيطة للغاية ، يمكنك ببساطة تشغيل البرامج النصية 6 الودية. انتبه لهم لأنك قد تقرر تغيير الأمور.

إذا كان لديك المزيد من النماذج الفرعية التي تريد إضافتها ، فيجب عليك تحرير عناوين URL المصدر قبل تشغيل الخطوة 1.

مثلا - إذا كنت تريد إضافة مصدر جديد لأمثلة محايدة ، فأنت ستضيف إلى قائمة subreddit في nsfw_data_scraper / scripts / source_urls / neutral.txt.

يعتبر Reddit مورداً رائعًا للمحتوى في جميع أنحاء الويب ، نظرًا لأن معظم الأجزاء الفرعية يتم ضبطها قليلاً من قِبل البشر ليكونوا مستهدفين لذلك الروتين الفرعي.

تسمية وتنظيف البيانات

البيانات التي حصلنا عليها من مكشطة بيانات NSFW مصنفة بالفعل! ولكن نتوقع بعض الأخطاء. خاصة وأن رديت ليس برعاية كاملة.

الازدواجية هي أيضا شائعة جدا ، ولكن يمكن حلها دون المقارنة البشرية البطيئة.

أول شيء أرغب في تشغيله هو مكررة - file-finder وهو أسرع مطابقة للملف و deleter. إنه مدعوم من بيثون.

يمكنني عمومًا الحصول على غالبية التكرارات التي خرجت من هذا الأمر.

الثعبان dff.py - مسار القطار / المسار - حذف

الآن ، هذا لا يلتقط صوراً "بالأساس". لذلك ، أنا أدافع عن استخدام أداة Macpaw تسمى "Gemini 2".

في حين أن هذا يبدو بسيطًا للغاية ، لا تنسى البحث في التكرارات التلقائية ، وحدد جميع التكرارات حتى تعلن شاشة الجوزاء "لا شيء متبقٍ" على هذا النحو:

من الآمن القول إن هذا قد يستغرق وقتًا كبيرًا إذا كان لديك مجموعة بيانات ضخمة. شخصيا ، قمت بتشغيله على كل تصنيف قبل أن أقوم بتشغيله على المجلد الأصل من أجل الحفاظ على أوقات تشغيل معقولة.

استخدام Keras ونقل التعلم

لقد نظرت إلى Tensorflow و Pytorch و Python الخام كطرق لتصميم نموذج تعلم آلي من البداية. لكنني لا أتطلع إلى اكتشاف شيء جديد ، أريد أن أفعل شيئًا فعالًا مسبقًا. لذلك ذهبت براغماتية.

لقد وجدت أن Keras هو أكثر واجهات برمجة التطبيقات عملية لكتابة نموذج بسيط. حتى Tensorflow يوافق ويعمل حاليًا ليكون أكثر شبهاً بـ Keras. أيضًا ، مع بطاقة رسومات واحدة فقط ، سأحصل على نموذج + أوزان شهيرة موجودة مسبقًا ، وسأقوم ببساطة بالتدريب عليها باستخدام بعض عمليات نقل النقل.

بعد قليل من البحث ، اخترت Inception v3 الموزون مع imagenet. بالنسبة لي ، هذا مثل الذهاب إلى متجر ML الموجود مسبقًا وشراء Aston Martin. سنحذف الطبقة العليا فقط حتى نتمكن من استخدام هذا النموذج لتلبية احتياجاتنا.

conv_base = InceptionV3 (
  الأوزان = 'imagenet،
  include_top = خطأ،
  input_shape = (الارتفاع ، العرض ، الأسطوانات)
)

مع النموذج في مكانه ، أضفت 3 طبقات أخرى. طبقة عصبية مخفية 256 ، تليها طبقة عصبية مخفية 128 ، تليها طبقة عصبية 5 النهائي. هذا الأخير هو التصنيف النهائي في خمس فئات نهائية خاضعة للإشراف softmax.

# إضافة 256
x = الكثافة (256 ، التنشيط = 'relu' ، kernel_initializer = initializers.he_normal (seed = None) ، kernel_regularizer = regularizers.l2 (.0005)) (x)
س = التسرب (0.5) (س)
# أضف 128
x = الكثافة (128 ، التنشيط = 'relu' ، kernel_initializer = initializers.he_normal (البذور = بلا)) (x)
س = التسرب (0.25) (س)
# إضافة 5
التنبؤات = كثيفة (5 ، kernel_initializer = "glorot_uniform" ، التنشيط = 'softmax') (x)

بصريا ، يتحول هذا الرمز إلى هذا:

بعض ما سبق قد يبدو غريبا. بعد كل شيء ، ليس كل يوم تقول "glorot_uniform". ولكن ، بغض النظر عن الكلمات الغريبة ، يتم تنظيم الطبقات المخفية الجديدة لمنع التحايل.

أنا أستخدم التسرب ، الذي سيؤدي إلى إزالة المسارات العصبية بشكل عشوائي ، لذلك لا توجد ميزة واحدة تهيمن على النموذج.

قريبا جدا؟

بالإضافة إلى ذلك ، أضفت تنظيم L2 إلى الطبقة الأولى أيضًا.

الآن وبعد الانتهاء من النموذج ، قمت بزيادة مجموعة البيانات الخاصة بي ببعض التحريض الناتج. لقد قمت بالتناوب ، والتناوب ، والاقتصاص ، والتقليص ، والتكبير / التصغير ، وقلب قناة الصور التدريبية الخاصة بي. يساعد ذلك في ضمان تدريب الصور من خلال الضوضاء الشائعة.

تهدف جميع الأنظمة المذكورة أعلاه إلى منع تركيب النموذج على بيانات التدريب. حتى لو كان الكثير من البيانات ، أريد أن أبقي النموذج قابلاً للتعميم على البيانات الجديدة قدر الإمكان.

أنا gotchu نموذج!

بعد تشغيل هذا لفترة طويلة ، حصلت على حوالي 87 ٪ من الدقة في النموذج! إنه إصدار جيد جدًا! لنجعلها رائعة.

صقل النموذج الخاص بك

صقل الأساسية

بمجرد تدريب الطبقات الجديدة ، يمكنك فتح بعض الطبقات الأعمق في نموذج Inception لإعادة التدريب. يفتح الكود التالي كل شيء بعد بدء الطبقة conv2d_56.

set_trainable = خطأ
للطبقة في conv_base.layers:
    إذا layer.name == 'conv2d_56':
        set_trainable = صحيح
    إذا set_trainable:
        layer.trainable = صحيح
    آخر:
        layer.trainable = خطأ

قمت بتشغيل النموذج لفترة طويلة مع هذه الطبقات التي تم إلغاء قفلها حديثًا ، وبمجرد إضافة تسوس الأسي (عبر معدل تعليمي مجدول) ، تلاقى النموذج بدقة 91٪ على بيانات الاختبار الخاصة بي!

مع وجود 300000 صورة ، كان العثور على أخطاء في بيانات التدريب أمرًا مستحيلًا. لكن مع وجود نموذج يحتوي على خطأ بنسبة 9٪ فقط ، كان بإمكاني تحليل الأخطاء حسب الفئة ، ومن ثم يمكنني النظر إلى حوالي 5400 صورة فقط! في الأساس ، يمكنني استخدام النموذج لمساعدتي في العثور على تصنيف خاطئ وتنظيف مجموعة البيانات!

من الناحية الفنية ، فإن هذا سيجد سلبيات كاذبة فقط. لا أفعل شيئًا من أجل التحيز في الإيجابيات الخاطئة ، لكن مع شيء يكتشف محتوى NSFW ، أتصور أن التذكير أكثر أهمية من الدقة.

أهم جزء من التكرير

حتى إذا كان لديك الكثير من بيانات الاختبار ، يتم سحبها عادةً من نفس البئر. أفضل اختبار هو تسهيل استخدام الآخرين والتحقق من طرازك. هذا يعمل بشكل أفضل في المصادر المفتوحة والعروض التوضيحية البسيطة. لقد أصدرت http://nsfwjs.com مما ساعد المجتمع على تحديد التحيز ، وفعل المجتمع ذلك تمامًا!

حصل المجتمع على مؤشرين مهمين للانحياز بسرعة إلى حد ما. كان الأمر الممتع هو أن جيفري جولدبلوم استمر في تصنيفه بطريقة خاطئة ، أما الشيء غير الممتع فهو أن النموذج كان شديد الحساسية للإناث.

بمجرد أن تبدأ في الوصول إلى مئات الآلاف من الصور ، يصعب على شخص واحد (مثل moi) تحديد مكان المشكلة. حتى لو نظرت إلى ألف صورة بالتفصيل عن التحيز ، فلن أخدش سطح مجموعة البيانات ككل.

لهذا السبب من المهم التحدث. Misclassifying Jeff Goldblum هي نقطة بيانات مسلية ، ولكن تحديد وتوثيق وحفظ تذكرة بأمثلة يؤدي شيئًا قويًا وجيدًا. كنت قادراً على العمل على إصلاح التحيز.

بفضل الصور الجديدة والتدريب المحسّن والتحقق بشكل أفضل ، تمكنت من إعادة تدريب النموذج على مدى بضعة أسابيع وتحقيق نتيجة أفضل بكثير. كان النموذج الناتج أكثر دقة بكثير في البرية. حسنًا ، ما لم تضحك بنفس القدر من الضحكة حول قضية Jeff Goldblum.

إذا كان بإمكاني صنع عيب واحد ... كنت سأحتفظ بجيف. ولكن للأسف ، وصلنا إلى دقة 93 ٪!

باختصار

ربما استغرق الأمر الكثير من الوقت ، لكنه لم يكن صعبًا ، وكان من الممتع بناء نموذج. أقترح عليك انتزاع الكود المصدري وتجربته بنفسك! ربما سأحاول حتى إعادة تدريب النموذج باستخدام أطر أخرى للمقارنة.

تبين لي ما كنت قد حصلت. ساهم أو نجمة / شاهد الريبو إذا كنت ترغب في رؤية تقدم: https://github.com/GantMan/nsfw_model

الانضمام إلى النشرة الإخبارية بلدي!

غانت لابورد هو كبير استراتيجيي التكنولوجيا في Infinite Red ، وهو مؤلف منشور وأستاذ مساعد ومتحدث عام في جميع أنحاء العالم وعالم مجنون في التدريب. التصفيق / متابعة / تغرد أو زيارته في مؤتمر.

لديك دقيقة؟ تحقق من عدد قليل من أكثر: