شعار زيفيرنت

تصنيف الصور باستخدام التعلم الآلي

التاريخ:

تم نشر هذه المقالة كجزء من مدونة علوم البيانات.

القراء الأعزاء،

في هذه المدونة ، سنناقش كيفية إجراء تصنيف الصور باستخدام أربع خوارزميات شائعة للتعلم الآلي وهي Random Forest Classifier و KNN و Decision Tree Classifier و Naive Bayes. سننتقل مباشرة إلى التنفيذ خطوة بخطوة.

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

فلنبدأ ...

البرنامج

  • اقتناء مجموعة البيانات
  • المعالجة المسبقة لمجموعة البيانات
  • تنفيذ مصنف الغابة العشوائية
  • تنفيذ KNN
  • تنفيذ مصنف شجرة القرار
  • تنفيذ مصنف Naive Bayes
  • النتائج
  • اختبار الإدخال المخصص
  • وفي الختام

اقتناء مجموعة البيانات

الحصول على البيانات

مصدر

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

أولاً ، دعنا نستورد الحزم المطلوبة على النحو التالي:

من tensorflow استيراد keras matplotlib.pyplot as plt
من sklearn.metrics استيراد دقة_سجل ، confusion_matrix ، تصنيف_تقرير استيراد numpy كـ np
استيراد السيرة الذاتية 2

يمكن تحميل مجموعة البيانات باستخدام الكود أدناه:

(x_train، y_train)، (x_test، y_test) = keras.datasets.cifar10.load_data ()

علاوة على ذلك ، يمكننا الحصول على حجم القطار واختبار مجموعات البيانات كما هو موضح أدناه:

x_train.shape ، x_test.shape

وبالتالي ، هناك إجمالي 50,000 صورة للتدريب و 10,000 صورة للاختبار. إلى جانب ذلك ، كل من هذه الصور بأبعاد 32 × 32 ولون. يمكن استنتاج التفاصيل أعلاه بسهولة من الشكل الذي تم إرجاعه.

ملاحظة: لاحظ أنه لا توجد حاجة لتقسيم القطار في هذه الحالة حيث يمكن الحصول على مجموعات القطار والاختبار مباشرة من Keras!

المعالجة المسبقة لمجموعة البيانات

تتضمن هذه الخطوة تطبيع الصور متبوعًا بإعادة تشكيلها.

تعد التسوية خطوة شائعة في المعالجة المسبقة للصور ويتم تحقيقها ببساطة عن طريق قسمة x_train على 255.0 لمجموعة بيانات القطار و x_test على 255.0 لمجموعة بيانات الاختبار. هذا ضروري للحفاظ على وحدات البكسل لجميع الصور ضمن نطاق موحد.

# التطبيع x_train = x_train / 255.0 x_test = x_test / 255.0

الآن تأتي الخطوة الأكثر أهمية في المعالجة المسبقة ، والتي تنطبق فقط في هذه الحالة لأننا نهدف إلى استخدام التعلم الآلي لتصنيف الصور. نظرًا لأننا سنستخدم خوارزميات ML من sklearn ، فهناك حاجة لإعادة تشكيل صور مجموعة البيانات إلى مصفوفة ثنائية الأبعاد. هذا لأن sklearn تتوقع مصفوفة ثنائية الأبعاد كمدخلات لوظيفة fit () التي سيتم استدعاؤها في النموذج أثناء التدريب.

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

ملاحظة: في حالة الشبكات العصبية ، نحدد شكل الإدخال للنموذج وبالتالي يكون أكثر مرونة. ولكن في حالة sklearn هناك بعض القيود.

الكود المطلوب لمجموعة القطار هو كما يلي:

يتوقع #sklearn أن يكون i / p عبارة عن صفيف ثنائي الأبعاد-model.fit (x_train، y_train) => إعادة تشكيل لمصفوفة 2d nsamples، nx، ny، nrgb = x_train.shape x_train2 = x_train.reshape ((nsamples، nx * ny * nrgb ))

يقوم الكود أعلاه بإعادة تشكيل مجموعة الصور من (50000,32,32,3،4،50000,3072،2) وهي مجموعة 3072D إلى (32،32) ، يتم الحصول على مصفوفة ثنائية الأبعاد 3 بضرب أبعاد الصورة (3072 × XNUMX × XNUMX = XNUMX).

الكود المطلوب لمجموعة الاختبار موضح أدناه:

# لذلك ، في النهاية ، يجب أن يكون model.predict () أيضًا إدخالًا ثنائي الأبعاد nsamples ، nx ، ny ، nrgb = x_test.shape x_test2 = x_test.reshape ((nsamples، nx * ny * nrgb))

وبالمثل تم إعادة تشكيل صور مجموعة الاختبار من (10000,32,32,3،10000,3072،XNUMX،XNUMX) إلى (XNUMX،XNUMX).

تنفيذ مصنف الغابة العشوائية

لنقم ببناء Random Forest Classifier لتصنيف صور CIFAR-10.

لهذا ، يجب علينا أولاً استيراده من sklearn:

من sklearn.ensemble استيراد RandomForestClassifier

قم بإنشاء مثيل لفئة RandomForestClassifier:

النموذج = RandomForestClassifier ()

أخيرًا ، دعونا نشرع في تدريب النموذج:

model.fit (x_train2، y_train) ملاحظة: قم بتمرير وظيفة x_train2 لتناسب () حيث إنها مصفوفة ثنائية الأبعاد مُعاد تشكيلها للصور وتحتاج sklearn إلى مصفوفة ثنائية الأبعاد كمدخلات هنا. افعل ذلك مع ملاءمة جميع النماذج حيث يتم تنفيذها جميعًا باستخدام sklearn

الآن ، توقع مجموعة الاختبار باستخدام نموذج Random Forest Classifier المناسب:

y_pred = model.predict (x_test2) y_pred

يُرجع النموذج رقمًا من 0 إلى 9 كناتج. يمكن ملاحظة ذلك بوضوح من التنبؤات المعروضة. يمكن ربط هذه الإجابات بالفئات المقابلة لها بمساعدة الجدول التالي:

الناتج 

مبوبة

0

1

لاستخدام السيارة

2

طائر

3

قط

4

أيل

5

كلب

6

ضفدع

7

خيل

8

شحن

9

شاحنة

الآن ، قم بتقييم النموذج مع صور الاختبار من خلال الحصول على تقرير التصنيف ومصفوفة الارتباك ودرجة الدقة.

دقة_تسجيل (y_pred ، y_test) طباعة (تصنيف_تقرير (y_pred ، y_test))
الإخراج | غابة عشوائية
confusion_matrix (y_pred، y_test)
تصنيف الصور ML

وبالتالي ، يُظهر Random Forest Classifier دقة 47٪ فقط في مجموعة الاختبار.

تنفيذ KNN

KNN تعني K-أقرب جيران. وهي أيضًا خوارزمية مستخدمة بشكل شائع لتصنيف متعدد الفئات.

يتم تنفيذه في sklearn باستخدام فئة KNeighboursClassifier. نبدأ باستيراده:

من sklearn.neighbours استيراد KNeighboursClassifier

ثم إنشاء مثيل له لإنشاء نموذج KNN:

knn = KNeighboursClassifier (n_neighbours = 7)

لقد اخترت 7 جيران بشكل عشوائي. لا تتردد في اللعب مع عدد الجيران للوصول إلى نموذج أفضل وبالتالي أفضل.

أخيرًا ، قم بتدريبه:

knn.fit (x_train2، y_train)

الآن ، توقع مجموعة الاختبار باستخدام نموذج KNN المناسب:

y_pred_knn = knn.predict (x_test2) y_pred_knn

التنبؤات هي مخرجات تمثل الفئات كما هو موضح في الخوارزمية السابقة.

الآن ، تابع تقييم نموذج KNN تمامًا بالطريقة التي قيمنا بها نموذجنا السابق.

