معرفی
تشخیص اشیا میدان بزرگی در بینایی کامپیوتری و یکی از مهمترین کاربردهای بینایی کامپیوتر در طبیعت است. از آن، تشخیص نقطه کلید (که اغلب برای تخمین پوز استفاده می شود) استخراج شد.
نقاط کلیدی میتوانند نقاط مختلفی باشند - قسمتهایی از صورت، اندامهای بدن و غیره. تخمین پوز یک مورد خاص برای تشخیص نقطه کلیدی است - که در آن نقاط بخشهایی از بدن انسان هستند.
تخمین پوس یک استفاده شگفت انگیز، بسیار سرگرم کننده و عملی از بینایی کامپیوتر است. با آن، میتوانیم سختافزاری را که برای تخمین ژستها استفاده میشود (لباسهای موشن کپچر)، که پرهزینه و سختگیر هستند، حذف کنیم. علاوه بر این، ما میتوانیم حرکت انسانها را با حرکت روباتها در فضای اقلیدسی ترسیم کنیم، و حرکت موتور دقیق را بدون استفاده از کنترلکنندهها امکانپذیر میکنیم، که معمولاً اجازه سطوح بالاتری از دقت را نمیدهند. تخمین نقطه کلیدی می تواند برای ترجمه حرکات ما به مدل های سه بعدی در واقعیت مجازی و واقعیت مجازی استفاده شود و به طور فزاینده ای برای انجام این کار فقط با وب کم استفاده می شود. در نهایت - تخمین پوز می تواند در ورزش و امنیت به ما کمک کند.
در این راهنما، با استفاده از مدل پیشرفته YOLOv7، تخمین ژست زمان واقعی را از یک ویدیو در پایتون انجام خواهیم داد.
به طور خاص، ما با ویدیویی از المپیک زمستانی 2018 که در پیونگ چانگ کره جنوبی برگزار شد کار خواهیم کرد:
آلجونا ساوچنکو و برونو ماسوت عملکرد شگفتانگیزی از جمله همپوشانی بدن در مقابل دوربین، حرکت سریع سیال و چرخش در هوا انجام دادند. این یک فرصت شگفتانگیز خواهد بود تا ببینیم این مدل چگونه موقعیتهای استنتاج دشوار را مدیریت میکند!
YOLO و تخمین پوس
یولو (شما فقط یک بار نگاه می کنید) یک متدولوژی و همچنین خانواده ای از مدل های ساخته شده برای تشخیص اشیا است. از زمان آغاز به کار در سال 2015، YOLOv1، YOLOv2 (YOLO9000) و YOLOv3 توسط نویسنده(های) یکسانی پیشنهاد شدهاند - و جامعه یادگیری عمیق با پیشرفتهای منبع باز در سالهای ادامه دار ادامه داد.
Ultralytics' YOLOv5 یک مخزن تشخیص اشیاء درجه صنعتی است که بر اساس روش YOLO ساخته شده است. برخلاف C++ برای مدلهای قبلی YOLO، در PyTorch پیادهسازی شده است، کاملاً منبع باز است و دارای یک API بسیار ساده و قدرتمند است که به شما امکان میدهد پروژه را بهطور انعطافپذیر استنباط، آموزش و سفارشیسازی کنید. این یک عنصر اصلی است که بیشتر تلاشهای جدید برای بهبود روش YOLO بر روی آن قرار میگیرد.
این است که چگونه YOLOR (شما فقط یک نمایش یاد می گیرید) و YOLOv7 که در بالای 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 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 را با بهترین روش ها، استانداردهای پذیرفته شده در صنعت و برگه تقلب شامل بررسی کنید. دستورات Google Git را متوقف کنید و در واقع یاد گرفتن آی تی!
عالی! بیایید بارگذاری مدل و ایجاد یک اسکریپت را ادامه دهیم که به شما امکان می دهد از ویدیوها با 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 برای سرعت واقعی بسیار توصیه می شود، زیرا CPU ها احتمالاً قدرت انجام این کار را ندارند مگر اینکه روی ویدیوهای کوچک اجرا شوند.
بیایید یک روش مطمئن برای اجرای استنتاج بنویسیم. ما تصاویر را بهعنوان آرایههای 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 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()
La VideoWriter
چندین پارامتر را می پذیرد - نام فایل خروجی، FourCC (چهار کد کدک، نشان دهنده کدک مورد استفاده برای رمزگذاری ویدیو)، نرخ فریم و وضوح به صورت یک تایی. برای اینکه ویدیو را حدس نزنیم یا اندازه آن را تغییر ندهیم – از عرض و ارتفاع ویدیوی اصلی که از طریق VideoCapture
نمونهای که حاوی دادههایی درباره خود ویدیو است، مانند عرض، ارتفاع، تعداد کل فریمها و غیره.
اکنون میتوانیم روش را در هر ویدیوی ورودی فراخوانی کنیم:
pose_estimation_video('../ice_skating.mp4')
با این کار یک پنجره OpenCV باز می شود و استنتاج را در زمان واقعی نمایش می دهد. و همچنین، یک فایل ویدئویی در آن می نویسد yolov7
دایرکتوری (از آنجایی که ما cd
وارد آن شدم):
توجه داشته باشید: اگر پردازنده گرافیکی شما مشکل دارد، یا اگر میخواهید نتایج مدلی مانند این را در برنامهای جاسازی کنید که دارای تأخیر بهعنوان یکی از جنبههای مهم گردش کار است، ویدیو را کوچکتر کنید و روی فریمهای کوچکتر کار کنید. این یک ویدیوی فول اچ دی 1920×1080 است و باید بتواند در اکثر سیستم های خانگی سریع اجرا شود، اما اگر روی سیستم شما به خوبی کار نمی کند، تصویر(ها) را کوچکتر کنید.
نتیجه
در این راهنما، نگاهی به روش YOLO، YOLOv7 و رابطه بین YOLO و تشخیص شی، تخمین پوز و تقسیمبندی نمونه انداختهایم. سپس نگاهی به نحوه نصب و کار با YOLOv7 با استفاده از API برنامهریزی کردهایم و چندین روش ساده برای استنتاج و نمایش نتایج ایجاد کردهایم.
در نهایت، ما یک ویدیو را با استفاده از OpenCV باز کردیم، استنتاج را با YOLOv7 اجرا کردیم، و تابعی را برای انجام تخمین پوز در زمان واقعی ایجاد کردیم، ویدیوی حاصل را با وضوح کامل و 30 فریم در ثانیه در دیسک محلی شما ذخیره کردیم.
رفتن به جلو - یادگیری عمیق عملی برای بینایی کامپیوتر
طبیعت کنجکاو شما باعث می شود که بخواهید جلوتر بروید؟ توصیه می کنیم ما را بررسی کنید دوره: "یادگیری عمیق عملی برای بینایی کامپیوتر با پایتون".
یکی دیگر از دوره های بینایی کامپیوتر؟
ما طبقه بندی ارقام MNIST یا مد MNIST را انجام نخواهیم داد. آنها مدتها پیش نقش خود را انجام دادند. بسیاری از منابع یادگیری قبل از اینکه به معماریهای جعبه سیاه پیشرفته اجازه دهند بار عملکرد را به دوش بکشند، روی مجموعه دادههای پایه و معماریهای پایه تمرکز میکنند.
ما می خواهیم روی آن تمرکز کنیم ابهام زدایی, عملی بودن, درک, شهود و پروژه های واقعی. می خواهند یاد بگیرند چگونه تو می توانی تفاوت ایجاد کنی؟ ما شما را از روشی که مغزمان تصاویر را پردازش میکند تا نوشتن طبقهبندیکننده یادگیری عمیق برای سرطان سینه تا شبکههای یادگیری عمیق که «توهم میکنند»، آموزش اصول و تئوری به شما از طریق کار عملی، و تجهیز شما به دانش و ابزارهایی برای تبدیل شدن به یک متخصص در استفاده از یادگیری عمیق برای حل بینایی کامپیوتر.
داخل چیست؟
- اولین اصول بینایی و نحوه آموزش دیدن کامپیوترها
- وظایف و کاربردهای مختلف بینایی کامپیوتر
- ابزارهای تجارت که کار شما را آسان می کند
- یافتن، ایجاد و استفاده از مجموعه داده ها برای بینایی کامپیوتری
- تئوری و کاربرد شبکه های عصبی کانولوشنال
- مدیریت تغییر دامنه، همزمانی و سایر سوگیری ها در مجموعه داده ها
- آموزش را انتقال دهید و از زمان آموزشی و منابع محاسباتی دیگران به نفع خود استفاده کنید
- ساخت و آموزش پیشرفته ترین طبقه بندی سرطان سینه
- چگونه می توان دوز سالمی از شک و تردید را در ایده های جریان اصلی به کار برد و پیامدهای تکنیک های پذیرفته شده را درک کرد
- تجسم فضای مفهومی ConvNet با استفاده از t-SNE و PCA
- مطالعات موردی چگونگی استفاده شرکت ها از تکنیک های بینایی کامپیوتری برای دستیابی به نتایج بهتر
- ارزیابی صحیح مدل، تجسم فضای پنهان و شناسایی توجه مدل
- انجام تحقیقات دامنه، پردازش مجموعه داده های خود و ایجاد آزمون های مدل
- معماری های پیشرفته، پیشرفت ایده ها، آنچه آنها را منحصر به فرد می کند و نحوه اجرای آنها
- KerasCV - یک کتابخانه WIP برای ایجاد خطوط لوله و مدل های پیشرفته
- نحوه تجزیه و خواندن مقالات و پیاده سازی آنها توسط خودتان
- انتخاب مدل ها بسته به برنامه شما
- ایجاد خط لوله یادگیری ماشینی سرتاسر
- چشم انداز و شهود در تشخیص اشیا با R-CNN سریعتر، رتینا نت، SSD و YOLO
- نمونه و تقسیم بندی معنایی
- تشخیص شی در زمان واقعی با YOLOv5
- آموزش آشکارسازهای شی YOLOv5
- کار با ترانسفورماتورها با استفاده از KerasNLP (کتابخانه WIP با قدرت صنعتی)
- ادغام ترانسفورماتورها با ConvNets برای تولید شرح تصاویر
- عمیق
- بهینه سازی مدل یادگیری عمیق برای بینایی کامپیوتر