本文章是为了实现对图像中特定的物体进行识别。
1.标记数据,制作训练集。
导入图片进行标记特定的物体:APP----->Image Labeler----->load------>add images from folder
新建Label,作为特定的物体名称,在导入的图片中进行标注。
导出标注内容:Export Labels----->to workplace(Export format要改成table)
2批量调整图像尺寸使其能用FasterRCNN进行训练
% imagePath = 'E:\matlab\installpath\bin\Fish_Dataset\Fish_Dataset\Black Sea Sprat\fish_test\';
% imageFiles = dir(imagePath); %%读取目录文件下的所有图片文件
% numFiles = length(imageFiles);%%获取图片的数量
% parfor i=3:numFiles %%matlab 并行 其实和for一个用法
% j = i-2;
% disp(j); %%disp() 函数直接将内容输出在Matlab命令窗口中
% imageFile = strcat(imagePath,imageFiles(i).name); %%strcat()函数经常出现在批量处理的时候,这个时候我们需要用到for循环,然后这个函数能够让变量和路径产生一些关系,这个时候我们就可以对其进行批量处理。
% A = imread(imageFile); %%读入图片
% B = imresize(A,[406 720]); %%修改图片尺寸
% imwrite(B,imageFile); %%保存图片 。
% end
3设置训练参数
% % Set training options
% options = trainingOptions('sgdm', ...
% 'MiniBatchSize', 1, ... %Faster-RCNN中的minibatch只能设置成1
% 'InitialLearnRate', 1e-4, ... %学习率,设置大的话训练速度快但效果比较差,甚至会发散,设置小了训练速度会较慢
% 'LearnRateSchedule', 'piecewise', ...
% 'LearnRateDropFactor', 0.1, ...
% 'LearnRateDropPeriod', 100, ...
% 'MaxEpochs', 20, ...
% 'CheckpointPath', tempdir, ...
% 'Verbose', true);
% % detector = trainFasterRCNNObjectDetector(gTruth,alexnet,options);
4测试单张图片的识别
img = imread('E:\matlab\installpath\bin\liuyaqi\Fish_Dataset\Fish_Dataset\Black Sea Sprat\Black Sea Sprat\00956.png');
[bbox,score,label]=detect(detector,img);
img=insertObjectAnnotation(img,'Rectangle',bbox,score);
figure;
imshow(img);
hold on
x=bbox(1)+60;
y=bbox(2)-14;
text(x,y,'fish-head','Color','k','FontSize',12);
%x,y分别为文本的位置。
5测试整个文件夹的文件识别
%测试训练好的网络detector
for i=1:5
img=imread(['E:\matlab\installpath\bin\liuyaqi\Fish_Dataset\Fish_Dataset\Black Sea Sprat\aim\',...
num2str(i),'.png']);
detectedImg=insertShape(img,'Rectangle',bbox);
[bbox,score,label]=detect(detector,img);
img=insertObjectAnnotation(img,'Rectangle',bbox,score);
figure;
imshow(img);
hold on
x=bbox(1)+60;
y=bbox(2)-14;
text(x,y,'fish-head','Color','k','FontSize',12);
%x,y分别为文本的位置。
end
6直到第5步为止,定位标注内容代码已经实现。
另外,对于matlab标注的函数有所了解。img=insertObjectAnnotation(....)其中当第二个参数为‘circle’的时候和是‘Rectangle’的时候的需要的position的格式不一样。
% %matlab圆形标注的代码
% position = [96 146 31;236 173 26];%设置圆位置。前两个值表示中心位于(x,y),第三个值表示半径。
% label = [55555555555555 10]; %设置标签显示整数5和10(美国美分)。
% RGB = insertObjectAnnotation(img,'circle',position,label,'LineWidth',3,'Color',{'cyan','yellow'},'TextColor','black'); %插入的批注。
% figure
% imshow(RGB) %显示图片
% title('Annotated coins');