شعار زيفيرنت

تطوير ونشر مصنف الصور باستخدام Flask: الجزء 1

التاريخ:

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

يا شباب،

آمل أن تكونوا جميعا بخير.

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

هذه المقالة مفتوحة لجميع فئات المشاهدين (مبتدئ ، متوسط ​​، متقدم). يوجد أدناه جدول محتوى هذه المقالة ، لذا لا تتردد في تخطي الأجزاء التي تشعر بالراحة معها بالفعل.

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

جدول المحتويات

  1. ما هو تصنيف الصور؟
    1. 1. الشبكة العصبية التلافيفية
    1. 2. نقل التعلم
  2.  ترميز مصنف الصور
  3. وفي الختام

تصنيف الصور

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

تعتمد حالة الفن لتصنيف الصور على التعلم العميق المعروف باسم الشبكات العصبية التلافيفية (CNN).

الشبكة العصبية التلافيفية

قبل أن ننتقل إلى CNN ، دعونا نلقي نظرة على الشبكة العصبية.

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

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

لماذا نستخدم CNN؟

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

تُظهر الصورة أدناه مثالًا كلاسيكيًا لشبكة CNN.

مصنف الصور باستخدام القارورة

شروط VIP في CNN

التفاف: يحتوي على مجموعة من المرشحات / النواة (مجموعة من الأوزان) التي تأخذ المدخلات كمجموعة فرعية من الصورة المدخلة. يتم ضرب مجموعات فرعية من الصور باستخدام المرشحات التي تكون عمومًا ذات حجم أقل من الصورة. ستساعدك الصورة أدناه على التعرف على الطبقة التلافيفية.

مصنف الصور باستخدام القارورة
الصورة مأخوذة من https://cs231n.github.io/convolutional-networks/

التجميع: تساعد هذه الطبقة في اختزال صورنا. نقوم بتشغيل مرشح على المصفوفة ونطبق فوقها دالة لتوليد الناتج. MAXPOOL هي وظيفة تعطي الناتج كقيمة قصوى كما هو موضح أدناه.

تجميع | مصنف الصور باستخدام القارورة

الصورة مأخوذة من https://cs231n.github.io/convolutional-networks/

ReLU

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

أوقع

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

طبقة متصلة بالكامل

الخلايا العصبية في طبقة متصلة بالكامل لها اتصالات كاملة بجميع التنشيطات في الطبقة السابقة. ومن ثم يمكن حساب عمليات التنشيط الخاصة بهم بضرب المصفوفة متبوعًا بإزاحة التحيز.

يمكنك قراءة المزيد من التفاصيل هنا.

نقل التعلم 

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

سنستخدم نقل التعلم أيضًا أثناء إنشاء نموذجنا. أمثلة على نماذج التعلم المستخدمة في تصنيف الصور هي Resnet50 و MobileNet و VGG16 و VGG19 و DenseNet.

اقرأ المزيد عن نقل التعلم هنا.

يكفي مع النظرية أرني الرمز!

ترميز مصنف الصور 

بالنسبة لمصنفات الصور ، هناك العديد من الوحدات النمطية مثل TensorFlow و PyTorch و fastai وما إلى ذلك. بالنسبة لهذه المدونة ، سنستخدم TensorFlow. 

مكتبات الاستيراد: 

# مكتبات المساعدة تستورد نظام التشغيل استيراد numpy كـ np import matplotlib.pyplot as plt
# Tensorflow استيراد Tensorflow مثل tf

من tensorflow.keras.applications.imagenet_utils استيراد preprocess_input ، decode_predities

من tensorflow.keras.models import load_model، model_from_json، الموديل

من tensorflow.keras.preprocessing استيراد صورة من keras استيراد tensorflow from keras.preprocessing.image import ImageDataGenerator

إنشاء مجموعة البيانات الخاصة بك

يجب عليك التصريح عن المتغيرات وتغييرها وفقًا لاستخدامك.

# إعلان المتغيرات train_data_dir = 'v_data / train' validation_data_dir = 'v_data / test' nb_train_samples = 400 nb_validation_samples = 100 عصر = 10 batch_size = 16
img_width, img_height = 224, 224 input_shape = (img_width, img_height, 3)

العصور: 1 الحقبة هي عندما يتم تمرير مجموعة البيانات الكاملة للأمام وللخلف عبر الشبكة العصبية مرة واحدة فقط.
حجم الدفعة: نظرًا لأن تمرير مجموعة البيانات الكاملة للأمام وللخلف سيؤدي إلى ارتفاع تكلفة الحساب ، فإننا نستخدم حجم الدُفعة الذي يتم تحديده على أنه عدد العينات التي سيتم نشرها عبر الشبكة.