دقة_تسجيل (y_pred_knn ، y_test) طباعة (تصنيف_تقرير (y_pred_knn ، y_test))
تصنيف الصور ML
confusion_matrix (y_pred_knn، y_test)
تنفيذ KNN

وبالتالي ، يُظهر مصنف KNN دقة 34٪ فقط في مجموعة الاختبار.

تنفيذ شجرة القرار

يتم تنفيذه في sklearn باستخدام فئة DecisionTreeClassifier. نبدأ باستيراده:

من sklearn.tree استيراد DecisionTreeClassifier

ثم إنشاء مثيل له لإنشاء نموذج DecisionTreeClassifier:

dtc = DecisionTreeClassifier ()

أخيرًا ، قم بتدريبه:

dtc.fit (x_train2، y_train)

الآن ، توقع مجموعة الاختبار باستخدام نموذج شجرة القرار المناسب:

y_pred_dtc = dtc.predict (x_test2)
y_pred_dtc

التنبؤات هي مخرجات تمثل الفئات كما هو موضح في الخوارزمية السابقة.

الآن ، تابع تقييم نموذج شجرة القرار تمامًا بالطريقة التي قمنا بها بتقييم نموذجنا السابق.

دقة_تسجيل (y_pred_dtc ، y_test) طباعة (تقرير التصنيف (y_pred_dtc ، y_test))
الإخراج | شجرة القرار
confusion_matrix (y_pred_dtc، y_test)
تصنيف الصور ML

وبالتالي ، يُظهر مصنف شجرة القرار دقة 27٪ فقط في مجموعة الاختبار.

تنفيذ مصنف Naive Bayes

إنه المصنف الأساسي للتعلم الآلي ، والمختصر أيضًا باسم NB. إنه يعمل على أساس نظرية بايز وله ميزات مستقلة.

يتم تنفيذه في sklearn باستخدام فئة GaussianNB. نبدأ باستيراده:

من sklearn.naive_bayes استيراد GaussianNB

ثم إنشاء مثيل له لإنشاء نموذج NB:

ملحوظة = GaussianNB ()

أخيرًا ، قم بتدريبه:

nb.fit (x_train2، y_train)

الآن ، توقع مجموعة الاختبار باستخدام نموذج NB المناسب:

y_pred_nb = nb.predict (x_test2)
y_pred_nb

التنبؤات هي مخرجات تمثل الفئات كما هو موضح في الخوارزمية السابقة.

الآن ، تابع تقييم نموذج شجرة القرار تمامًا بالطريقة التي قمنا بها بتقييم نموذجنا السابق.

دقة_تسجيل (y_pred_nb ، y_test) طباعة (تصنيف_تقرير (y_pred_nb ، y_test))
الإخراج | تصنيف الصور ML
confusion_matrix (y_pred_nb، y_test)
الإخراج | نايفس بايز

وبالتالي ، يُظهر مصنف Naive Bayes دقة 30٪ فقط في مجموعة الاختبار.

النتائج

تصنيف الصور ML

يمكن تلخيص دقة خوارزميات ML الأربعة ، التي اكتشفناها للتو لمجموعة بيانات CIFAR-10 ، باستخدام الرسم البياني الموضح أعلاه.

يُظهر Random Forest Classifier أفضل أداء بدقة 47٪ يليه KNN بدقة 34٪ ، و NB بدقة 30٪ ، وشجرة القرار بدقة 27٪. وهكذا ، فإن Random Forest تقدم أفضل أداء بينما تقدم Decision Tree الأسوأ.

ومع ذلك ، فإن أداء جميع خوارزميات التعلم الآلي ضعيف كما هو مبين في الدقة. أعلى نسبة هي 47٪ فقط بينما تتفوق خوارزميات التعلم العميق عليهم بشكل استثنائي وبدقة تتجاوز 90٪ في الغالب !!!

لهذا السبب ذكرت في البداية أنه لا يمكن استخدام هذا العمل إلا لمقارنة نموذج التعلم العميق والدفاع عن نموذج DL.

اختبار الإدخال المخصص

من النتائج المذكورة أعلاه ، حيث يظهر RandomForestClassifier أفضل أداء بين الجميع ودقة مناسبة أيضًا ، فلنختار هذا النموذج.

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

لقد استخدمت الصورة المخصصة التالية لاختبار نموذجي:

تصنيف الصور ML                                                                                                        مصدر

اذكر مسار صورتك - الموقع حيث قمت بتخزين الصورة المخصصة التي تريد اختبارها.

img_path = '/ content / bird.jfif' ملاحظة: نظرًا لأنني قمت بتنفيذ العمل على Google Colab ، فقد قمت بتحميل صورة هناك وقمت بتضمين مسار الصورة وفقًا لذلك. قم بتغيير قيمة img_path وفقًا لموقع الصورة التي تريد اختبارها.

أولاً ، اقرأ الصورة باستخدام OpenCV ثم قم بتغيير حجمها إلى 32 × 32.

img_arr = cv2.imread (img_path) img_arr = cv2.resize (img_arr، (32,32،XNUMX))

الآن ، أعد تشكيل الصورة إلى ثنائية الأبعاد كما تمت مناقشته في قسم المعالجة المسبقة:

# لذا ، في النهاية ، يجب أن يكون model.predict () أيضًا إدخالًا ثنائي الأبعاد nx، ny، nrgb = img_arr.shape img_arr2 = img_arr.reshape (2، (nx * ny * nrgb))

دعونا نعلن عن قائمة تسمى الفئات:

فئات = ["طائرة" ، "سيارة" ، "طائر" ، "قطة" ، "أيل" ، "كلب" ، "ضفدع" ، "حصان" ، "سفينة" ، "شاحنة"]

لديها كل الفئات العشر. سيكون ناتج النموذج ، كما تمت مناقشته سابقًا ، من 0 إلى 9 ويمكن استرداد الفئة المقابلة من القائمة أعلاه.

أخيرًا ، قم بتمرير الصفيف المطلوب إلى مصنف Random Forest باستخدام وظيفة التنبؤ ().

ans = model.predict (img_arr2) print (classes [ans [0]]) #RandomForestClassifier

متغير الإجابة هو قائمة تحتوي على رقم واحد فقط وهو فهرس قائمة الفئات. الفئة في هذا الفهرس هي الفئة المتوقعة.

يتنبأ النموذج بأنه طائر على حق! لكنها تتوقع بشكل غير صحيح لبعض الصور الاختبارية. يمكن التغلب على العيب من خلال بناء نموذج CNN أو ANN بدلاً من ذلك.

وفي الختام

وبالتالي ، في هذه المدونة ، ناقشنا كيفية استخدام تصنيف الصور في التعلم الآلي من خلال تنفيذ أربعة خوارزميات ML الشائعة بما في ذلك Random Forest و KNN و Decision Tree و Naive Bayes مصنف. نظرًا لضعف دقتها ، يُفضل التعلم العميق لمهام تصنيف الصور.

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

عني

أنا Nithyashree V ، طالبة هندسة وعلوم الكمبيوتر في BTech في العام الأخير. أحب تعلم هذه التقنيات الرائعة ووضعها موضع التنفيذ ، لا سيما ملاحظة كيف تساعدنا في حل مشاكل المجتمع الصعبة. تشمل مجالات اهتمامي الذكاء الاصطناعي وعلوم البيانات ومعالجة اللغة الطبيعية.

يمكنك قراءة مقالاتي الأخرى على Analytics Vidhya من هنا.

يمكنك أن تجدني على LinkedIn من هنا.

الوسائط الموضحة في هذه المقالة ليست مملوكة لشركة Analytics Vidhya ويتم استخدامها وفقًا لتقدير المؤلف. 

المصدر: https://www.analyticsvidhya.com/blog/2022/01/image-classification-using-machine-learning/

بقعة_صورة

أحدث المعلومات الاستخباراتية

بقعة_صورة

الدردشة معنا

أهلاً! كيف يمكنني مساعدك؟