前言:在之前的学习过程中,FlowNet2.0网络模型的代码配置到win10环境中进行调用,训练遇到了各种各样的问题。到目前为止,已经能够实现对FlowNet网络的训练,修改以及目标物视频中的光流识别。
win10系统下训练调用自己的FlowNet网络模型
环境搭建-硬件软件搭配
硬件环境
本机配置:显卡NVIDIA GeForce GTX 1050 Ti 内存 16.00 GB ( 2400 MHz) CPU (英特尔)Intel® Core™ i7-7700HQ CPU @ 2.80GHz(2801 MHz)
系统环境搭建
重点 显卡驱动版本、CUDA版本和Pytorch要对应,这部分可以在网上搜一下《老黄的工程师在这个地方根本没有说明,而且GItHub上光流网络的项目的Readme也一直没有更新,完全靠大家摸索了》,教程很多,在此不详述了。下面是我的设备参数:
python 模块版本
训练代码解释
Train and validation 训练模型
python main.py --batch_size 8 --model FlowNet2C --optimizer=Adam --optimizer_lr=1e-4 --loss=MultiScale --loss_norm=L1 --loss_numScales=5 --loss_startScale=4 --optimizer_lr=1e-4 --crop_size 384 512 --training_dataset FlyingChairs --training_dataset_root /FlyingChairs/FlyingChairs_release/data/ --validation_dataset FlyingChairs --validation_dataset_root /FlyingChairs/FlyingChairs_release/data/
Inference 调用训练好的模型提取光流信息
python main.py --inference --model FlowNet2 --save_flow --inference_dataset FlyingChairs --inference_dataset_root /FlyingChairs/FlyingChairs_release/data/ --resume FlowNet2_checkpoint.pth.tar
注意数据路径引用,其它没有什么大问题
重点:调用自己训练的模型并提取视频中的光流数据
from models import FlowNet2 # the path is depended on where you create this module
from utils.flow_utils import flow2img
import matplotlib.pyplot as plt
cap = cv2.VideoCapture('video')
#获取第一帧
ret, frame1 = cap.read()
prvs = frame1
i = 0 #控制实现的张数
count = 0
save_path = 'save_path'
while(1):
ret, frame2 = cap.read()
prvs_t = prvs
crop_size = (512,256)
prvs_t = cv2.resize(prvs_t,crop_size)
cv2.imwrite("save_path" + str(count) + ".jpg",prvs_t)
next = frame2
count += 1
pim1 = cv2.resize(prvs, crop_size, interpolation = cv2.INTER_CUBIC)
pim2 = cv2.resize(next, crop_size, interpolation = cv2.INTER_CUBIC)
# obtain the necessary args for construct the flownet framework
parser = argparse.ArgumentParser()
parser.add_argument('--fp16', action='store_true', help='Run model in pseudo-fp16 mode (fp16 storage fp32 math).')
parser.add_argument("--rgb_max", type=float, default=255.)
args = parser.parse_args()
# initial a Net
net = FlowNet2(args).cuda()
# load the state_dict
dict = torch.load("model_save_path")
net.load_state_dict(dict["state_dict"])
images = [pim1, pim2]
images = np.array(images).transpose(3, 0, 1, 2)
im = torch.from_numpy(images.astype(np.float32)).unsqueeze(0).cuda()
start = time.time()
result = net(im).squeeze()
end = time.time()
print(end-start)
data = result.data.cpu().numpy().transpose(1, 2, 0)
result1 = np.array(data).reshape(-1,2)
print(result1)
img = flow2img(data)
cv2.imwrite(save_path + str(i)+'.png',img)
i = i+1
prvs = next
测试
利用自己视频提取的光流信息