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

سرور مجازی NVMe

تخمین موقعیت/تشخیص نقطه کلید با YOLOv7 در پایتون

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


معرفی

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

تشخیص اشیاء و تشخیص نقاط کلیدی به اندازه طبقه‌بندی تصویر استاندارد نیست، عمدتاً به این دلیل که بیشتر پیشرفت‌های جدید به‌جای کتابخانه‌ها و چارچوب‌های بزرگ، معمولاً توسط محققان، نگهداری‌کنندگان و توسعه‌دهندگان منفرد انجام می‌شود. بسته‌بندی اسکریپت‌های کاربردی ضروری در چارچوبی مانند TensorFlow یا PyTorch و حفظ دستورالعمل‌های API که تاکنون توسعه را هدایت کرده‌اند، دشوار است.

این امر تشخیص اشیاء را تا حدودی پیچیده‌تر، معمولاً پرمخاطب‌تر (اما نه همیشه) و کمتر از طبقه‌بندی تصویر می‌سازد.

خوشبختانه برای توده ها – Ultralytics یک API تشخیص شی ساده، بسیار قدرتمند و زیبا در اطراف YOLOv5 خود ایجاد کرده است که توسط سایر تیم های تحقیق و توسعه به نسخه های جدیدتر مانند YOLOv7 گسترش یافته است.

در این راهنمای کوتاه، ما تخمین پوس (تشخیص نقطه کلید) را در پایتون، با پیشرفته ترین YOLOv7 انجام خواهیم داد.

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

YOLO و تخمین پوس

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

Ultralytics’ YOLOv5 اولین پیاده سازی در مقیاس بزرگ YOLO در PyTorch است که آن را بیش از هر زمان دیگری در دسترس قرار داده است، اما دلیل اصلی که YOLOv5 چنین جایگاهی را به دست آورده است API بسیار ساده و قدرتمندی است که پیرامون آن ساخته شده است. این پروژه جزئیات غیر ضروری را حذف می کند، در حالی که امکان سفارشی سازی را فراهم می کند، که عملاً همه قابل استفاده هستند export قالب‌بندی می‌کند و از شیوه‌های شگفت‌انگیزی استفاده می‌کند که کل پروژه را هم کارآمد و هم بهینه می‌کند.

YOLOv5 هنوز پروژه اصلی برای ساخت مدل‌های تشخیص اشیاء است، و بسیاری از مخازن که هدفشان پیشرفت روش YOLO است، با YOLOv5 به عنوان پایه شروع می‌شوند و یک API مشابه ارائه می‌کنند (یا به سادگی پروژه را فوک می‌کنند و می‌سازند. روی بالای آن). چنین موردی است YOLOR (شما فقط یک نمایش یاد می گیرید) و YOLOv7 که ساخت روی بالای YOLOR (همان نویسنده) که آخرین پیشرفت در روش YOLO است.

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

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

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

در حال نصب YOLOv7

بیایید پیش برویم و پروژه را از GitHub نصب کنیم:

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

این باعث ایجاد یک yolov7 دایرکتوری تحت فهرست کاری فعلی شما، که در آن می توانید فایل های اصلی پروژه را پیدا کنید:

%cd yolov7
!ls

/Users/macbookpro/jup/yolov7
LICENSE.md       detect.py        models           tools
README.md        export.py        paper            train.py
cfg              figure           requirements.txt train_aux.py
data             hubconf.py       scripts          utils
deploy           inference        test.py

توجه داشته باشید: هنگام تماس !cd dirname، فقط برای آن سلول اعمال می شود. هنگام تماس %cd dirname، برای تمام سلول های بعدی نیز به خاطر سپرده می شود.

هر زمان که کدی را با مجموعه ای از وزن ها اجرا می کنید – آنها در این دایرکتوری دانلود و ذخیره می شوند. برای انجام تخمین پوز، می خواهیم وزنه های مدل YOLOv7 از پیش آموزش دیده را برای آن کار دانلود کنیم که در زیر /releases/download/ برگه روی GitHub:

! 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  3742k      0  0:00:42  0:00:42 --:--:-- 4573k

عالی است، ما آن را دانلود کردیم yolov7-w6-pose.pt فایل وزن، که می تواند برای بارگذاری و بازسازی یک مدل آموزش دیده برای تخمین پوز استفاده شود.

در حال بارگیری مدل تخمین پوس YOLOv7