train_datagen = ImageDataGenerator (إعادة القياس = 1/255 ، shear_range = 0.2 ، zoom_range = 0.2 ،orizontal_flip = True) test_datagen = ImageDataGenerator (إعادة البيع = 1/255) train_generator = train_datagen.flow_from_directory (train_data_dir ، target_size) ، batch_size = batch_size، class_mode = 'binary') validation_generator = test_datagen.flow_from_directory (validation_data_dir، target_size = (img_width، img_height)، batch_size = batch_size، class_mode = 'binary')

خلق النموذج

model = Sequential()
model.add(Conv2D(32, (2, 2), input_shape=input_shape))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(32, (2, 2)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, (2, 2)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))

لقد أنشأنا هيكل نموذجنا هنا.

model.compile(loss='binary_crossentropy',
optimizer='adam',metrics=['accuracy'])

ستنشئ الكود أعلاه وظيفة تجميع تحتوي على وظيفة الخسارة والمحسن مثل آدم وتقييم النموذج.

نقل نموذج التعلم

من tensorflow.keras.applications.mobilenet_v2 استيراد نموذج MobileNetV2 = MobileNetV2 (weights = 'imagenet')

سيؤدي هذا الرمز إلى إنشاء نموذج بهيكل MobileNetV2 محمّل بأوزان تخيلية.

توليف دقيق لنموذج تعلم النقل

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

من keras.applications استيراد Resnet50 base_model = ResNet50 (أوزان = 'imagenet'، include_top = False، input_shape = (IMG_SIZE، IMG_SIZE، 3))
output_categories = 2 # عدد الفئات في الطبقة النهائية. add_model = متسلسل () add_model.add (Flatten (input_shape = base_model.output_shape [1:])) add_model.add (Dropout (0.3)) add_model.add (Dense (128، Activation = 'relu')) add_model.add ( Dropout (0.3)) add_model.add (Dense (output_categories، Activation = 'softmax')) النموذج = النموذج (المدخلات = base_model.input ، المخرجات = add_model (base_model.output))

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

نموذج التدريب

model.fit_generator (train_generator، steps_per_epoch = nb_train_samples // batch_size، epochs = epochs، validation_data = validation_generator، validation_steps = nb_validation_samples // batch_size)

التنبؤ باستخدام النموذج 

def model_predict (img، model): img = img.resize ((224، 224))
 # المعالجة المسبقة للصورة x = image.img_to_array (img) # x = np.true_divide (x، 255) x = np.expand_dims (x، محور = 0)
 # كن حذرًا في كيفية تعامل نموذجك المدرب مع الإدخال # وإلا فلن يقوم بالتنبؤ الصحيح! x = preprocess_input (x ، الوضع = 'tf')
 preds = model.predict (x) إرجاع preds

نموذج التوفير

model_json = model.to_json () مع open ("ImageClassifier.json"، "w") مثل json_file: json_file.write (model_json) # تسلسل الأوزان إلى HDF5 model.save_weights ("ImageClassifier.h5")

ستتغير المواقع وفقًا لنظامك.

نموذج التحميل

model_json = open (path_to_model_json، 'r') تحميل_model_json = model_json.read () model_json.close () model = model_from_json (تحميل_model_json) model.load_weights (path_to_model_wieght)

في حالة الارتباك وترغب في رؤية الكود أو نسخه. مرجع لمصنف الصور هنا.

وفي الختام

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

البحث عن الكود هنا. 

عني 

أنا طالب في السنة النهائية من المعهد الدولي للتكنولوجيا (IIIT) أسعى للحصول على درجة البكالوريوس في علوم الكمبيوتر والهندسة. أحب استكشاف وتجربة المزيد والمزيد حول التعلم العميق والتعلم الآلي. إذا كنت ترغب في التعاون يمكنك استخدام الروابط أدناه:

لينكدإن: انقر فوق لي

جيثب: انقر فوق لي

كاجل: انقر فوق لي

البريد لي: [البريد الإلكتروني محمي]

آمل أن تكون مقالتي قد أحببت عن مصنف الصور باستخدام Flask. شكرا لقرائتك!

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

المصدر: https://www.analyticsvidhya.com/blog/2022/01/develop-and-deploy-image-classifier-using-flask-part-1/

بقعة_صورة

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

بقعة_صورة

الدردشة معنا

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