بهبود بازی تنیس با دید کامپیوتر

بهبود بازی تنیس با دید کامپیوتر

تفسیر تصویری و تصویری دیجیتالی ، که به عنوان بینایی رایانه ای شناخته می شود ، در دهه گذشته بسیار توسعه یافته است. شرکت هایی مانند Sportlogiq از این فناوری برای ردیابی حرکت بازیکنان و مسیر حرکت توپ استفاده می کنند و نوع جدیدی از تجزیه و تحلیل و بینش عمیق را در اختیار مربیان و بازیکنان قرار می دهند. در یک پروژه اخیر ، ما با توسعه یک مربی تنیس کاملاً دیجیتال ، بینایی رایانه را بیشتر مورد بررسی قرار دادیم. تنیسورها باید بتوانند خود را ضبط کنند ، فیلم را بارگذاری کنند و تجزیه و تحلیل بازی خود را دریافت کنند. به طور دقیق تر ، آنها باید در مورد مواردی که برای بازی در تنیس بسیار مهم است ، بازخورد بگیرند: زمان نوسانات نسبت به پرواز توپ ، موقعیت بدن و زاویه ها و منحنی نوسانات نسبت به حالت حرفه ای بازیکنان.

در این مقاله ما نحوه ساختن یک نمونه اولیه کاملاً کارآمد که می تواند همه اینها را انجام دهد ، و موارد دیگر را توضیح خواهیم داد.

تشخیص حرکت بدن

در ابتدا ، ما باید راهی برای تشخیص حرکت و حالت بدن پیدا کنیم. "OpenPose" آخرین وضعیت در برآورد ژست انسان است ، بنابراین یک نقطه شروع طبیعی برای نمونه اولیه ما بود.

ما از فیلم به عنوان وسیله ای برای تشخیص حرکات بدن با تمرکز بر روی هر فریم از یک مورد استفاده کردیم. توالی. برای به دست آوردن تفسیر دقیق افراد در یک تصویر یا فیلم ، اعضای بدن آنها باید با برخی از نکات کلیدی مشخص شود.

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

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

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

ردیابی راکت

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

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

با مشاهده بازی های تنیس از نزدیک ، متوجه شدیم که مچ دست و پایه راکت با هم حرکت کنید کتابخانه ای که ما از آن استفاده می کنیم ، فهرستی کامل از تمام نکات کلیدی و اتصالات مرتبط را ارائه می دهد. این اطلاعات برای مورد استفاده ما مفید است اما کامل نیست. با سفارشی سازی کتابخانه "tf-pose-estisation" ، می توانیم از مچ دست خود به عنوان پایه ای برای ردیابی چرخش بازیکنان استفاده کنیم. از آخرین فریم پردازش شده برای ردیابی نوسان. ما برخی تغییرات را در ماژول پردازش قاب (جایی که نقاط کلیدی و اتصالات مشخص شده اند) انجام دادیم تا بتوانیم وضعیت آخرین فریم پردازش شده را ذخیره کنیم. با ترکیب اطلاعات اسکلت ، متشکل از نقاط کلیدی و مفاصل ، در قاب قبلی و فعلی ، می توانیم به راحتی حرکت مچ دست را پیگیری کنیم.

چرخش مانند سرنا

نمونه اولیه یک گام فراتر با تجزیه و تحلیل نوسانات بازیکنان حرفه ای ، می توانیم ویژگی را ایجاد کنیم که در آن کاربر چرخش خود را با حرفه ای ها مقایسه کرده و نحوه بهبود را بیاموزد. برای انجام این کار ، ما باید مطمئن شویم که ویدیوی کاربر به گونه ای ضبط شده است که نکات کلیدی مورد نیاز قابل مشاهده باشد. ما زمان زیادی را صرف تحقیق در مورد بهترین نقطه برای این کار کردیم تا بتوانیم هر چه بهتر کار کنیم.

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

برای اینکه کاربر بتواند نوسان خود را بایک بازیکن حرفه ای ، ما باید نوع چرخش ، قد بازیکن ، دست و غیره را در نظر بگیریم و نوع چرخش و دستی را که قبلاً پوشش داده ایم. برای حل مسئله با تفاوت در ارتفاع ، ما نوسان کاربر و حرفه ای را در یک مختصات یکسان شروع می کنیم ، که این نوسان را به راحتی قابل مقایسه می کند و بازخورد ارزشمندی را برای کاربر ارائه می دهد.

پردازش و بازخورد

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

در حالت ایده آل ، ما بازخورد بلادرنگ را می خواهیم. به اصطلاح تشخیص و برآورد دستگاه ، راهی عالی برای انجام این کار است. با عرضه هرچه بیشتر دستگاه های تلفن همراه ، اکنون می توان از مدلهای یادگیری ماشین به طور مستقیم در تلفن استفاده کرد. ما به استفاده از tensorflow lite ، که برای دستگاه های تلفن همراه ساخته شده است ، پرداختیم ، اما پس از آزمایش با "tf.js" برای برآورد ژست روی دستگاه ، تصمیم گرفتیم آن را رها کنیم. نتایج به سادگی قابل اعتماد نبودند تا بازخورد مفیدی به بازیکن بدهند.