اجازه دهید 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

torch و torchvision به اندازه کافی ساده هستند – YOLOv7 با PyTorch پیاده سازی شده است. این utils.datasets، utils.general و utils.plots ماژول ها از پروژه YOLOv7 می آیند و روش هایی را در اختیار ما قرار می دهند که به پیش پردازش و آماده سازی ورودی برای مدل برای اجرای استنتاج کمک می کند. روی. از جمله آنها هستند letterbox() برای قرار دادن تصویر، non_max_supression_keypoint() برای اجرای الگوریتم Non-Max Suppression روی خروجی اولیه مدل و تولید یک خروجی تمیز برای تفسیر ما، و همچنین output_to_keypoint() و plot_skeleton_kpts() روش هایی برای افزودن نقاط کلیدی به یک تصویر مشخص، پس از پیش بینی آنها.

ما می توانیم مدل را از فایل وزن با torch.load(). بیایید یک تابع ایجاد کنیم تا بررسی کنیم که یک GPU در دسترس است، مدل را بارگذاری کنیم، آن را در حالت استنتاج قرار دهیم و در صورت وجود آن را به GPU منتقل کنیم:

def load_model():
    device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
    model = torch.load('yolov7/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()

با بارگذاری مدل، اجازه دهید a ایجاد کنیم run_inference() روشی که رشته ای را می پذیرد که به یک فایل اشاره می کند روی سیستم ما این روش تصویر را با استفاده از OpenCV می خواند (cv2)، آن را با پد letterbox()، تبدیل ها را روی آن اعمال کنید و آن را به یک دسته تبدیل کنید (مدل آموزش داده شده است روی و طبق معمول انتظار دسته ها را دارد):

def run_inference(url):
    image = cv2.imread(url) 
    
    image = letterbox(image, 960, stride=64, auto=True)(0) 
    
    image = transforms.ToTensor()(image) 
    
    image = image.unsqueeze(0) 
    output, _ = model(image) 
    return output, image

در اینجا، تصویر تبدیل شده را برگردانده ایم (زیرا می خواهیم اصل و نمودار را استخراج کنیم روی آن) و خروجی های مدل. این خروجی ها حاوی 45900 پیش بینی نقطه کلیدی هستند که اکثر آنها همپوشانی دارند. ما می‌خواهیم Non-Max Suppression را برای این پیش‌بینی‌های خام اعمال کنیم، درست مانند پیش‌بینی‌های تشخیص اشیا (که در آن بسیاری از جعبه‌های مرزی پیش‌بینی می‌شوند و سپس با توجه به اطمینان و آستانه IoU، آنها «محل می‌شوند»). پس از سرکوب، می توانیم هر نقطه کلیدی را رسم کنیم روی تصویر اصلی و نمایش آن:

def visualize_output(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)
    plt.figure(figsize=(12, 12))
    plt.axis('off')
    plt.imshow(nimg)
    plt.show()

در حال حاضر، برای برخی از تصویر ورودی، مانند karate.jpg در دایرکتوری اصلی می توانیم استنتاج را اجرا کنیم، Non-Max Suppression را انجام دهیم و نتایج را با استفاده از:

output, image = run_inference('../basketball.jpg') 
visualize_output(output, image)

این نتیجه در:

تخمین موقعیت/تشخیص نقطه کلید با YOLOv7 در پایتون

یا یکی دیگر:

output, image = run_inference('../karate.jpg') 
visualize_output(output, image)

تخمین موقعیت/تشخیص نقطه کلید با YOLOv7 در پایتون

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

در واقع – شخصی که در پشت نشسته است، تقریباً به طور کامل برای دوربین نامرئی است ژست آنها ظاهراً درست تخمین زده شده است روی وضعیت باسن در هنگام نشستن کار عالی روی از طرف شبکه!

نتیجه

در این راهنما – نگاهی کوتاه به YOLOv7 انداخته‌ایم، آخرین پیشرفت در خانواده YOLO، که می‌سازد. روی در بالای YOLOR، و همچنین قابلیت‌های تقسیم‌بندی نمونه و تشخیص نقطه کلید را فراتر از قابلیت‌های استاندارد تشخیص اشیا در اکثر مدل‌های مبتنی بر YOLO ارائه می‌دهد.

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

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



منتشر شده در 1403-01-03 18:48:03

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

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

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