从影像中自动提取目标,并进行稳定跟踪,是自动驾驶感知系统的重要目标。本技术博文,介绍了基于卷积神经网络技术(CNN)的图像目标识别的全过程,包括:l FasterCNN中影响标注的数据格式
l imageLabeler的结果,非所愿
l Matlab影像标注工具
l 自动化Image标注
FasterCNN中影响标注的数据格式
FasterCNN是卷积神经网络进行detector学习的一种模型。它支持的ground truth data数据格式,请参考:《自动驾驶中的移动目标识别与跟踪(含代码)》(from《自动驾驶工程技术》)若谷:Matlab深度学习----自动驾驶中的移动目标识别与跟踪(含代码)zhuanlan.zhihu.com
data = load('vehicleDatasetGroundTruth.mat') %
vehicleDataset = data.vehicleDataset; % vehicleDataset数据结构是表格table,两列:图片路径、BBox
size(vehicleDataset)
LLL22 = vehicleDataset(1,1) % Table 表格
kkkk = vehicleDataset.imageFilename % cell
im_cell = kkkk(1) % cell
FirstImage_data = imread(im_cell{1}) % 读取cell 中的内容
imshow(im_cell{1})
vehicleDataset.Properties
jjjj_cell = vehicleDataset.vehicle % cell
FirstImage_bbox = jjjj_cell{1} % 读取cell 中的内容
FirstImage = insertShape(FirstImage_data,'Rectangle',FirstImage_bbox ); % insertShape函数:根据bbox1的方框信息,插入I1 图像中,形成新的图像;
FirstImage = imresize(FirstImage,1); % imresize函数:把影像annotatedImage1放大1倍;
% pause (1);
set(gcf,'unit','normalized','position',[0.2,0.2,0.6,0.3])
imshow(FirstImage)
% print(['.\objectdetected_example\ObjectDetected-' num2str(iii)], '-dpng', '-r200');
saveas(gcf,strcat('FirstImage.png'));
imageLabeler的结果,非所愿
Matlab 2019b打开影像标注工具imageLabeler的方式很简单,在命令行输入imageLabeler,即可开始进行影像标注。如下图所示。
保存得到session模式的数据,格式是matlab支持的.mat格式。
打开session数据,可以看到session的许多属性。
gTruth0508_test.imageLabelingSession
ans =
Session - 属性:
ImageFilenames: {100×1 cell}
SelectedImageIdx: 1
IsChanged: 0
IsPixelLabelChanged: [100×1 logical]
FileName: 'D:\MatlabCoding\SemanticSegement\Object_Detection_Using_Faster_R_CNN_Deep_Learning\2020-04-28-09-40-10-bigboat-lable\imageLabelingSession0508.mat'
PixelLabelDataPath: []
TempDirectory: []
ROILabelSet: [1×1 vision.internal.labeler.ROILabelSet]
ROISublabelSet: [1×1 vision.internal.labeler.ROISublabelSet]
ROIAttributeSet: [1×1 vision.internal.labeler.ROIAttributeSet]
FrameLabelSet: [1×1 vision.internal.labeler.FrameLabelSet]
ROIAnnotations: [1×1 vision.internal.labeler.ROIAnnotationSet]
FrameAnnotations: [1×1 vision.internal.labeler.FrameAnnotationSet]
HasROILabels: 1
NumROILabels: 1
HasFrameLabels: 1
NumFrameLabels: 1
NumROISublabels: 0
NumAttributes: 0
事实上,在matlab 2019b中,这是一个软件自身的BUG,即从image labeler中导出gtruth data时,出现错误。Error using vision.internal.labeler.validation.checkLabelData (line 100)
Invalid entry in label data table for Rectangle labelType. Table entries for column 'boat' must be M-by-4 matrices of [x, y, width, height]. Please refer to groundTruth object.
通过Google搜索,发现有人遇到了同样的问题:
经过测试,这个链接提供的解决方法,至少是不适合Matlab 2019b的。
从Matlab imageLabeler中导出的标注数据,在进行分析之后,得到这样的结果.
在应该出现bbox的结构中,出现了不一样的东东.
这个问题,在下方的程序中,得到基本的解决。
validation.checkLabelData问题解决
问题的解决,其实很偶然。那就是,增加了场景标签。
如此,在保存后,就可以导出gtruth data了。
l Matlab影像标注工具
使用imageLabeler进行影像标注,折腾了好几天.今天终于有了结果.
下面,提供了一个工具, 把Matlab的imageLabeler工具,产生的数据标注结果, 转化成下图这种格式,便于调用.
%% Matlab_gTruth_refine
% 使用Matlab 的imageLabeler工具,进行数据标注,得到结果gTruth
% 根据gTruth0506数据,读取影像及其对应的bbox,并显示,以便验证gTruth数据的可靠性。
clear all;
clc
diary '.\path\output_0509_Test_gTruthdata_log.txt'
diary on;
colorCode = [0.6 0.8 0]
gTruth0508_test = load('gTruth0508_TEST2.mat');
% get path of image
kkk_boat_image = gTruth0508_test.gTruth.DataSource;
kkk_boat_image = kkk_boat_image.Source; % cell结构
size(kkk_boat_image)
% get bbox of image
kkk_boat_bbox = gTruth0508_test.gTruth.LabelData;
% table 格式
% boat boat0506
% {1×2 struct} true
% {1×2 struct} true
% {2×4 double} true
kkk_boat_bbox = kkk_boat_bbox.boat; %% cell 格式, 内容可以是2*4 矩阵,也可以是struct格式
% {1×2 struct}
% {1×2 struct}
% {2×4 double}
jjj = 0;
for iii = 1:10 % size(kkk_boat_image)
iii
% get path of image
imagePath = kkk_boat_image{iii} % 获取第一个
imagedataMatrix = imread(imagePath);
% get bbox
kkk_boat_bbox_typecheck = kkk_boat_bbox{iii}; %% cell 格式, 内容可以是2*4 矩阵,也可以是struct格式
if isa(kkk_boat_bbox_typecheck,'struct') % 当是 struct格式
[kkk_boat_bbox_single1,kkk_boat_bbox_single2] = kkk_boat_bbox_typecheck.Position %% 第一个bbox的区域
% kkk_boat{iii}.LabelUIDs
else % 当是 2*4 矩阵
jjj = jjj + 1
kkk_boat_bbox_single = kkk_boat_bbox{iii,1}
kkk_boat_bbox_single1 = kkk_boat_bbox_single(1,:)
kkk_boat_bbox_single2 = kkk_boat_bbox_single(2,:)
end
%% visualization of the image
figure
% imshow(imagePath)
FirstImage = insertShape(imagedataMatrix,'Rectangle',kkk_boat_bbox_single1,'LineWidth',3); % insertShape函数:根据bbox1的方框信息,插入I1 图像中,形成新的图像;
FirstImage = insertShape(FirstImage,'Rectangle',kkk_boat_bbox_single2,'LineWidth',3,'Color', 'r'); % insertShape函数:根据bbox1的方框信息,插入I1 图像中,形成新的图像;
imshow(FirstImage)
end
jjj
diary off;
l 自动化Image标注
l CNN训练结果