本文总结红外弱小目标检测领域论文中经常出现的算法评价指标,并对部分评价指标用MATLAB实现。
目前总结的评价指标最为常见,像检测率、ROC曲线这些都要基于大量的实验才能得到数据,进而绘制表格或曲线对算法进行客观评价。(所以,有好的idea,一定要尽快做实验呀!)
本文代码全部原创,若有不足之处,欢迎指正。
检测率与虚警率的定义如图1.
图1 检测率与虚警率,摘自[1]
关于检测率的理解:
关于虚警率的理解:
怎样的检测结果才可以被看作是“true detection“?
必须同时满足两个条件:
式中,表示目标的像素平均值,分别表示目标周围背景的像素平均值和像素标准差。
图2 目标及其邻域示意图,摘自[1],其中d的大小不超过20个像素
在阅读文献时,经常可以看到目标的三维灰度图,作者通过展示目标增强前与增强后,或背景抑制前和抑制后的三维灰度图来直观地向读者呈现其算法的效果。
此外绘制目标的三维灰度图也可以直观的感受目标的SCR。所以,我们先来学习如何绘制目标的三维灰度图。
补充说明,绘制目标的三维灰度图有两种选择:
(1)有些文章会选择绘制整张图的三维灰度图,然后用箭头—>标示出目标的“峰值”;
(2)也可以选择绘制目标的局部区域,观察目标的局部对比度是否得到了增强。
这里给出分别给出两种方式的MATLAB代码与图例。
%% 绘制图像的三维灰度图
img1 = imread('images/1.jpg');
if (size(img1,3) > 1)
img1 = rgb2gray(img1);
end
subplot(221)
imshow(img1);title('原图');
sub_img1 = img1(68:88,99:119); % 这里需要人工选择目标区域位置及大小
subplot(222)
imshow(sub_img1);title('目标局部图像 20*20');
subplot(223)
[y,x] = size(img1);
[X,Y] = meshgrid(1:x, 1:y);
surf(X, Y, img1);title('全局三维灰度图');
shading interp;
subplot(224)
[sub_y, sub_x] = size(sub_img1);
[sub_X, sub_Y] = meshgrid(1:sub_x, 1:sub_y);
surf(sub_X, sub_Y, sub_img1);title('局部三维灰度图');
shading interp;
图3 含弱小目标的红外图像的全局三维灰度图与局部三维灰度图
function scr = CalculateSCR(img, pos, t_size, d)
%% 功能说明:计算弱小目标的SCR
%% 参数说明: img -- 原图像
% pos -- 目标在原图像中的位置
% t_size = [a,b]-- 目标尺寸
% d -- 目标邻域半径,最终计算的目标及其局部区域的大小为(2d+a)*(2d+b)
% 1. 转灰度图
if(size(img,3)>1)
img = rgb2gray(img);
end
% 2. 目标大小为a*b
a = t_size(1);
b = t_size(2);
T = img(ceil(pos(1)-b/2):ceil(pos(1)+b/2), ceil(pos(2)-a/2):ceil(pos(2)+a/2));
% 3. 目标与其周围邻域,大小为(a+2d)*(b+2d)
B = img(ceil(pos(1)-b/2-d):ceil(pos(1)+b/2+d), ceil(pos(2)-a/2-d):ceil(pos(2)+a/2+d));
B(d:d+b,d:d+a) = 0;
% 4. 分别显示目标图与背景图
figure
imshow(T);title('Target');
figure
imshow(B);title('Background');
% 5. 分别计算目标的灰度均值、背景的灰度均值与标准差
T_avg = mean(T(:));
B_avg = sum(B(:)) / ((a+2*d)*(b+2*d) - a*b);
size(B)
B_1 = B(1:d,:);
B_2 = B(a+d+1:a+2*d,:);
B_3 = B(d+1:d+a, 1:d);
B_4 = B(d+1:d+a, d+b+1: 2*d+b);
B_final = [B_1(:)',B_2(:)',B_3(:)',B_4(:)'];
size(B_final);
B_std = std(double(B_final));
% 6. 计算SCR
scr = abs(T_avg - B_avg)/B_std;
end
图4 原图、目标图与局部背景图,
这里原图大小为(150,200),手动选择的目标位置为pos=(80,108),目标尺寸为t_size=(4,4),d = 10.
当(1)一张图中含有多个目标;(2)图像序列中含有多个目标时,目标的平均信杂比来评估多目标检测的难度与算法的性能。
式中,N表示目标的数量;表示第i个目标的信杂比。
文献[1]中,还使用 分别表示被检测的真实目标与未被检测出的真实目标的平均信杂比。通常,在检测虚警率确定的情况下,越小,算法的检测性能越好。
弱小目标检测中的ROC曲线与机器学习中的ROC曲线定义略微不同。
弱小目标检测中的ROC曲线,以虚警率(false-rate, FA)为横轴,以检测率(Probability of detection, PD)为纵轴(FA,PD的定义见第一部分)。
通常,虚警率相同的情况下,检测率越高,则算法的性能越好。
图5 不同算法的ROC曲线对比,摘自[1]
绘制ROC曲线并不难,难点在于需要通过实验获取数据——不同算法的在相同虚警率下的检测率。
这里给出MATLAB绘制折线图的简单示例,包含一些小技巧:设置x, y轴的间隔;设置线宽与线的样式;设置x, y坐标轴描述
x = 0:0.5:15;
%% 这里需要替换为实验结果
Pd_1 = 1 - exp(-x) ;
Pd_2 = 1 - exp(-1/2*x);
% 设置显示样式与线宽LineWidth
plot(x, Pd_1, '-ob', 'LineWidth', 2);
hold on
plot(x, Pd_2, '-*r', 'LineWidth', 1);
% 设置坐标轴范围
axis([0,15,0,1]);
% 设置坐标轴范围及间隔
set(gca, 'XTick', [0:5:15]);
set(gca, 'YTick', [0:0.1:1]);
% 显示图例
legend('method_1', 'method_2');
% 显示坐标轴描述与标题
xlabel('False-rate, F_a');
ylabel('Probability of detection, P_d');
title('不同算法的ROC曲线');
图6 ROC示例图
[1] C. Gao et al., “Infrared Patch-Image Model for Small Target Detection in a Single Image,” vol. 22, no. 12, pp. 4996–5009, 2013.