الرابطة الوطنية لكرة القدم (NFL) هي واحدة من الدوريات الرياضية الأكثر شعبية في الولايات المتحدة وهي كذلك أغلى دوري رياضي في العالم. يلتزم اتحاد كرة القدم الأميركي و BioCore و AWS بتعزيز التفاهم البشري حول تشخيص الإصابات الرياضية والوقاية منها وعلاجها لجعل لعبة كرة القدم أكثر أمانًا. يتوفر مزيد من المعلومات حول جهود صحة وسلامة لاعب اتحاد كرة القدم الأميركي على موقع موقع اتحاد كرة القدم الأميركي.
• الخدمات المهنية AWS دخل الفريق في شراكة مع NFL و Biocore لتوفير حلول قائمة على التعلم الآلي (ML) لتحديد تأثيرات الخوذة من لقطات اللعبة باستخدام تقنيات رؤية الكمبيوتر (CV). من خلال العديد من طرق عرض الكاميرا المتاحة من كل لعبة ، قمنا بتطوير حلول لتحديد تأثيرات الخوذة من كل من هذه العروض ودمج نتائج تأثير الخوذة.
الدافع وراء استخدام طرق عرض الكاميرا المتعددة يأتي من محدودية المعلومات عندما يتم التقاط أحداث التأثير من خلال عرض واحد فقط. من منظور واحد فقط ، قد يسد بعض اللاعبين بعضهم البعض أو يتم حظرهم بواسطة كائنات أخرى في الملعب. لذلك ، فإن إضافة المزيد من المنظورات يسمح لنظام ML الخاص بنا بتحديد المزيد من التأثيرات غير المرئية في عرض واحد. لعرض نتائج عملية الاندماج الخاصة بنا وكيفية استخدام الفريق لأدوات التصور للمساعدة في تقييم أداء النموذج ، قمنا بتطوير قاعدة بيانات للتراكب البصري لنتائج اكتشاف طرق العرض المتعددة. تساعد هذه العملية في تحديد العدد الفعلي للتأثيرات التي يختبرها اللاعبون الفرديون عن طريق إزالة التأثيرات المكررة المكتشفة في طرق عرض متعددة.
في هذا المنشور ، نستخدم مجموعة البيانات المتاحة للجمهور من NFL - مسابقة Kaggle للكشف عن التأثير وتظهر النتائج لدمج وجهتي نظر. تتضمن مجموعة البيانات المربعات المحيطة بالخوذة في كل إطار وتسميات التأثير الموجودة في كل مقطع فيديو. على وجه الخصوص ، نركز على إزالة تكرار وتصور مقاطع الفيديو باستخدام المعرف 57583_000082
في طرق العرض الجانبية و endzone. يمكنك تنزيل ملف منطقة النهاية ومقاطع الفيديو الجانبيةو كذلك تسميات الحقيقة الأرضية.
المتطلبات الأساسية المسبقة
الحل يتطلب ما يلي:
ابدأ في SageMaker Studio Lab وقم بتثبيت الحزم المطلوبة
يمكنك تشغيل دفتر الملاحظات من GitHub جيثب: أو من SageMaker Studio Lab. في هذا المنشور ، نقوم بتشغيل دفتر الملاحظات من بيئة SageMaker Studio Lab. نحن نختار SageMaker Studio Lab لأنه مجاني ، ويوفر جلسات مستخدم قوية لوحدة المعالجة المركزية ووحدة معالجة الرسومات ، و 15 جيجابايت من التخزين الدائم الذي سيوفر تلقائيًا بيئتك ، مما يتيح لك المتابعة من حيث توقفت. لاستخدام SageMaker Studio Lab ، طلب وإنشاء حساب جديد. بعد الموافقة على الحساب ، أكمل الخطوات التالية:
- زر ال AWS- عينات GitHub repo.
- في مجلة
README
القسم، اختر افتح معمل الاستوديو.
هذا يعيد توجيهك إلى بيئة SageMaker Studio Lab الخاصة بك.
- حدد نوع حساب وحدة المعالجة المركزية الخاصة بك ، ثم اختر ابدأ وقت التشغيل.
- بعد بدء وقت التشغيل ، اختر نسخ إلى المشروع، والذي يفتح نافذة جديدة مع بيئة Jupyter Lab.
أنت الآن جاهز لاستخدام الكمبيوتر الدفتري!
- ساعات العمل
fuse_and_visualize_multiview_impacts.ipynb
واتبع التعليمات الموجودة في دفتر الملاحظات.
تثبت الخلية الأولى في الكمبيوتر الدفتري حزم Python الضرورية مثل pandas و OpenCV:
%pip install pandas
%pip install opencv-contrib-python-headless
قم باستيراد جميع حزم Python الضرورية وقم بتعيين خيارات الباندا لتجربة تصور أفضل:
import os
import cv2
import pandas as pd
import numpy as np
pd.set_option('mode.chained_assignment', None)
نحن نستخدم الباندا للاستيعاب والتحليل من خلال ملف CSV مع مربعات ربط الخوذة المشروحة بالإضافة إلى التأثيرات. نستخدم NumPy بشكل أساسي لمعالجة المصفوفات والمصفوفات. نستخدم OpenCV لقراءة بيانات الصور وكتابتها ومعالجتها في Python.
تحضير البيانات بدمج النتائج من وجهتي نظر
لدمج المنظورين معًا ، نستخدم امتداد train_labels.csv
من مسابقة Kaggle كمثال لأنها تحتوي على تأثيرات الحقيقة الأساسية من كل من المنطقة النهائية والخط الجانبي. تأخذ الوظيفة التالية مجموعة بيانات الإدخال وتخرج إطار بيانات مدمجًا يتم إلغاء تكراره لجميع عمليات التشغيل في مجموعة بيانات الإدخال:
def prep_data(df): df['game_play'] = df['gameKey'].astype('str') + '_' + df['playID'].astype('str').str.zfill(6) return df def dedup_view(df, windows): # define view df = df.sort_values(by='frame') view_columns = ['frame', 'left', 'width', 'top', 'height', 'video'] common_columns = ['game_play', 'label', 'view', 'impactType'] label_cleaned = df[view_columns + common_columns] # rename columns sideline_column_rename = {col: 'Sideline_' + col for col in view_columns} endzone_column_rename = {col: 'Endzone_' + col for col in view_columns} sideline_columns = list(sideline_column_rename.values()) # create two dataframes, one for sideline, one for endzone label_endzone = label_cleaned.query('view == "Endzone"') label_endzone.rename(columns=endzone_column_rename, inplace=True) label_sideline = label_cleaned.query('view == "Sideline"') label_sideline.rename(columns=sideline_column_rename, inplace=True) # prepare sideline labels label_sideline['is_dup'] = False for columns in sideline_columns: label_endzone[columns] = np.nan label_endzone['is_dup'] = False # iterrate endzone rows to find matches and dedup for index, row in label_endzone.iterrows(): player = row['label'] frame = row['Endzone_frame'] impact_type = row['impactType'] sideline_row = label_sideline[(label_sideline['label'] == player) & ((label_sideline['Sideline_frame'] >= frame - windows // 2) & (label_sideline['Sideline_frame'] <= frame + windows // 2 + 1)) & (label_sideline['is_dup'] == False) & (label_sideline['impactType'] == impact_type)] if len(sideline_row) > 0: sideline_index = sideline_row.index[0] label_sideline['is_dup'].loc[sideline_index] = True for col in sideline_columns: label_endzone[col].loc[index] = sideline_row.iloc[0][col] label_endzone['is_dup'].loc[index] = True # calculate overlap perc not_dup_sideline = label_sideline[label_sideline['is_dup'] == False] final_output = pd.concat([not_dup_sideline, label_endzone]) return final_output def fuse_df(raw_df, windows): outputs = [] all_game_play = raw_df['game_play'].unique() for game_play in all_game_play: df = raw_df.query('game_play ==@game_play') output = dedup_view(df, windows) outputs.append(output) output_df = pd.concat(outputs) output_df['gameKey'] = output_df['game_play'].apply(lambda x: x.split('_')[0]).map(int) output_df['playID'] = output_df['game_play'].apply(lambda x: x.split('_')[1]).map(int) return output_df
لتشغيل الوظيفة ، نقوم بتشغيل كتلة التعليمات البرمجية التالية لتوفير موقع ملف train_labels.csv
البيانات ثم إجراء تحضير البيانات لإضافة عمود إضافي واستخراج صفوف التأثير فقط. بعد تشغيل الوظيفة ، نحفظ الإخراج في متغير dataframe يسمى fused_df
.
# read the annotated impact data from train_labels.csv
ground_truth = pd.read_csv('train_labels.csv') # prepare game_play column using pipe(prep_data) function in pandas then filter the dataframe for just rows with impacts
ground_truth = ground_truth.pipe(prep_data).query('impact == 1') # loop over all the unique game_plays and deduplicate the impact results from sideline and endzone
fused_df = fuse_df(ground_truth, windows=30)
تُظهر لقطة الشاشة التالية الحقيقة الأساسية.
تُظهر لقطة الشاشة التالية أمثلة إطار البيانات المدمجة.
رمز الرسم البياني والفيديو
بعد دمج نتائج التأثير ، نستخدم الناتج fused_df
لتراكب النتائج على المنطقة النهائية ومقاطع الفيديو الجانبية ودمج طريقتي العرض معًا. نستخدم الوظيفة التالية لهذا الغرض ، والمدخلات المطلوبة هي المسارات إلى فيديو المنطقة النهائية ، والفيديو الجانبي ، fused_df
dataframe ، ومسار الإخراج النهائي للفيديو الذي تم إنشاؤه حديثًا. تم وصف الوظائف المستخدمة في هذا القسم في قسم علامة التخفيض في دفتر الملاحظات المستخدم في SageMaker Studio Lab.
def get_video_and_metadata(vid_path): vid = cv2.VideoCapture(vid_path) total_frame_number = vid.get(cv2.CAP_PROP_FRAME_COUNT) width = int(vid.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(vid.get(cv2.CAP_PROP_FRAME_HEIGHT)) fps = vid.get(cv2.CAP_PROP_FPS) return vid, total_frame_number, width, height, fps def overlay_impacts(frame, fused_df, game_key, play_id, frame_cnt, h1): # look for duplicates duplicates = fused_df.query(f"gameKey == {int(game_key)} and playID == {int(play_id)} and is_dup == True and Sideline_frame == @frame_cnt") frame_has_impact = False if len(duplicates) > 0: for duplicate in duplicates.itertuples(index=False): if frame_cnt == duplicate.Sideline_frame: frame_has_impact = True if frame_has_impact: cv2.rectangle(frame, #frame to be edited (int(duplicate.Sideline_left), int(duplicate.Sideline_top)), #(x,y) of top left corner (int(duplicate.Sideline_left) + int(duplicate.Sideline_width), int(duplicate.Sideline_top) + int(duplicate.Sideline_height)), #(x,y) of bottom right corner (0,0,255), #RED boxes thickness=3) cv2.rectangle(frame, #frame to be edited (int(duplicate.Endzone_left), int(duplicate.Endzone_top)+ h1), #(x,y) of top left corner (int(duplicate.Endzone_left) + int(duplicate.Endzone_width), int(duplicate.Endzone_top) + int(duplicate.Endzone_height) + h1), #(x,y) of bottom right corner (0,0,255), #RED boxes thickness=3) cv2.line(frame, #frame to be edited (int(duplicate.Sideline_left), int(duplicate.Sideline_top)), #(x,y) of point 1 in a line (int(duplicate.Endzone_left), int(duplicate.Endzone_top) + h1), #(x,y) of point 2 in a line (255, 255, 255), # WHITE lines thickness=4) else: # if no duplicates, look for sideline then endzone and add to the view sl_impacts = fused_df.query(f"gameKey == {int(game_key)} and playID == {int(play_id)} and is_dup == False and view == 'Sideline' and Sideline_frame == @frame_cnt") if len(sl_impacts) > 0: for impact in sl_impacts.itertuples(index=False): if frame_cnt == impact.Sideline_frame: frame_has_impact = True if frame_has_impact: cv2.rectangle(frame, #frame to be edited (int(impact.Sideline_left), int(impact.Sideline_top)), #(x,y) of top left corner (int(impact.Sideline_left) + int(impact.Sideline_width), int(impact.Sideline_top) + int(impact.Sideline_height)), #(x,y) of bottom right corner (0, 255, 255), #YELLOW BOXES thickness=3) ez_impacts = fused_df.query(f"gameKey == {int(game_key)} and playID == {int(play_id)} and is_dup == False and view == 'Endzone' and Endzone_frame == @frame_cnt") if len(ez_impacts) > 0: for impact in ez_impacts.itertuples(index=False): if frame_cnt == impact.Endzone_frame: frame_has_impact = True if frame_has_impact: cv2.rectangle(frame, #frame to be edited (int(impact.Endzone_left), int(impact.Endzone_top)+ h1), #(x,y) of top left corner (int(impact.Endzone_left) + int(impact.Endzone_width), int(impact.Endzone_top) + int(impact.Endzone_height) + h1 ), #(x,y) of bottom right corner (0, 255, 255), #YELLOW BOXES thickness=3) return frame, frame_has_impact def generate_impact_video(ez_vid_path:str, sl_vid_path:str, fused_df:pd.DataFrame, output_path:str, freeze_impacts=True): #define video codec to be used for VIDEO_CODEC = "MP4V" # parse game_key and play_id information from the name of the files game_key = os.path.basename(ez_vid_path).split('_')[0] # parse game_key play_id = os.path.basename(ez_vid_path).split('_')[1] # parse play_id # get metadata such as total frame number, width, height and frames per second (FPS) from endzone (ez) and sideline (sl) videos ez_vid, ez_total_frame_number, ez_width, ez_height, ez_fps = get_video_and_metadata(ez_vid_path) sl_vid, sl_total_frame_number, sl_width, sl_height, sl_fps = get_video_and_metadata(sl_vid_path) # define a video writer for the output video output_video = cv2.VideoWriter(output_path, #output file name cv2.VideoWriter_fourcc(*VIDEO_CODEC), #Video codec ez_fps, #frames per second in the output video (ez_width, ez_height+sl_height)) # frame size with stacking video vertically # find shorter video and use the total frame number from the shorter video for the output video total_frame_number = int(min(ez_total_frame_number, sl_total_frame_number)) # iterate through each frame from endzone and sideline for frame_cnt in range(total_frame_number): frame_has_impact = False frame_near_impact = False # reading frames from both endzone and sideline ez_ret, ez_frame = ez_vid.read() sl_ret, sl_frame = sl_vid.read() # creating strings to be added to the output frames img_name = f"Game key: {game_key}, Play ID: {play_id}, Frame: {frame_cnt}" video_frame = f'{game_key}_{play_id}_{frame_cnt}' if ez_ret == True and sl_ret == True: h, w, c = ez_frame.shape h1,w1,c1 = sl_frame.shape if h != h1 or w != w1: # resize images if they're different ez_frame = cv2.resize(ez_frame,(w1,h1)) frame = np.concatenate((sl_frame, ez_frame), axis=0) # stack the frames vertically frame, frame_has_impact = overlay_impacts(frame, fused_df, game_key, play_id, frame_cnt, h1) cv2.putText(frame, #image frame to be modified img_name, #string to be inserted (30, 30), #(x,y) location of the string cv2.FONT_HERSHEY_SIMPLEX, #font 1, #scale (255, 255, 255), #WHITE letters thickness=2) cv2.putText(frame, #image frame to be modified str(frame_cnt), #frame count string to be inserted (w1-75, h1-20), #(x,y) location of the string in the top view cv2.FONT_HERSHEY_SIMPLEX, #font 1, #scale (255, 255, 255), # WHITE letters thickness=2) cv2.putText(frame, #image frame to be modified str(frame_cnt), #frame count string to be inserted (w1-75, h1+h-20), #(x,y) location of the string in the bottom view cv2.FONT_HERSHEY_SIMPLEX, #font 1, #scale (255, 255, 255), # WHITE letters thickness=2) output_video.write(frame) # Freeze for 60 frames on impacts if frame_has_impact and freeze_impacts: for _ in range(60): output_video.write(frame) else: break frame_cnt += 1 output_video.release() return
لتشغيل هذه الوظائف ، يمكننا توفير إدخال كما هو موضح في الكود التالي ، والذي يقوم بإنشاء مقطع فيديو يسمى output.mp4
:
generate_impact_video('57583_000082_Endzone.mp4', '57583_000082_Sideline.mp4', fused_df, 'output.mp4')
يؤدي هذا إلى إنشاء مقطع فيديو كما هو موضح في المثال التالي ، حيث تكون المربعات المحيطة باللون الأحمر عبارة عن تأثيرات موجودة في كل من طرق عرض المنطقة النهائية والخط الجانبي ، وتكون مربعات الإحاطة الصفراء تأثيرات موجودة في عرض واحد فقط إما في المنطقة النهائية أو الخط الجانبي.
وفي الختام
في هذا المنشور ، أوضحنا كيف تعمل فرق NFL و Biocore و AWS ProServe معًا لتحسين اكتشاف التأثير من خلال دمج النتائج من طرق عرض متعددة. يتيح ذلك للفرق تصحيح الأخطاء وتصور كيفية أداء النموذج نوعيًا. يمكن توسيع نطاق هذه العملية بسهولة إلى ثلاث طرق عرض أو أكثر ؛ في مشاريعنا ، استخدمنا ما يصل إلى سبع وجهات نظر مختلفة. قد يكون من الصعب اكتشاف تأثيرات الخوذة من خلال مشاهدة مقاطع الفيديو من عرض واحد فقط بسبب عائق العرض ، ولكن اكتشاف التأثيرات من وجهات نظر متعددة ودمج النتائج يسمح لنا بتحسين أداء نموذجنا.
لتجربة هذا الحل ، قم بزيارة AWS- عينات GitHub repo والإشارة إلى fuse_and_visualize_multiview_impacts.ipynb دفتر. يمكن أيضًا تطبيق تقنيات مماثلة على صناعات أخرى مثل التصنيع وتجارة التجزئة والأمن ، حيث من شأن وجود وجهات نظر متعددة أن يفيد نظام ML لتحديد الأهداف بشكل أفضل مع رؤية أكثر شمولاً.
لمزيد من المعلومات حول صحة وسلامة لاعب اتحاد كرة القدم الأميركي ، قم بزيارة موقع اتحاد كرة القدم الأميركي و وأوضح اتحاد كرة القدم الأميركي: الابتكار في صحة اللاعب وسلامته.
عن المؤلفين
كريس بومهاور هو مهندس تعلم الآلة في AWS Professional Services. يتمتع كريس بخبرة تزيد عن 6 سنوات في تطوير حلول التعلم الآلي الخاضعة للإشراف وغير الخاضعة للإشراف في مختلف الصناعات. اليوم ، يقضي معظم وقته في مساعدة العملاء في مجالات الرياضة والرعاية الصحية والزراعة في تصميم وبناء حلول التعلم الآلي القابلة للتطوير والشاملة.
بن فنكر هو عالم بيانات أول في خدمات AWS الاحترافية وقد ساعد العملاء على بناء ونشر حلول ML في صناعات تتراوح من الرياضة إلى الرعاية الصحية إلى التصنيع. حاصل على دكتوراه. في الفيزياء من جامعة تكساس إيه آند إم وست سنوات من الخبرة في الصناعة. يستمتع بن بلعبة البيسبول والقراءة وتربية أطفاله.
سام هادلستون هو عالم بيانات رئيسي في Biocore LLC ، ويعمل كقائد التكنولوجيا لبرنامج رياضي رقمي في اتحاد كرة القدم الأميركي. Biocore هو فريق من المهندسين ذوي المستوى العالمي ومقره في شارلوتسفيل بولاية فيرجينيا ، والذي يوفر البحث والاختبار والخبرة في الميكانيكا الحيوية والنمذجة والخدمات الهندسية الأخرى للعملاء المكرسين لفهم وتقليل الإصابة.
جارفيس لي هو عالم بيانات أقدم مع خدمات AWS الاحترافية. لقد عمل مع AWS لأكثر من خمس سنوات ، حيث عمل مع العملاء في مشكلات التعلم الآلي ورؤية الكمبيوتر. خارج العمل ، يستمتع بركوب الدراجات.
تايلر مولينباخ هو قائد الممارسة العالمية للتعلم الآلي مع خدمات AWS الاحترافية. وهو مسؤول عن قيادة الاتجاه الاستراتيجي لـ ML للخدمات الاحترافية والتأكد من أن العملاء يحققون إنجازات الأعمال التحويلية من خلال اعتماد تقنيات ML.
كيفن سونغ هو عالم بيانات في خدمات AWS الاحترافية. وهو حاصل على درجة الدكتوراه في الفيزياء الحيوية ولديه أكثر من 5 سنوات من الخبرة الصناعية في بناء رؤية الكمبيوتر وحلول التعلم الآلي.
بيتي تشانغ هو عالم بيانات يتمتع بخبرة 10 سنوات في مجال البيانات والتكنولوجيا. شغفها هو بناء حلول مبتكرة للتعلم الآلي لإحداث تغييرات تحويلية للشركات. في أوقات فراغها ، تستمتع بالسفر والقراءة والتعرف على التقنيات الجديدة.
- محتوى مدعوم من تحسين محركات البحث وتوزيع العلاقات العامة. تضخيم اليوم.
- بلاتوبلوكشين. Web3 Metaverse Intelligence. تضخيم المعرفة. الوصول هنا.
- المصدر https://aws.amazon.com/blogs/machine-learning/analyze-and-visualize-multi-camera-events-using-amazon-sagemaker-studio-lab/
- 1
- 10
- 100
- 202
- 7
- a
- حول المستشفى
- حسابي
- الإنجازات
- في
- وأضاف
- إضافي
- تبني
- بعد
- زراعة
- الكل
- يسمح
- أمازون
- الأمازون SageMaker
- أمازون ساجميكر ستوديو
- مختبر استوديو Amazon SageMaker
- تحليل
- و
- تطبيقي
- من وزارة الصحة
- حول
- رياضي
- تلقائيا
- متاح
- AWS
- الخدمات المهنية AWS
- البيسبول
- على أساس
- لان
- وراء
- تستفيد
- أفضل
- فيزياء حيوية
- حظر
- سدت
- الملابس السفلية
- مربعات
- استراحة
- نساعدك في بناء
- ابني
- الأعمال
- تسمى
- وكاميرا
- التغييرات
- اختار
- اختيار
- عميل
- الكود
- مصدر برنامج
- عمود
- الأعمدة
- ملتزم
- الشركات
- منافسة
- إكمال
- شامل
- إحصاء
- الكمبيوتر
- رؤية الكمبيوتر
- يحتوي
- زاوية
- خلق
- خلق
- العملاء
- البيانات
- تحضير البيانات
- عالم البيانات
- مخصصة
- تظاهر
- نشر
- وصف
- تصميم
- الكشف عن
- كشف
- المتقدمة
- تطوير
- مختلف
- صعبة
- رقمي
- اتجاه
- بإمكانك تحميله
- قيادة
- قيادة
- التكرارات
- كل
- بسهولة
- جهود
- إما
- تمكين
- النهائي إلى نهاية
- مهندس
- الهندسة
- المهندسين
- ضمان
- البيئة
- تقييم
- أحداث
- كل
- مثال
- أمثلة
- الخبره في مجال الغطس
- تجربة
- خبرة
- شرح
- استخراج
- حقل
- قم بتقديم
- ملفات
- تصفية
- نهائي
- الاسم الأول
- تركز
- اتباع
- متابعيك
- كرة القدم
- وجدت
- إطارا في الثانية
- FRAME
- مجانًا
- تجمد
- تبدأ من
- وظيفة
- وظائف
- انصهار
- لعبة
- ولدت
- يولد
- دولار فقط واحصل على خصم XNUMX% على جميع
- GitHub جيثب:
- العالمية
- وحدة معالجة الرسوميات:
- أرض
- وجود
- صحة الإنسان
- الرعاية الصحية
- ارتفاع
- مساعدة
- ساعد
- مساعدة
- يساعد
- يحمل
- كيفية
- HTTPS
- الانسان
- ID
- تحديد
- تحديد
- صورة
- صور
- التأثير
- الآثار
- استيراد
- تحسن
- in
- يشمل
- مؤشر
- فرد
- الصناعات
- العالمية
- معلومات
- الابتكار
- مبتكرة
- إدخال
- تثبيت
- تعليمات
- IT
- واحد فقط
- القفل
- اطفال
- مختبر
- تُشير
- ملصقات
- قيادة
- الدوري
- بطولات الدوري
- تعلم
- تحديد
- خط
- خطوط
- LLC
- موقع
- بحث
- آلة
- آلة التعلم
- جعل
- التلاعب
- تصنيع
- دمج
- دمج
- البيانات الوصفية
- ربما
- ML
- موضة
- نموذج
- تم التعديل
- الأكثر من ذلك
- أكثر
- الاكثر شهره
- التحفيز
- متعدد
- الاسم
- محليات
- ضروري
- جديد
- التكنولوجيات الجديدة
- اتحاد كرة القدم الأميركي
- مفكرة
- عدد
- نمباي
- الأجسام
- ONE
- مكتبة برمجية مفتوحة للرؤية الحاسوبية
- يفتح
- مزيد من الخيارات
- OS
- أخرى
- في الخارج
- حزم
- الباندا
- خاص
- شراكة
- شغف
- مسار
- نفذ
- أداء
- أداء
- منظور
- وجهات نظر
- فيزياء
- اختيار
- أفلاطون
- الذكاء افلاطون البيانات
- أفلاطون داتا
- بلايستشن
- لاعب
- لاعبين
- البوينت
- الرائج
- منشور
- قوي
- ممارسة
- إعداد
- الوقاية
- رئيسي
- مشاكل
- عملية المعالجة
- محترف
- البرنامج
- مشروع ناجح
- تزود
- ويوفر
- علانية
- بايثون
- رفع
- تتراوح
- RE
- عرض
- نادي القراءة
- استعداد
- أدرك
- أحمر
- بخصوص
- إزالة
- مستودع
- مطلوب
- يتطلب
- بحث
- مسؤول
- النتائج
- بيع بالتجزئة
- عائد أعلى
- ركوب الخيل
- صف
- يجري
- تشغيل
- أكثر أمانا
- السلامة
- sagemaker
- معمل استوديو SageMaker
- حفظ
- تحجيم
- عالم
- الثاني
- القسم
- أمن
- كبير
- يخدم
- خدماتنا
- دورات
- طقم
- سبعة
- الشكل
- إظهار
- عرض
- أظهرت
- يظهر
- مماثل
- عزباء
- المقاس
- حل
- الحلول
- بعض
- رياضة
- كومة
- التراص
- بدأت
- يبدأ
- المحافظة
- خطوات
- تخزين
- إستراتيجي
- ستوديو
- هذه
- نظام
- يأخذ
- الأهداف
- فريق
- فريق
- تقنيات
- التكنولوجيا
- تكنولوجيا
- الاختبار
- تكساس
- •
- وبالتالي
- ثلاثة
- عبر
- الوقت
- إلى
- اليوم
- سويا
- أدوات
- تيشرت
- الإجمالي
- التحويلية
- السفر
- علاج
- صحيح
- فهم
- فريد من نوعه
- متحد
- الولايات المتحدة
- جامعة
- us
- تستخدم
- مستخدم
- تستخدم
- استخدام
- القيمة
- مختلف
- فيديو
- مقاطع فيديو
- المزيد
- الرؤى
- فرجينيا
- مرئي
- رؤيتنا
- التصور
- W
- مراقبة
- التي
- أبيض
- من الذى
- ويكيبيديا
- سوف
- نوافذ
- للعمل
- عامل
- عالمي
- سوف
- كاتب
- جاري الكتابة
- X
- سنوات
- أنت
- حل متجر العقارات الشامل الخاص بك في جورجيا
- موقع YouTube
- زفيرنت