در اینجا نمونه ای از تجزیه و تحلیل پیش دستی آورده شده است. تجزیه و تحلیل بازخورد کاربر را در مورد حالت و چرخش ارائه می دهد:

پیشرفتهای بیشتر

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

بینایی رایانه ای برای مبتدیان: قسمت 1

بینایی رایانه ای برای مبتدیان: قسمت 1

مقدمه ای بر OpenCV و پردازش تصویر در پایتون

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

بنابراین آیا می خواهید اولین قدم خود را در Computer Vision برداشته و در این حرکت اخیر شرکت کنید؟ خوش آمدید در جای مناسب هستید. از این مقاله ، ما قصد داریم یک سری آموزش در مورد اصول پردازش تصویر و تشخیص اشیاء داشته باشیم. این اولین قسمت از آموزش OpenCV برای مبتدیان است و مجموعه کامل مجموعه به شرح زیر است:

درک مدلهای رنگی و ترسیم شکل روی تصاویر اصول پردازش تصویر با فیلتر کردن از تشخیص ویژگی تا تشخیص چهره تشخیص کانتور و کمی تفریح ​​

اولین داستان این مجموعه در مورد نصب OpenCV ، توضیح رنگ خواهد بود مدل ها و رسم فیگورها بر روی تصاویر. کد کامل این آموزش نیز در Github موجود است. حالا بیایید آن را شروع کنیم.

مقدمه ای بر OpenCV

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

OpenCV مخفف Open Source Computer Vision library است و توسط Intel در سال 1999 اختراع شده است. این کتاب ابتدا به زبان C/C ++ نوشته شده است ، بنابراین ممکن است آموزش های بیشتری را به زبان C مشاهده کنید. از پایتون اما اکنون در پایتون برای بینایی رایانه نیز استفاده می شود. اول از همه ، بیایید یک محیط مناسب برای استفاده از OpenCV ایجاد کنیم. نصب را می توان به شرح زیر پردازش کرد ، اما می توانید توضیحات دقیق آن را نیز در اینجا بیابید.

 pip install opencv-python == 3.4.2
pip install opencv-contrib-python == 3.3.1 

پس از اتمام نصب ، بسته را وارد کنید تا ببینید آیا خوب کار می کند یا خیر. اگر بازده را بدون هیچ گونه خطایی دریافت کردید ، اکنون آماده رفتن هستید.

 واردات cv2
cv2 .__ نسخه__ 

اولین مرحله ای که ما با OpenCV انجام می دهیم وارد کردن یک تصویر است و می توان آن را به صورت زیر انجام داد.

 وارد کردن numpy به عنوان np
matplotlib.pyplot را به عنوان plt وارد کنید
٪ matplotlib inline 
# وارد کردن تصویر
img = cv2.imread ('burano.jpg')
plt.imshow (img) 

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

این به این دلیل است که تنظیم پیش فرض حالت رنگ در OpenCV درترتیب BGR ، که با Matplotlib متفاوت است. بنابراین برای مشاهده تصویر در حالت RGB ، باید آن را از BGR به RGB به صورت زیر تبدیل کنیم.

# تبدیل تصویر به RGB
img_rgb = cv2.cvtColor (img، cv2.COLOR_BGR2RGB)
plt.imshow (img_rgb) 

در حال حاضر ، این بورانو است! چنین جزیره ای دوست داشتنی در ایتالیا!

بیش از RGB

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

(منبع)

شما کاملاً به این دو نوع مدل عادت کرده اید. در دنیای مدلهای رنگی ، بیش از دو نوع مدل وجود دارد. در میان آنها ، مقیاس خاکستری ، HSV و HLS مواردی هستند که اغلب در بینایی رایانه مشاهده خواهید کرد.

مقیاس خاکستری ساده است. این تصویر و مورفولوژی را با شدت سیاه و سفید نشان می دهد ، به این معنی که تنها یک کانال دارد. برای مشاهده تصاویر در مقیاس خاکستری ، ما باید حالت رنگ را به خاکستری تبدیل کنیم همانطور که قبلاً با تصویر BGR انجام دادیم.

# تبدیل تصویر به مقیاس خاکستری
img_gray = cv2.cvtColor (img، cv2.COLOR_BGR2GRAY)
plt.imshow (img_gray، cmap = 'gray') 

در حقیقت ، تصاویر RGB با چیدن سه کانال R ، G و B ساخته می شوند. بنابراین اگر هر کانال را گرفته و آنها را یکی یکی به تصویر بکشیم ، می توانیم نحوه ساختار کانال های رنگی را درک کنیم.

< pre># سه کانال تصویر را ترسیم کنید انجیر ، axs = plt.subplots (nrows = 1 ، ncols = 3 ، figsize = (20 ، 20))
 برای i در محدوده (0 ، 3):
    ax = axs [i]
    ax.imshow (img_rgb [:،:، i]، cmap = 'خاکستری')
