وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

تخمین ژست در زمان واقعی از ویدیو در پایتون با YOLOv7

0 4
زمان لازم برای مطالعه: 6 دقیقه


معرفی

تشخیص اشیا میدان بزرگی در بینایی کامپیوتری است و یکی از مهم‌ترین کاربردهای بینایی کامپیوتر در طبیعت است. از آن، تشخیص نقطه کلید (که اغلب برای تخمین پوز استفاده می شود) استخراج شد.

نقاط کلیدی می توانند نقاط مختلفی باشند – قسمت هایی از صورت، اندام های بدن و غیره. تخمین پوز یک مورد خاص برای تشخیص نقطه کلیدی است – که در آن نقاط، بخش هایی از بدن انسان هستند.

تخمین پوس یک استفاده شگفت انگیز، بسیار سرگرم کننده و عملی از بینایی کامپیوتری است. با آن، می‌توانیم سخت‌افزاری را که برای تخمین ژست‌ها استفاده می‌شود (لباس‌های موشن کپچر)، که پرهزینه و سخت‌گیر هستند، حذف کنیم. علاوه بر این، ما می‌توانیم حرکت انسان‌ها را با حرکت روبات‌ها در فضای اقلیدسی ترسیم کنیم، و حرکت موتور دقیق را بدون استفاده از کنترل‌کننده‌ها امکان‌پذیر می‌کنیم، که معمولاً اجازه سطوح بالاتری از دقت را نمی‌دهند. تخمین نقطه کلید را می توان برای ترجمه حرکات ما به مدل های سه بعدی در واقعیت افزوده و واقعیت مجازی استفاده کرد و به طور فزاینده ای برای انجام این کار فقط با وب کم استفاده می شود. در نهایت – تخمین پوز می تواند در ورزش و امنیت به ما کمک کند.

در این راهنما، با استفاده از مدل پیشرفته YOLOv7، تخمین ژست زمان واقعی را از یک ویدیو در پایتون انجام خواهیم داد.

به طور خاص، ما با ویدیویی از بازی های المپیک زمستانی 2018 که در پیونگ چانگ کره جنوبی برگزار شد کار خواهیم کرد:

تخمین ژست در زمان واقعی از ویدیو در پایتون با YOLOv7

آلجونا ساوچنکو و برونو ماسوت عملکرد شگفت‌انگیزی از جمله همپوشانی بدن در مقابل دوربین، حرکت سریع سیال و چرخش در هوا انجام دادند. این یک فرصت شگفت‌انگیز خواهد بود تا ببینیم این مدل چگونه موقعیت‌های استنتاج دشوار را مدیریت می‌کند!

YOLO و تخمین پوس

یولو (شما فقط یک بار نگاه می کنید) یک متدولوژی و همچنین خانواده ای از مدل های ساخته شده برای تشخیص اشیا است. از زمان آغاز به کار در سال 2015، YOLOv1، YOLOv2 (YOLO9000) و YOLOv3 توسط همان نویسنده(ها) پیشنهاد شده اند – و جامعه یادگیری عمیق با پیشرفت های منبع باز در سال های ادامه دار ادامه داد.

Ultralytics’ YOLOv5 یک مخزن تشخیص اشیاء درجه صنعتی است که ساخته شده است روی بالای روش YOLO برخلاف C++ برای مدل‌های قبلی YOLO، در PyTorch پیاده‌سازی شده است، کاملاً منبع باز است و دارای یک API بسیار ساده و قدرتمند است که به شما امکان می‌دهد پروژه را به‌طور انعطاف‌پذیر استنباط، آموزش و سفارشی‌سازی کنید. این یک عنصر اصلی است که بیشتر تلاش‌های جدید برای بهبود روش YOLO ایجاد می‌کنند روی بالای آن

اینگونه است YOLOR (شما فقط یک نمایش یاد می گیرید) و YOLOv7 که ساخت روی top of YOLOR (همان نویسنده) نیز ایجاد شد!

YOLOv7 فقط یک معماری تشخیص اشیاء نیست – سرهای مدل جدیدی را ارائه می دهد که می توانند نقاط کلیدی (اسکلت ها) را خروجی داده و تقسیم بندی نمونه را علاوه بر رگرسیون جعبه مرزی انجام دهند، که در مدل های قبلی YOLO استاندارد نبود. این تعجب آور نیست، زیرا بسیاری از معماری‌های تشخیص اشیاء برای نمونه‌سازی و وظایف تشخیص نقطه کلید، به دلیل معماری عمومی مشترک، با خروجی‌های متفاوت بسته به قبل، مجدداً مورد استفاده قرار گرفتند. روی وظیفه

اگرچه جای تعجب نیست – پشتیبانی از تقسیم‌بندی نمونه و تشخیص نقطه کلید احتمالاً به استاندارد جدیدی برای مدل‌های مبتنی بر YOLO تبدیل می‌شود، که از چند سال پیش از نظر دقت و سرعت عملاً از همه آشکارسازهای دو مرحله‌ای دیگر بهتر عمل کردند.

