تجزئة المثيلات باستخدام YOLOv7 في ذكاء بيانات Python PlatoBlockchain. البحث العمودي. عاي.

تجزئة المثيلات باستخدام YOLOv7 في Python

المُقدّمة

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

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

من الناحية المفاهيمية - إنهما متشابهان ، لكن يجمع تجزئة المثيل بين التجزئة الدلالية واكتشاف الكائن. لحسن الحظ ، يمكن إجراء اكتشاف الكائن والتجزئة الدلالية وتجزئة مثيل الامتداد من خلال نهاية خلفية مشتركة ، مع رؤساء مختلفين للشبكة ، حيث يتم تكليفهم بمهمة مماثلة من الناحية المفاهيمية ، وبالتالي مشاركة التمثيلات الحسابية لتلك المعرفة.

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

لحسن الحظ للجماهير - طورت Ultralytics واجهة برمجة تطبيقات بسيطة وقوية جدًا ورائعة لاكتشاف الكائنات حول YOLOv5 الخاصة بهم والتي تم تمديدها من قبل فرق البحث والتطوير الأخرى إلى إصدارات أحدث ، مثل YOLOv7.

في هذا الدليل المختصر ، سنقوم بإجراء تجزئة المثيلات في بايثون ، باستخدام أحدث إصدارات YOLOv7.

YOLO و Instance Segmentation

YOLO (أنت تنظر مرة واحدة فقط) هي منهجية ، بالإضافة إلى مجموعة من النماذج المصممة لاكتشاف الكائنات. منذ البداية في عام 2015 ، تم اقتراح YOLOv1 و YOLOv2 (YOLO9000) و YOLOv3 من قبل نفس المؤلف (المؤلفين) - واستمر مجتمع التعلم العميق في التقدم مفتوح المصدر في السنوات المستمرة.

Ultralytics 'YOLOv5 هو مستودع ضخم ، وأول تطبيق على مستوى الإنتاج لـ YOLO في PyTorch ، والذي شهد استخدامًا كبيرًا في الصناعة. جعل تطبيق PyTorch الوصول إليها أكثر سهولة من أي وقت مضى ، والذي تم إجراؤه عادةً في C ++ ، ولكن السبب الرئيسي الذي جعله شائعًا للغاية هو واجهة برمجة التطبيقات القوية والبسيطة الجميلة المبنية حوله ، والتي تسمح لأي شخص يمكنه تشغيل بضعة أسطر من Python كود قادر على بناء كاشفات الكائنات.

أصبح YOLOv5 عنصرًا أساسيًا لدرجة أن معظم المستودعات التي تهدف إلى تطوير طريقة YOLO تستخدمها كأساس وتقدم واجهة برمجة تطبيقات مماثلة موروثة من Ultralytics. YOLOR (أنت تتعلم تمثيل واحد فقط) فعل هذا بالضبط ، وتم إنشاء YOLOv7 فوق YOLOR بواسطة نفس المؤلفين.

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

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

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

تجزئة المثيل مع YOLOv7

المكتبة القياسية المستخدمة لتجزئة المثال ، واكتشاف الكائنات وتقدير النقطة الأساسية في Python هي Detectron2 ، التي تم إنشاؤها بواسطة Meta AI.

تقدم المكتبة طرقًا وفئات ملائمة متنوعة للمساعدة في تصور النتائج بشكل جميل ، ولكن التنفيذ الأساسي للكشف هو Mask R-CNN. لقد ثبت أن YOLO تتفوق في الأداء على النماذج المستندة إلى R-CNN في جميع المجالات. مستودع YOLOv7 متوافق مع Detectron2 ومتوافق مع API وأدوات التصور ، مما يجعل من السهل تشغيل تجزئة المثيلات بسرعة ودقة دون الحاجة إلى تعلم واجهة برمجة تطبيقات جديدة. يمكنك ، في الواقع ، تبديل العمود الفقري لـ Mask R-CNN واستبداله بـ YOLOv7.

تثبيت التبعيات - YOLOv7 و Detectron2

لنبدأ أولاً ونثبت التبعيات. سنقوم باستنساخ GitHub repo لمشروع YOLOv7 ، وتثبيت أحدث إصدار من Detectron2 عبر pip:

