我想从视频中获取角色图像

安装额外依赖

waifuc同样提供了从视频中获取图像的方法

在开始运行之前首先需要安装额外的依赖,其中包含pyav库,以便对视频进行处理:

pip install git+https://github.com/deepghs/waifuc.git@main#egg=waifuc[video]

从视频文件中获取图像

在waifuc中,可以使用VideoSource对视频文件进行抽帧处理,并以图像的形式保存到给定的路径中,如下所示:

 1from waifuc.export import SaveExporter
 2from waifuc.source import VideoSource
 3
 4if __name__ == '__main__':
 5    source = VideoSource(
 6        '/data/videos/[IrizaRaws] Oresuki - 03 (BDRip 1920x1080 x264 10bit FLAC).mkv'
 7    )
 8    source.export(
 9        SaveExporter('/data/dstdataset')
10    )

保存的图像如下所示:

../../_images/video_simple.png

从包含视频的文件夹中获取图像

在此基础上,很多情况下,我们需要对下载好的一整部动漫系列视频进行处理,而他们常常被放在同一个文件夹中

为此我们可以直接从包含视频的文件夹中进行抽帧,如下所示:

1from waifuc.export import SaveExporter
2from waifuc.source import VideoSource
3
4if __name__ == '__main__':
5    source = VideoSource.from_directory('/data/videos')
6    source.export(
7        SaveExporter('/data/dstdataset')
8    )

该代码将对/data/videos路径下的全部视频文件进行逐一抽帧,并保存至/data/dstdataset文件夹

从包含视频的文件夹中获取角色图像

在上述代码的基础上,我们只需要为其添加PersonSplitAction即可从视频文件夹中截取人像图像,如下所示:

 1from waifuc.action import PersonSplitAction
 2from waifuc.export import SaveExporter
 3from waifuc.source import VideoSource
 4
 5if __name__ == '__main__':
 6    source = VideoSource.from_directory('/data/videos')
 7    source = source.attach(
 8        PersonSplitAction(),
 9    )
10    source.export(
11        SaveExporter('/data/dstdataset')
12    )

上述代码从视频中抽帧,并从抽取的图像中截取人像保存下来,如下所示:

../../_images/video_split.png

不过看起来似乎有一些图像并不适合用于训练。因此在实际的动漫视频中,可以通过添加更多的Action来获得更高质量的训练数据集。例如下面的代码:

 1from waifuc.action import PersonSplitAction, FilterSimilarAction, FileOrderAction, MinSizeFilterAction, FaceCountAction
 2from waifuc.export import SaveExporter
 3from waifuc.source import VideoSource
 4
 5if __name__ == '__main__':
 6    source = VideoSource.from_directory('/data/videos')
 7    source = source.attach(
 8        # 过滤掉全帧相似的视频片段,
 9        # 例如片头、片尾
10        FilterSimilarAction(),
11
12        # 逐张拆分出每个人物
13        PersonSplitAction(),
14
15        # 丢弃没有人脸或有多个人脸的图像
16        FaceCountAction(1),
17
18        # 丢弃短边小于320像素的图像
19        MinSizeFilterAction(320),
20
21        # 丢弃相似或重复的图像
22        FilterSimilarAction(),
23
24        # 按顺序重命名文件,扩展名为'.png'
25        FileOrderAction(ext='.png'),
26    )
27    source.export(
28        SaveExporter('/data/dstdataset')
29    )

最终将得到如下的数据集

../../_images/video_split_better.png