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

مشروع 17: التعرف على الصور باستخدام التعلم الآلي باستخدام PyTorch

اقرأ في هذا المقال
  • ما هو PyTorch؟
  • التعرف على الصور باستخدام التعلم الآلي
  • التعرف على الصور
  • تشغيل نموذج التعرف على الصور

لا يبذل البشر أي جهد للتمييز بين كلب أو قطة أو صحن طائر. لكن هذه العملية يصعب على الكمبيوتر محاكاتها: تبدو سهلة فقط لأن الله يصمم أدمغتنا بشكل جيد للغاية للتعرف على الصور. أحد الأمثلة الشائعة على التعرف على الصور باستخدام التعلم الآلي هو التعرف الضوئي على الأحرف optical character recognition. في هذه المقالة، سوف آخذك خلال بناء نموذج التعرف على الصور باستخدام التعلم الآلي باستخدام PyTorch.

ما هو PyTorch؟

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

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

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

يمكن العثور على النماذج المحددة مسبقًا في torchvision.models.

 

from torchvision import models
dir(models)

['AlexNet',
 'DenseNet',
 'GoogLeNet',
 'GoogLeNetOutputs',
 'Inception3',
 'InceptionOutputs',
 'MNASNet',
 'MobileNetV2',
 'ResNet',
 'ShuffleNetV2',
 'SqueezeNet',
 'VGG',
 '_GoogLeNetOutputs',
 '_InceptionOutputs',
 '__builtins__',
 '__cached__',
 '__doc__',
 '__file__',
 '__loader__',
 '__name__',
 '__package__',
 '__path__',
 '__spec__',
 '_utils',
 'alexnet',
 'densenet',
 'densenet121',
 'densenet161',
 'densenet169',
 'densenet201',
 'detection',
 'googlenet',
 'inception',
 'inception_v3',
 'mnasnet',
 'mnasnet0_5',
 'mnasnet0_75',
 'mnasnet1_0',
 'mnasnet1_3',
 'mobilenet',
 'mobilenet_v2',
 'quantization',
 'resnet',
 'resnet101',
 'resnet152',
 'resnet18',
 'resnet34',
 'resnet50',
 'resnext101_32x8d',
 'resnext50_32x4d',
 'segmentation',
 'shufflenet_v2_x0_5',
 'shufflenet_v2_x1_0',
 'shufflenet_v2_x1_5',
 'shufflenet_v2_x2_0',
 'shufflenetv2',
 'squeezenet',
 'squeezenet1_0',
 'squeezenet1_1',
 'utils',
 'vgg',
 'vgg11',
 'vgg11_bn',
 'vgg13',
 'vgg13_bn',
 'vgg16',
 'vgg16_bn',
 'vgg19',
 'vgg19_bn',
 'video',
 'wide_resnet101_2',
 'wide_resnet50_2']

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

AlexNet

لتشغيل بُنية AlexNet على صورة إدخال، يمكننا إنشاء مثيل لفئة AlexNet. هنا كيفية القيام بذلك:

alexnet = models.AlexNet()

في هذه المرحلة، alexnet هو كائن يدير بُنية AlexNet. ليس من الضروري بالنسبة لنا أن نفهم تفاصيل هذه البُنية في هذا الوقت. في الوقت الحالي، يعد AlexNet مجرد كائن معتم يمكن تسميته كدالة.

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

ResNet

باستخدام طريقة resnet101، يمكننا الآن إنشاء مثيل لشبكة عصبية تلافيفية مكونة من 101 طبقة. لنقم الآن بإنشاء مثيل للشبكة. سنقوم بتمرير وسيطة ستطلب من الدالة تنزيل أوزان resnet101 التي تم تكوينها على مجموعة بيانات ImageNet، مع 1.2 مليون صورة و1000 فئة:

resnet = models.resnet101(pretrained=True)
resnet

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

from torchvision import transforms
preprocess = transforms.Compose([
        transforms.Resize(256),
        transforms.CenterCrop(224),
        transforms.ToTensor(),
        transforms.Normalize(
            mean=[0.485, 0.456, 0.406],
            std=[0.229, 0.224, 0.225]
        )])

في هذه الحالة، حددنا دالة المعالجة المسبقة التي ستعمل على قياس صورة الإدخال إلى 256 × 256، واقتصاص الصورة إلى 224 × 224 حول المركز، وتحويلها إلى موتر، وتسوية مكونات RGB الخاصة بها. (أحمر، أخضر، أزرق) بحيث يكون لديهم وسائط محددة وانحرافات معيارية.

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

الآن يمكننا استخدام صورة لمهمة التعرف على الصور باستخدام نموذجنا. لقد التقطت صورة لكلب. يمكننا البدء بتحميل صورة من نظام الملفات المحلي باستخدام Pillow، وهي وحدة معالجة الصور لبايثون:

 

from google.colab import files
uploaded = files.upload()
from PIL import Image
img = Image.open("dog.png")
img

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

img_t = preprocess(img)

يمكننا الآن إعادة تشكيل موتر الإدخال واقتصاصه وتسويته بالطريقة التي تتوقعها الشبكة:

import torch
batch_t = torch.unsqueeze(img_t, 0)
resnet.eval()
out = resnet(batch_t)
out

تشغيل نموذج التعرف على الصور

تسمى عملية تشغيل نموذج مدرب على بيانات جديدة الاستدلال inference في دوائر التعلم العميق. من أجل عمل استنتاجات لنموذج التعرف على الصور هذا، نحتاج إلى وضع الشبكة في وضع التقييم. فلنقم الآن بتحميل الملف الذي يحتوي على 1000 تصنيف لفئات مجموعة البيانات ImageNet:

with open('imagenet_classes.txt') as f:
    labels = [line.strip() for line in f.readlines()]
_, index = torch.max(out, 1)

percentage = torch.nn.functional.softmax(out, dim=1)[0] * 100
labels[index[0]], percentage[index[0]].item()

(‘golden retriever’, 96.29334259033203)

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

بواسطة
thecleverprogrammer
المصدر
thecleverprogrammer

د. علاء طعيمة

كلية علوم الحاسوب وتكنولوجيا المعلومات / جامعة القادسية / العراق

مقالات ذات صلة

تعليق واحد

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

زر الذهاب إلى الأعلى