! git clone -b mask https://github.com/WongKinYiu/yolov7.git
! pip install pyyaml==5.1
! pip install 'git+https://github.com/facebookresearch/detectron2.git'

يتطلب Detectron2 pyyaml كذلك. لضمان التوافق ، ستحتاج أيضًا إلى تحديد التشغيل torch النسخة:

! pip install torch==1.10.1+cu111 torchvision==0.11.2+cu111 torchaudio==0.10.1 -f https://download.pytorch.org/whl/torch_stable.html

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

%cd yolov7
! curl -L https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7-mask.pt -o yolov7-mask.pt

لقد انتقلنا أولاً إلى yolov7 الدليل (الدليل الذي تم تنزيله والذي يحتوي على المشروع) ثم تنزيل ملف الأوزان هناك. مع ذلك - تم إنشاء تبعياتنا! لنستورد الحزم والفئات التي سنستخدمها:

import matplotlib.pyplot as plt
import torch
import cv2
import yaml
from torchvision import transforms
import numpy as np

from utils.datasets import letterbox
from utils.general import non_max_suppression_mask_conf

from detectron2.modeling.poolers import ROIPooler
from detectron2.structures import Boxes
from detectron2.utils.memory import retry_if_cuda_oom
from detectron2.layers import paste_masks_in_image

استدلال تجزئة المثيل باستخدام YOLOv7

دعنا أولاً نلقي نظرة على الصورة التي سنقوم بتقسيمها:

street_img = cv2.imread('../street.png')
street_img = cv2.cvtColor(street_img, cv2.COLOR_BGR2RGB)

fig = plt.figure(figsize=(12, 6))
plt.imshow(street_img)

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

يمكننا الآن تحميل النموذج وتجهيزه للاستدلال. ال hyp.scratch.mask.yaml يحتوي الملف على تكوينات للمعلمات الفائقة ، لذلك سنقوم في البداية بتحميله ، والتحقق من الجهاز النشط (GPU أو CPU) ، وتحميل النموذج من ملف الأوزان الذي قمنا بتنزيله للتو:

تحقق من دليلنا العملي العملي لتعلم Git ، مع أفضل الممارسات ، والمعايير المقبولة في الصناعة ، وورقة الغش المضمنة. توقف عن أوامر Googling Git وفي الواقع تعلم ذلك!

with open('data/hyp.scratch.mask.yaml') as f:
    hyp = yaml.load(f, Loader=yaml.FullLoader)

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

def load_model():
    model = torch.load('yolov7-mask.pt', map_location=device)['model']
    
    model.eval()

    if torch.cuda.is_available():
        
        
        model.half().to(device)
    return model

model = load_model()

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

def run_inference(url):
    image = cv2.imread(url) 
    
    image = letterbox(image, 640, stride=64, auto=True)[0] 
    
    image = transforms.ToTensor()(image) 
    
    image = image.half().to(device)
    
    image = image.unsqueeze(0) 
    output = model(image) 
    return output, image

output, image = run_inference('../street.png')

تقوم الوظيفة بإرجاع إخراج النموذج ، بالإضافة إلى الصورة نفسها (محملة ومبطن ومعالجة بطريقة أخرى). الإخراج عبارة عن قاموس:

output.keys()

التنبؤات التي قدمها النموذج أولية - سنحتاج إلى تمريرها non_max_supression()، واستخدام ROIPooler من Detectron2.

ملحوظة: "تجميع عائد الاستثمار" هو اختصار ل "منطقة تجميع الاهتمامات" ويستخدم لاستخراج خرائط الميزات الصغيرة لاكتشاف الكائنات ومهام التجزئة ، في المناطق التي قد تحتوي على كائنات.

inf_out = output['test']
attn = output['attn']
bases = output['bases']
sem_output = output['sem']

bases = torch.cat([bases, sem_output], dim=1)
nb, _, height, width = image.shape
names = model.names
pooler_scale = model.pooler_scale

pooler = ROIPooler(output_size=hyp['mask_resolution'], 
                   scales=(pooler_scale,), 
                   sampling_ratio=1, 
                   pooler_type='ROIAlignV2', 
                   canonical_level=2)
                   

