采集方式
用于训练的图片集采集有两种方式, 一种是使用相机从不同角度拍照, 另一种是拍视频后逐帧提取. 两种方式各有利弊, 拍照分辨率更高, 方便控制光圈,快门和白平衡, 但是拍照时较难控制好角度可能会造成部分交叠区域过小, 视频比较容易实现连续的画面移动, 保证交叠区域, 但是大多数手机没法手动控制视频录制过程的光圈和白平衡, 并且视频的分辨率大多数是通过插值填充的, 拍摄1080p视频时, 实际有效像素并没有1080p.
我自己的使用经验是, 用视频方式提取的帧训练结果更稳定.
图片数量
另外一方面是图片集的数量, 为了保证帧之间特征点的交叠, 一般按角度每3度一帧比较合适, 也就是从水平视角恢复一个3D对象至少需要约120张图.
图片分辨率
图片分辨率跟你的显卡显存有关. 16G的显存训练 1920x1080分辨率大概率是不够的, 在 train.py 那一步会报torch.OutOfMemoryError: CUDA out of memory.错误. 如果出现这种错误, 就把分辨率适当降一点. 实际测试训练1366x768的分辨率只需要8GB的显存, 如果用1024x576分辨率训练速度较快且细节保留还不错.
从视频提取帧序列
方式一: 使用 python 代码
from pathlib import Path |
|
import cv2 |
|
work_path = '/home/milton/temp/input' |
|
target_height = 720 |
|
imgpath = Path(work_path) |
|
imgpath.mkdir(exist_ok = True) |
|
cap = cv2.VideoCapture('/home/milton/temp/557 Marksbury Road Pickering Open House Video Tour.mp4') |
|
frame_no = 0 |
|
while cap.isOpened(): |
|
ret, frame = cap.read() |
|
if ret: |
|
# 视频是 60fps, 每秒取3帧, 因此每20帧取一帧 |
|
if frame_no % 20 == 0: |
|
original_height, original_width = frame.shape[:2] |
|
scaling_factor = target_height / original_height |
|
target_width = int(original_width * scaling_f |

最低0.47元/天 解锁文章
3234

被折叠的 条评论
为什么被折叠?



