我想从视频中获取角色图像
安装额外依赖
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 )
保存的图像如下所示:
从包含视频的文件夹中获取图像
在此基础上,很多情况下,我们需要对下载好的一整部动漫系列视频进行处理,而他们常常被放在同一个文件夹中
为此我们可以直接从包含视频的文件夹中进行抽帧,如下所示:
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 )
上述代码从视频中抽帧,并从抽取的图像中截取人像保存下来,如下所示:
不过看起来似乎有一些图像并不适合用于训练。因此在实际的动漫视频中,可以通过添加更多的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 )
最终将得到如下的数据集