تقدير الوضع في الوقت الفعلي من الفيديو في Python باستخدام ذكاء بيانات YOLOv7 PlatoBlockchain. البحث العمودي. عاي.

تقدير الوضع في الوقت الفعلي من الفيديو في Python باستخدام YOLOv7

المُقدّمة

يعد اكتشاف الأشياء مجالًا كبيرًا في رؤية الكمبيوتر ، وأحد أهم تطبيقات رؤية الكمبيوتر "في البرية". من ذلك ، تم استخراج الكشف الأساسي (يستخدم في كثير من الأحيان لتقدير الوضع).

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

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

في هذا الدليل ، سنقوم بتقدير الوضع في الوقت الفعلي من مقطع فيديو في Python ، باستخدام أحدث طراز YOLOv7.

على وجه التحديد ، سنعمل مع مقطع فيديو من دورة الألعاب الأولمبية الشتوية لعام 2018 ، التي أقيمت في بيونغ تشانغ بكوريا الجنوبية:

قدم Aljona Savchenko و Bruno Massot أداءً مذهلاً ، بما في ذلك تداخل الأجسام ضد الكاميرا ، وحركة انسيابية سريعة ودوران في الهواء. ستكون فرصة رائعة لمعرفة كيف يتعامل النموذج مع المواقف التي يصعب استنتاجها!

YOLO و Pose Estimation

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

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

هذه هي الطريقة YOLOR (أنت تتعلم تمثيل واحد فقط) و YOLOv7 اللذان تم بناؤهما فوق YOLOR (نفس المؤلف) تم إنشاؤهما أيضًا!

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

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

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

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

تثبيت YOLOv7

لنبدأ باستنساخ المستودع للحصول على شفرة المصدر:

! git clone https://github.com/WongKinYiu/yolov7.git

الآن ، دعنا ننتقل إلى ملف yolov7 الدليل الذي يحتوي على المشروع ، وإلقاء نظرة على المحتويات:

%cd yolov7
!ls
/content/yolov7
cfg	   figure      output.mp4	 test.py       
data	   hubconf.py  paper		 tools
deploy	   inference   README.md	 train_aux.py
detect.py  LICENSE.md  requirements.txt  train.py
export.py  models      scripts		 utils

ملحوظة: دعوة !cd dirname ينقلك إلى دليل في تلك الخلية. الاتصال %cd dirname ينقلك إلى دليل عبر الخلايا القادمة أيضًا ويبقيك هناك.

الآن ، من المفترض أن يكون YOLO كاشفًا للأشياء ، ولا يتم شحنه بأوزان تقدير الوضع بواسطة dedfault. سنرغب في تنزيل الأوزان وتحميل نموذج ملموس منها. تتوفر الأوزان في نفس مستودع GitHub ، ويمكن تنزيلها بسهولة من خلال CLI أيضًا:

! curl -L https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7-w6-pose.pt -o yolov7-w6-pose.pt

 % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100  153M  100  153M    0     0  23.4M      0  0:00:06  0:00:06 --:--:-- 32.3M

بمجرد التنزيل ، يمكننا استيراد المكتبات والطرق المساعدة التي سنستخدمها:

import torch
from torchvision import transforms

from utils.datasets import letterbox
from utils.general import non_max_suppression_kpt
from utils.plots import output_to_keypoint, plot_skeleton_kpts

import matplotlib.pyplot as plt
import cv2
import numpy as np

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

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

تقدير الوضع في الوقت الفعلي باستخدام YOLOv7

لنقم أولاً بإنشاء طريقة لتحميل النموذج من الأوزان التي تم تنزيلها. سنتحقق من الجهاز المتاح لدينا (وحدة المعالجة المركزية أو وحدة معالجة الرسومات):

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

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

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

model = load_model()

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

لنكتب طريقة ملائمة لتشغيل الاستدلال. سنقبل الصور كمصفوفات NumPy (وهذا ما سنمرره لاحقًا أثناء قراءة الفيديو). أولاً ، باستخدام ملف letterbox() وظيفة - سنقوم بتغيير حجم الفيديو ووضعه في شكل يمكن أن يعمل به النموذج. لا يجب أن يكون هذا الشكل (دقة) الفيديو الناتج ولن يكون كذلك!

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

