星级打分
平均分: 5 参与人数: 10 我的评分: 未评
本帖最后由 Gottvonkarlberg 于 2022-7-12 13:49 编辑
之前论坛里有人提出了通过基础素材加模型训练的方式来补充SRC数据集,如 无敌小金鱼的素材库https://www.dfldata.xyz/forum.php?mod=viewthread&tid=4327 ,以及wtxx8888 的WF换头https://www.dfldata.xyz/forum.php?mod=viewthread&tid=8863 。但是一方面模型的训练旷日持久、DFL的运行造成了对电脑资源的大量占用、模型本身的质量还影响合成的效果,另一方面,在每一次换脸或换头来补充SRC时,由于没法通过DFL或MVE自带的排序和过滤功能来排除合成效果不好的图,所以需要对合成的图进行大量人工筛选。因此这些方法都比较费时费力,而且受原SRC数据集的限制及模型性能的限制,效果也差强人意。
所以我想从源头出发,即通过使用自动化的方式,直接从目标人物的影视资料中截取目标人物的脸,且对截取出的图集的后处理要能够通过其他的软件自动地进行。
我编写了一个程序,作用有:
1.可以自动比对视频中的人脸和你放在target_face文件夹里的人脸,从而可以将你的目标人脸截图出来。
2.由于DFL切脸的最低分辨率为256,因此我添加了分辨率检测判断,保证用此方法截图出来的脸的大小是大于等于256×256的。
3.可以通过调整tolerance变量的值来调整人脸筛选的严格度。tolerance选值越低,越不容易选到别人,但也容易漏选目标的脸;选值越高,越容易选到别人,但也更容易选全目标的脸。建议:若目标在视频中常以单人出镜,则可选较高的tolerance,如0.6到0.7,若目标在视频中常和别人同时出镜,则可选较低的tolerance,如0.3到0.4 。
4.添加了连续帧筛选,大家可以自己填每过多少帧才采样一次图。
5.已打包为exe文件,双击即用。
一些瑕疵:
1.并不对模糊和运动模糊做筛选,因为MVE可以完成这方面的工作。
2.在tolerance设置较高时,也可能将其他人的脸截取出来,可以通过4.2) data_src sort.bat的相似度排序来筛选出来。
3.由于并没有用DFL内部的代码来实现,所以截出的脸图还需要用DFL的4) data_src faceset extract.bat来切脸成aligned里的脸图。
4.由于限定了输出图片要大于256×256,所以分辨率低于1080的视频,有可能只有特写会被筛选出来。不过既然是要做SRC图集,原视频分辨率还是要有的,再说1080p的资源现在也很好找了,所以这点应该问题不大。
使用提示:
1.target_face里的图有一张正脸图就够了,但添加多张不同角度的图依然有助于更多属于目标人物的脸图被截取出来。
2.放进target_face文件夹的脸图最好就是从你的目标视频里截出来的,图片范围最好只包含整个头 (包括头发和脖子),见示例图1。
示例图1
3.提高tolerance有助于找出大角度脸(见示例图2),但也会加大选到其他人的概率(但可以在DFL切脸后用DFL的4.2) data_src sort.bat的相似度排序来筛选出来),这个值怎么选还需要大家自己多多尝试,我感觉0.6不错。
示例图2
与前人工作的对比:
https://www.dfldata.xyz/forum.php?mod=viewthread&tid=546&extra=page%3D1 在这篇帖子中,作者给出了对已切脸的图集进行筛选的方法。我和他的不同在于,我是直接可以从原视频里截指定的脸,所以可以从无到有地建立一个SRC图集,也不需要预先切脸。由于全部不含人脸的帧以及大部分不含目标人脸的帧都被去掉了,且同时有目标人脸和其他人脸的帧里大部分情况下也只保留了目标人脸的区域,因此可以大大减少后续切脸要用的时间。
对预览图的说明:预览的GIF经过了大幅度的压缩和抽帧以满足上传的大小需求,因此看起来很糊而且很卡,但实际上原视频是什么清晰度,截取的脸图就是什么清晰度,而且也不影响你用电脑干其他的事。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
V0.2 更新:我重新研究了一下pyinstaller,解决了它找不到face_recognition的dat模型文件以及无法并行的问题。大家可以用exe版了。
基于双进程的exe版,我重新查看了一下它的资源占用如下:对1080p的视频,CPU占用最高达33%(加上你其他的后台程序,总占用有将近50%),内存占用最高达5.4GB(游戏本一般是16GB内存,这样加上你其他的程序的内存占用大概有个70%,要挂着这个玩大型游戏可能够呛,但是看视频、上网、写word等并未感觉卡顿),磁盘占用最高达2.0MB/秒(我的500GB SSD的占用率是1%),GPU占用最高达2.9GB(我之前应该是把单进程版的程序的测试和双进程的弄混了,单进程才是1.5GB的占用,不过我游戏本8GB显存,还留有不少空间)。
速度上,对一个1分钟的1080p,24FPS的视频要43秒左右。在输入方式上做了改进,现在输入路径全靠拖拽对应文件即可。
exe版本的使用视频和程序地址:链接:https://pan.baidu.com/s/1qRTkbDjPLLVBBjYqbSCs9Q 提取码:12wk
未来的改进方向:
1.使用decord库替代opencv来提取视频帧,提高提取帧的速度
2.用mediapipe库替代face_recognition,这样就可以从提取出的视频帧到生成landmarks全部放在GPU上,同时还可以使用minibatch来输入神经网络(face_recognition里只有face_location是用GPU的,而且它的batched版本好像不能正常使用,我用batched版本定位不到任何脸,所以只能一帧一帧地定位,然后它的face_encoding也只能生成128个点的mask,且都在CPU上生成,而mediapipe能生成400多个点的mask,还带有深度信息,更加准确,也有GPU版本)
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
V0.2 Bug收集和解决方案:
1.报错:Could not load 1ibrary cudnn_ops_infer64_8.d11. Error code 126. Please make sure cudnn_ops_infer64_8.dl1 is in your library path!
解决方案: https://stackoverflow.com/questions/66355477/could-not-load-library-cudnn-ops-infer64-8-dll-error-code-126-please-make-sure
2.运行后没有报错,但在输入完tolerance后就卡住,且运行完后saved_face文件夹里也没有找出来的图
解决方案:target_face里放的所有 图需要整个头 ,比如一个包含了全部头发、半个脖子的图(但也不能包含太多背景)。这里感谢wdfs 对此Bug测试提供的帮助
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
V0.3 更新:
1.使用mediapipe重构了人脸定位部分,现在人脸定位放到CPU上了。
2.添加了decord模块来提取视频帧,连续提取视频帧速度比opencv快了128%到138%,这使得总速度比用opencv快了50%。但decord遇到视频有坏帧时就会报错退出,所以我仍然保留了opencv作为可选的视频帧提取器。
3.使用matplotlib.pyplot.imsave 替代 opencv的cv2.imwrite 来向硬盘写入图片,写入速度快了15%。
4.由于mediapipe本身很高的推理速度,以及我尽可能地在各个环节进行速度上的优化,现在使用decord进行视频帧提取时,总速度和原来差不多,用opencv提取则慢一些(但原来是双进程加GPU,现在是单进程加CPU)。
5.现在你可以选择每多少帧采样一次。若视频比较短,还是建议1帧一次,若视频比较长(如电视剧或电影),那么可以设置比较高的采样间隔。
6.增大了截图面积(从脖子到头顶),并且现在截图大小会跟随视频分辨率变化,所以用4K视频也不用怕截不到下巴了。
7.改变了运行进度的可视化方式,原先按帧号刷屏来logging让人眼花缭乱,也达不到进度监控的目的。现在改成进度条显示,更加直观和美观。
存在的一点问题:我发现mediapipe给的INFO说是用的CPU,API也没有显式调用GPU的接口,但是我查看任务管理器发现它还是会占用1.3GB的显存。
未来改进方向:
其实不能用GPU的话,也没啥好改进的了。顶多就是用多线程加速一下输出的截图写入硬盘这个部分。其他的可能就是使用体验上的改进了,这个要结合大家的反馈来做。
之后看心情和忙不忙,可能会用pytorch写个landmarks提取器,代替DFL自带的提取器,就算是用的同一个模型,我加一个batch processing,都有望把速度提升十几倍。
新版下载仍然在原来的百度网盘分享链接里下,我追加了一个SFCV0.3文件夹,里面的压缩包是新版。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
V0.4 更新:
1.定位到了出现缺少cudnn文件报错的原因是我用pip配置人脸比对用的face_recognition时其使用的dlib库默认是gpu版的。所以我重新配置了环境,现在人脸比对环节也运行在CPU上了。
2.经过我用我的老爷机测试(没有CUDA和Cudnn),V0.4版可以在没有CUDA和Cudnn的电脑上运行,对GPU的占用为0,因此应该也可以在A卡电脑上使用。
3.由于我并没有找到人脸比对方面的轻量级库,因此这个环节在CPU上的耗时会多很多,导致整个程序的运行时间是V0.3的3到4倍,建议大家在target_face里只放一张图,可以缩短运行时间。
4.在网盘里添加了Test.zip压缩包,里面有测试用的视频,target_face(已含有目标人脸图)和saved_face文件夹。你可以用这个测试材料来测试程序是否可以正常运行。
新版下载仍然在原来的百度网盘分享链接里下,我追加了一个SFC_EXE V0.4压缩文件,里面是新版。
我更新这么勤快,可以得到大家一个免费的五星好评吗?