gpt4 book ai didi

matlab - 如何在自定义数据集上执行 RCNN 对象检测?

转载 作者:太空宇宙 更新时间:2023-11-03 20:27:50 26 4
gpt4 key购买 nike

我正在尝试使用 RCNN 在我自己的数据集上执行对象检测,遵循 the tutorial on Matlab webpage .基于下图:

enter image description here

我应该将图像路径放在第一列中,将每个对象的边界框放在后面的列中。但是在我的每幅图像中,每种对象都有不止一个。例如,一幅图像中有 20 辆车。我该如何处理?我是否应该为图像中的每个车辆实例创建一个单独的行?

最佳答案

网站上的示例找到得分最高的像素邻域,并在图像中围绕该区域绘制边界框。当您现在有多个对象时,事情就会变得复杂。您可以使用两种方法来帮助查找多个对象。

  1. 找到得分超过某个全局阈值的所有边界框。
  2. 找到得分最高的边界框,并找到超过此阈值百分比的边界框。这个百分比是任意的,但根据经验和我在实践中看到的情况,人们倾向于选择图像中找到的最大分数的 80% 到 95% 之间。如果您将图像作为查询提交,其中包含未经过分类器检测的对象训练,这当然会给您带来误报,但您必须在您的终端实现更多的后处理逻辑。

另一种方法是选择一些值 k,然后您将显示与 k 最高分相关联的前 k 边界框。这当然要求您事先知道 k 的值是多少,并且它总是假设您已经像第二种方法一样在图像中找到了一个对象。


除了上述逻辑之外,您声明需要为图像中的每个车辆实例创建单独的行的方法是正确的。这意味着如果您在单个图像中有多个候选对象,则需要为每个实例引入一行,同时保持图像文件名相同。因此,例如,如果一张图像中有 20 辆车,则需要在文件名完全相同的表中创建 20 行,并且您将为该图像中的每个不同对象指定一个边界框。

一旦你这样做了,假设你已经训练了 R-CNN 检测器并且你想使用它,检测对象的原始代码如下引用网站:

% Read test image
testImage = imread('stopSignTest.jpg');

% Detect stop signs
[bboxes, score, label] = detect(rcnn, testImage, 'MiniBatchSize', 128)

% Display the detection results
[score, idx] = max(score);

bbox = bboxes(idx, :);
annotation = sprintf('%s: (Confidence = %f)', label(idx), score);

outputImage = insertObjectAnnotation(testImage, 'rectangle', bbox, annotation);

figure
imshow(outputImage)

这只适用于得分最高的一个对象。如果您想对多个对象执行此操作,您可以使用 detect 方法输出的 score 并找到那些适合情况 1 或情况 2 的位置。

如果遇到情况 1,您会将其修改为如下所示。

% Read test image
testImage = imread('stopSignTest.jpg');

% Detect stop signs
[bboxes, score, label] = detect(rcnn, testImage, 'MiniBatchSize', 128)

% New - Find those bounding boxes that surpassed a threshold
T = 0.7; % Define threshold here
idx = score >= T;

% Retrieve those scores that surpassed the threshold
s = score(idx);

% Do the same for the labels as well
lbl = label(idx);

bbox = bboxes(idx, :); % This logic doesn't change

% New - Loop through each box and print out its confidence on the image
outputImage = testImage; % Make a copy of the test image to write to
for ii = 1 : size(bbox, 1)
annotation = sprintf('%s: (Confidence = %f)', lbl(ii), s(ii)); % Change
outputImage = insertObjectAnnotation(outputImage, 'rectangle', bbox(ii,:), annotation); % New - Choose the right box
end

figure
imshow(outputImage)

请注意,我已将原始边界框、标签和分数存储在它们的原始变量中,而超过阈值的子集存储在单独的变量中,以防您想在两者之间进行交叉引用。如果您想适应情况 2,除了定义阈值之外,代码与情况 1 相同。

代码来自:

% New - Find those bounding boxes that surpassed a threshold
T = 0.7; % Define threshold here
idx = scores >= T;
% [score, idx] = max(score);

...现在将更改为:

% New - Find those bounding boxes that surpassed a threshold
perc = 0.85; % 85% of the maximum threshold
T = perc * max(score); % Define threshold here
idx = score >= T;

最终结果将是图像中检测到的对象的多个边界框 - 每个检测到的对象一个注释。

关于matlab - 如何在自定义数据集上执行 RCNN 对象检测?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42930027/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com