def run_inference(image):
    
    image = letterbox(image, 960, stride=64, auto=True)[0] 
    
    image = transforms.ToTensor()(image) 
    if torch.cuda.is_available():
      image = image.half().to(device)
    
    image = image.unsqueeze(0) 
    with torch.no_grad():
      output, _ = model(image)
    return output, image

سنعيد تنبؤات النموذج ، وكذلك الصورة على شكل موتر. هذه تنبؤات "تقريبية" - تحتوي على العديد من التنشيطات المتداخلة ، وسنريد "تنظيفها" باستخدام Non-Max Supression ، ورسم الهياكل العظمية المتوقعة فوق الصورة نفسها:

def draw_keypoints(output, image):
  output = non_max_suppression_kpt(output, 
                                     0.25, 
                                     0.65, 
                                     nc=model.yaml['nc'], 
                                     nkpt=model.yaml['nkpt'], 
                                     kpt_label=True)
  with torch.no_grad():
        output = output_to_keypoint(output)
  nimg = image[0].permute(1, 2, 0) * 255
  nimg = nimg.cpu().numpy().astype(np.uint8)
  nimg = cv2.cvtColor(nimg, cv2.COLOR_RGB2BGR)
  for idx in range(output.shape[0]):
      plot_skeleton_kpts(nimg, output[idx, 7:].T, 3)

  return nimg

مع وجود هذه العناصر في مكانها الصحيح ، سيبدو تدفقنا العام كما يلي:

img = read_img()
outputs, img = run_inference(img)
keypoint_img = draw_keypoints(output, img)

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

def pose_estimation_video(filename):
    cap = cv2.VideoCapture(filename)
    
    fourcc = cv2.VideoWriter_fourcc(*'MP4V')
    out = cv2.VideoWriter('ice_skating_output.mp4', fourcc, 30.0, (int(cap.get(3)), int(cap.get(4))))
    while cap.isOpened():
        (ret, frame) = cap.read()
        if ret == True:
            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            output, frame = run_inference(frame)
            frame = draw_keypoints(output, frame)
            frame = cv2.resize(frame, (int(cap.get(3)), int(cap.get(4))))
            out.write(frame)
            cv2.imshow('Pose estimation', frame)
        else:
            break

        if cv2.waitKey(10) & 0xFF == ord('q'):
            break

    cap.release()
    out.release()
    cv2.destroyAllWindows()

VideoWriter يقبل العديد من المعلمات - اسم ملف الإخراج ، و FourCC (أربعة رموز ترميز ، تشير إلى برنامج الترميز المستخدم لتشفير الفيديو) ، ومعدل الإطارات والدقة كصفيف. لعدم تخمين الفيديو أو تغيير حجمه - استخدمنا عرض وارتفاع الفيديو الأصلي ، الذي تم الحصول عليه من خلال ملف VideoCapture المثال الذي يحتوي على بيانات حول الفيديو نفسه ، مثل العرض والارتفاع وإجمالي عدد الإطارات وما إلى ذلك.

الآن ، يمكننا استدعاء الطريقة على أي إدخال فيديو:

pose_estimation_video('../ice_skating.mp4')

سيؤدي هذا إلى فتح نافذة OpenCV تعرض الاستدلال في الوقت الفعلي. وأيضًا ، ستكتب ملف فيديو بتنسيق yolov7 الدليل (منذ أن فعلنا cd'د فيه):

تقدير الوضع في الوقت الفعلي من الفيديو في Python باستخدام ذكاء بيانات YOLOv7 PlatoBlockchain. البحث العمودي. عاي.

ملحوظة: إذا كانت وحدة معالجة الرسومات لديك تكافح ، أو إذا كنت ترغب في تضمين نتائج نموذج مثل هذا في تطبيق به زمن انتقال باعتباره جانبًا مهمًا من سير العمل - اجعل الفيديو أصغر حجمًا واعمل على إطارات أصغر. هذا فيديو عالي الدقة 1920 × 1080 ، ويجب أن يكون قادرًا على العمل بسرعة على معظم الأنظمة المنزلية ، ولكن إذا لم يعمل بشكل جيد على نظامك ، فاجعل الصورة (الصور) أصغر.

وفي الختام

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

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

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

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

تقدير الوضع في الوقت الفعلي من الفيديو في Python باستخدام ذكاء بيانات YOLOv7 PlatoBlockchain. البحث العمودي. عاي.

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

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

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

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

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

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

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