این باعث می‌شود که قطعه‌بندی نمونه و تشخیص نقطه کلید با معماری ساده‌تر از آشکارسازهای دو مرحله‌ای، سریع‌تر از همیشه انجام شود.

خود این مدل از طریق تغییرات معماری و همچنین بهینه‌سازی جنبه‌های آموزش ایجاد شده است که به آن «bag-of-freebies» می‌گویند که دقت را بدون افزایش هزینه استنتاج افزایش می‌دهد.

در حال نصب 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 یک آشکارساز شی است و به طور پیش‌فرض با وزن‌های تخمین پوز ارسال نمی‌شود. ما می خواهیم وزنه ها را دانلود کنیم و یک نمونه مدل بتن را از آنها بارگیری کنیم. وزنه ها موجود است روی همان مخزن 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 کتابخانه ها و روش های کمکی که ما استفاده خواهیم کرد:

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

عالی! بگیریم روی با بارگذاری مدل و ایجاد یک اسکریپت که به شما امکان می دهد از ویدیوها با YOLOv7 و OpenCV استنباط کنید.

برآورد ژست در زمان واقعی با YOLOv7

ابتدا روشی برای بارگذاری مدل از وزن های دانلود شده ایجاد می کنیم. ما بررسی خواهیم کرد که چه دستگاهی در دسترس داریم (CPU یا GPU):

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()

بسته به روی چه پردازنده گرافیکی داشته باشیم چه نداشته باشیم، نیم دقت خواهیم کرد روی (استفاده کردن float16 بجای float32 در عملیات)، که استنتاج را به طور قابل توجهی سریعتر می کند. توجه داشته باشید که انجام این کار بسیار تشویق می شود روی یک GPU برای سرعت‌های بلادرنگ، زیرا پردازنده‌ها احتمالاً قدرت انجام این کار را ندارند مگر اینکه در حال اجرا باشند روی ویدیوهای کوچک

بیایید یک روش مناسب برای اجرای استنتاج بنویسیم. ما تصاویر را به‌عنوان آرایه‌های NumPy می‌پذیریم (زیرا این همان چیزی است که بعداً هنگام خواندن ویدیو آنها را ارسال خواهیم کرد). ابتدا با استفاده از letterbox() تابع – اندازه ویدیو را تغییر می دهیم و به شکلی اضافه می کنیم که مدل بتواند با آن کار کند. نیازی نیست که این شکل (رزولوشن) ویدیوی به دست آمده باشد و نخواهد بود!

سپس، تبدیل‌ها را اعمال می‌کنیم، تصویر را به نیمه دقت تبدیل می‌کنیم (اگر یک GPU در دسترس باشد)، آن را دسته‌بندی می‌کنیم و آن را در مدل اجرا می‌کنیم:

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 Suppression «پاک‌سازی کنیم» و اسکلت‌های پیش‌بینی‌شده را روی خود تصویر رسم کنیم:

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 برای خواندن یک ویدیو استفاده می کنیم و این را اجرا می کنیم process برای هر فریم در هر فریم، ما همچنین فریم را در یک فایل جدید که به صورت ویدیو کدگذاری شده است، می نویسیم. این لزوما سرعت را کاهش می دهد process همانطور که ما استنتاج را اجرا می کنیم، آن را نمایش می دهیم و می نویسیم – بنابراین می توانید با اجتناب از ایجاد یک فایل جدید و نوشتن روی آن در حلقه، استنتاج و نمایش را سرعت بخشید:

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وارد آن شدم):

تخمین ژست در زمان واقعی از ویدیو در پایتون با YOLOv7

توجه داشته باشید: اگر GPU شما مشکل دارد، یا اگر می‌خواهید نتایج مدلی مانند این را در برنامه‌ای جاسازی کنید که دارای تأخیر به‌عنوان جنبه حیاتی گردش کار است – ویدیو را کوچک‌تر کنید و کار کنید. روی فریم های کوچکتر این یک ویدیوی Full HD 1920×1080 است و باید بتواند سریع اجرا شود روی اکثر سیستم های خانگی، اما اگر به خوبی کار نکند روی سیستم شما، تصویر(ها) را کوچکتر کنید.

نتیجه

در این راهنما، نگاهی به روش YOLO، YOLOv7 و رابطه بین YOLO و تشخیص شی، تخمین پوز و تقسیم‌بندی نمونه انداخته‌ایم. سپس نگاهی به روش نصب و کار با YOLOv7 با استفاده از API برنامه‌ریزی کرده‌ایم و چندین روش راحت را برای استنتاج و نمایش نتایج آسان‌تر ایجاد کرده‌ایم.

در نهایت، ما یک ویدیو را با استفاده از OpenCV باز کرده‌ایم، استنباط را با YOLOv7 اجرا کرده‌ایم، و تابعی برای انجام تخمین پوز در زمان واقعی ایجاد کرده‌ایم، ویدیوی حاصل را با وضوح کامل و 30 فریم در ثانیه ذخیره می‌کنیم. روی دیسک محلی شما

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-03 03:43:04

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید