本文共 1170 字,大约阅读时间需要 3 分钟。
训练和测试一个有效的机器学习模型最重要的一步是收集大量数据并使用这些数据对其进行有效训练。小批量(Mini-batches)训练是最有效的训练策略,在每次迭代中使用一小部分数据进行训练。
然而,随着大量的机器学习任务在视频数据集上执行,存在着对不等长视频进行有效批处理的问题。大多数解决方法依赖于将视频裁剪成相等的长度,以便在迭代期间提取相同数量的帧,但在我们需要从每一帧获取信息来有效地预测某些事情的场景中,这并不是特别有用的,特别是在自动驾驶汽车和动作识别的情景中。
本文我们通过创建一个可以处理不同长度视频的处理方法来解决该问题。在Glenn Jocher的Yolov3中(https://github.com/ultralytics/yolov3),我用LoadStreams作为基础,创建了LoadStreamsBatch类。
在类初始化中,接受四个参数:sources、batch_size、subdir_search。sources可以是目录路径或文本文件。如果是一个目录,我会读取目录中的所有内容(如果subdir_search参数为True,子目录也会包括在内),否则我会读取文本文件中视频的路径,视频的路径存储在列表中。使用cur_pos来跟踪列表中的当前位置。
该列表以< strong>batch_size</ strong>为最大值进行迭代,并检查以跳过错误视频或不存在的视频。它们被发送到< strong>letterbox</ strong>函数进行调整,确保所有视频的形状一致。
< strong>update</ strong>函数存储了默认的图像大小,以便在所有视频都被提取进行处理,但由于长度不相等,一个视频比另一个视频提前完成。当我解释代码的下一部分时,它就会更清楚了,那就是< strong>next</ strong> 函数。
< strong>next</ strong> 函数将帧传递给< strong>letterbox</ strong>函数,确保视频的形状一致。如果帧为None,则意味着视频已被完全处理,这时我们检查列表中的所有视频是否都已被处理。如果有更多的视频要处理,< strong>cur_pos</ strong>指针将用于获取下一个可用视频的位置。
为了实现这一目标,我们需要修改现有的代码,确保能够处理不同长度的视频。在< strong>update</ strong>函数中,我们引入了一个小的变化,确保每隔4帧读取一次,以便在不同长度的视频中保持同步。
最终,我们实现了一个能够处理不同长度视频的批处理方法,确保在自动驾驶汽车和动作识别等场景中仍然能够有效地预测和识别。
通过这种方法,我们可以显著减少数据收集和预处理的时间,从而使模型与数据相匹配的时间也大大减少。
转载地址:http://qnov.baihongyu.com/