Target
- 安装python环境,安装numpy,pytorch等库、
- 跑通老师提供的双线性插值循环版本upsampling.ipynb
- 用numpy实现双线性插值的矩阵版本(函数提示:np_mgrid,np.clip, np.expand_dims
- 测试双线性插值循环版和矩阵版本的运行时间和结果差异(参考陈老师提供的nearest的代码)
提交要求: - 提交双线性插值矩阵版本的python代码(建议.py 或 .ipynb格式)
- 提交两个版本的运行时间和结果差异截图
过程记录
跑通没什么问题,总结一下代码中各种upsample的方法。
1. unpooling
这个是直接给了一个scale放大系数,细节就是在目标大小图像中填值的时候,使步长为scale。
def unpooling(src, scale):
'''
src: input image
scale: dst_size / src_size , int
直接扩大图像,在没有值的地方补零。
随着scale变大,要补的0越来越多,图像整体会越来越暗。
'''
## 判断scale,只能upsample整数倍的size
assert isinstance(scale, int)
src_h, src_w, channel = src.shape
dst_h = src_h * scale
dst_w = src_w * scale
dst = np.zeros((dst_h, dst_w, channel), dtype=src.dtype)
dst[::scale, ::scale] = src
return dst
img_u = unpooling(img, 2)
# 改scale为1测试,dif为0
# print('Difference: ', ((img_u - img)**2).sum())
cv2.imshow('show', img_u)
cv2.waitKey(0)
cv2.destroyAllWindows()
2. nearest interpolation
近邻插值,在目标图像中的每个点处,插入最近位置的源图像中的像素值。核心思想就是先找到目标图的当前坐标在源图像中的位置,数学关系是:src_x + 0.5 = (dst_x + 0.5) / x_scale
# 矩阵版本 nearest upsample
def nearest_interpolation_v2(src, dst_size):
src_h, src_w,