H.264视频编解码的FPGA源码分析(二)帧内预测2

目录

  • `intra_4×4`帧内预测
    • 下左对角线模式`INTRA4x4_DDL`
    • 下右对角线模式`INTRA4x4_DDR`
    • 右垂直模式`INTRA4x4_VR`
    • 下水平模式`INTRA4x4_HD`
    • 左垂直模式`INTRA4x4_VL`
    • 上水平模式`INTRA4x4_HU`
  • 变换编码
    • 为什么要使用Hadamard变换
    • `Rate Distortion Optimation`
    • `lambda`值的产生

前述文章链接在此
H.264视频编解码的FPGA源码分析(一)输入数据分析
H.264视频编解码的FPGA源码分析(二)帧内预测1

intra_4×4帧内预测

书接上文,写到intra_4×4帧内预测的9中模式

下左对角线模式INTRA4x4_DDL

pixel_pred00=( ref00_t  + (ref01_t<<1 ) + ref02_t  + 2'd2 ) >>2 ;
pixel_pred01=( ref01_t  + (ref02_t<<1 ) + ref03_t  + 2'd2 ) >>2 ;
pixel_pred02=( ref02_t  + (ref03_t<<1 ) + ref00_tr + 2'd2 ) >>2 ;
pixel_pred03=( ref03_t  + (ref00_tr<<1) + ref01_tr + 2'd2 ) >>2 ;
pixel_pred10=( ref01_t  + (ref02_t<<1 ) + ref03_t  + 2'd2 ) >>2 ;
pixel_pred11=( ref02_t  + (ref03_t<<1 ) + ref00_tr + 2'd2 ) >>2 ;
pixel_pred12=( ref03_t  + (ref00_tr<<1) + ref01_tr + 2'd2 ) >>2 ;
pixel_pred13=( ref00_tr + (ref01_tr<<1 )+ ref02_tr + 2'd2 ) >>2 ;
pixel_pred20=( ref02_t  + (ref03_t<<1 ) + ref00_tr + 2'd2 ) >>2 ;
pixel_pred21=( ref03_t  + (ref00_tr<<1) + ref01_tr + 2'd2 ) >>2 ;
pixel_pred22=( ref00_tr + (ref01_tr<<1) + ref02_tr + 2'd2 ) >>2 ;
pixel_pred23=( ref01_tr + (ref02_tr<<1) + ref03_tr + 2'd2 ) >>2 ;
pixel_pred30=( ref03_t  + (ref00_tr<<1) + ref01_tr + 2'd2 ) >>2 ;
pixel_pred31=( ref00_tr + (ref01_tr<<1) + ref02_tr + 2'd2 ) >>2 ;
pixel_pred32=( ref01_tr + (ref02_tr<<1) + ref03_tr + 2'd2 ) >>2 ;
pixel_pred33=( ref02_tr + (ref03_tr<<1) + ref03_tr + 2'd2 ) >>2 ;

在这里插入图片描述
只有A、B、C、D、I、J、K、L都存在的时候才可以使用
在这里插入图片描述
对应关系示意图

ref00_tl (M)ref00_t(A)ref01_t (B)ref02_t (C)ref03_t (D)ref00_tr (E)ref01_tr (F)ref02_tr (G)ref03_tr (H)
ref00_lpred00pred01pred02pred03
ref01_lpred10pred11pred12pred13
ref02_lpred20pred21pred22pred23
ref03_lpred30pred31pred32pred33

这波操作的解释
H.264帧内预测可以分为三个步骤

  1. 相邻像素的获取
    在这里插入图片描述
    在遇到边界情况时,相邻参考像素可能会不存在或不可用,此时会使用最邻近的像素进行填充。举个栗子,A中所有区域不存在,则A中所有像素用B最下方的像素填充,如果所有区域参考像素都不可用,则使用固定值填充
    R = 1 << (BitDepth - 1)
  2. 参考像素的滤波
    这一步就是计算公式的来源
    滤波的目的:更好的利用邻近像素之间的相关性,提高预测精度
    常规滤波方法
    在这里插入图片描述
    相当于一个抽头系数为[0.25, 0.25, 0.5]的滤波器
    强滤波方法:只针对32*32TU进行,且需要满足:
    abs(A + C - 2B) < Thresholdabs(C + E - 2D) < Threshold
    在这里插入图片描述
  3. 预测像素的计算(有时间再说)

下右对角线模式INTRA4x4_DDR

pixel_pred00=( ref00_l  + (ref00_tl<<1) + ref00_t + 2'd2 ) >> 2;
pixel_pred01=( ref00_tl + (ref00_t<<1 ) + ref01_t + 2'd2 ) >> 2;
pixel_pred02=( ref00_t  + (ref01_t<<1 ) + ref02_t + 2'd2 ) >> 2;
pixel_pred03=( ref01_t  + (ref02_t<<1 ) + ref03_t + 2'd2 ) >> 2;
pixel_pred10=( ref00_tl + (ref00_l<<1 ) + ref01_l + 2'd2 ) >> 2;
pixel_pred11=( ref00_l  + (ref00_tl<<1) + ref00_t + 2'd2 ) >> 2;
pixel_pred12=( ref00_tl + (ref00_t<<1 ) + ref01_t + 2'd2 ) >> 2;
pixel_pred13=( ref00_t  + (ref01_t<<1 ) + ref02_t + 2'd2 ) >> 2;
pixel_pred20=( ref00_l  + (ref01_l<<1 ) + ref02_l + 2'd2 ) >> 2;
pixel_pred21=( ref00_tl + (ref00_l<<1 ) + ref01_l + 2'd2 ) >> 2;
pixel_pred22=( ref00_l  + (ref00_tl<<1) + ref00_t + 2'd2 ) >> 2;
pixel_pred23=( ref00_tl + (ref00_t<<1 ) + ref01_t + 2'd2 ) >> 2;
pixel_pred30=( ref01_l  + (ref02_l<<1 ) + ref03_l + 2'd2 ) >> 2;
pixel_pred31=( ref00_l  + (ref01_l<<1 ) + ref02_l + 2'd2 ) >> 2;
pixel_pred32=( ref00_tl + (ref00_l<<1 ) + ref01_l + 2'd2 ) >> 2;
pixel_pred33=( ref00_l  + (ref00_tl<<1) + ref00_t + 2'd2 ) >> 2;

在这里插入图片描述
对应关系
在这里插入图片描述
a的预测值:(I + 2M + A + 2) / 4
b的预测值:(M + 2A + B + 2) / 4
c的预测值:(A + 2B + C + 2) / 4
d的预测值:(B + 2C + D + 2) / 4


e的预测值:(M + 2I + J + 2) / 4
f的预测值:(I + 2M + A + 2) / 4 和a是一样的
g的预测值:(M + 2A + B + 2) / 4 和b是一样的
h的预测值:(A + 2B + C + 2) / 4 和c是一样的


i的预测值:(I + 2J + K + 2) / 4
j的预测值:(M + 2I + J + 2) / 4 和e是一样的
k的预测值:(I + 2M + A + 2) / 4 和a是一样的
l的预测值:(M + 2A + B + 2) / 4 和b是一样的


m的预测值:(J + 2K+ L + 2) / 4
n的预测值:(I + 2J + K + 2) / 4 和i是一样的
o的预测值:(M + 2I + J + 2) / 4 和e是一样的
p的预测值:(I + 2M + A + 2) / 4 和a是一样的


你找一找规律:
在同一根箭头上的一定是相同的值
从箭头起点的三个值出发去计算

右垂直模式INTRA4x4_VR

pixel_pred00=( ref00_tl +                 ref00_t  + 1'd1 ) >> 1;
pixel_pred01=( ref00_t  +                 ref01_t  + 1'd1 ) >> 1;
pixel_pred02=( ref01_t  +                 ref02_t  + 1'd1 ) >> 1;
pixel_pred03=( ref02_t  +                 ref03_t  + 1'd1 ) >> 1;
pixel_pred10=( ref00_l  + (ref00_tl<<1) + ref00_t  + 2'd2 ) >> 2;
pixel_pred11=( ref00_tl + (ref00_t<<1 ) + ref01_t  + 2'd2 ) >> 2;
pixel_pred12=( ref00_t  + (ref01_t<<1 ) + ref02_t  + 2'd2 ) >> 2;
pixel_pred13=( ref01_t  + (ref02_t<<1 ) + ref03_t  + 2'd2 ) >> 2;
pixel_pred20=( ref01_l  + (ref00_l<<1 ) + ref00_tl + 2'd2 ) >> 2;
pixel_pred21=( ref00_tl +                 ref00_t  + 1'd1 ) >> 1;
pixel_pred22=( ref00_t  +                 ref01_t  + 1'd1 ) >> 1;
pixel_pred23=( ref01_t  +                 ref02_t  + 1'd1 ) >> 1;
pixel_pred30=( ref00_l  + (ref01_l<<1 ) + ref02_l  + 2'd2 ) >> 2;
pixel_pred31=( ref00_l  + (ref00_tl<<1) + ref00_t  + 2'd2 ) >> 2;
pixel_pred32=( ref00_tl + (ref00_t<<1 ) + ref01_t  + 2'd2 ) >> 2;
pixel_pred33=( ref00_t  + (ref01_t<<1 ) + ref02_t  + 2'd2 ) >> 2;

在这里插入图片描述

下水平模式INTRA4x4_HD

pixel_pred00=( ref00_l  +                 ref00_tl + 1'd1 ) >> 1;
pixel_pred01=( ref00_l  + (ref00_tl<<1) + ref00_t  + 2'd2 ) >> 2;
pixel_pred02=( ref00_tl + (ref00_t<<1 ) + ref01_t  + 2'd2 ) >> 2;
pixel_pred03=( ref00_t  + (ref01_t<<1 ) + ref02_t  + 2'd2 ) >> 2;
pixel_pred10=( ref00_l  +                 ref01_l  + 1'd1 ) >> 1;
pixel_pred11=( ref01_l  + (ref00_l<<1 ) + ref00_tl + 2'd2 ) >> 2;
pixel_pred12=( ref00_l  +                 ref00_tl + 1'd1 ) >> 1;
pixel_pred13=( ref00_l  + (ref00_tl<<1) + ref00_t  + 2'd2 ) >> 2;
pixel_pred20=( ref02_l  +                 ref01_l  + 1'd1 ) >> 1;
pixel_pred21=( ref02_l  + (ref01_l<<1 ) + ref00_l  + 2'd2 ) >> 2;
pixel_pred22=( ref00_l  +                 ref01_l  + 1'd1 ) >> 1;
pixel_pred23=( ref01_l  + (ref00_l<<1 ) + ref00_tl + 2'd2 ) >> 2;
pixel_pred30=( ref03_l  +                 ref02_l  + 1'd1 ) >> 1;
pixel_pred31=( ref03_l  + (ref02_l<<1 ) + ref01_l  + 2'd2 ) >> 2;
pixel_pred32=( ref02_l  +                 ref01_l  + 1'd1 ) >> 1;
pixel_pred33=( ref02_l  + (ref01_l<<1 ) + ref00_l  + 2'd2 ) >> 2;

在这里插入图片描述

左垂直模式INTRA4x4_VL

pixel_pred00=( ref00_t  +                 ref01_t  + 1'd1 ) >> 1;
pixel_pred01=( ref01_t  +                 ref02_t  + 1'd1 ) >> 1;
pixel_pred02=( ref02_t  +                 ref03_t  + 1'd1 ) >> 1;
pixel_pred03=( ref03_t  +                 ref00_tr + 1'd1 ) >> 1;
pixel_pred10=( ref00_t  + (ref01_t<<1 ) + ref02_t  + 2'd2 ) >> 2;
pixel_pred11=( ref01_t  + (ref02_t<<1 ) + ref03_t  + 2'd2 ) >> 2;
pixel_pred12=( ref02_t  + (ref03_t<<1 ) + ref00_tr + 2'd2 ) >> 2;
pixel_pred13=( ref03_t  + (ref00_tr<<1) + ref01_tr + 2'd2 ) >> 2;
pixel_pred20=( ref01_t  +                 ref02_t  + 1'd1 ) >> 1;
pixel_pred21=( ref02_t  +                 ref03_t  + 1'd1 ) >> 1;
pixel_pred22=( ref03_t  +                 ref00_tr + 1'd1 ) >> 1;
pixel_pred23=( ref00_tr +                 ref01_tr + 1'd1 ) >> 1;
pixel_pred30=( ref01_t  + (ref02_t<<1 ) + ref03_t  + 2'd2 ) >> 2;
pixel_pred31=( ref02_t  + (ref03_t<<1 ) + ref00_tr + 2'd2 ) >> 2;
pixel_pred32=( ref03_t  + (ref00_tr<<1) + ref01_tr + 2'd2 ) >> 2;
pixel_pred33=( ref00_tr + (ref01_tr<<1) + ref02_tr + 2'd2 ) >> 2;

在这里插入图片描述

上水平模式INTRA4x4_HU

pixel_pred00=( ref01_l  +                 ref00_l  + 1'd1 ) >> 1;
pixel_pred01=( ref02_l  + (ref01_l<<1 ) + ref00_l  + 2'd2 ) >> 2;
pixel_pred02=( ref02_l  +                 ref01_l  + 1'd1 ) >> 1;
pixel_pred03=( ref03_l  + (ref02_l<<1 ) + ref01_l  + 2'd2 ) >> 2;
pixel_pred10=( ref02_l  +                 ref01_l  + 1'd1 ) >> 1;
pixel_pred11=( ref03_l  + (ref02_l<<1 ) + ref01_l  + 2'd2 ) >> 2;
pixel_pred12=( ref03_l  +                 ref02_l  + 1'd1 ) >> 1;
pixel_pred13=( ref03_l  + (ref03_l<<1 ) + ref02_l  + 2'd2 ) >> 2;
pixel_pred20=( ref03_l  +                 ref02_l  + 1'd1 ) >> 1;
pixel_pred21=( ref03_l  + (ref03_l<<1 ) + ref02_l  + 2'd2 ) >> 2;
pixel_pred22=ref03_l;
pixel_pred23=ref03_l;
pixel_pred30=ref03_l;
pixel_pred31=ref03_l;
pixel_pred32=ref03_l;
pixel_pred33=ref03_l;

在这里插入图片描述
在这里插入图片描述

原始值减去预测值得到残差值,然后赋值给pixel_res00_o
这个就是预测模块的输出
在这里插入图片描述
在这里插入图片描述
给到了这个,是个多路选择器
这个其实就是整个帧内预测模块的输出,不知道为啥是用个多路选择器表示的~

下面看一下参考值从哪来
在这里插入图片描述
在这里插入图片描述

变换编码

我们先不去思考参考值的由来,这个参考值并不是原始图像的值,而是原始像素值经过重建之后的值,所以被命名为rec,我们先看这个输出的残差值去了哪儿。

// hadamard transform
intra_hadamard4x4 u_intra4x4_hadamard4x4 (.ht_s00_i ( res00     ), .ht_s01_i ( res01     ), .ht_s02_i ( res02     ), .ht_s03_i ( res03     ),.ht_s10_i ( res10     ), .ht_s11_i ( res11     ), .ht_s12_i ( res12     ), .ht_s13_i ( res13     ),.ht_s20_i ( res20     ), .ht_s21_i ( res21     ), .ht_s22_i ( res22     ), .ht_s23_i ( res23     ),.ht_s30_i ( res30     ), .ht_s31_i ( res31     ), .ht_s32_i ( res32     ), .ht_s33_i ( res33     ),.ht_d00_o ( ht_coef00 ), .ht_d01_o ( ht_coef01 ), .ht_d02_o ( ht_coef02 ), .ht_d03_o ( ht_coef03 ),.ht_d10_o ( ht_coef10 ), .ht_d11_o ( ht_coef11 ), .ht_d12_o ( ht_coef12 ), .ht_d13_o ( ht_coef13 ),.ht_d20_o ( ht_coef20 ), .ht_d21_o ( ht_coef21 ), .ht_d22_o ( ht_coef22 ), .ht_d23_o ( ht_coef23 ),.ht_d30_o ( ht_coef30 ), .ht_d31_o ( ht_coef31 ), .ht_d32_o ( ht_coef32 ), .ht_d33_o ( ht_coef33 )
);

可以看到这里使用的是Hadamard矩阵变换

为什么要使用Hadamard变换

目的:为了进一步节省图像传输码率,需要对图像信号进行压缩,一般方法为去除图像信号中的相关性减小图像编码的动态范围,也就是变换编码和量化
变换编码的实质:将时域信号变换成频域信号(频域中信号能量大部分集中在低频部分,码率下降)
在这里插入图片描述
离散余弦变换和量化是在tq这个大模块里面进行的,这里直接对输出进行了hadamard变换,其实感觉看这张图会比较符合代码:
在这里插入图片描述
书上给出的蝶形结构是酱紫:
在这里插入图片描述
但是代码中的结构是这样的:
在这里插入图片描述
类似于这种FHT快速算法,但是注意到在结构上是水平交换的。
在这里插入图片描述
也就是说源代码中的更确切的说是hadamard的反变换?此处存疑。

该变换模块中有三类变量:

// 输入的残差块
input  [ 8:0] ht_s00_i, ht_s01_i, ht_s02_i, ht_s03_i;
// 输出的变换后值
output [12:0] ht_d00_o, ht_d01_o, ht_d02_o, ht_d03_o;
// 中间值
wire   [10:0] ht_t00_w, ht_t01_w, ht_t02_w, ht_t03_w;

可以看到

hadamard4 #(9)  u_hadamard_h0(.s0(ht_s00_i), .s1(ht_s01_i), .s2(ht_s02_i), .s3(ht_s03_i), .d0(ht_t00_w), .d1(ht_t01_w), .d2(ht_t02_w), .d3(ht_t03_w));
// 代码有删减
hadamard4 #(11) u_hadamard_v0(.s0(ht_t00_w), .s1(ht_t10_w), .s2(ht_t20_w), .s3(ht_t30_w), .d0(ht_d00_o), .d1(ht_d10_o), .d2(ht_d20_o), .d3(ht_d30_o));

此处经过了两次hadamard变换,先变换到中间值,再变换至输出值
因此,输入数据位宽是9,输出数据位宽变成了13
我怀疑这个地方根本没有根据快速算法来,而是直接执行了公式:
在这里插入图片描述
在这里插入图片描述
随后取绝对值

assign ht_abs00 = ht_coef00[`BIT_DEPTH+4]? (~ht_coef00[`BIT_DEPTH+3:0] + 1'b1) : ht_coef00[`BIT_DEPTH+3:0];

然后用寄存器寄存一级,计算Cost

assign ht_sum0 = (ht_abs00_r + ht_abs01_r) + (ht_abs02_r + ht_abs03_r);
assign ht_sum1 = (ht_abs10_r + ht_abs11_r) + (ht_abs12_r + ht_abs13_r);
assign ht_sum2 = (ht_abs20_r + ht_abs21_r) + (ht_abs22_r + ht_abs23_r);
assign ht_sum3 = (ht_abs30_r + ht_abs31_r) + (ht_abs32_r + ht_abs33_r);
assign ht_sum4x4 = (ht_sum0 + ht_sum1) + (ht_sum2 + ht_sum3); 

就是求宏块所有值的和
这个是为了计算RD-Cost

Rate Distortion Optimation

率失真优化
在H.264编码过程中,有许多模式可以选择(前面已经详细说过了),有些模式的图像失真比较小,但是码率很大;有些模式则相反。为了找到一种模式在不超过某最大码率的情况下,失真达到最小
这篇文章中有图解
因此有文献提出,用Hadamard-SATD来估算帧内预测的RD-CostSATD就是预测残差矩阵经过hadamard变换后的矩阵的绝对值的和。

该值作为intra_4x4_ctrl模块的输入值:

input  [`BIT_DEPTH+7:0]		ht_sum4x4_i; // 4x4 block hardamard sum
// 具体的计算公式为:
assign cost4x4     =  ((ht_sum4x4_i>>1) + cost_lambda);
// cost_lambda的取值:
assign cost_lambda = mode_equal_r1 ? 9'd0 : (lambda_i<<2);

也就是说如果mode_equal_r1 == 1cost直接就是绝对值和的一半,如果mode_equal_r1 == 0cost直接就是绝对值和的一半加上一个lambda

lambda值的产生

intra_lambda u_lambda(.qp_i		( qp		),.lambda_o	( lambda	)
);

输入信号qp

// qp pipeline
always @(posedge clk or negedge rst_n)beginif (!rst_n)qp_r <= 'b0;else if (ime_start || intra_start)qp_r <= sys_qp;
end

qp是量化模块中的量化参数,是整体top模块从外部设置的参数
量化步长QP 决定量化器的编码压缩率及图像精度
在量化和反量化过程中,量化步长QP决定量化器的编码压缩率图像精度。如果QP 比较大,则量化值FQ动态范围较小,其相应的编码长度较小,但反量化时损失较多的图像细节信息;如果QP比较小,则FQ动态范围较大,相应的编码长度也较大,但图像细节信息损失较少。编码器根据图像值实际动态范围自动改变QP 值,在编码长度和图像精度之间折衷,达到整体最佳效果
在这里插入图片描述
用量化步长推算lambda的值:

always @ (qp_i)case(qp_i)6'd0, 6'd1, 6'd2, 6'd3, 6'd4, 6'd5, 6'd6, 6'd7,6'd8, 6'd9, 6'd10, 6'd11,6'd12, 6'd13, 6'd14, 6'd15 :lambda=7'd1;6'd16, 6'd17, 6'd18, 6'd19 :lambda=2;6'd20, 6'd21, 6'd22 :lambda=7'd3;6'd23, 6'd24, 6'd25 :lambda=7'd4;6'd26 :lambda=7'd5;6'd27, 6'd28:lambda=7'd6;6'd29 : lambda=7'd7;6'd30 : lambda=7'd8;6'd31 : lambda=7'd9;6'd32 : lambda=7'd10;6'd33 : lambda=7'd11;6'd34 : lambda=7'd13;6'd35 : lambda=7'd14;6'd36 : lambda=7'd16;6'd37 : lambda=7'd18;6'd38 : lambda=7'd20;6'd39 : lambda=7'd23;6'd40 : lambda=7'd25;6'd41 : lambda=7'd29;6'd42 : lambda=7'd32;6'd43 : lambda=7'd36;6'd44 : lambda=7'd40;6'd45 : lambda=7'd45;6'd46 : lambda=7'd51;6'd47 : lambda=7'd57;6'd48 : lambda=7'd64;6'd49 : lambda=7'd72;6'd50 : lambda=7'd81;6'd51 : lambda=7'd91;default:lambda=7'd0 ;endcase

其实lambda就是拉格朗日因子,感觉就是提前打好的表

那么下面看一下mode_equal_r1这个决定拉格朗日取值的标志位:
在非复位状态下:

// Mode Compare
assign mode_equal = (curr_mode==i4x4_pred_mode_i) ? 1'b1 : 1'b0; always @(posedge clk or negedge rst_n) beginif(!rst_n)mode_equal_r  <= 1'b0;else if (mode_equal && valid_prediction)mode_equal_r  <= mode_equal;elsemode_equal_r  <= 1'b0;
end
// 代码有删减
// Current 4x4 sub-block valid intra prediction 
assign valid_prediction = (curr_state!=INTRA4x4_IDLE) && (curr_state!=INTRA4x4_WAIT);

这个i4x4_pred_mode_i是模块intra_4x4_pred_mode_gen的输出

// Mode gen module
intra_4x4_pred_mode_gen u_intra_4x4_pred_mode_gen(.clk  			( clk  			    ),.rst_n			( rst_n			    ),.mb_x			( mb_x			    ),.mb_y			( mb_y			    ),.blk4x4_num		( i4x4_num_i		),.intra4x4_bm_c	( i4x4_bm_o	    	),.intra4x4_bm_l	( i4x4_bm_l	    	),.intra4x4_bm_t	( i4x4_bm_t	    	),				.mode_pred      ( i4x4_pred_mode_o  )
);
assign 	mode_pred = (intra4x4_mode_t==4'd15 || intra4x4_mode_l==4'd15)? 4'd2 : (intra4x4_mode_t < intra4x4_mode_l) ? intra4x4_mode_t : intra4x4_mode_l;

这是一种拉格朗日因子的选择方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/66959.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2017CS231n笔记_S13生成模型

目录 S13.1Supervised vs Unsupervised Learning S13.2生成模型Generative Model S13.2.1Fully visible belief network S13.2.3变分编码器(Variational Autoencoders ,VAE) S13.2.4对抗生成网络(Generative Adversarial Networks ,GAN) S13.1Supervised vs Unsupervised…

使用Apache Spark进行预测性数据分析--数据准备篇

本文是Boutros El-Gamil的使用Apache Spark进行预测性数据分析系列文章的第二篇&#xff0c;http://www.data-automaton.com/2019/01/04/predictive-data-analytics-with-apache-spark-part-2-data-preparation/ 第一篇详见使用Apache Spark进行预测性数据分析--简介篇关于Wind…

王者服务器维护段位掉了,王者荣耀s13赛季段位掉段规则 s13段位重置掉段继承表[图]...

王者荣耀s13赛季段位会掉多少&#xff0c;新赛季开始的时候会重置到什么阶段呢&#xff1f;或许有的玩家朋友很好奇吧&#xff0c;下面是友情MT为大家带来的王者荣耀s13赛季段位掉段规则&#xff0c;s13段位重置掉段继承表&#xff0c;希望能帮助到大家&#xff01; 王者荣耀s1…

BRAUN A5S13B90-06速度传感器

向地球赎罪 美国加州有一个创业奇人名叫马修。 向地球赎罪少年时。他的梦想是“做爱迪生那样为世界带来光明的英雄”。 大学毕业后&#xff0c;他创办起圣诞灯制造厂&#xff0c;将美国的圣诞灯全面翻新&#xff0c;闪耀了整个美国&#xff0c;又将业务扩充到多种显示器&am…

倍福PLC标签导入威纶通触摸屏

使用到的软件TwinCAT2、威纶通EBpro V6.02.01.274 步骤1&#xff1a;编译PLC程序&#xff0c;生成后缀为".tpy"的文件。记住PLC程序路径 步骤2&#xff1a;打开威纶通EBpro&#xff0c;这里用到EBpro HMI版本是V6.02.01.274&#xff0c;和其他更高的版本大同小异。 …

威纶通触摸屏报错问题汇总

1、端口号被占用-在线模拟提示端口号8000被占 一旦出现这样提示以后&#xff0c;不管是离线模拟还是在线模拟都无法顺利往下执行&#xff0c;那么&#xff0c;怎么来解决这个问题呢&#xff1f;解决这个问题&#xff0c;通常分以下三类情况&#xff1a; 情况一 常规的解决方法…

威纶通触摸屏模板,直接打开就可以用 威纶通触摸屏,全部图库

威纶通触摸屏模板&#xff0c;直接打开就可以用&#xff0c;可根据自己要求修改&#xff0c; 威纶通触摸屏&#xff0c;全部图库。 ID:1219657830585655工控自动化技师

【告别传统】人工智能时代下,学习网安的成本有多低?

自我介绍⛵ &#x1f4e3;我是秋说&#xff0c;研究人工智能、大数据等前沿技术&#xff0c;传递Java、Python等语言知识。 &#x1f649;主页链接&#xff1a;秋说的博客 &#x1f4c6; 学习专栏推荐&#xff1a; 人工智能&#xff1a;创新无限&#x1f916; MySQL进阶之路&am…

理解unsafe-assume-no-moving-gc包

1. 背景 在之前的《Go与神经网络&#xff1a;张量计算》[1]一文中&#xff0c;不知道大家是否发现了&#xff0c;所有例子代码执行时&#xff0c;前面都加了一个环境变量ASSUME_NO_MOVING_GC_UNSAFE_RISK_IT_WITH&#xff0c;就像下面这样&#xff1a; $ASSUME_NO_MOVING_GC_UN…

探秘火山之巅:我在字节跳动的三年奇妙旅程

❤️点击上方&#xff0c;选择星标或置顶&#xff0c;每天给你送上干货❤️ 作者 | godweiyang 出品 | 公众号&#xff1a;算法码上来&#xff08;ID&#xff1a;GodNLP&#xff09; - BEGIN - 本文由ChatGPT润色&#xff0c;朱自清文笔 似乎已有半载的光阴&#xff0c;我未曾触…

OpenAI再获100亿美元?DoNotPay力砸100万仅为AI律师辩护复述;新冠四种亚型被机器学习算法进行归纳...

来源&#xff1a;AI科技大本营 本周AI界又有哪些新鲜事&#xff1f; 基础核心 超聚变服务器操作系统新版FusionOS 23发布 1月12日&#xff0c;“超聚变2023新品发布会”在北京举行。公司算力服务领域总裁郝峰会议上做了《桥接南北&#xff0c;融合生长&#xff0c;加速算力释放…

iPhone出黄色了/ 马斯克嘲笑推特前员工/ 日本火箭空中自毁…今日更多新鲜事在此...

日报君 发自 凹非寺量子位 | 公众号 QbitAI 大家好&#xff0c;今天是3月8日&#xff0c;国际妇女节。 祝女性读者们节日快乐。 今日科技圈还有哪些新鲜事儿&#xff0c;下滑走起&#xff5e; 特斯拉下一代小型汽车价成本仅为Model 3一半 马斯克最新透露称&#xff0c;特斯拉正…

知网搜索论文:如何在知网上查找期刊论文

目录 一、先进入学术期刊库&#xff0c;然后再进行高级搜索 二、直接进行高级搜索 一、先进入学术期刊库&#xff0c;然后再进行高级搜索 1&#xff09;进入中国知网官方主页之后&#xff0c;点击搜索框下方的选项功能键【学术期刊】。 2&#xff09;之后页面就会跳转到期刊…

可以从知网领钱了,你知道吗?

说到知网&#xff0c;大家一定都不陌生。 中国知网给大家发钱了&#xff0c;是怎么回事儿呢&#xff1f; 原来是知网为了响应国家关于知识产权保护的相关政策推出了这个活动和政策。 这次活动不仅惠及今年的应届毕业生&#xff0c;还惠及往届毕业生&#xff0c;历年的研究生…

知网查重提交论文显示服务器错误,知网查重怎么会提交失败

在毕业之即&#xff0c;毕业生在完成论文初稿后&#xff0c;便要对论文进行查重。高校认证的一般都是知网查重&#xff0c;但在知网查重中会有许多问题出现&#xff0c;比如在上交论文的时候却提交失败。这是为什么呢&#xff1f;今天就让我们一起来聊聊知网查重怎么会提交失败…

知网获取论文参考文献

知网获取论文参考文献 进入知网搜索相应材料普通检索高级检索 选择相应的文献点击右上角左边双引号“凑”参考文献 进入知网 中国知网官方网址&#xff1a;https://www.cnki.net/ 搜索相应材料 搜素一般可分为普通检索和高级检索。 一般而言&#xff0c;普通检索即可完成我…

知网导入EndNote

首先进入知网&#xff0c;搜索你想要找的期刊论文。 选择EndNote 点击导出 浏览器自动下载以txt为后缀的文件 导入到EndNote中

毕业论文中计算机代码重复吗,知网查重程序代码算重复吗?

知网查重程序代码也是有源代码对比库的&#xff0c;因此程序代码也会被系统检测出来的。对于程序代码查重率过高的情况&#xff0c;我们需要通过别的方式来降低查重率&#xff0c;比如说通过截图。但为了保证论文字数与质量&#xff0c;建议大家多换个思路写代码。那么&#xf…

计算机毕业论文截图,知网查重代码截图能过吗?

知网查重代码截图在之前可能还适用&#xff0c;但是最新的检测系统中已经变得不可行了&#xff0c;最新版本中新增了源代码库&#xff0c;以及OCR图片识别功能&#xff0c;由此可见代码截图也是有可能被查到。换句话说&#xff0c;代码截图也不是百分百就能过的&#xff01;那么…

计算机论文查重修改吗,程序符号换了知网查重能过吗

程序符号换了知网查重未必能过的&#xff0c;对于程序代码来说知网也是检测的。对于最新版本的检测系统来说&#xff0c;它对比的数据库中还新增了源代码数据库。所以说&#xff0c;程序代码一样容易出现非常高的重复率&#xff0c;与其它论文一样也是需要降重修改的。那么&…