文章目录
2022.1.25日的记录
之前的检测参数计算代码规定的是一次性就计算所有的数据,这给我想一张图一张图的看效果造成了困扰。所以修改了一下代码。一次只计算一个图。
for ii = 1:m % 遍历一个预测label文件中的所有信号
calculate_signal = calculate_data(ii, :); % 一个预测信号
delect_class = calculate_signal(1); % 得到预测信号的类别
% 找出文件名一样的实际信号label文件中与calculate_signal相同类别的信号的行序列号
x = find(real_data(:, 1) == delect_class);
if isempty(x) % 检测出了实际信号中不存在的信号时
Mf = Mf + 1; % 虚假信号加1
else
d = []; % 刷新数组d的长度
for iii = 1:length(x) % 遍历所有找到的与calculate_signal类别相同的实际信号
% 用俩个信号中心点的欧氏距离的最小值来找到与calculate_signal匹配的实际信号
x_c = calculate_signal(2); y_c = calculate_signal(3); % calculate_signal中心坐标(x_c,y_c)
x_r = real_data(x(iii), 2); y_r = real_data(x(iii), 3); % 实际信号中心坐标(x_r,y_r)
d(iii) = (x_c - x_r)^2 + (y_c - y_r)^2; % 算俩点距离的平方
end
[mmin, note] = min(d); % 得到最小值所在的d向量的序列号note
signal_note = x(note); % 得到最小值所对应的实际信号的在矩阵real_data中的行序列号signal_note
real_signal = real_data(signal_note, :); % 得到与calculate_signal匹配的实际信号
cbox = calculate_signal(2: 5); % calculate_signal的box [x, y, w, h]
rbox = real_signal(2: 5); % real_signal的box [x, y, w, h]
iou = Box_IOU(cbox, rbox); % 计算iou
if iou > 0.8
Mt = Mt + 1; % 真实信号个数加1
Fc = real_signal(2); % 实际信号频率值
Bw = real_signal(4); % 实际信号带宽值
Ts = real_signal(3) - real_signal(5)/2; % 实际信号开始时间值
Te = real_signal(3) + real_signal(5)/2; % 实际信号终止时间值
fc = calculate_signal(2); % 真实信号频率值
bw = calculate_signal(4); % 真实信号带宽值
ts = calculate_signal(3) - calculate_signal(5)/2; % 真实信号开始时间值
te = calculate_signal(3) + calculate_signal(5)/2; % 真实信号开始时间值
T = real_signal(5); % 实际信号时长值
Eavg = Eavg + abs(Fc-fc)/Bw + abs(Bw-bw)/Bw + abs(Ts-ts)/T...
+ abs(Te-te)/T;
else
Mf = Mf + 1; % 虚假信号加1
end
end
end
画图代码中增加和修改了:
之前每个图的参数都是在循环中计算,今天修改为先将参数全部汇总到一个矩阵中,最后在使用sum函数计算。方便观察数据。
for i = 1:num % 遍历每个SNR下的label文件夹下的一共num(1000)个labels文本文件,包括预测和实际
% 判断文件是否存在,存在就读取文件。yolov5如果一张图检测不到目标就不会输出txt文件。
if(exist([[CIOU_DIOU_NMS_5000_path, num2str(dB), 'dB\labels\'],[num2str(i),'.txt']], 'file') == 2)
ML = PdPfEavg([[real_path, num2str(dB), 'dB\labels\'],[num2str(i),'.txt']],...
[[CIOU_DIOU_NMS_5000_path, num2str(dB), 'dB\labels\'],[num2str(i),'.txt']]);
% N3ME_5000 : [N, M, Mt, Mf, Eavg]
N3ME_5000 = [N3ME_5000; ML];
else % 不存在就记录下对应的实际信号的个数并开始下一个label文件
real_data = load([[real_path, num2str(dB), 'dB\labels\'],[num2str(i),'.txt']]);
N = length(real_data(:,1)); % 一张图中实际信号的个数
N3ME_5000 = [N3ME_5000; N, 0, 0, 0, 0]; % 记录对应的实际信号的个数N并填充矩阵行数
disp(['训练集5000中', [num2str(dB),'dB下第', num2str(i), '张一个都没有检测出来']])
continue;
end
增加了将所有的计算结果用一个3维数组保存下来的代码
N3ME_20000_dB(:, :, dB/2 + 1) = N3ME_20000; % 保存所有db下的结果
增加了打印模型不敏感的图片的代码
disp(['训练集20000中', [num2str(dB),'dB下第', num2str(i), '张一个都没有检测出来']])