源代码:DynamicNeRF

主要思想:利用RAFT模型来预测flow

argparse.ArgumentParser()用法解析参数解析
action='store_true’的区别

 #创建对象——添加参数——返回命名空间parser = argparse.ArgumentParser()parser.add_argument("--dataset_path", type=str, help='Dataset path')parser.add_argument('--model', help="restore RAFT checkpoint")parser.add_argument('--small', action='store_true', help='use small model')parser.add_argument('--mixed_precision', action='store_true', help='use mixed precision')args = parser.parse_args()

os.path模块主要用来获取文件属性

os.path.join(path1[, path2[, …]]) 把目录和文件名合成一个路径

def create_dir(dir):if not os.path.exists(dir):os.makedirs(dir)# 将目录和文件名合成一个路径input_path = os.path.join(args.dataset_path, 'images')output_path = os.path.join(args.dataset_path, 'flow')output_img_path = os.path.join(args.dataset_path, 'flow_png')create_dir(output_path)create_dir(output_img_path)

torch.nn.DataParallel()表示多GPU训练用多块显卡来加速训练,参考好文

model.eval()使得网络处于测试模式,若处于训练模式:model.train()

glob.glob()返回所有匹配的文件路径列表

GPU上的tensor转成CPU上的numpy:.cpu().numpy()

.transpose(1,2,0)是调节数组维数变换。

np.savez()用来存储.npz文件,numpy数据存储

Image.fromarray()数组到图像的转换
np.arrary() 对应地从图像转数组

DEVICE = 'cuda'
def run(args, input_path, output_path, output_img_path):
#加载模型#加速训练model = torch.nn.DataParallel(RAFT(args))#torch.load 加载state_dicts——使用state_dicts实例化modelmodel.load_state_dict(torch.load(args.model))# 将模型送入gpumodel = model.modulemodel.to(DEVICE)model.eval()
#获取指定目录下的所有图片with torch.no_grad():images = glob.glob(os.path.join(input_path, '*.png')) + \glob.glob(os.path.join(input_path, '*.jpg'))images = sorted(images)for i in range(len(images) - 1):print(i)image1 = load_image(images[i])image2 = load_image(images[i + 1])#填充图像,使尺寸可被 8 整除,子函数来自RAFTpadder = InputPadder(image1.shape)image1, image2 = padder.pad(image1, image2)_, flow_fwd = model(image1, image2, iters=20, test_mode=True)_, flow_bwd = model(image2, image1, iters=20, test_mode=True)#GPU上的tensor———>CPU上的数组flow_fwd = padder.unpad(flow_fwd[0]).cpu().numpy().transpose(1, 2, 0)flow_bwd = padder.unpad(flow_bwd[0]).cpu().numpy().transpose(1, 2, 0)#计算前向光流、后向光流的maskmask_fwd, mask_bwd = compute_fwdbwd_mask(flow_fwd, flow_bwd)# Save flownp.savez(os.path.join(output_path, '%03d_fwd.npz'%i), flow=flow_fwd, mask=mask_fwd)np.savez(os.path.join(output_path, '%03d_bwd.npz'%(i + 1)), flow=flow_bwd, mask=mask_bwd)# Save flow_img#numpy 转 image类Image.fromarray(flow_viz.flow_to_image(flow_fwd)).save(os.path.join(output_img_path, '%03d_fwd.png'%i))Image.fromarray(flow_viz.flow_to_image(flow_bwd)).save(os.path.join(output_img_path, '%03d_bwd.png'%(i + 1)))Image.fromarray(mask_fwd).save(os.path.join(output_img_path, '%03d_fwd_mask.png'%i))Image.fromarray(mask_bwd).save(os.path.join(output_img_path, '%03d_bwd_mask.png'%(i + 1)))

加载图像

像素值表达的两种类型:
float:0-1
uint8:0-255
float到unit8需要image*255;从uint8到float需要image/255

torch.from_numpy()把数组转换成张量,且二者共享内存,对张量进行修改比如重新赋值,那么原始数组也会相应发生改变。
tensor.permute()将tensor的维度换位,跟transpose()作用类似

def load_image(imfile):img = np.array(Image.open(imfile)).astype(np.uint8)img = torch.from_numpy(img).permute(2, 0, 1).float()return img[None].to(DEVICE)

图像warp变换
切片操作
[:2] 表示索引 0至1行 [ :, 2]:表示所有行的第3列
[:,:,0] 取其中的所有0号索引
[:,np.newaxis]表示升维
cv2.remap()函数的使用remap函数实际就是通过修改像素点的位置得到一幅新图像。已知前一帧的图像和光流,通过cv2.remap()来预测恢复下一帧的图像

def warp_flow(img, flow):h, w = flow.shape[:2]flow_new = flow.copy()flow_new[:,:,0] += np.arange(w)flow_new[:,:,1] += np.arange(h)[:,np.newaxis]res = cv2.remap(img, flow_new, None, cv2.INTER_CUBIC, borderMode=cv2.BORDER_CONSTANT)return res

np.linalg.norm()求范数

