在计算机视觉任务中,媒体处理非常普遍。预处理任务,包括帧提取、格式转换和质量调整,在图像和视频分析中扮演着关键角色。一个在这些任务中表现出色的工具是FFmpeg。FFmpeg是一个由Fabrice Bellard自2000年以来协同开发的库和程序集合,它被VLC、YouTube和OBS等主要玩家所信赖。从转换视频格式到高效调整图像大小和提取音频,FFmpeg已成为许多多媒体工作流程的首选解决方案。
要在系统上设置FFmpeg,请首先访问终端。在Linux上,终端应用程序是现成的。对于macOS用户,请在应用程序 > 实用工具文件夹中找到终端应用程序。Windows用户可以选择Windows子系统用于Linux(WSL)或安装像Git Bash这样的Bash终端。
一旦进入终端,请更新软件包列表以确保获得最新版本的FFmpeg。在Ubuntu或Debian系统上,执行以下命令:
sudo apt update
更新后,使用包管理器安装FFmpeg及其依赖项。在Ubuntu或Debian上,请使用以下命令:
sudo apt install ffmpeg
在macOS上,可以使用Homebrew安装FFmpeg:
brew install ffmpeg
要验证安装是否成功,请运行以下命令:
ffmpeg -version
此命令应显示有关最近安装的FFmpeg版本的信息。
视频以各种格式和大小出现,兼容性问题很常见。FFmpeg简化了这一过程。考虑将AVI视频转换为MP4文件。AVI是存储CCTV摄像机镜头的常见文件格式,但许多计算机视觉系统使用MOV或MP4。可以使用以下代码将数据转换为MP4,以便在进一步处理中使用视觉系统(例如,运行目标检测模型):
ffmpeg -i input.avi -c:v libx264 -c:a aac -strict experimental output.mp4
要从MOV转换为MP4,这是另一个常见的转换,可以使用:
ffmpeg -i input.mov -vcodec h264 -acodec mp2 input.mp4
可以使用FFmpeg将视频分割成代表每一帧的图像文件。如果想要将视频分割成帧以用于训练计算机视觉模型,可能需要完成此任务。许多常见的计算机视觉模型(例如,目标检测、分类模型)是在注释图像上训练的,而不是视频。
要将视频分割为帧,请运行:
ffmpeg -i input.mp4 -vf fps=1 output_%04d.png
可以配置使用fps标志获取帧的间隔。在上面的例子中,fps设置为1。这意味着每秒捕获一帧,然后保存到名为output_{frame_number}.png的文件中,其中{frame_number}代表收集的帧。
可以使用Python子进程库与FFmpeg一起将视频分割成用于训练计算机视觉模型的图像文件夹。为此,需要一个Roboflow账户和工作区中的项目。要创建项目,请首先转到Roboflow仪表板。然后,点击“创建项目”。
可以通过Web界面上传视频,也可以通过编程方式上传。如果需要上传大量数据,编程上传是理想的选择。创建一个新的Python文件并添加以下代码:
import os
import subprocess
from roboflow import Roboflow
def video_to_frames(video_path, output_folder):
if not os.path.exists(output_folder):
os.makedirs(output_folder)
command = [
'ffmpeg',
'-i', video_path,
os.path.join(output_folder, 'frame_%04d.png')
]
subprocess.run(command)
def upload_frames_to_roboflow(api_key, workspace_id, project_id, frames_folder):
rf = Roboflow(api_key=api_key)
print(rf.workspace())
project = rf.workspace(workspace_id).project(project_id)
project.upload(frames_folder)
if __name__ == "__main__":
roboflow_api_key = "my-api-key"
roboflow_workspace_id = 'my-workspace'
roboflow_project_id = 'my-project-id'
video_path = 'input.mp4'
frames_folder = 'outputs/'
video_to_frames(video_path, frames_folder)
upload_frames_to_roboflow(roboflow_api_key, roboflow_workspace_id, roboflow_project_id, frames_folder)
在代码中定义了一个名为`video_to_frames`的函数,该函数使用`ffmpeg`将视频转换为系统命名的PNG帧。`upload_frames_to_roboflow`连接到Roboflow,打印工作区详细信息,访问指定的项目,并上传帧。
在代码中,替换:
代码使用video_to_frames将视频转换为帧,并使用upload_frames_to_roboflow将它们上传到指定的Roboflow项目。这种自动化加速了视频到帧的转换及其与Roboflow项目的无缝集成,简化了数据集管理。
运行上述脚本以将图像上传到工作区。图像将出现在Roboflow仪表板的“注释”选项卡上。