亚马逊AWS官方博客

使用 Amazon Rekognition 自动检测图像中人物的个人防护设备

原文链接:

https://aws.amazon.com/cn/blogs/machine-learning/automatically-detecting-personal-protective-equipment-on-persons-in-images-using-amazon-rekognition/

 

工作场所内往往有着多种多样的安全隐患:尖锐的边缘、掉落的物体、飞扬的火花、弥漫在空气中的化学物质、刺耳的噪音乃至其他潜在的危险因素。为此,安全监管机构(例如职业安全与健康管理局(OSHA)以及欧盟委员会等)经常要求企业为员工提供个人防护设备(PPE)并确保按要求使用。在制造、建筑、食品加工、化工、医疗保健以及物流等诸多行业当中,工作场所的安全都是日常运营的重中之重。此外,随着COVID-19疫情的爆发,在公共场所佩戴PPE也能够有效阻遏病毒传播。在本文中,我们将共同了解如何使用Amazon Rekognition自动检测图像中的人物是否佩戴PPE,借此改善安全流程。我们将首先概述PPE检测功能,解释其工作原理,而后根据您的摄像机与网络要求讨论部署PPE检测解决方案的不同方法。

Amazon Rekognition PPE检测概述

即使人们努力遵循PPE准则,有时也会无意间忘记佩戴PPE、或者未能意识到当前区域需要佩戴PPE。这不仅给他们的人身安全带来潜在风险,同时也令企业面临潜在的合规性问题。企业通常依靠现场主管或督导员单独检查,并提醒特定区域内的所有人员佩戴PPE。这种方式可靠性差,而且在规模化场景下往往效率低下或成本过高。借助Amazon Rekognition PPE检测,企业可以通过自动化方式显著增强手动检查能力。

凭借Amazon Rekognition PPE检测,大家可以规模化分析来自本地摄像机的图像,借此自动检测人员是否佩戴了必要的防护设备,包括口罩(手术口罩、N95口罩、布口罩等)、头罩(安全帽或头盔)以及手套(手术手套、安全手套、布制手套等)。利用这部分结果,您可以及时触发警报或通知,提醒人们在进入危险区域之前或之时佩戴PPE,借此改善或维护全体人员的安全。

您还可以汇总PPE检测结果,并按时间和地点对其进行分析,借此确定如何改进安全警告、培训实践或者生成报告以供监管审计使用。例如,建筑企业可以检查建筑工人在施工现场时是否佩戴有安全帽与手套,通过实际检测到的PPE数量判断其是否遵循安全保护要求。食品加工企业则可以检查无污染区域内的工作人员是否佩戴口罩与手套,保证符合食品安全法规。或者,制造企业可以分析不同站点及工厂的PPE检测结果,确定需要在哪里添加更多危险警告标志并进行额外的安全培训。

使用Amazon Rekognition PPE检测,您将收到关于图像内容的详细分析结果,包括对应PPE及人员的边界框与置信度得分(每幅图像最多15个),同时检测身体各部位置信度得分、相应布尔值以及PPE是否覆盖相应身体部位的置信度。下图所示,为使用Amazon Rekognition PPE检测功能提供的分析结果,对示例内的头盔、手套以及口罩等PPE的边界框划分与置信度评分。

通常,仅检测图像中是否存在PPE往往缺乏实际意义。更重要的是检测客户或员工是否正确佩戴了PPE。Amazon Rekognition PPE检测还可以预测防护设备是否覆盖到人体相应部位,并以置信度得分的形式体现。例如,如果某人的鼻子被口罩覆盖、头部被头盔覆盖、手部被手套覆盖,则代表正确佩戴PPE。这种预测有助于解决图像中包含PPE,但实际上未得到正确佩戴的问题。

您还可以整理出必要的PPE列表(例如口罩或口罩加头盔)以及最低置信度阈值(例如80%),借此为图像上穿着必要PPE的人员、未佩戴必要PPE以及未检测到任何PPE(例如未拍到某些身体部位)等结论的合并列表。这减少了开发人员进行大量计数,或者引用图像中特定个人信息以进一步进行分析所需要的代码编写需求。

现在,让我们进一步分析Amazon Rekognition PPE检测的工作原理。

工作原理