output, output_mask, _, _, _ = non_max_suppression_mask_conf(inf_out, 
                                                             attn, 
                                                             bases, 
                                                             pooler, 
                                                             hyp, 
                                                             conf_thres=0.25, 
                                                             iou_thres=0.65, 
                                                             merge=False, 
                                                             mask_iou=None)                 

هنا - حصلنا على تنبؤات الكائنات وتسمياتها بتنسيق output والأقنعة التي يجب أن تغطي تلك الأشياء output_mask:

output[0].shape 
output_mask[0].shape 

وجد النموذج 30 حالة في الصورة ، كل منها مع تسمية مرتبطة بها. لنقم بإنشاء مربعات لمثيلاتنا بمساعدة Detectron2's Boxes فئة وتكثيف pred_masks (التي تحتوي على قناع منطقي) في مجموعة من وحدات البكسل التي يمكننا تطبيقها على الصورة الأصلية:

pred, pred_masks = output[0], output_mask[0]
base = bases[0]
bboxes = Boxes(pred[:, :4])

original_pred_masks = pred_masks.view(-1, 
                                      hyp['mask_resolution'], 
                                      hyp['mask_resolution'])

pred_masks = retry_if_cuda_oom(paste_masks_in_image)(original_pred_masks, 
                                                     bboxes, 
                                                     (height, width), 
                                                     threshold=0.5)
                                                     

pred_masks_np = pred_masks.detach().cpu().numpy()
pred_cls = pred[:, 5].detach().cpu().numpy()
pred_conf = pred[:, 4].detach().cpu().numpy()
nimg = image[0].permute(1, 2, 0) * 255
nimg = nimg.cpu().numpy().astype(np.uint8)
nimg = cv2.cvtColor(nimg, cv2.COLOR_RGB2BGR)
nbboxes = bboxes.tensor.detach().cpu().numpy().astype(np.int)

original_pred_masks يشير إلى الأقنعة المتوقعة للصورة الأصلية:

original_pred_masks.shape 

وأخيرًا ، يمكننا رسم النتائج باستخدام:

def plot_results(original_image, pred_img, pred_masks_np, nbboxes, pred_cls, pred_conf, plot_labels=True):
  for one_mask, bbox, cls, conf in zip(pred_masks_np, nbboxes, pred_cls, pred_conf):
    if conf < 0.25:
        continue
    color = [np.random.randint(255), np.random.randint(255), np.random.randint(255)]

    pred_img = pred_img.copy()
                             
    
    pred_img[one_mask] = pred_img[one_mask] * 0.5 + np.array(color, dtype=np.uint8) * 0.5
    
    pred_img = cv2.rectangle(pred_img, (bbox[0], bbox[1]), (bbox[2], bbox[3]), color, 2)

    if plot_labels:
      label = '%s %.3f' % (names[int(cls)], conf)
      t_size = cv2.getTextSize(label, 0, fontScale=0.1, thickness=1)[0]
      c2 = bbox[0] + t_size[0], bbox[1] - t_size[1] - 3
      pred_img = cv2.rectangle(pred_img, (bbox[0], bbox[1]), c2, color, -1, cv2.LINE_AA)
      pred_img = cv2.putText(pred_img, label, (bbox[0], bbox[1] - 2), 0, 0.5, [255, 255, 255], thickness=1, lineType=cv2.LINE_AA)  

  fig, ax = plt.subplots(1, 2, figsize=(pred_img.shape[0]/10, pred_img.shape[1]/10), dpi=150)

  original_image = np.moveaxis(image.cpu().numpy().squeeze(), 0, 2).astype('float32')
  original_image = cv2.cvtColor(original_image, cv2.COLOR_RGB2BGR)
  
  ax[0].imshow(original_image)
  ax[0].axis("off")
  ax[1].imshow(pred_img)
  ax[1].axis("off")

يتم نسخ الصورة حتى لا نطبق تحويلات على الصورة في مكانها ، ولكن على نسخة. لكل بكسل يطابق بين الصورة المدخلة والأقنعة المتوقعة ، نطبق لونًا بعتامة 0.5 ولكل كائن ، نرسم أ cv2.Rectangle() التي تشملها من المربعات المحيطة (bbox). إذا كنت ترغب في رسم الملصقات ، والتي قد يكون هناك تداخل كبير فيها ، فهناك ملف plot_labels العلم في plot_results() طريقة التوقيع. دعنا نحاول رسم الصورة التي بدأنا العمل بها سابقًا باستخدام التسميات وبدونها:

