2022.1.12的记录:
一共三个检测标准,检测概率、虚警概率、信号参数平均误差。
N = 0; % 实际信号总数
M = 0; % 检测出的信号个数
Mt = 0; % M中真实的信号个数,即检测到的信号中真的是信号的个数,标准IOU>0.8
Mf = 0; % M中虚假的信号个数,即误测的信号个数
Pd = 0; % 检测概率 Pd = Mt/N
Pf = 0; % 虚警概率 Pf = Mf/M
Eavg = 0; % 信息参数平均误差
为了方便计算检测到的信号中真的是信号的个数,修改yolov5代码中detect.py中,增加保存一个conf。
计算信息参数平均误差时遇到一个问题,因为每张图同一个信号不止一个,我无法区分同样的信号。就像下面右图中检测出2个2FSK信号,但是真实有3个2FSK信号,我该如何在真实的这3个2FSK信号中找到预测到的这俩个2FSK信号呢。
先拟定一个无可奈何的方案:将每张图中每个种类的信号个数限定为1
real_path = 'E:\yolov5\data\images\labels\'; % 真实数据的路径
calculate_path = 'E:\yolov5\runs\detect\exp36\labels\'; % 预测结果的路径
num = length(dir([real_path, '*.txt'])); % 统计label文本文件的数量
N = 0; % 实际信号总数
M = 0; % 检测出的信号个数
Mt = 0; % M中真实的信号个数,即检测到的信号中真的是信号的个数
Mf = 0; % M中虚假的信号个数,即误测的信号个数
Pd = 0; % 检测概率 Pd = Mt/N
Pf = 0; % 虚警概率 Pf = Mf/M
Eavg = 0; % 信息参数平均误差
for i = 1:num
real_data = load([real_path,[num2str(i),'.txt']]); % 读取真实文本中的label信息
calculate_data = load([calculate_path,[num2str(i),'.txt']]); % 读取预测文本中的label信息
N = N + length(real_data(:,1));
M = M + length(calculate_data(:,1));
Mt = Mt + sum(calculate_data(:, 6) > 0.8);
end
Mf = M - Mt;
Pd = Mt/N;
Pf = Mf/M;
2022.1.13的记录:
matlab函数增的输入参数不设置就使用默认值的方法:
https://blog.csdn.net/weixin_30528371/article/details/98037085?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0.no_search_link&spm=1001.2101.3001.4242.1&utm_relevant_index=3
在PlotData.py中使用俩个信号中心点欧式距离最小来配对真实信号和预测信号,从而计算信号参数平均误差率。
for i = 1:num
real_data = load([real_path,[num2str(i),'.txt']]); % 读取真实文本中的label信息
calculate_data = load([calculate_path,[num2str(i),'.txt']]); % 读取预测文本中的label信息
m = length(calculate_data(:,1)); % 一张图检测出的信号的个数
n = length(real_data(:,1)); % 一张图中实际信号的个数
x = find(calculate_data(:, 6) > 0.8); % 找出每个真实信号所在行的索引值
mt = length(x); % 一张图中真实信号的个数
N = N + n;
M = M + m;
Mt = Mt + mt;
for ii = 1:mt
d = []; % 刷新数组d的长度
for iii = 1:n
% 用俩个信号中心点的欧氏距离的最小值来找到相对于的俩个信号
d(iii) = (calculate_data(x(ii), 2) - real_data(iii, 2))^2 +...
(calculate_data(x(ii), 2) - real_data(iii, 2))^2;
end
[mmax, note] = min(d);
Fc = real_data(note, 2); % 信号频率真实值
Bw = real_data(note, 4); % 信号带宽真实值
Ts = real_data(note, 3) - real_data(note, 5)/2; % 信号开始时间真实值
Te = real_data(note, 3) + real_data(note, 5)/2; % 信号终止时间真实值
fc = calculate_data(x(ii), 2); % 信号频率预测值
bw = calculate_data(x(ii), 4); % 信号带宽预测值
ts = calculate_data(x(ii), 3) - calculate_data(x(ii), 5)/2; % 信号开始时间预测值
te = calculate_data(x(ii), 3) + calculate_data(x(ii), 5)/2; % 信号开始时间预测值
T = real_data(note, 5); % 信号时长真实值
Eavg = Eavg + abs(Fc-fc)/Bw + abs(Bw-bw)/Bw + abs(Ts-ts)/T...
+ abs(Te-te)/T;
% nnn = nnn +1;
end
end
Eavg = Eavg/(4 * Mt);
然后还修改了Signals_STFT,将函数内的随机信噪比改为函数的输入,使得可以通过输入特定值达到输出特定信噪比的图片的目的,为了以后画图做准备。同时也对Detect进行修改,以2为步进,0-16信噪比,每一个信噪比画1000张图用于对模型的验证,也会之后的画图提供数据支持。
% Detect.py 生成用于验证模型的图片和标签文件
num = 1000; %每个信噪比下图片的数量
for snr = 0:2:16
save_path = ['E:\yolov5\data\images\', num2str(snr), 'dB\'];% 数据集根路径
label_path = [save_path, 'labels\'];
if(exist(label_path, 'dir') ~= 7) % 判断文件夹是否存在
mkdir(label_path); % 不存在则创建文件夹
end
for i = 1:num
[matrix, random_time] = Signals_STFT(snr); % 得到含有信号类型、f1、f2的矩阵
saveas(gcf,[save_path, num2str(i), '.jpg']); % 保存图片
close(); %关闭图片
class = matrix(:,1);
fid = fopen([label_path, [num2str(i), '.txt']], 'w'); % 创建label文本文件
for n = 1:length(matrix(:, 1)) % length(matrix(:, 1))信号个数
signal_class = class(n);
if signal_class == 4 % 2FSK区别对待
x = (matrix(n, 2) + (matrix(n, 3) - matrix(n, 2))/2)/120000; % 中心点横坐标及中心频率
y = 0.5; % 中心点纵坐标及中心时刻位置
w = (matrix(n, 3)-matrix(n, 2))/120000 + 14/875; % 宽度 为了画出的框可以包含信号而增加像素点
h = 1; % 高度及信号时长
elseif signal_class == 3 % 2PSK区别对待
x = matrix(n, 3)/120000; % 中心点横坐标及中心频率
y = random_time(n, 1); % 中心点纵坐标及中心时刻位置
w = 14/875; % 宽度 为了画出的框可以包含信号而增加像素点
h = random_time(n, 2); % 高度及信号时长
elseif signal_class == 1 % FM区别对待
x = matrix(n, 3)/120000; % 中心点横坐标及中心频率
y = random_time(n, 1); % 中心点纵坐标及中心时刻位置
% 基带信号频率:500 调制指数 5
w = 2 * (5+1) * 500/120000 + 14/875; % 宽度 为了画出的框可以包含信号而增加像素点
h = random_time(n, 2); % 高度及信号时长
else % AM和DSB
x = matrix(n, 3)/120000; % 中心点横坐标及中心频率
y = random_time(n, 1); % 中心点纵坐标及中心时刻位置
w = 2 * matrix(n, 2) / 120000 + 14/875; % 宽度及带宽 为了画出的框可以包含信号而增加像素点
h = random_time(n, 2); % 高度及信号时长
end
signal_class = num2str(signal_class);
x = num2str(x);
y = num2str(y);
w = num2str(w);
h = num2str(h);
% ascii码 空格32 回车13
label = strcat(signal_class, 32, x, 32, y, 32, w, 32, h, 13);
for jj = 1:length(label)
fprintf(fid, '%s', label(jj));
end
end
fclose(fid);
disp(['信噪比为',num2str(snr),'dB下的第',num2str(i),'张']);
end
end