Aser Atawya
Google Summer of Code: Adding RAFT Optical Flow Model using ONNX Format (#197)
47e6010
# This file is part of OpenCV Zoo project.
import cv2 as cv
import numpy as np
class Raft:
def __init__(self, modelPath):
self._modelPath = modelPath
self.model = cv.dnn.readNet(self._modelPath)
self.input_names = ['0', '1']
self.first_input_name = self.input_names[0]
self.second_input_name = self.input_names[1]
self.input_shape = [360, 480] # change if going to use different model with different input shape
self.input_height = self.input_shape[0]
self.input_width = self.input_shape[1]
@property
def name(self):
return self.__class__.__name__
def _preprocess(self, image):
image = cv.cvtColor(image, cv.COLOR_BGR2RGB)
img_input = cv.resize(image, (self.input_width,self.input_height))
img_input = img_input.transpose(2, 0, 1)
img_input = img_input[np.newaxis,:,:,:]
img_input = img_input.astype(np.float32)
return img_input
def infer(self, image1, image2):
# Preprocess
input_1 = self._preprocess(image1)
input_2 = self._preprocess(image2)
# Forward
self.model.setInput(input_1, self.first_input_name)
self.model.setInput(input_2, self.second_input_name)
layer_names = self.model.getLayerNames()
outputlayers = [layer_names[i-1] for i in self.model.getUnconnectedOutLayers()]
output = self.model.forward(outputlayers)
# Postprocess
results = self._postprocess(output)
return results
def _postprocess(self, output):
flow_map = output[1][0].transpose(1, 2, 0)
return flow_map