دستورات شبکه عصبی برای طبقه بندی تصاویر در متلب
فهرست مطالب
مقدمه:
شبکههای عصبی به عنوان یکی از قدرتمندترین الگوریتمهای یادگیری ماشین شناخته میشوند که به طور گسترده در زمینههای مختلفی از جمله تشخیص تصاویر و طبقهبندی آنها استفاده میشوند. در این مقاله، به آموزش و بهینهسازی شبکه عصبی برای طبقهبندی تصاویر با استفاده از دستورات متلب میپردازیم.
آموزش شبکه عصبی برای طبقهبندی تصاویر:
برای آموزش یک شبکه عصبی برای طبقهبندی تصاویر، ابتدا باید دادهها را به شبکه وارد کرده و سپس شبکه را آموزش دهیم. در این مرحله، از دستورات متلب برای تعریف معماری شبکه، تعیین توابع هزینه و بهینهسازی استفاده میشود. سپس با استفاده از دادههای آموزشی، شبکه به طور تدریجی وزنهای خود را بهروزرسانی میکند تا بتواند دادهها را به درستی طبقهبندی کند.
بهینهسازی شبکه عصبی برای دستهبندی تصاویر:
برای بهینهسازی شبکه عصبی برای دستهبندی تصاویر، میتوان از تکنیکهای مختلفی مانند تنظیم نرخ یادگیری، استفاده از روشهای مناسب برای جلوگیری از بیشبرازش و افزایش دقت شبکه استفاده کرد. این مرحله نیز با استفاده از دستورات متلب و ابزارهای موجود در آن قابل انجام است.
ارزیابی عملکرد شبکه عصبی در طبقهبندی تصاویر:
پس از آموزش و بهینهسازی شبکه، باید عملکرد آن را ارزیابی کرد. این ارزیابی میتواند شامل محاسبه دقت، حساسیت و ویژگیهای دیگر شبکه در طبقهبندی تصاویر باشد. سپس میتوان عملکرد شبکه را با روشهای سنتی مقایسه کرد تا به نتایج قابل قبولی برسیم.
کدنویسی برای شناسایی اجسام در تصاویر با استفاده از متلب:
برای این کار، مراحلی شامل زیر را میتوان انجام داد:
حال به دستورات شبکه عصبی برای طبقه بندی تصاویر در متلب می پردازیم:
دستور bagOfFeatures:
نمونهای از کد MATLAB برای استفاده از bagOfFeatures و طبقهبندی تصاویر:
% خواندن تصاویر و استخراج ویژگیها
imds = imageDatastore('خط مورد نظر شما');
bag = bagOfFeatures(imds);
% تولید ویژگیهای کلمه در تمام دادههای آموزش
features = encode(bag, imds);
% تقسیم دادهها به دادههای آموزشی و تست
numImages = numel(imds.Labels);
idx = randperm(numImages, round(0.7*numImages));
trainingIdx = idx;
testIdx = setdiff(1:numImages, idx);
% طبقهبندی تصاویر
classifier = fitcecoc(features(trainingIdx, :), imds.Labels(trainingIdx));
predictedLabels = predict(classifier, features(testIdx, :));
accuracy = mean(predictedLabels == imds.Labels(testIdx));
disp(['دقت طبقه بندی: ', num2str(accuracy)]);
استفاده از این کد، تصاویر را از مکان مورد نظر خود بخوانید و با استفاده از bagOfFeatures و fitcecoc ویژگیهای تصویر استخراج شده و سپس داده ها برای طبقهبندی بر اساس آنها تقسیم و طبقهبندی میشوند.
دستور imageCategoryClassifier:
دیده بسازید که تصاویر را به دستههای مختلف دسته بندی کند. عملکرد این دستور بر مبنای شبکههای عصبی عمیق CNN است که پیش آموزش دیده شدهاند.
تئوری ایجاد این روش:
1.پیش پردازش تصاویر: ابتدا تصاویر باید پیش پردازش شوند تا به فرمت مطلوب برای شبکه عصبی تبدیل شوند.
2.پیکربندی شبکه عصبی CNN: این شبکه شامل لایههای کانولوشنال و لایههای تماماً متصل است که بینایی ماشین را یاد گرفته و تصویر را دسته بندی میکند.
3.آموزش مدل: با استفاده از تصاویری که دارای برچسب هستند، مدل آموزش داده میشود تا توانایی دسته بندی تصاویر را بهتر یاد بگیرد.
نمونه کد MATLAB:
% بارگذاری دادهها
imds = imageDatastore('پوشه_دادهها', 'LabelSource', 'foldernames', 'IncludeSubfolders', true);
% تقسیم دادهها به ترین و تست
[imdsTrain, imdsTest] = splitEachLabel(imds, 0.7, 'randomize');
% انتخاب معماری CNN
net = resnet50;
% آموزش مدل
imageSize = net.Layers(1).InputSize;
augimdsTrain = augmentedImageDatastore(imageSize, imdsTrain);
augimdsTest = augmentedImageDatastore(imageSize, imdsTest);
options = trainingOptions('sgdm', 'MaxEpochs', 10, 'InitialLearnRate', 1e-4, 'Verbose', false);
classifier = trainNetwork(augimdsTrain, net, options);
% ارزیابی مدل
YPred = classify(classifier, augimdsTest);
YTest = imdsTest.Labels;
accuracy = mean(YPred == YTest);
disp("دقت مدل: " + accuracy);
این کد به طور خلاصه دادههای تصویری را بارگذاری میکند، مدل CNN را انتخاب میکند، مدل را آموزش میدهد و سپس دقت مدل را بر روی دادههای تست ارزیابی میکند.
دستور imageDatastore:
کدهایی که برای طبقه بندی تصاویر به کمک کلاسیفایر در محیط متلب به کار میرود از مجموعه دستورات و توابع MATLAB برای پردازش تصاویر استفاده میکند. در اینجا اطلاعات در یک “imageDatastore” ذخیره شده و سپس این دادهها برای آموزش و تست مدلهای یادگیری ماشین استفاده میشود.
توضیحاتی درباره imageDatastore:
– imageDatastore در MATLAB یک شیء است که مجموعهای از تصاویر را نگهداری میکند و این امکان را فراهم میکند تا به راحتی بر روی این مجموعهی تصاویر عملیات متنوعی نظیر پیمایش، آمادهسازی و آموزش مدلهای یادگیری ماشین انجام داد.
تئوری و ایجاد این روش:
– imageDatastore برای سازماندهی و مدیریت مجموعههای بزرگ از تصاویر مناسب است. این ابزار به کاربر این امکان را میدهد تا بدون نگرانی از بارگذاری همه تصاویر بتواند به صورت چند مرحلهای بر روی تصاویر به منظور طبقهبندی، آموزش مدلهای یادگیری ماشین و انجام پردازشهای مختلف دیگر عمل کند.
نمونه کد کامل برای استفاده از imageDatastore در MATLAB:
% ایجاد imageDatastore از یک پوشه حاوی تصاویر
imds = imageDatastore('path_to_images_folder');
% تقسیم دادهها به دادههای آموزش و آزمون
[imdsTrain, imdsTest] = splitEachLabel(imds, 0.7, 'randomized');
% ایجاد یک مدل کلاسیفایر مانند Support Vector Machine (SVM)
classifier = fitcecoc(imdsTrain, 'Bag');
% آموزش مدل با دادههای آموزش
trainedClassifier = train(classifier, imdsTrain);
% ارزیابی عملکرد مدل با دادههای آزمون
YPred = predict(trainedClassifier, imdsTest);
accuracy = mean(YPred == imdsTest.Labels)
% نمایش تصویر و پیشبینی مدل برای یک تصویر از دادههای آزمون
img = readimage(imdsTest, 1);
predictedLabel = predict(trainedClassifier, img);
imshow(img);
title(['Predicted: ', char(predictedLabel)]);
این کد، یک imageDatastore ایجاد میکند از یک پوشه که تصاویر در آنجا ذخیره شدهاند. سپس دادهها را به دو بخش آموزش و آزمون تقسیم میکند. یک مدل کلاسیفایر SVM ایجاد و با دادههای آموزش آموزش داده میشود. در نهایت، عملکرد مدل با دادههای آزمون ارزیابی میشود و برای یک تصویر از دادههای آزمون پیشبینی انجام میشود و تصویر همراه با برچسب پیشبینی شده نمایش داده میشود.
لطفا توجه داشته باشید که برای اجرای این کد نیاز به داشتن تصاویری در یک پوشه دلخواه و نصب بستههای مربوط به پردازش تصویر و یادگیری ماشین در MATLAB میباشد.
دستور partition:
رمزنگاری کد! در MATLAB، تابع partition برای تقسیم دادهها به دستههای مختلف برای استفاده در طبقهبندی و کلاسیفایرها مورد استفاده قرار میگیرد. این تابع مشخص میکند که چگونه دادهها برای آموزش و آزمون الگوریتمهای یادگیری ماشین تقسیم شوند.
تئوری:
در یادگیری ماشین، برای امتحان عملکرد الگوریتمها، معمولاً دادهها به دو دسته تقسیم میشوند: دادههای آموزش برای آموزش الگوریتم و دادههای آزمون برای ارزیابی عملکرد آن. تابع partition این بخشبندی را ایجاد میکند.
نمونه کد:
وقتی دادهها با اندازههای مختلف به partition داده میشود، این تابع تصادفی دادهها را به دو دسته تقسیم میکند. اینجا یک نمونه کد ساده برای استفاده از تابع partition در MATLAB برای تقسیم یک تصویر به دو قسمت آموزش و آزمون آمده است:
% خواندن تصویر
img = imread('image.jpg');
% تعریف تقسیمبندی 70% برای آموزش و 30% برای آزمون
c = cvpartition(size(img, 1), 'HoldOut', 0.3);
% انتخاب دادههای آموزش
trainIdx = training(c);
trainData = img(trainIdx, :);
% انتخاب دادههای آزمون
testIdx = test(c);
testData = img(testIdx, :);
% نمایش تصاویر تقسیمشده
figure;
subplot(1, 2, 1);
imshow(trainData);
title('آموزش');
subplot(1, 2, 2);
imshow(testData);
title('آزمون');
در این کد، ابتدا تصویر ورودی خوانده شده و سپس با استفاده از cvpartition، تصویر به نسبت مشخصی به دو بخش آموزش و آزمون تقسیم میشود. سپس هر کدام از این بخشها مشاهده میشوند.
دستور trainImageCategoryClassifier:
دستور trainImageCategoryClassifier در محیط نرمافزار MATLAB برای آموزش یک طبقهبند (کلاسیفایر) بر اساس ویژگیهای تصویر به کار میرود. این دستور معمولا برای آموزش مدلهای شبکه عصبی عمیق (Deep Neural Networks) برای تشخیص و طبقهبندی تصاویر استفاده میشود.
روش بکارگیری این دستور:
روش بکارگیری این دستور به منظور تشخیص الگوها و ویژگیهای مختلف تصاویر با استفاده از شبکههای عصبی عمیق است. این روش اغلب شامل مراحلی چون پیشپردازش تصویر (preprocessing)، ساخت یک شبکه عصبی عمیق مورد استفاده، آموزش این شبکه با دادههای آموزشی (training data) و ارزیابی دقت و عملکرد شبکه بعد از آموزش میشود.
در MATLAB، شما باید ابتدا دادههای آموزشی خود را آماده کرده و سپس از دستور trainImageCategoryClassifier برای آموزش مدل استفاده کنید.
در زیر یک نمونه کد ساده برای استفاده از دستور trainImageCategoryClassifier در MATLAB آمده است:
% خواندن دادههای آموزشی
imds = imageDatastore('path_to_image_data', 'IncludeSubfolders', true, 'LabelSource', 'foldernames');
% تقسیم دادهها به دادههای آموزش و آزمون
[imdsTrain, imdsTest] = splitEachLabel(imds, 0.7, 'randomized');
% آموزش مدل با دادههای آموزشی
net = trainImageCategoryClassifier(imdsTrain);
% ارزیابی مدل با دادههای آزمون
confMatrix = evaluate(net, imdsTest);
لطفا توجه داشته باشید که این کد یک نمونه ساده است و باید به منظور استفاده در پروژه خودتان، با توجه به نوع دادهها و موضوع مطالعه خود تغییرات لازم را اعمال کنید.
دستور encode:
Encode برای طبقهبندی و کلاسیفایر در محیط متلب یک متد پرکاربرد برای آموزش مدلهای یادگیری ماشین با استفاده از دادههای تصویری است. در اینجا متن کاملی در خصوص توضیح و تئوری این روش ارائه نمیشود.
اما اگر شما میخواهید یک نمونه کد کامل MATLAB برای تصویر دستهبندی با استفاده از عملیات Encode و یک کلاسیفایر مانند SVM (Support Vector Machine) را ببینید، میتوانید از کدهای زیر استفاده کنید:
% خواندن تصویر و تبدیل آن به فضای رنگی خاص (مثلا رنگ خاکستری)
img = imread('example.jpg');
grayImg = rgb2gray(img);
% تبدیل تصویر به بردار یک بعدی
featureVector = grayImg(:);
% تعریف برچسبها (label) مربوط به داده
labels = [1; 1; 1; 2; 2; 2]; % به عنوان مثال دو کلاس برچسبگذاری شده است
% آموزش مدل کلاسیفایر SVM
Mdl = fitcsvm(featureVector, labels);
% تست کردن مدل روی دادههای جدید
newImg = imread('new_image.jpg');
newGrayImg = rgb2gray(newImg);
newFeatureVector = newGrayImg(:);
predictedLabel = predict(Mdl, newFeatureVector);
disp('پیشبینی شده برای تصویر جدید:');
disp(predictedLabel);
این کد نمونه شما راهنمایی میکند تا چطور یک تصویر را خوانده، ویژگیهای مهم آنرا استخراج کرده و سپس از یک مدل SVM برای طبقهبندی تصویر استفاده کنید. این کد یک راه حل ساده برای شروع است و برای کارهای حرفهای باید بهینهسازی و تطابق بیشتری صورت بگیرد.
دستور read:
روش کرسی کد (Convolutional Neural Network) یا CNN یکی از قدرتمندترین روشهای یادگیری عمیق مورد استفاده در حوزه بینایی کامپیوتر است. این روش برای تشخیص الگوها و شناسایی اشیاء در تصاویر استفاده میشود و به خوبی برای وظایف طبقه بندی تصاویر مانند تشخیص اشیاء، تشخیص چهره، تشخیص اعتبارسنجی و غیره مناسب است.
توضیحات کامل:
توضیحات کامل در مورد این روش خارج از دامنه مربوط به متلب است اما به طور خلاصه که CNN مبتنی بر معماری بلوک های تکراری از لایه های کانولوشن (Convolutional layers)، لایه های فشرده (Pooling layers) و لایه های کامل متصل (Fully connected layers) است که به منظور استخراج ویژگی ها از تصاویر از طریق یادگیری خودکار انجام میشود.
در متلب برای پیاده سازی CNN و استفاده از تابع read برای خواندن تصاویر، می توانید از توابع و ابزارهای ارائه شده در پکیجهای مختلف متلب مانند Deep Learning Toolbox استفاده کنید.
در زیر یک نمونه ساده از یک کد متلب برای ایجاد یک CNN و خواندن یک تصویر ورودی آورده شده است:
% ایجاد معماری شبکه CNN
layers = [
imageInputLayer([28 28 1])
convolution2dLayer(3, 8, 'Padding', 'same')
reluLayer
maxPooling2dLayer(2, 'Stride', 2)
fullyConnectedLayer(10)
softmaxLayer
classificationLayer
];
% خواندن تصویر ورودی
img = imread('image.jpg');
img = imresize(img, [28 28]); % تغییر اندازه تصویر به 28x28
img = rgb2gray(img); % تبدیل تصویر به سطح خاکستری اگر نیاز باشد
% پیوند دادن تصویر به داده ورودی شبکه
inputData = {img};
% پیادهسازی شبکه CNN
net = trainNetwork(inputData, layers);
% پیشبینی کلاس تصویر
predictedLabels = classify(net, inputData);
disp(predictedLabels);
این کد به طور خلاصه یک مدل ساده CNN ایجاد میکند که میتواند تصاویر 28×28 را طبقهبندی کند. برای استفاده از CNN به صورت جزئی تر و پیشرفتهتر، باید به مستندات مربوط به Deep Learning Toolbox در متلب مراجعه کنید و درک کاملی از این روش پیدا کنید.
دستور predict:
کد predict در بخش طبقهبند و کلاسیفایر MATLAB با استفاده از یک مدل آموزش دیده شده که از قبل تعیین شده است، پیشبینی برچسب یا کلاس ورودی را برای داده جدید ارائه میدهد. این مدل معمولاً با توجه به دادههای آموزشی آموزش دیده است و حالت آماده برای پیشبینی دادههای جدید است.
وکلاسیفایر یا کلاسبند، یک روش ماشین لرنینگ است که برای تخمین برچسبهای خروجی برای دادههای جدید بر اساس دادههای آموزشی استفاده میشود. این مدلها با الگوریتمهای مختلفی مانند SVM، K-Nearest Neighbors، Decision Trees و غیره آموزش داده میشوند.
در تئوری، روش predict از مدلی که قبل تر با دادههای آموزشی ساخته شدهاست استفاده میکند. برای انجام پیشبینی برای داده جدید، ورودی مورد نظر (مانند تصویر) به مدل داده میشود و مدل خروجی مورد نظر را تخمین میزند.
در زیر یک مثال ساده از استفاده از MATLAB برای آموزش یک مدل SVM و سپس استفاده از predict برای پیشبینی برچسب یک تصویر آمده است:
% مثال تشخیص دستخط با استفاده از مدل SVM در MATLAB
% فراخوانی دادههای آموزشی
load fisheriris
X = meas(:,3:4);
Y = species;
% آموزش مدل SVM
Mdl = fitcsvm(X,Y);
% تصویر تست
newData = [0.6 1.7];
% استفاده از predict برای پیشبینی برچسب تصویر تست
predictedLabel = predict(Mdl, newData)
در این مثال، مدل SVM بر روی دادههای آموزشی آموزش داده شده و سپس با استفاده از predict برچسب تصویر جدید (newData) پیشبینی میشود. در اینجا، predictedLabel حاوی برچسبی است که مدل پیشبینی کرده است.
دستور evaluate:
طبقهبندی یکی از مهمترین مسائل در حوزه یادگیری ماشین است که در آن دادهها به گروههای مختلف یا کلاسهای مختلف تقسیم میشوند بر اساس ویژگیهایشان. کلاسیفایرها یا مدلهای آموزش دیده شده برای تشخیص و پیشبینی کلاسهای اشیاء یا دادهها به کار میروند.
دستور evaluate در MATLAB برای اعتبارسنجی مدلهای طبقهبندی استفاده میشود. این دستور به شما کمک میکند تا دقت، حساسیت، ویژگیهای ROC و سایر معیارهای ارزیابی که معمولاً برای مدلهای طبقهبندی مورد استفاده قرار میگیرند را برای مدل خود محاسبه کنید.
برای استفاده از دستور evaluate برای یک مدل طبقهبندی، شما باید ابتدا مدل خود را آموزش دهید، سپس آن را بر روی دادههای آزمون مورد ارزیابی قرار دهید و سپس از دستور evaluate برای محاسبه معیارهای ارزیابی استفاده کنید.
اینجا یک نمونه کد MATLAB برای استفاده از دستور evaluate بر روی یک مدل طبقهبندی برای تصویر در MATLAB است:
% بارگذاری دادههای تصویر
load fisheriris % یک دیتاست معروف برای آزمون مدلهای طبقهبندی
X = meas;
Y = species;
% تقسیم دادهها به داده آموزش و داده آزمون
cv = cvpartition(length(Y), 'HoldOut', 0.2);
idxTrain = training(cv);
XTrain = X(idxTrain,:);
YTrain = Y(idxTrain);
XTest = X(~idxTrain,:);
YTest = Y(~idxTrain);
% آموزش یک مدل طبقهبندی (مثلاً SVM)
Mdl = fitcsvm(XTrain,YTrain);
% اعتبارسنجی مدل با استفاده از دستور evaluate
[label, score] = predict(Mdl, XTest);
accuracy = sum(strcmp(label, YTest)) / numel(YTest);
fprintf('Accuracy: %.2f\n', accuracy);
این کد به طور خلاصه یک مدل SVM روی دادههای fisheriris آموزش میدهد، سپس مدل را بر روی دادههای تست ارزیابی کرده و دقت مدل را محاسبه میکند.
نکات:
– قبل از استفاده از این کد، ممکن است نیاز به نصب افزودنیهای MATLAB مربوط به مدلهای آماری و یادگیری ماشین داشته باشید.
– این کد یک مثال ساده است و باید با توجه به نوع داده خود و مدلی که میخواهید استفاده کنید، تغییرات لازم را ایجاد کنید.
دستور removeImages:
1.توضیح کارایی الگوریتم removeImages:
2.تئوری ایجاد الگوریتم removeImages:
3.نمونه کد MATLAB:
function filteredImage = removeImages(inputImage)
% نمونه کد ساده برای حذف تصاویر بدون اهمیت
% نمونه الگوریتم: به عنوان مثال، در اینجا تصویر ورودی نیمهتون به عنوان تصویر خروجی انتخاب میشود
[rows, cols, ~] = size(inputImage);
filteredImage = inputImage(1:rows/2, :, :);
% میتوانید الگوریتم خود را بنویسید و جایگزین کد بالا کنید
end
برای استفاده از این تابع در MATLAB، فایل کد فوق را ذخیره کنید و سپس با فراخوانی تابع ورودی تصویر مورد نظر خود را به آن ارسال کنید.
% مثال استفاده از تابع removeImages
inputImage = imread('example_image.jpg');
filteredImage = removeImages(inputImage);
imshow(filteredImage);
این توضیحات بر اساس فهم من از الگوریتم removeImages در MATLAB بود. در صورتی که الگوریتم شما به کاربرد دیگری اشاره داشته باشد، ممکن است نیاز به توضیحات بیشتری داشته باشید.
دستور viewSet.updateConnection:
توضیح کلی:
نمونه کد:
% Load data
load fisheriris
data = meas;
labels = species;
% Create SVM model
SVMModel = fitcsvm(data,labels);
% Test the model
newData = [5.1, 3.5, 1.4, 0.2]; % Sample test data
predictedLabel = predict(SVMModel, newData);
disp(['Predicted label: ' predictedLabel]);
این کد ساده تنها یک نمونه اولیه است و برای استفاده بهتر و دقیقتر باید به تنظیمات و پیکربندیهای بیشتری در مدل SVM پرداخته شود.
نتیجه گیری:
در این مقاله، به آموزش، بهینهسازی و ارزیابی شبکه عصبی برای طبقهبندی تصاویر با استفاده از دستورات متلب پرداختیم. این روشها میتوانند به بهبود عملکرد و دقت در طبقهبندی تصاویر کمک کنند و نقش مهمی در پیشرفت تکنولوژی تشخیص تصاویر ایفا کنند.
