-
Notifications
You must be signed in to change notification settings - Fork 3
How to use
假设你已经按 Installation 安装好运行环境。
python .\video_splitter.py "D:\Downloads\videos\77b66W1--DxLCnyltG66EIG-CQ_rmcvideo_1080P_1920_5120_192.mp4" "D:\Downloads\videos\temp\201812081557" --step_duration=0.5
上面的命令会对视频以每 0.5 秒取一帧的速度来提取帧,保存到 D:\Downloads\videos\temp\201812081557
下,请勿修改图片的文件名。你也可以使用其他工具来完成这个操作,比如 ffmpeg。
一般可以将 step_duration 设为 1,我这里为了得到更细致的识别结果来做演示所以改成了 0.5。如果你设定的跳转间隙( --step_duration
)比较大,你需要修改源码 face_clustering.py#L74 处 compute_face_descriptor
的第三个参数,将 1 改大一些,比如 50 或者 100,这样会计算更多次数,但识别准确率会有所上升。
python .\face_clustering.py D:\Downloads\videos\temp\201812081557
对 D:\Downloads\videos\temp\201812081557
下的图片进行人脸检测与识别,并保存其中的人脸图片和特征数据到该目录下。如果你的显存足够大,可以对视频帧做放大处理( --frame_scale_rate
),或者在源码的 face_clustering.py#L54 处将 face_detector
的第二个参数改为 1 或以上的数字来 upsample,以检测出更小更远处的人脸。
如果你使用参数 --model=mtcnn
,并且显存足够大,那么处理时间将有较大的提高,但是 mtcnn 检测的准确率相比 dlib 的 cnn face detection 会低一些,比如会将类似人脸的图案检测为人脸(需要调整参数),对角度较大的侧脸或者占满屏幕的特写脸也无法识别。
源码 face_clustering.py#L92 处的参数 0.45 是聚类的门限值,越小则越严格,严格就意味着可能只是光照、角度或者表情有一定的变化,同一人的脸就会被分到不同类别中去;而越大则越宽松,宽松容易导致长的相似的不同人的脸被分到同一类的情况。建议设置得小一点,得出结果之后把不同分类的名称设为同一人即可,这比在一堆图片中分离不同人脸的工作量要小很多。
运行 python .\face_clustering.py --help
了解其他参数的用法,比如设定处理的起始时间和结束时间,批量处理图片数目等。
上一步完成之后, D:\Downloads\videos\temp\201812081557
下的目录结构是类似这样的:
D:\Downloads\videos\temp\201812081557
├── 0-unknown
│ ├── 252_1.jpg
│ ├── 266_1.jpg
│ ├── 280_1.jpg
│ ├── 308_1.jpg
│ ···
├── 1-unknown
│ ├── 294_1.jpg
│ ├── 308_1.jpg
│ ├── 420_1.jpg
│ ├── 448_1.jpg
│ ···
├── 2-unknown
│ ├── 322_1.jpg
│ ├── 336_1.jpg
...
...
└── face_to_descriptor.pickle
每个文件夹代表一个分类,其中包含了属于该分类的人脸图像。每个图像文件名称中 _
号之前的数字为其所在帧数,用于统计,请勿修改。
要列出某个人物的具体出场时段来做视频 cut ,按这么三步操作即可:
- 将包含这个人的文件夹重命名,改为
数字-人名
,如0-张三
3-张三
,不需要合并它们。 - 将文件夹中不是这个人的人脸图片删除。
- 执行
python video_clipping.py 参数
输出时段信息。
标注和整理时,尽量保留每一个确定的不同的分类,删除模糊脸和半截脸,把被视作同一分类的不同人脸新建分类分别存放。
整理之后的目录结构为:
D:\Downloads\videos\temp\201812081557
├── 0-unknown
│ ├── 252_1.jpg
│ ├── 266_1.jpg
│ ├── 280_1.jpg
│ ├── 308_1.jpg
│ ···
├── 1-恩熙
│ ├── 294_1.jpg
│ ├── 308_1.jpg
│ ├── 420_1.jpg
│ ├── 448_1.jpg
│ ···
├── 2-unknown
│ ├── 322_1.jpg
│ ├── 336_1.jpg
...
...
└── face_to_descriptor.pickle
执行 python video_clipping.py D:\Downloads\videos\77b66W1--DxLCnyltG66EIG-CQ_rmcvideo_1080P_1920_5120_192.mp4 D:\Downloads\videos\temp\201812081557 10
,其中参数 --split_blank_duration=10
表示当出现的相邻两帧之间的时长超过 10 秒钟时,即认为两帧不属于同一分段,将分开显示。
作为示例,比如选择列出 程潇
出现的时段:
please select:
0: 路人3
1: 路人14
2: 广告2
3: 恩熙
4: 路人6
5: 广告6
6: 工作人员2
7: 路人5
8: 姚晨
9: 美岐
10: 广告3
11: 路人10
12: 路人11
13: 路人2
14: 宣仪
15: 苞娜
16: 路人7
17: 路人8
18: 路人1
19: 路人?
20: 路人13
21: 路人4
22: 工作人员
23: EXY
24: 路人15
25: 程潇
26: 路人16
27: 路人戴口罩
28: 李晨
29: 路人12
30: 路人9
31: 广告5
32: 广告1
33: 一个字
34: 广告4
25
you select 程潇
['00:17 - 00:32', '01:01 - 01:06', '01:23 - 01:27', '01:38 - 02:48', '03:54 - 04:33', '05:59 - 06:35', '08:03 - 08:40', '08:52 - 08:52', '09:04 - 09:41', '10:42 - 11:37', '12:40 - 12:49', '14:53 - 16:50', '17:04 - 17:04', '17:23 - 17:23', '21:17 - 21:55', '22:14 - 22:24', '23:06 - 24:06', '25:21 - 28:54', '31:26 - 31:32']
这些时段是你选择的人物脸部出现的时间,只有背影或者只说话没有露脸等情况自然不会统计在内,不过还是可以作为视频 cut 的有效辅助手段,在很大程度上可避免人工 cut 遗漏画面的情况,更可以帮助你在获取到视频的第一时间快速 cut 出视频,前提是你电脑性能不错。
你可以简单修改代码,生成适合比如 ffmpeg 的参数形式,实现一键 cut 视频。
执行 python face_classifier.py D:\Downloads\videos\temp\201812081557
生成分类器模型,保存在同目录下,名为 face_classifier.pickle
。
由于我将采样的间隔设置的比较小(0.5 秒),所以结果是非常准确的,因为很多帧都是重合的,仅用作演示,实际应用中分类器的样本数据不会有这么密集,误识别率会相对高一些。间隔设置的较小可以获得更高的识别率,但是做的重复工作就会更多,在比如统计每个人出现时长的应用场景中可以斟酌使用。
执行 python face_recognition.py D:\Downloads\videos\77b66W1--DxLCnyltG66EIG-CQ_rmcvideo_1080P_1920_5120_192.mp4 D:\Downloads\videos\temp\201812081557\face_classifier.pickle
即可查看。