#计算前向光流mask以及后向光流mask
def compute_fwdbwd_mask(fwd_flow, bwd_flow):alpha_1 = 0.5alpha_2 = 0.5bwd2fwd_flow = warp_flow(bwd_flow, fwd_flow)fwd_lr_error = np.linalg.norm(fwd_flow + bwd2fwd_flow, axis=-1)fwd_mask = fwd_lr_error < alpha_1  * (np.linalg.norm(fwd_flow, axis=-1) \+ np.linalg.norm(bwd2fwd_flow, axis=-1)) + alpha_2fwd2bwd_flow = warp_flow(fwd_flow, bwd_flow)bwd_lr_error = np.linalg.norm(bwd_flow + fwd2bwd_flow, axis=-1)bwd_mask = bwd_lr_error < alpha_1  * (np.linalg.norm(bwd_flow, axis=-1) \+ np.linalg.norm(fwd2bwd_flow, axis=-1)) + alpha_2return fwd_mask, bwd_mask

【code explained】DynamicNeRF| generate_flow相关推荐

  1. 【code explained】Dynamic NeRF|generate_depth

    源代码:Dynamic NeRF|generate_depth 主要是利用Midas模型来预测深度 主函数:创建参数解析------创建路径------GPU加速设置------计算depth tor ...

  2. 程序猿之歌 PHP,1024丨腾讯第一首程序员之歌【Code代码】

    原标题:1024丨腾讯第一首程序员之歌[Code代码] "发布总是在半夜 回滚是永远的愁". 内存泄漏.深夜发布.需求变更,这些熟悉的词语和场景,相信对于每个程序员朋友来说,都有着 ...

  3. 【Code Complete】《Code Complete 》

    良好编程实践的百科全书,完善编码聚焦于个人技能--所有的内容都来说明我们称之为"编写巧妙的代码"(write clean code,clean可以翻译多种意思,只能意会了,有些英语 ...

  4. 【Code forces】63B Settlers' Training

    http://codeforces.com/problemset/problem/63/B 给你一串数字,直到所有数字都变为k为止,相同的数为一组,在一次中,所有不同的数都加1 1 2 2 3  →  ...

  5. 【Code pratice】—— 四平方和

    Date:2022−10−06\color{FF6633}{Date:2022-10-06}Date:2022−10−06 Event\color{FF6633}{Event}Event is\col ...

  6. 【Code pratice】—— 大数乘法

    Date:2022−10−07\color{33CCFF}{Date:2022-10-07}Date:2022−10−07 Last\color{33CCFF}{Last}Last night\col ...

  7. 【Code pratice】—— 纸牌三角形

    Date:2022−10−04\color{FFCC99}{Date:2022-10-04}Date:2022−10−04 Everyone\color{FFCC99}{Everyone}Everyo ...

  8. 【Code pratice】——排他平方数

    Date:2022−10−05\color{FF22CC}{Date:2022-10-05}Date:2022−10−05 The\color{FF22CC}{The}The second\color ...

  9. 【Code Pratice】—— 猜字母、次数差、交换瓶子

    文章目录 1 | 猜字母 题目 思路 逻辑代码 2 | 次数差 题目 思路 逻辑代码 3 | 交换瓶子 题目 思路 逻辑代码 1 | 猜字母 题目 把abcd-s共19个字母组成的序列重复拼接106次 ...

最新文章

  1. 我崩溃了!月薪30K必须掌握的开源项目Java中SPI机制
  2. DirectX 开发环境配置
  3. sql报表按月统计_如何通过INTOUCH组态软件做EXCEL报表(含代码)
  4. Python和xml简介
  5. dotnet core 开发无缝兼容Http和Websocket协议的接口服务
  6. yii schema.mysql.sql_YII学习,初体验 ,对YII的一些理解.
  7. CGAL4.4+VC2008编译
  8. linux 双网卡 debian,Linux服务器双网卡双IP和单网卡双IP配置方法(Debian/Ubuntu)
  9. dup和dup2详解
  10. Oracle 无备份情况下的恢复--控制文件/数据文件
  11. .Net脱壳工具 de4dot参数说明/简易教程
  12. Ubuntu中使用freeradius配置RADIUS,并在RADIUS中配置LDAP 并实现AP认证
  13. I/O多路复用之select,poll,epoll简介
  14. VC2008编译libthrift
  15. bootstrap 二级下拉菜单
  16. 符号及符号表是什么?
  17. springMVC中 Controller层为什么可以用map来传输数据
  18. 大乱炖-java基础
  19. CentOS8使用cephadm部署和配置Ceph Octopus
  20. 《麻省理工科技评论》发布2019全球十大突破性技术 阿里巴巴成唯一上榜中国公司...

热门文章

  1. 八家征信试点机构竟然全部out,央行到底想要一个怎样的市场格局?
  2. 血腥丛林中的无底线战争
  3. html转换为pdf的笔顺,拼音笔顺的正确写法(精美图文排版)图[整理].pdf
  4. Everything实现快速搜索的原理
  5. python qt 按钮实现拖放_python qtdesigner 拖拽工具
  6. 用python编写一个点餐程序_用python做一个点餐系统,热敏打印机怎么连?
  7. 如何判断直线和圆的位置关系?
  8. D-InSAR处理流程
  9. Thinkpad T580 更换固态NVME 2242接口硬盘迁移系统
  10. linux终端文字看不清,Linux字体模糊该怎么解决? Linux让字体清晰的教程