plt.show () 

نگاهی به تصاویر بالا این سه تصویر نحوه تشکیل هر کانال را به شما نشان می دهد. در تصویر کانال R ، قسمت با اشباع زیاد رنگهای قرمز سفید به نظر می رسد. چرا اینطور است؟ این به این دلیل است که مقادیر قسمتهای رنگ قرمز نزدیک به 255 خواهد بود. و در حالت خاکستری ، هرچه مقدار بیشتر باشد ، رنگ سفیدتر می شود. همچنین می توانید این را با کانال های G یا B بررسی کنید و تفاوت قسمت های مختلف را با یکدیگر مقایسه کنید.

HSV و HLS جنبه کمی متفاوت دارند. همانطور که در بالا مشاهده می کنید ، آنها نمایشی سه بعدی دارند و بیشتر شبیه به شیوه ادراک انسان است. HSV مخفف رنگ ، اشباع و ارزش است. HSL مخفف رنگ ، اشباع و روشنایی است. محور مرکزی برای HSV مقدار رنگها است در حالی که برای HSL مقدار نور است. در امتداد زوایای محور مرکزی ، وجود داردرنگ ، رنگهای واقعی و فاصله از محور مرکزی به اشباع تعلق دارد. تغییر حالت رنگ می تواند به شرح زیر انجام شود.

# تبدیل تصویر به مدل HSV و HLS
img_hsv = cv2.cvtColor (img، cv2.COLOR_BGR2HSV)
img_hls = cv2.cvtColor (img، cv2.COLOR_BGR2HLS) 
# ترسیم تصاویر تبدیل شده
انجیر ، (ax1 ، ax2) = plt. subplots (nrows = 1 ، ncols = 2 ، figsize = (20 ، 20))
ax1.imshow (img_hsv)
ax2.imshow (img_hls)
plt.show () 

اما چرا ما باید رنگ ها را تغییر داد؟ اینها برای چیست؟ یکی از مثالهایی که می تواند پاسخ دهد تشخیص خط است. لطفاً به تصویر زیر نگاهی بیندازید. ببینید چگونه خطوط در حالت های رنگی مختلف تشخیص داده می شوند. در حین کار بینایی رایانه ، ما چندین حالت رنگ را همراه با ماسک انجام می دهیم. اگر می خواهید در مورد نحوه استفاده از پردازش تصویر در کار تشخیص خط بیشتر بدانید ، با خیال راحت این پست را با nachiket tankale بررسی کنید.

RGB vs Grayscale (darkened) vs HSV vs HSL

اکنون معتقدم شما این ایده را دریافت کرده اید. پردازش تصویر "پیش پردازش داده ها" است. کاهش صداها و استخراج الگوهای مفید برای سهولت انجام کارهای طبقه بندی و تشخیص. بنابراین همه این تکنیکها از جمله تکنیکهایی که بعداً در مورد آنها صحبت خواهیم کرد ، برای کمک به مدل در تشخیص آسانتر الگوها است. حالا میریم پاریس آیا تا به حال نام دیوار عشق را شنیده اید؟ این دیواری است که با کلمات "دوستت دارم" در انواع زبان های بین المللی پر شده است. آنچه ما قرار است انجام دهیم این است که کلمات را در زبان خود بیابیم و آنها را با یک مستطیل علامت گذاری کنیم. از آنجا که اهل کره جنوبی هستم ، به دنبال "دوستت دارم" به زبان کره ای هستم. ابتدا ، یک کپی از تصویر اصلی تهیه می کنم و سپس یک مستطیل با cv2.rectangle ترسیم می کنم () ما باید مقادیر مختصات را برای نقطه بالا سمت چپ و پایین سمت راست نشان دهیم.

# کپی تصویر
img_copy = img.copy () 
# یک مستطیل بکشید
cv2. rectangle (img_copy، pt1 = (800 ، 470) ، pt2 = (980 ، 530) ،
              رنگ = (255 ، 0 ، 0) ، ضخامت = 5)
plt.imshow (img_copy) 

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

# رسم یک دایره
cv2.circle (img_copy ، center = (950 ، 50) ، شعاع = 50 ،
           رنگ = (0 ، 0 ، 255) ، ضخامت = 5)
plt.imshow (img_copy) 

ما همچنین می توانیم قرار دادن داده های متنی روی تصویر چرا این بار نام این دیوار را نمی نویسیم؟ با cv2.putText () ، می توانیم موقعیت و سبک فونت و اندازه متن را تعیین کنیم.

# افزودن متن
cv2.putText (img_copy، text = "دیوار عشق" ،
            org = (250 ، 250) ،
            fontFace = cv2. FONT_HERSHEY_DUPLEX ،
            fontScale =2 ،
            رنگ = (0 ، 255 ، 0) ،
            ضخامت = 2 ،
            lineType = cv2.LINE_AA)
plt.imshow (img_copy) 

این واقعا یک دیوار "دوست داشتنی" ، اینطور نیست؟ این را خودتان امتحان کنید و "دوستت دارم" را در زبان خود بیابید!