كيفية إنشاء نظام التعرف على الصور باستخدام Keras و Tensorflow لفئة 1000 كائن يومي (ImageNet ILSVRC)

التعرف على الصور مع أفضل 5 تسميات متوقعة واحتمالاتها (الصف الأحمر يدل على الإجابة الصحيحة) http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf
انتقل مباشرة إلى رمز على جيثب.

في هذه السلسلة من المنشورات ، سأوضح لك كيفية إنشاء خدمة الويب الخاصة بك للتنبؤ بها أو اكتشافها / الربط بها في بضعة أسطر من التعليمات البرمجية باستخدام Keras و TensorFlow ومكتبة طلبات python. سلسلة النشر على النحو التالي:

  1. بناء نظام التعرف على الصور لفئة 1000 كائن يومي (ImageNet ILSVRC) باستخدام Keras و TensorFlow (هذا المنشور)
  2. قم ببناء نظام للتعرف على الصور لأي فئات كائنات قابلة للتخصيص باستخدام تعلم النقل والضبط في Keras و TensorFlow
  3. أنشئ نظامًا لكشف كائنات الصندوق المحيط في الوقت الفعلي لمئات فئات الكائنات اليومية (PASCAL VOC، COCO)
  4. أنشئ خدمة ويب لأي نظام للتعرف على الصور أو نظام الكشف عن الأشياء

ما هو الذي تريد التعرف عليه؟

هناك 3 مسابقات أكاديمية شائعة في مجال رؤية الكمبيوتر والتي كانت ذات تأثير هائل: ImageNet ILSVRC و PASCAL VOC و COCO. لقد دفعت هذه المسابقات الاختراعات في أبحاث رؤية الكمبيوتر ، والعديد منها متاح للاستخدام المجاني وغير المقيد. بالنسبة لهذا المنشور ، سأركز على التعرف على الصور باستخدام ImageNet ILSCVRC.

ألقِ نظرة على قائمة كائنات ILSVRC. إذا كانت الكائنات المعينة التي تهتم بالتعرف عليها هي واحدة من 1001 كائنًا في تلك القائمة ، فأنت محظوظ! فيما يلي مقتطف من قائمة فئات الكائنات:

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

التعرف على الصور

ما هو التعرف على الصورة (أو الكائن)؟ إنه يجيب على السؤال التالي: "ما هي الكائنات التي يتم تصويرها في هذه الصورة؟" المزيد من التطبيقات.

Keras و TensorFlow

Keras عبارة عن مكتبة شبكة عصبية عالية المستوى تعمل كطبقة تجريدية سهلة الاستخدام أعلى مكتبة الحسابات العددية TensorFlow. حتى أنه يوفر الوصول عبر الوحدة النمطية keras.applications لنماذج الشبكة التلافيفية الحائزة على المنافسة في ILSVRC مثل ResNet50 (التي طورتها شركة Microsoft Research) و InceptionV3 (التي طورتها Google Research) للاستخدام المجاني وغير المقيد. للتثبيت ، اتبع التعليمات على:

  • تثبيت Keras: https://keras.io/#installation
  • تثبيت TensorFlow: https://www.tensorflow.org/install/

التنفيذ

للذهاب مباشرة إلى البرنامج الكامل ، تحقق من جيثب.

هدفنا النهائي هو كتابة برنامج بيثون صغير مع خيارات الوسيطة إما 1. مسار إلى ملف محلي أو 2. عنوان URL لصورة. فيما يلي مثال للاستخدام باستخدام صورة لفيل أفريقي.

1. python classify.py - صورة African_Bush_Elephant.jpg
2. python classify.py --image_url http://i.imgur.com/wpxMwsR.jpg
https://upload.wikimedia.org/wikipedia/commons/3/37/African_Bush_Elephant.jpg

سيبدو الإخراج مثل:

أعلى 3 فئات متوقعة واحتمالاتها

وظيفة التنبؤ

للبدء ، لنقم بتحميل الوحدات النمطية keras.preprocessing و keras.applications.resnet50 (ورقة resnet50: التعلم المتبقي العميق للتعرف على الصور) ، وتحميل نموذج ResNet50 باستخدام الأوزان التي تم تدريبها على مسابقة ImageNet ILSVRC:

استيراد numpy كـ np
من keras.preprocessing استيراد الصورة
من keras.applications.resnet50 استيراد ResNet50 ، preprocess_input ، decode_predictions
نموذج = ResNet50 (الأوزان = 'imagenet')

ثم يمكننا تحديد دالة التنبؤ:

def التنبؤ (نموذج ، img ، target_size ، top_n = 3):
  "" "تشغيل التنبؤ بالنموذج على الصورة
  وسائط:
    نموذج: نموذج keras
    img: صورة تنسيق PIL
    target_size: (العرض ، الارتفاع) tuple
    top_n: # من أهم التنبؤات للعودة
  عائدات:
    قائمة التسميات المتوقعة واحتمالاتها
  "" "
  إذا img.size! = target_size:
    img = img.resize (target_size)
  x = image.img_to_array (img)
  x = np.expand_dims (x ، المحور = 0)
  x = preprocess_input (x)
  preds = model.predict (x)
  إرجاع decode_predictions (preds ، top = top_n) [0]

لاحظ أنه لاستخدام بنية ResNet50 ، يجب أن يساوي target_size (224 ، 224). تمتلك العديد من تصميمات CNN حجم إدخال ثابت و ResNet50 هي إحدى هذه الهياكل ، حيث استخدم المخترعون مدخلات بالحجم الثابت (224 ، 224).