%matplotlib inline
plot_results(image, nimg, pred_masks_np, nbboxes, pred_cls, pred_conf, plot_labels=False)

تجزئة المثيلات باستخدام YOLOv7 في ذكاء بيانات Python PlatoBlockchain. البحث العمودي. عاي.

%matplotlib inline
plot_results(image, nimg, pred_masks_np, nbboxes, pred_cls, pred_conf, plot_labels=True)

تجزئة المثيلات باستخدام YOLOv7 في ذكاء بيانات Python PlatoBlockchain. البحث العمودي. عاي.

لقد قمنا برسم كلتا الصورتين - الصورة الأصلية والصورة المجزأة في مخطط واحد. للحصول على دقة أعلى ، اضبط ملف dpi (نقطة في البوصة) وسيطة في subplots() قم باستدعاء ورسم الصورة فقط باستخدام خريطة / تسميات التجزئة المتوقعة لتحتل الشكل بأكمله.

المضي قدمًا - التعلم العميق العملي لرؤية الكمبيوتر

طبيعتك الفضولية تجعلك ترغب في الذهاب إلى أبعد من ذلك؟ نوصي بالتحقق من الدورة: "التعلم العميق العملي لرؤية الكمبيوتر باستخدام Python".

تجزئة المثيلات باستخدام YOLOv7 في ذكاء بيانات Python PlatoBlockchain. البحث العمودي. عاي.

دورة أخرى في الرؤية الحاسوبية؟

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

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

ماذا يوجد في الداخل؟

  • المبادئ الأولى للرؤية وكيف يمكن تعليم أجهزة الكمبيوتر "الرؤية"
  • مهام وتطبيقات مختلفة للرؤية الحاسوبية
  • أدوات التجارة التي ستجعل عملك أسهل
  • البحث عن مجموعات البيانات وإنشائها واستخدامها للرؤية الحاسوبية
  • نظرية وتطبيق الشبكات العصبية التلافيفية
  • التعامل مع تحول المجال والتواجد المشترك والتحيزات الأخرى في مجموعات البيانات
  • نقل التعلم والاستفادة من وقت تدريب الآخرين والموارد الحسابية لصالحك
  • بناء وتدريب مصنف حديث لسرطان الثدي
  • كيفية تطبيق جرعة صحية من الشك على الأفكار السائدة وفهم الآثار المترتبة على التقنيات المعتمدة على نطاق واسع
  • تصور "الفضاء المفهوم" لـ ConvNet باستخدام t-SNE و PCA
  • دراسات حالة عن كيفية استخدام الشركات لتقنيات الرؤية الحاسوبية لتحقيق نتائج أفضل
  • تقييم النموذج المناسب ، تصور الفضاء الكامن وتحديد انتباه النموذج
  • إجراء بحث في المجال ومعالجة مجموعات البيانات الخاصة بك وإنشاء اختبارات نموذجية
  • أحدث البنيات ، تطور الأفكار ، ما الذي يجعلها فريدة من نوعها وكيفية تنفيذها
  • KerasCV - مكتبة العمل قيد التقدم لإنشاء خطوط الأنابيب والنماذج الحديثة
  • كيف تحلل وتقرأ الأوراق وتنفذها بنفسك
  • اختيار النماذج حسب التطبيق الخاص بك
  • إنشاء خط أنابيب تعلم آلي شامل
  • المناظر الطبيعية والحدس في اكتشاف الكائنات باستخدام شبكات R-CNN و RetinaNets و SSDs و YOLO أسرع
  • المثيل والتجزئة الدلالية
  • التعرف على الكائنات في الوقت الفعلي باستخدام YOLOv5
  • تدريب كاشفات الأجسام YOLOv5
  • العمل مع المحولات باستخدام KerasNLP (مكتبة WIP ذات قوة الصناعة)
  • دمج المحولات مع ConvNets لإنشاء تسميات توضيحية للصور
  • ديب دريم
  • تحسين نموذج التعلم العميق لرؤية الكمبيوتر

الطابع الزمني:

اكثر من ستاكابوز