No.68-直播时长自动化统计小妙招
评论
收藏

No.68-直播时长自动化统计小妙招

经验分享
昼夜
2024-06-26 19:50·浏览量:550
昼夜
发布于 2024-06-26 19:43更新于 2024-06-26 19:50550浏览

作者:昼夜

关键词:人脸识别、时长统计



一、问题背景

       在目前电商领域中,直播已经成为越来越多商家的卖货的渠道之一。而对于直播平台的运营者和主播个人来说,准确快速地统计主播的在线时长,对于快速调整直播策略、提升观众体验以及调整直播计划都具有重要意义。那么随之而来就有一个问题,如何自动的去统计主播的时长,尤其是当一场直播中有多位主播出现时,如何计算每位主播的出镜时间呢,这边介绍一些方法。


二、解决方案

       对于统计时长的场景来讲,一般采取到的方案就是先给定一张人像,然后对于视频进行逐帧的读取后对比,通过查看每帧图像帧是否包含我们给定的人像,再根据视频的帧率和图像下标来计算出镜的各个时间点,最后累计得到整体的一个出镜时长。

       而关键的地方就是这个对比的动作如何去做,大致有两种方案,一个是通过第三方的产品(像百度智能云这种)去做图像之间的对比,对比的速度较快且比较成熟。但是该方案会存在一个问题,假设一个直播录屏视频的fps为25,时长为5分钟左右,逐帧截图的话会产生7000多张的图像,依次调用的话,一次运行产生较高额的费用(在预算充足的情况下可以尝试)

       第二种适中的方式是通过python中的face_recognition库来本地实现,这个是专门用来处理人脸识别事务的,基于dlib的深度学习模型,简单易用,通过其内置的方法可以轻松的帮助我们实现人脸识别的功能。具体逻辑如下:

       1.通过opencv加载视频文件,获取到视频的总帧数、帧率等参数信息

       2.通过face_recognition加载对比目标人像,生成对比数据

       3.循环读取视频文件中的每一帧,通过face_recognition检测每帧中人像的位置

       4.对于检测到的每个人脸,获取其编码,并与目标人脸编码进行比较,以确定是否匹配

       5.如果检测到匹配的人脸,记录当前的秒数到时间列表中

       6.统计时间列表的长度,累计之和即为主播出镜时长

import cv2
import face_recognition as fr
import numpy as np

def count_time(video_path, face_path):
    _video = cv2.VideoCapture(video_path)
    _face = fr.load_image_file(face_path)
    compare_face_encoding = fr.face_encodings(_face)

    _frame = True
    i = s = 0

    fps = int(_video.get(cv2.CAP_PROP_FPS))  # 帧率
    print("帧率:", fps)
    total_fps = _video.get(cv2.CAP_PROP_FRAME_COUNT)  # 总帧数
    print("总帧率:", total_fps)
    time_list = []
    
    # 逐帧循环视频进行对比
    while True:
        ret, frame = _video.read()
        
        if (i % fps == 0):
            s = i / fps + 1  # 具体的秒数

            if _frame:
                face_position = fr.face_locations(frame)

                face_encodings = fr.face_encodings(frame, face_position)

                for _i in face_encodings:
                    # 获取人像的位置并于给定图像进行匹配
                    matches = fr.compare_faces(compare_face_encoding, _i)
                    _distances = fr.face_distance(compare_face_encoding, _i)
                    _index = np.argmin(_distances)

                    if matches[_index]:
                        time_list.append(s) # 将时间记录到列表中
        i += 1

        if (i-total_fps == 0):
            break
    
    # 释放资源
    _video.release()
    cv2.destroyAllWindows()

    return time_list


三、效果展示

       这里以一个4分25秒的视频为例,分别统计两位主播在整个播出过程中的时长。


四、其他事项

       1.在影刀中安装face_recognition的时候需要注意,由于他底层依赖的是dlib的包,所以我们需要先到 这个链接下 下载dlib-19.22.99-cp37-cp37m-win_amd64.whl文件(因为影刀内置的python是3.7的,所以一定要下载cp37的),然后放入到影刀目录的cache文件夹下,再到影刀内按照dlib->face_recognition 的顺序安装即可。

       2.在识别的时候由于人像角度、图像识别或者目标人像图的原因,在最后统计的时长中会有一定偏差(一般都是5-8秒之间),这个需要根据实际业务情况评估。

       3.在执行的时候若视频的fps较高或者时长较长,可能会对设备的配置有一些要求。

收藏
全部评论1
最新
发布评论
评论