image.img_to_array: يحول صورة تنسيق PIL إلى صفيف numpy

np.expand_dims: يحول صورتنا بحجم (3 ، 224 ، 224) إلى (1 ، 3 ، 224 ، 2 24). والسبب في ذلك هو أن الدالة model.predict تتطلب صفيفًا ثلاثي الأبعاد كمدخل ، حيث يتوافق البعد الرابع مع حجم الدُفعة. هذا يعني ، إذا أردنا ، يمكننا تصنيف صور متعددة في وقت واحد.

preprocess_input: صفر مراكز بياناتنا الصورة باستخدام القيم قناة المتوسط ​​من مجموعة البيانات التدريب. هذه خطوة مهمة للغاية ، إذا تم تخطيها ، فإنها ستتسبب في أن تكون جميع الاحتمالات المتوقعة غير صحيحة. هذا يعني أن التركيز هو ما يسمى تطبيع البيانات ، وهو مفهوم أساسي في التعلم الآلي.

model.predict: يعمل على الاستدلال على مجموعة البيانات الخاصة بنا ويعيد التنبؤات

decode_predictions: يأخذ التسميات المشفرة المرتبطة بالموديل model.predict ويعيد الملصقات القابلة للقراءة من مجموعة ImageNet ILSVRC.

توفر وحدة keras.applications 4 أبنية جاهزة: ResNet50 و InceptionV3 و VGG16 و VGG19 و XCeption. لقد اخترنا ResNet50 بشكل تعسفي ، لكنك حر في تبديل ذلك مع أي من البنيات الجاهزة الأخرى. راجع https://keras.io/applications/ لمزيد من المعلومات والمراجع.

التخطيط

يمكننا استخدام matplotlib لطباعة الإخراج في رسم بياني شريطي أفقي مثل:

def plot_preds (الصورة ، preds):
  "" "يعرض الصورة والاحتمالات الأعلى المتوقعة
     في شريط الرسم البياني
  وسائط:
    صورة: صورة بيل
    preds: قائمة التسميات المتوقعة واحتمالاتها
  "" "
  #صورة
  plt.imshow (صورة)
  plt.axis ( 'خارج')
  
  #شريط الرسم البياني
  plt.figure ()
  ترتيب = قائمة (عكس (النطاق (لين (preds))))
  bar_preds = [pr [2] لـ pr in preds]
  التسميات = (pr [1] لـ pr in preds)
  plt.barh (الترتيب ، bar_preds ، ألفا = 0.5)
  plt.yticks (ترتيب ، تسميات)
  plt.xlabel ( 'احتمال')
  plt.xlim (0 ، 1.01)
  plt.tight_layout ()
  plt.show ()

الأساسية

من أجل استخدام سطر الأوامر هذا:

1. python classify.py - صورة African_Bush_Elephant.jpg
2. python classify.py --image_url http://i.imgur.com/wpxMwsR.jpg

سنحدد الوظيفة الرئيسية كما يلي:

إذا __name __ == "__ main__":
  a = argparse.ArgumentParser ()
  a.add_argument ("- image"، help = "path to image")
  a.add_argument ("- image_url"، help = "url to image")
  args = a.parse_args ()
إذا كان args.image بلا و args.image_url هو بلا:
    a.print_help ()
    sys.exit (1)
إذا كانت args.image ليست بلا:
    img = Image.open (args.image)
    plot_preds (تنبؤ (نموذج ، img ، target_size))
إذا كان args.image_url ليس بلا:
    استجابة =طلبات.get (args.image_url)
    img = Image.open (BytesIO (response.content))
    plot_preds (تنبؤ (نموذج ، img ، target_size))

يستخدم خيار image_url مكتبة طلبات python لتنزيل صورة بسهولة من أي عنوان URL!

لقد انتهينا!

بمجرد وضع الشفرة أعلاه معًا ، يكون لديك بدايات نظام التعرف على الصور! انظر البرنامج الكامل ومثال الصور هنا على جيثب.

سيغطي المنشور التالي في سلسلتنا الموقف الذي لا يكون فيه موضوع اهتمامك أحد فئات ImageNet ILSVRC:

  1. بناء نظام التعرف على الصور لفئة 1000 كائن يومي (ImageNet ILSVRC) باستخدام Keras و TensorFlow (هذا المنشور)
  2. قم ببناء نظام للتعرف على الصور لأي فئات كائنات قابلة للتخصيص باستخدام تعلم النقل والضبط في Keras و TensorFlow
  3. أنشئ نظامًا لكشف كائنات الصندوق المحيط في الوقت الفعلي لمئات فئات الكائنات اليومية (PASCAL VOC، COCO)
  4. أنشئ خدمة ويب لأي نظام للتعرف على الصور أو نظام الكشف عن الأشياء

أمثلة إضافية

لنجرب بعض الأمثلة الأخرى!

  1. بيثون classify.py --image_url http://i.imgur.com/cg37Ojo.jpg
الصورة وأعلى 3 تسميات متوقعة مع احتمالاتها

2. بيثون classify.py --image_url http://i.imgur.com/4FIOwAN.jpg

الصورة وأعلى 3 تسميات متوقعة مع احتمالاتها

3. python classify.py --image_url http://goo.gl/t3Gh5P

الصورة وأعلى 3 تسميات متوقعة مع احتمالاتها

إذا كنت قد استمتعت بالمقال ، فانقر فوق ❤ واشترك:

إذا كان لديك أي أسئلة اتصل بي على greg.ht.chu@gmail.com أو أرسل لي رسالة على LinkedIn!