رانندگی خودمختار با استفاده از یادگیری عمیق در نرم افزار متلب


رانندگی خودمختار با استفاده از یادگیری عمیق در نرم افزار متلب

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


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

1- تشخیص خودرو

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



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

همچنین، به منظور کاهش زمان در برچسب گذاری داده ها می توان از تولباکس رانندگی خودکار متلب (MATLAB Automated Driving System Toolbox) استفاده کرد که در شکل زیر نشان داده شده است.

الگوریتم (KTL (Kanade Lucas Tomasi یکی از اولین الگوریتم های بینایی ماشین است که در دنیای واقعی از آن استفاده شد و در امر ردیابی مشهور است. با استفاده از این روش می توان تعداد اشیا مورد اهمیت در یک فریم از ویدیو را برچسب گذاری کرد و سپس با این الگوریتم اشیا برچسب شده را در تمام فریم های ویدیو، ردیابی کرد.
بعد از این، نیاز به آشکار سازی خودرو و موانع به کمک یادگیری عمیق است که آشکارساز Faster R-cnn گزینه مناسبی می باشد (فایل متلب از اینجا قابل دسترس است، برای شروع از پنجره 32 در 32 پیکسل استفاده کنید).

% Create image input layer.
inputLayer = imageInputLayer([32 32 3]);

لایه های میانی، هسته بلوک ساختمان شبکه است که مجموعه هایی از لایه کانولوشن، یکسو کننده (ReLU) و هموارکننده (Pooling) است. برای عمیقتر کردن شبکه و پردازش، تعداد لایه ها را باید افزایش داد. در زیر مثالی از دو لایه کانولوشن آمده است. 

% Define the convolutional layer parameters.
filterSize = [3 3];
numFilters = 32;
% Create the middle layers.
middleLayers = [
convolution2dLayer(filterSize, numFilters, 'Padding', 1)
reluLayer()
convolution2dLayer(filterSize, numFilters, 'Padding', 1)
reluLayer()
maxPooling2dLayer(3, 'Stride',2)
];

لایه پایانی معمولا یک لایه ی ارتباط دهنده و تطابق دهنده است (آشکارساز Softmax). در زیر، یک ReLU بین لایه های پایانی به منظور بهبود عملکرد آشکار ساز، اضافه شده است. 


finalLayers = [
% Add a fully connected layer with 64 output neurons. The output size
% of this layer will be an array with a length of 64.
fullyConnectedLayer(64)
% Add a ReLU non-linearity.
reluLayer()
% Add the last fully connected layer. At this point, the network must
% produce outputs that can be used to measure whether the input image
% belongs to one of the object classes or background. This measurement
% is made using the subsequent loss layers.
fullyConnectedLayer(width(vehicleDataset))
% Add the softmax loss layer and classification layer.
softmaxLayer()
classificationLayer()
];
layers = [
inputLayer
middleLayers
finalLayers
]

برای آموزش تشخیص اشیا، همچنین می توان از تابع trainFasterRCNNObjectDetector استفاده کرد. در این تابع، اگر GPU نصب باشد الگوریتم به صورت خودکار از آن استفاده می کند. اگر نیاز است بدون GPU، یا با چند GPU شبکه آموزش داده شود نیاز است پارامتر ExecutionEnvironment از trainingOptions، تنظیم شود. نتایج در شکل زیر آمده است.

2- تشخیص خطوط

تشخیص خطوط خیابان، در واقع شناسایی موقعیت و انحنای خط (لندمارک خیابان) است که حتما باید قابل مشاهده باشد. این موضوع به خودرو اجازه حرکت بین خطوط و ناوبری ایمن در تعویض خط را می دهد. روش تشخیص خط با تشخیص خودرو متفاوت است و دیگر نیازی به طبقه بندی و موقعیت یابی (Bounding box) نیست. در این بخش به الگوریتمی به منظور خروجی مجموعه ای از اعداد ضرایب، نیاز است که مرزهای راست و چپ را نشان می دهد. برای حل این مسئله، از ساختار شبکه عصبی کانولوش می توان استفاده کرد که رگرسیون را برای خروجی ضرایب انجام می دهد. همانند تشخیص خودرو نیاز است برای شبکه عصبی کانولوشن، برچسب گذاری داده، به منظور تشخیص مرزهای چپ و راست انجام شود. برای این منظور نیز می توان از MATLAB Automated Driving System Toolbox استفاده کرد.

برای درک بهتر ground truth برای مرزهای خطوط، تعدادی از ضرایب بدست آمده در جدول زیر نمایش داده شده است.



در آزمایش انجام شده، از 1225 سمپل آموزش دیده شده برای استخراج خط استفاده شد که معمولا برای آموزش شبکه عمیق به بیشتر از این نیاز است. دلیل اینکه این مقدار برای این آزمایش بسنده می کند Transfer learning با استفاده از یک شبکه از قبل موجود، شروع می شود که با مجموعه ای از تصاویر آموزش دیده شده، و برای این عمل به روز رسانی شده است. شبکه استفاده شده AlexNet است که دارای 1000 گروه متفاوت از تصاویر آموزش دیده شده است. برای اجرای این شبکه از قبل آموزش دیده شده، می توانید از دستور زیر استفاده کنید.

originalConvNet = alexnet    

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


%Extract layers from the original network
layers = originalConvNet.Layers
%Net surgery
%Replace the last few fully connected layers with suitable size layers
layers(20:25) = [];
outputLayers =  [ ...
fullyConnectedLayer(16, 'Name', 'fcLane1');
reluLayer('Name','fcLane1Relu');
fullyConnectedLayer(6, 'Name', 'fcLane2');
regressionLayer('Name','output')];
layers = [layers; outputLayers]

همچنین در شکل زیر نمونه آموزش دیده شده با NVIDIA Titan X GPU نشان داده شده است که 245 ثانبه برای آموزش این شبکه زمان تلف شده است. این زمان خیلی زمان کوتاهی برای آموزش است در حقیقت زمان انجام آزمایش خیلی کمتر از تصور است و این را باید مدیون قدرت پردازش موازی سخت افزار NVIDIA دانست. همچنین نرم افزار متلب به طور خودکار از CUDA و cuDNN به منظور افزایش سرعت در پردازش آموزش، وقتی که GPU قابل دسترس است، استفاده می کند. این نشان می دهد که سرعت GPU تقریبا 100 برابر سرعت CPU در 1000 تکرار است.

نتایج تشخیص خطوط در شکل زیر آمده است.


رانندگی خودمختار با استفاده از یادگیری عمیق در نرم افزار متلب
4.3/3
4.3
30
5
1

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

ارسال دیدگاه

دیدگاه ها