亚马逊AWS官方博客

基于AI技术的智能剪辑方案

伴随着技术的发展,每天都有海量视频资料产生,但人们往往并不需要视频中的每一个片段。也许您只是想看到自己孩子出现的镜头,或者只关注自己喜欢的明星出演的节目,还可能需要用一些特定人员出现的镜头以制作新的视频。本文将介绍一种基于 AI 技术完成视频智能剪辑的方法。

通过这种方法,您可以从已有视频中快速剪辑出仅包含目标人物的内容。通过 AWS 所提供的托管服务,您无需了解复杂的人脸识别技术或视频编解码技术,甚至无需部署任何服务器资源。您只需要将精力集中在功能实现上。

本方案主要依赖两个核心功能。一,识别视频中的目标人物;二,针对目标任务进行剪辑。前者依赖于人脸识别技术(例如:Amazon Rekognition),后者则属于媒体行业中的视频合成技术(例如:AWS Elemental MediaConvert)。

此外,您需要预先了解 Amazon S3、Amazon DynamoDB、AWS Lambda、Amazon SNS、Amazon API Gateway 服务的基础功能。对这些服务的介绍不在本文范围内,您可以通过官方网站了解它们相关的进一步信息。

 

关于人脸识别:

Amazon Rekognition(下文简称 Rekognition)是 Amazon Web Services 提供的使用机器学习自动执行图像和视频分析的托管服务。Rekognition 提供高度精确的面孔分析和面孔搜索功能,我们将利用这个功能检测、分析并搜索视频中出现的特定面孔。

面孔检测和分析

为了实现特定人员的搜索,首先需要告诉 Rekognition 我们要搜索目标人脸特征是什么。这里我们无需了解诸如卷机神经网络、训练样本、迭代次数之类的技术细节,Rekognition 可以检测图像和视频中的人脸,自动提取并存储这些人脸的特征。所以我们需要做的只是向 Rekognition 提供一组目标人群的人脸照片即可。

首先,通过调用 create_collection API 在 Rekognition 中创建一个被称为“集合(以下称作:collection)“的对象,在 collection 中将会存储检测到的人脸特征。collection 只是一个逻辑上的容器,本身并不包含任何的人脸特征信息。所以接下来需要向 collection 中添加这些信息。

添加的过程需要调用 index_faces API,并提供一张保存在 Amazon S3 存储桶上的人脸照片,以及对应的 collection id。Rekognition 会完成人脸特征提取、信息保存的过程。在 collection 中不会保存完整的图片,只是保存人脸特征信息,例如:

{
    "FaceModelVersion": "5.0",
    "Faces": [
        {
            "BoundingBox": {
                "Width": 0.5216310024261475,
                "Top": 0.3256250023841858,
                "Left": 0.13394300639629364,
                "Height": 0.3918749988079071
            },
            "FaceId": "0040279c-0178-436e-b70a-e61b074e96b0",
            "ExternalImageId": "image1.jpg",
            "Confidence": 100.0,
            "ImageId": "f976e487-3719-5e2d-be8b-ea2724c26991"
        }
}

默认参数下,Rekognition 只提取这些人脸特征:BoundingBox、Confidence、Pose、Quality、和 Landmarks,对于本文中的应用场景已经足够。如果您还需要人脸的年龄、表情、眼睛状态、情绪等更细节的属性,可以在调用 index_faces API 时增加 DetectionAttributes=ALL 的参数设置。这可以满足更广泛的应用场景需求,当然所需要花费的处理时间也会更长。

在保存的参数中,ExternalImageId 是为当前人脸起一个便于记忆的名字。本文介绍的方法将会利用 ExternalImageId 作为在视频中搜索目标人物时使用到的标签名。每次调用 index_faces 时会向 colletion 中添加 1 张人脸信息。如果希望一次性添加多张人脸,需要自行编写代码实现多次调用。

面孔搜索

当建立好 collection 并向其中添加了 IndexFaces 后,就可以利用 collection 对视频进行检索。Rekognition Video 提供 start_face_search API 针对视频文件进行人脸信息检索。调用 API 时需提供视频文件存储的位置(视频需存储在 Amazon S3 存储桶中),以及所使用的 collectionId(即:需要针对哪一个人脸进行检索)。

注意,start_face_search API将搜索视频文件中所有的人脸信息。如果搜索到的人脸信息包含在 collection 中,返回结果将包含该人脸的 ExternalImageId。这是一个异步的人脸检测操作,处理时间与 collection 中包含的信息数量以及待处理的视频长度相关。API 调用成功后仅返回生成的 jobId。在调用 API 进行处理时,可以指定 Amazon SNS Topic。这样,当 Rekognition Video 完成视频检索后将会自动向 SNS Topic 发送消息进行提示。

当检索完成后,可以调用 get_face_search API 查看特定 jobId 的检索结果。返回结果示意如下:

{
    "JobStatus": "SUCCEEDED",
    "NextToken": "cbV9RaFdm…",
    "VideoMetadata": {
        "Codec": "h264",
        "DurationMillis": 1800000,
        "Format": "QuickTime / MOV",
        "FrameRate": 25.0,
        "FrameHeight": 480,
        "FrameWidth": 856
    },
    "Persons": [
        {
            "Timestamp": 4480,
            "Person": {…},
	"FaceMatches": [
                {
                    "Similarity": 99.99900817871094,
                    "Face": {…},
                        "ImageId": "15681d6b-",
                        "ExternalImageId": "xxxxxx",
                        "Confidence": 99.99849700927734
                    }
                }
            ]
        },

返回结果中包含如下主要信息:

  • 视频的元数据信息(视频时长、帧率等);
  • 人脸出现的时间戳(以毫秒为单位);
  • 人脸匹配信息(ExternalImageId,Confidence等)

在单次调用 get_face_search API 时,最多只返回 1000 条信息,这显然无法满足长视频的识别需要。因此对于超过 1000 条信息的检索,get_face_search API 在返回结果中会包含 NextToken字段,这是一个指向后 1000 条检索信息的 hash 指针。通过在循环调用 get_face_search API 中逐条包含 NextToken 字段可顺序获得全部检索结果。

本文中所涉及到的场景将会利用检索结果中的如下信息:

  • 视频文件的帧率;
  • 人脸出现的时间戳;
  • 人脸的 ExternalImageId。

 

关于视频合成:

现在我们已经获得了视频文件中所有人脸出现时的时间码信息,接下来的工作将是基于这些信息进行新的视频合成。这将用到 Amazon Elemental MediaConvert(下文简称 MediaConvert)服务。MediaConvert 是一款具有广播级功能的基于文件的视频转码服务。借助该服务,您能够轻松创建视频点播 (VOD) 内容,实现大规模的广播和多屏幕传输。

在这里我们将使用 MediaConvert 所提供的视频合成功能。我们只需要在创建 MediaConvert 任务时指定好每段视频的起、止时间帧,MediaConvert 将按顺序将所有时间段串行合并为一个新的视频。

Rekognition Video 返回的结果中已经包含了 ExternalImageId,基于这个标记我们直接可以选择要检索出来的人员在哪些时间点出现。然而仍然有两个细节工作需要注意。

  1. Rekognition Video 返回的结果以毫秒为单位,而 MediaConvert 在视频处理时以帧(HH:MM:SS:FF)为单位。这就需要根据视频原始帧率,在“毫秒”与“帧”之间进行转换。
  2. Rekognition Video 返回的是所有时间点,而不是某个人在视频中出现的时间段。从“时间点”到“时间段”的转换需要使用者通过代码自行时间。例如:当返回结果中两个相邻的 Timestamp 之间间隔大于 1 秒时,我们就可以认为这是两段不同的时间段,如果小于 1 秒则是一段连续时间段中的不同时间点。

完成好时间段和视频帧的转换后,可以通过调用 MediaConvert 的 create_job API 创建视频合成任务。

如前文所提到的,MediaConvert 是一款广播级功能的视频转码服务,可设置的参数、可实现的功能非常丰富。下图展示了 MediaConvert 在输出选项组中可设置的部分参数:


输出参数设置(部分截图)

所有参数均和可以在调用 create_job API 时进行设置,或通过指定 JSON 文件的方式传入。对于 job 所需要的 JSON 文件,使用者不必从零开始编写,只需要在控制台界面中根据自己的需要设置好各项参数,然后选择控制台界面中的“显示作业JSON”选项,将自动生成的内容复制出来生成新的 JSON 文件即可。

为实现本文所涉及的场景,只需要设置基本的输入(待处理视频位置)、输出(处理后视频位置、视频片段起止时间、输出视频名称)参数即可。需要注意的是,在输出选项中“速率控制模式”参数是必填项,支持可变比特率(VBR)、恒定比特率(CBR)以及质量定义的可变比特率(QVBR)三种模式。推荐使用 QVBR 方式,不同分辨率下 QVBR 的推荐参数值可以参考 官方文档 中的介绍。

 

整体设计架构:

为了进一步提升整体方案的自动化程度,以及对中间数据持久化,本方案中还使用到了 Amazon DynamoDB、AWS Lambda、Amazon SNS、Amazon API Gateway 服务。方案的整体架构如下图所示:

方案架构图

方案中使用了如下服务:

  1. Amazon Rekognition:图像和视频分析服务;
  2. Amazon Elemental MediaConvert:具有广播级功能的基于文件的视频转码服务;
  3. Amazon API Gateway:一种完全托管的服务,可以帮助开发人员轻松创建、发布、维护、监控和保护任意规模的 API;
  4. Amazon Lambda:一种无服务器的计算服务,让您无需预置或管理服务器、创建可感知工作负载的集群扩展逻辑、维护事件集成或管理运行时,即可运行代码;
  5. Amazon DynamoDB:是一个键/值和文档数据库,可以在任何规模的环境中提供个位数的毫秒级性能;
  6. Amazon S3:对象存储服务,提供行业领先的可扩展性、数据可用性、安全性和性能;
  7. Amazon CloudFront:快速内容分发网络 (CDN) 服务,可以安全地以低延迟和高传输速度向全球客户分发数据、视频、应用程序和 API;
  8. Amazon SNS:一项用于应用与应用之间 (A2A) 以及应用与人之间 (A2P) 通信的完全托管型消息收发服务。

方案通过 Amazon API Gateway 对外暴露 3 个 REST API:collection-create、faces-search、video-clip。

3 个 API 分别对应后端的 3 个 Amazon Lambda 函数。

  • Collection:创建 collection,并从指定的 S3 目录中读取照片,将照片中的人脸信息逐一添加到 collection,以照片的文件名作为人脸信息的 ExternalImageId。需调用 Rekognition 服务的 create_collection 和 index_faces API。
  • Faces Search:根据指定的 collectionid,对保存在 S3 存储桶中的视频文件进行人脸检索。需调用 Rekognition 服务的 start_face_search API。
  • Media Clipping:创建 MediaConvert Job,按照指定的 ExternalImageId 合成剪辑后的视频。需调用 MediaConvert 服务的 create_job API

如之前所描述的,在调用 start_face_search API 时处理时间较长,一方面需要注意将 Lambda 函数的处理时间适当增加(例如:1分钟),另一方面需要进行自动化的设置以便触发下一步的 Lambda 函数。在自动化设置方面,start_face_search API 支持设置 SNS topic,当作业完成后直接发送消息给对应的 SNS topic,通过这个 topic 触发下一步的操作。以 python 为例,调用 start_face_search API 注意进行如下设置:

reko_client.start_face_search(
        Video={
            'S3Object': {
                'Bucket': BUCKET,
                'Name': OBJECT
            }
        },
        CollectionId=collectionId,
        NotificationChannel={
            'SNSTopicArn': snsTopic,
            'RoleArn': roleARN
        }

Lambda 函数 Result Save 被 SNS topic 触发,根据 NextToken 循环调用 Rekognition 的 get_face_search API 获取完整的 face_search 结果,并生成 JSON 文件保存到 S3 存储桶。

上述过程中所生成的 collectionid、jobid 等中间信息均保存在 DynamoDB Table 中。在方案架构图中显示有两个 DynamoDB Table,一个用于保存 collection 信息,另一个用于保存 face_search 的结果信息。您也可以根据自己的需要进行设置。

最后,剪辑好的视频会保存在 S3 存储桶中。为了进一步降低方案的整体成本,剪辑好的视频会通过 cloudfront 进行下载(这将降低在云上产生的流量成本)。在向 S3 存储桶中保存视频时会产生一个事件,这个事件会触发负责通知的 Lambda 函数,生成下载视频时所需要用到的 cloudfront 链接,并向 SNS topic 发送消息,通过 SNS 向订阅者发送 email 进行通知。

 

总结:

本文描述了一种基于 AI 技术,针对人脸信息对视频文件进行智能剪辑的方案。在使用该方案时,您可以:

  • 无需部署服务器资源,整个方案使用 Amazon Web Services 托管服务;
  • 利用 AI 技术,自动识别目标任务;
  • 无需准备海量训练样本,无需掌握复杂的机器学习技能。

如您希望了解该方案原型的部署细节,可以从这里获得方案源代码及架构详细说明。

 

本篇作者

刘伟平

AWS APN 合作伙伴解决方案架构师,主要负责 AWS (中国)合作伙伴的技术支持工作,同时致力于 AWS 云服务在国内的应用及推广。加入 AWS 前,在 HP(HPE)服务超过7年,历任存储售前工程师、电信行业售前工程师、NFV 解决方案架构师,熟悉传统企业 IT 架构、私有云及混合云部署。