要检查图像中的PPE,您可以调用DetectProtectiveEquipment API并传递输入图像。您可以提供输入图像(JPG或PNG格式),将其作为原始字节或者存储在Amazon Simple Storage Service (Amazon S3)存储桶内的对象。您也可以选择使用SummarizationAttributes (ProtectiveEquipmentSummarizationAttributes)输入参数来请求关于佩戴所需PPE、未佩戴所需PPE或者不确定人员的摘要信息。

下图所示,为示例输入图像以及在Amazon Rekognition PPE检测控制台上看到的来自DetectProtectiveEquipment的相应输出。在此示例中,我们将口罩作为必要PPE,并将80%设定为摘要属性中的最低置信度阈值。我们收到一项汇总结果,表明图像中有4人佩戴有脸部覆盖物,且置信度得分均超过80%(人物标识符0、1、2、3)。它还在每位人员的分析结果中提出完整的保真度API响应。请注意,此功能不会执行人脸识别或者面部比较,也无法识别出检测到的人物。

以下,为控制台内指向此示例图像的DetectProtectiveEquipment API请求。

{
    "Image": {
        "S3Object": {
            "Bucket": "console-sample-images",
            "Name": "ppe_group_updated.jpg"
        }
    },
    "SummarizationAttributes": {
        "MinConfidence": 80,
        "RequiredEquipmentTypes": [
            "FACE_COVER"
        ]
    }
}

DetectProtectiveEquipment API的响应为JSON结构,能够在每张图像中包含最多15位检测到的人物,并对各个人物的身体部位(面部、头部、左手与右手)、画面中的PPE类型以及PPE是否覆盖相应身体部位进行检测。来自此图像DetectProtectiveEquipment API的完整JSON响应如下:

"ProtectiveEquipmentModelVersion": "1.0",
    "Persons": [
        {
            "BodyParts": [
                {
                    "Name": "FACE",
                    "Confidence": 99.07738494873047,
                    "EquipmentDetections": [
                        {
                            "BoundingBox": {
                                "Width": 0.06805413216352463,
                                "Height": 0.09381836652755737,
                                "Left": 0.7537466287612915,
                                "Top": 0.26088595390319824
                            },
                            "Confidence": 99.98419189453125,
                            "Type": "FACE_COVER",
                            "CoversBodyPart": {
                                "Confidence": 99.76295471191406,
                                "Value": true
                            }
                        }
                    ]
                },
                {
                    "Name": "LEFT_HAND",
                    "Confidence": 99.25702667236328,
                    "EquipmentDetections": []
                },
                {
                    "Name": "RIGHT_HAND",
                    "Confidence": 80.11490631103516,
                    "EquipmentDetections": []
                },
                {
                    "Name": "HEAD",
                    "Confidence": 99.9693374633789,
                    "EquipmentDetections": [
                        {
                            "BoundingBox": {
                                "Width": 0.09358207136392593,
                                "Height": 0.10753925144672394,
                                "Left": 0.7455776929855347,
                                "Top": 0.16204142570495605
                            },
                            "Confidence": 98.4826889038086,
                            "Type": "HEAD_COVER",
                            "CoversBodyPart": {
                                "Confidence": 99.99744415283203,
                                "Value": true
                            }
                        }
                    ]
                }
            ],
            "BoundingBox": {
                "Width": 0.22291666269302368,
                "Height": 0.82421875,
                "Left": 0.7026041746139526,
                "Top": 0.15703125298023224
            },
            "Confidence": 99.97362518310547,
            "Id": 0
        },
        {
            "BodyParts": [
                {
                    "Name": "FACE",
                    "Confidence": 99.71298217773438,
                    "EquipmentDetections": [
                        {
                            "BoundingBox": {
                                "Width": 0.05732834339141846,
                                "Height": 0.07323434203863144,
                                "Left": 0.5775181651115417,
                                "Top": 0.33671364188194275
                            },
                            "Confidence": 99.96135711669922,
                            "Type": "FACE_COVER",
                            "CoversBodyPart": {
                                "Confidence": 96.60395050048828,
                                "Value": true
                            }
                        }
                    ]
                },
                {
                    "Name": "LEFT_HAND",
                    "Confidence": 98.09618377685547,
                    "EquipmentDetections": []
                },
                {
                    "Name": "RIGHT_HAND",
                    "Confidence": 95.69132995605469,
                    "EquipmentDetections": []
                },
                {
                    "Name": "HEAD",
                    "Confidence": 99.997314453125,
                    "EquipmentDetections": [
                        {
                            "BoundingBox": {
                                "Width": 0.07994530349969864,
                                "Height": 0.08479492366313934,
                                "Left": 0.5641391277313232,
                                "Top": 0.2394576370716095
                            },
                            "Confidence": 97.718017578125,
                            "Type": "HEAD_COVER",
                            "CoversBodyPart": {
                                "Confidence": 99.9454345703125,
                                "Value": true
                            }
                        }
                    ]
                }
            ],
            "BoundingBox": {
                "Width": 0.21979166567325592,
                "Height": 0.742968738079071,
                "Left": 0.49427083134651184,
                "Top": 0.24296875298023224
            },
            "Confidence": 99.99588012695312,
            "Id": 1
        },
        {
            "BodyParts": [
                {
                    "Name": "FACE",
                    "Confidence": 98.42090606689453,
                    "EquipmentDetections": [
                        {
                            "BoundingBox": {
                                "Width": 0.05756797641515732,
                                "Height": 0.07883334159851074,
                                "Left": 0.22534936666488647,
                                "Top": 0.35751715302467346
                            },
                            "Confidence": 99.97816467285156,
                            "Type": "FACE_COVER",
                            "CoversBodyPart": {
                                "Confidence": 95.9388656616211,
                                "Value": true
                            }
                        }
                    ]
                },
                {
                    "Name": "LEFT_HAND",
                    "Confidence": 92.42487335205078,
                    "EquipmentDetections": []
                },
                {
                    "Name": "RIGHT_HAND",
                    "Confidence": 96.88029479980469,
                    "EquipmentDetections": []
                },
                {
                    "Name": "HEAD",
                    "Confidence": 99.98686218261719,
                    "EquipmentDetections": [
                        {
                            "BoundingBox": {
                                "Width": 0.0872764065861702,
                                "Height": 0.09496871381998062,
                                "Left": 0.20529428124427795,
                                "Top": 0.2652358412742615
                            },
                            "Confidence": 90.25578308105469,
                            "Type": "HEAD_COVER",
                            "CoversBodyPart": {
                                "Confidence": 99.99089813232422,
                                "Value": true
                            }
                        }
                    ]
                }
            ],
            "BoundingBox": {
                "Width": 0.19479165971279144,
                "Height": 0.72265625,
                "Left": 0.12187500298023224,
                "Top": 0.2679687440395355
            },
            "Confidence": 99.98648071289062,
            "Id": 2
        },
        {
            "BodyParts": [
                {
                    "Name": "FACE",
                    "Confidence": 99.32310485839844,
                    "EquipmentDetections": [
                        {
                            "BoundingBox": {
                                "Width": 0.055801939219236374,
                                "Height": 0.06405147165060043,
                                "Left": 0.38087061047554016,
                                "Top": 0.393160879611969
                            },
                            "Confidence": 99.98370361328125,
                            "Type": "FACE_COVER",
                            "CoversBodyPart": {
                                "Confidence": 98.56526184082031,
                                "Value": true
                            }
                        }
                    ]
                },
                {
                    "Name": "LEFT_HAND",
                    "Confidence": 96.11709594726562,
                    "EquipmentDetections": []
                },
                {
                    "Name": "RIGHT_HAND",
                    "Confidence": 80.49284362792969,
                    "EquipmentDetections": []
                },
                {
                    "Name": "HEAD",
                    "Confidence": 99.91870880126953,
                    "EquipmentDetections": [
                        {
                            "BoundingBox": {
                                "Width": 0.08105235546827316,
                                "Height": 0.07952981442213058,
                                "Left": 0.36679577827453613,
                                "Top": 0.2875025272369385
                            },
                            "Confidence": 98.80988311767578,
                            "Type": "HEAD_COVER",
                            "CoversBodyPart": {
                                "Confidence": 99.6932144165039,
                                "Value": true
                            }
                        }
                    ]
                }
            ],
            "BoundingBox": {
                "Width": 0.18541666865348816,
                "Height": 0.6875,
                "Left": 0.3187499940395355,
                "Top": 0.29218751192092896
            },
            "Confidence": 99.98927307128906,
            "Id": 3
        }
    ],
    "Summary": {
        "PersonsWithRequiredEquipment": [
            0,
            1,
            2,
            3
        ],
        "PersonsWithoutRequiredEquipment": [],
        "PersonsIndeterminate": []
    }
}

部署Amazon Rekognition PPE检测

根据您的实际用例、摄像机与环境设置,大家可以使用不同的方法来分析本地摄像机内容,借此进行PPE检测。由于DetectProtectiveEquipment API仅接受图像作为输出,因此您可以设定预期频率(例如每1秒、2秒或5秒,或者每次检测到运动时)从流式传输或存储的视频中提取画面帧,并使用DetectProtectiveEquipment API分析这些帧。您还可以为覆盖不同区域的摄像机设置不同的帧摄取频率。例如,您可以在繁忙或重要的地点设置较高的频率,而为相对普通的区域设定较低的频率。以此为基础,您可以控制网络带宽要求,更高效地将重要图像发送至AWS云进行处理。

以下架构所示,为如何设计无服务器工作流以处理来自摄像机的画面帧并进行PPE检测。

我们在Amazon Rekognition PPE检测的GitHub repo中包含一个用于实现这套参考架构的演示Web应用程序。此Web应用程序能够从网络摄像机视频提要中提取帧,并将其发送至部署在AWS云端的解决方案。在使用DetectProtectiveEquipment API分析图像时,Web应用程序中的摘要输出将以近实时方式显示。通过以下示例GIF,我们可以看到网络摄像机以每2秒钟一次的频率进行帧采样时,检测到的面部、头部与手部覆盖物检测结果。根据实际使用需求,您可以将采样率调整为更高或更低的频率。截屏中显示出完整的演示应用程序输出,包括PPE以及PPE磨损情况的预测。

口罩检测

手套检测

头盔检测

完整的演示Web应用程序输出结果

使用这款应用程序及解决方案,您可以使用Amazon Simple Notification Service生成通知。尽管未在演示解决方案中体现(但参考架构中有所包含),您仍然可以存储PPE检测结果,以供后续通过AWS Glue、Amazon Athena以及Amazon QuickSight等AWS服务创建PPE检测事件的匿名报告。您还可以选择在特定时间之内将提取到的图像存储在Amazon S3当中,借此进行监管审计。关于部署演示Web应用程序及解决方案的说明,请参阅Amazon Rekognition PPE检测GitHub repo

除了通过Amazon API Gateway发送图像之外,您还可以将图像直接发送至S3存储桶。以此为基础,您可以将其他元数据(包括摄像机位置、时间以及其他摄像机信息)存储为Amazon S3对象元数据。图像处理完成之后,您可以根据组织的数据保留策略要求,通过S3存储桶的生命周期策略立即将其删除、或者设置时间窗口以定期进行数据清理。大家可以使用以下参考架构设计出这样一套替代性的工作流。

从视频系统中提取图像帧

根据您所使用的摄像机设置与视频管理系统,大家可以使用制造商提供的SDK提取图像帧。对于支持HTTP或RTSP流的摄像机,以下代码示例演示了如何从摄像机的提要中以所需频率提取图像帧,并使用DetectProtectiveEquipment API对其进行处理。

import cv2
import boto3
import time
from datetime import datetime
import json

def processFrame(videoStreamUrl):
    cap = cv2.VideoCapture(videoStreamUrl)
    ret, frame = cap.read()
    if ret:
        hasFrame, imageBytes = cv2.imencode(".jpg", frame)
        if hasFrame:
            session = boto3.session.Session()
            rekognition = session.client('rekognition')
            response = rekognition. detect_protective_equipment(
                    Image={
                        'Bytes': imageBytes.tobytes(),
                    }
                )
            print(response)
    cap.release()

# 视频流
videoStreamUrl = "rtsp://@192.168.10.100"
frameCaptureThreshold = 300

while (True):
    try:
        processFrame(videoStreamUrl)
    except Exception as e:
        print("Error: {}.".format(e))

    time.sleep(frameCaptureThreshold)

要从存储的视频中提取图像帧,您可以使用AWS Elemental MediaConvert或者FFmpegOpenCV等其他工具。以下代码所示,为如何在存储的视频中提取图像帧并使用DetectProtectiveEquipment API进行处理:

import json
import boto3
import cv2
import math
import io

videoFile = "video file"
rekognition = boto3.client('rekognition')        
ppeLabels = []    
cap = cv2.VideoCapture(videoFile)
frameRate = cap.get(5) #帧率
while(cap.isOpened()):
    frameId = cap.get(1) #当前帧数
    print("Processing frame id: {}".format(frameId))
    ret, frame = cap.read()
    if (ret != True):
        break
    if (frameId % math.floor(frameRate) == 0):
        hasFrame, imageBytes = cv2.imencode(".jpg", frame)

        if(hasFrame):
            response = rekognition. detect_protective_equipment(
                Image={
                    'Bytes': imageBytes.tobytes(),
                }
            )
        
        for person in response["Persons"]:
            person["Timestamp"] = (frameId/frameRate)*1000
            ppeLabels.append(person)

print(ppeLabels)

with open(videoFile + ".json", "w") as f:
    f.write(json.dumps(ppeLabels)) 

cap.release()

 

检测其他及自定义PPE

DetectProtectiveEquipment API能够涵盖大部分常见的PPE,但如果您的用例需要识别特定于业务需求的其他设备,则可以使用Amazon Rekognition自定义标签。例如,您可以使用Amazon Rekognition自定义标签快速训练自定义模型,提供包含待检测内容的标记图像以识别安全眼镜、高识别度背心或者其他自定义PPE。使用Amazon Rekognition自定义标签不需要任何机器学习专业知识。在您训练好自定义模型并准备进行推理时,则可并行调用DetectProtectiveEquipment与Amazon Rekognition自定义标签模型,借此检测所有必要的PPE,并合并结果以供进一步处理。关于使用Amazon Rekognition自定义标签检测高识别度背心(包括带有说明的示例解决方案)的更多详细信息,请参阅自定义PPE检测GitHub repo。您可以使用以下参考架构图以设计出将DetectProtectiveEquipment与Amazon Rekognition Custom Labels PPE将结合的检测解决方案。

总结

在本文中,我们展示了如何使用检测(DetectProtectiveEquipment API)来自动分析图像及视频帧,借此检查员工及客户是否正确佩戴个人防护设备,例如口罩、头盔与手套等。我们介绍了多种实现方法,包括从摄像机、存储视频以及流式视频中提取图像帧。最后,我们还介绍了如何使用Amazon Rekognition自定义标签来识别特定实际业务需求的其他设备。

要使用您自己的图像测试PPE检测,请登录至Amazon Rekognition控制台,而后将图像上传至Amazon Rekognition PPE检测控制台演示当中。关于API输入、输出、限制及建议的更多详细信息,请参阅Amazon Rekognition PPE检测说明文档。要了解客户对此项功能的看法,或者思考是否需要合作伙伴帮助您的组织构建端到端PPE检测解决方案,请参阅Amazon Rekognition工作场所安全网页

 

本篇作者

Tushar Agrawal

Amazon Rekognition出站产品管理负责人。他致力于通过正确的解决方案与产品发布能力帮助客户解决业务难题,助力客户取得成功。在业余时间,他喜欢听音乐和重温童年回忆。

Kashif Imran

Amazon Web Services公司首席解决方案架构师。他与多家努力利用AI/ML技术解决复杂业务问题的最大AWS客户开展合作,负责提供技术指导与设计建议,借此大规模实施计算机视觉应用。他的专长涵盖应用程序架构、无服务器、容器、NoSQL以及机器学习技术。

Matteo Figus

AWS英国分部解决方案工程师。Matteo与AWS解决方案架构师们共同创建标准化工具、代码示例、演示及快速入门教程。他对开源软件充满热情,在业余时间喜欢烹饪和演奏钢琴。

Connor Kirkpatrick

AWS英国分部解决方案工程师。Connor与AWS解决方案架构师们共同创建标准化工具、代码示例、演示及快速入门教程。在业余时间,他热爱壁球运动、偶尔也骑自行车和烘焙面包。