-
RAFT: Recurrent All-Pairs Field Transforms for Optical Flow 돌려보기영상처리/3D computer vision 2023. 10. 30. 20:56728x90
RAFT를 이용해 dense optical flow를 계산해보고자 한다.
아래와 같이, torchvision.models.optical_flow로부터 이미 train된 raft 모델을 가져와, image와 optical flow를 overlay 해보 았다.
import numpy as np import torch import matplotlib.pyplot as plt import torchvision.transforms.functional as F import torchvision.transforms as T import cv2 from torchvision.models.optical_flow import raft_small from torchvision.models.optical_flow import raft_large def preprocess(batch): transforms = T.Compose( [ T.ConvertImageDtype(torch.float32), T.Normalize(mean=0.5, std=0.5), # map [0, 1] into [-1, 1] T.Resize(size=(512, 512)), ] ) batch = transforms(batch) return batch def add_arrow_line(img,flow): for y in range(16,flow.shape[1]-16,32): for x in range(16,flow.shape[2]-16,32): cv2.arrowedLine(img, (x,y), (x+int(flow[0][y][x]),y+int(flow[1][y][x])), (255,0,0)) return img device = "cuda" if torch.cuda.is_available() else "cpu" img1= cv2.imread('20231014_233154.jpg') img2= cv2.imread('20231014_233150.jpg') # model = raft_small(progress=False).to(device) model = raft_large(pretrained=True, progress=False).to(device) model = model.eval() img1_stack=torch.stack([torch.permute(torch.tensor(img1),(2,0,1))]) # tensor shape (N, C, H, W) img2_stack=torch.stack([torch.permute(torch.tensor(img2),(2,0,1))]) # tensor shape (N, C, H, W) flow = model(preprocess(img1_stack).to(device), preprocess(img2_stack).to(device)) # plot cv2.imshow('overlay', add_arrow_line( cv2.resize(cv2.addWeighted(img1,0.5,img2,0.5,0),(512,512)),flow[0][0])) cv2.waitKey()
RAFT small의 결과. 실제 발생한 optical flow를 잘 반영하지 못하고 있다. RAFT large 모델 결과. 훨씬 실제에 가까운 결과를 보여준다. 하지만,feature point가 없는 흰 벽에서는 여전히 정확도가 떨어짐. 728x90'영상처리 > 3D computer vision' 카테고리의 다른 글
Handheld Multi-Frame Super-Resolution (2019) (0) 2023.11.23 pyflow optical flow (0) 2023.11.01 Dense Optical Flow algorithm 비교 (open cv) (2) 2023.10.15 Epipolar geometry (0) 2023.02.12 Homogeneous coordinate (0) 2023.02.02