文章目录
- 2022.1.16日的记录
- 2022.1.17日的记录
- 2022.1.22日的记录
2022.1.16日的记录
说下明天要做的事情
1、通过回看吴恩达老师的深度学习视频中目标检测相关的视频,我意识到我之前有个地方搞错了,明天需要修改的地方。
PlotData.m文件中对Mt的计算方法。不应该直接视预测精度也就是Pc大于0.8的为Mt,而是应该将网络输出的box与实际上的box做一个交并比,最后iou大于0.8的才是Mt。具体步骤:首先遍历整个预测输出的labels文件和实际上的labels文件用俩个中心点之间距离最短找到同一类别中与预测框对应的实际框,然后计算俩这的iou,然后把满足iou>0.8的作为Mt。同样需要修改的是yolov5代码中的
line = (cls, *xywh, conf) if save_conf else (cls, *xywh, conf) # label format
改为
line = (cls, *xywh, conf) if save_conf else (cls, *xywh) # label format
不需要输出他的置信度。
2、matlab中的画图部分过于简略,需要丰富起来。
3、yolov5训练过程可视化。之前还能用的wandb突然用不了了,伤心。
2022.1.17日的记录
中午满怀欣喜的用刚生成的2w张图来训练,结果,python直接报了没有归一化的错误,而且一看全部都是2fsk的宽度信息报错。我就知道matlab代码里关于2fsk的部分有一些忘记更改了。
之前2fsk的序号一直是4,后来为了方便和python一样的序列编号。就把2fsk的序号改成了2.结果代码里一共三处要改,我是所有忘记改了。。。gan!只能重新生成了。
修改的第二处,之前2fsk的时间长度一直是人为设置为最大时长1s,因为我之前设的是1s8个bit,一个bit也就只有0.125s,如果随机的话,在低信噪比的情况下会出现2fsk和2psk的信号在时频图中看是一样的。后来修改为1s10个bit,一个bit0.1s,将2fsk的时间长度和其他信号一样参与随机。
%% 整合信号
for nnum = 1:signals_num % 每张图一共signals_num个信号
% 随机抽选class中的一个信号种类
signal_class = class(randi([1, length(class)]));
% 创建信号
[x, f1, f2] = CreateSignal(signal_class, t);
% 将创建的signals_num个信号放入信号矩阵中
signals_matrix = [signals_matrix; signal_class, f1, f2];
% signals_matrix尺寸为 signals_num * 3
x_signal = x_signal + x.*(t > (random_time(nnum, 1) - random_time(nnum, 2)/2) ...
& t < (random_time(nnum, 1) + random_time(nnum, 2)/2));
end
x_signal = x_signal .* Z_Rayleigh(8,100,t); % 经过瑞利衰落信道
x_signal = real(x_signal); % 取实部
x_signal = awgn(x_signal, snr); % 加入高斯白噪声
修改的第三处:寻找Mt的代码修改。可以说是把PlotData文件重写了一遍,www。
%% 计算三个指标
for dB = 0:2:16 % 遍历每个SNR下的label文件夹
for i = 1:num % 遍历每个SNR下的label文件夹下的一共num(1000)个labels文本文件,包括预测和实际
% 读取一个实际文本中的所有label信息
real_data = load([[real_path, num2str(dB), 'dB\labels\'],[num2str(i),'.txt']]);
% 读取一个预测文本中的所有label信息
calculate_data = load([[calculate_path, num2str(dB), 'dB\labels\'],[num2str(i),'.txt']]);
m = length(calculate_data(:,1)); % 一张图中检测出的信号的个数
n = length(real_data(:,1)); % 一张图中实际信号的个数
N = N + n; % 总共的实际信号数量 = 求和(每张图中实际信号的个数)
M = M + m; % 总共检测出的信号数量 = 求和(每张图中检测出的信号数量)
%Mt = Mt + mt;
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
end
Pd = Mt/N; % 检测概率
Pf = Mf/M; % 虚警概率
Eavg = Eavg/(4 * Mt);
画出的图片
2022.1.22日的记录
今天画检测参数曲线图的时候发现不太对劲,明明每个dB下的图都是一样的为啥,每次实际信号都会增加。原因:每次循环之后没有刷新参数。
增加刷新代码: