b-up:Enzo_Mi:深度学习基础知识
1.最近邻差值(Neareast Neighbor Interpolation)
插值算法 | 最近邻插值法_哔哩哔哩_bilibili
上图中最后一行,第一个图像,因为目标像素(放大后,位于第1行第0列的像素)距离它最近的原图的像素的像素值为1,因此该目标像素取值为1。
把原图分别进行 上采样
方式1:最近邻插值
方式2:双线性插值
肉眼观看,方式2效果更好,没有锯齿状,更平滑
虽然在上采样阶段, 使用双线性插值可以得到比最近邻差值效果更好的 图片,但是对于语义分割任务并不合适。
语义分割任务只能使用最近邻插值,因为其标注时 将目标对应像素点的值赋值为1,背景赋值为0, 边缘赋值为255, 当通过数据增强进行图片缩放时,使用最近邻插值 ,得到的新图像的语义标签中像素值只包含 0,1,255, 这个三个数值对语义分割网络训练具有意义, 其他数字没有意义。
当使用双线性插值,会导致语义标签图像中出现 如 111,126等数字,这些数字没有意义,对网络训练没有用处。
个人
疑惑:对于实例实例分割,可以使用双线性插值吗?
语义分割网络训练时, 可能进行图像缩放这一数据增强方法,因此只能使用 最近邻差值 防止语义标签出现 非规定中的数字。
但是对于实例实例分割,可以使用双线性插值吗?
最近使用YOLO-SEG, 发现将最近邻插值替换为 双线性插值, 精度有些提升。
2.双线性插值(bilinear interpolation)
插值算法 |双线性插值法_哔哩哔哩_bilibili
将源图像t0进行上采样, 使用双线性插值, 首先:需要将放大的图像(t1)等比例缩小为源图像尺寸t3。
缩放为源图像尺寸大小,需要进行对齐,有两种对齐方式:
1.角对齐:需要将 t3与t0的网格中心点对齐, 这种需要t1缩小的尺度更大
2.边对齐,需要将t3与t0的边对齐,这种需要t1缩小的尺度比角对齐小一些
具体可以见pytorch官网的说明
该链接的内容
注意:像素值分别为v1,v2,v3,v4
代码示例
角对齐
边对齐
角对齐
上述两段代码。第一个自已编写, 第二个是调用函数库
注意:这里以最左上角像素点的中心点的坐标作为原点坐标(0,0),而不是边界框的角点
边对齐
使用pytorch函数
3.双三次插值算法(Bicubic)
双: X,Y两个方向
三次:计算目标像素点周围像素权重时,使用三次项公式计算周围权重
与上述两种插值方法 初始步骤相同,将放大的图像t1进行缩小,缩小为源图像t0尺度t2,然后对照源图像,计算目标像素点
上图中, 发现t2的一个像素点在t0中,刚好位于t0中四个像素点之间的中心
双三次插值,取周围16个像素点的值进行计算
上图:
第一行表示 一维插值
第二行:二维差值,彩色点表示原图像素点,彩色点的高低表示该像素点的像素值,黑色点表示放大图像中的像素点,其高低表示所计算的采样值。
x只能表示 X或Y一个方向的距离
因此需要计算两次权重,分别表示X,Y方向
上图:右边第一个小图,
蓝色点(目标点)与源图像素的一个红点重合, X,Y方向距离均为0, 则该源图的像素点在X或Y方向的对应的权重为1,
右边第二个小图,蓝色点(目标点)与源图像素的一个红点在X,Y距离上均为1, 则该源图的像素点在X或Y方向的对应的权重为0
因此:参考上图的曲线图
在X方向距离为0,则在X方向取得权重为1;
在X方向距离为1,则在X方向取得权重为0;
在X方向距离为2,则在X方向取得权重为0;
根据距离的不同(0.5,1.5等)分别选择权重计算公式W(x)的三个不同分段函数
将在X,Y方向 计算出的16个值相加得到3.5
使用个人编写程序, 以及pytorch 程序进行验证
4.IoU与NMS
NMS 非极大值抑制 | IoU 交并比_哔哩哔哩_bilibili
待看
。。。
参考资料
1.插值算法 | 最近邻插值法_哔哩哔哩_bilibili