视觉AI五天训练营 Day05 搭建多场景人脸口罩检测系统(附效果动图)

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,内容安全 1000次 1年
对象存储 OSS,恶意文件检测 1000次 1年
简介: 视觉AI五天训练营 Day05 搭建多场景人脸口罩检测系统(附效果动图)

搭建多场景人脸口罩检测系统-基于阿里云视觉智能平台

最后一次的课了,就不辣么水了。这次的试验目的是将用户上传的图片(例如在公共场合的监控照片)进行识别,返回当前图片中的人数、(人)活体的可信度、佩戴口罩的人数以及其占比、未佩戴口罩的人物坐标。可以设置适当的阀值,当达到一定阀值(占比)时进行警告或者通知等处理。

第一步,阿里云控制台获取accesskey

image.png

不管你调用任何的能力,基本都需要获取accesskey。

第二步,去阿里云视觉开放平台查看接口文档

  • 这次试验一共使用了阿里云视觉开放平台的两个能力,分别是:

人脸检测定位:返回图片中人脸数量,人脸坐标;
使用OpenCV切割人脸(无阿里云相关接口,所以通过本地实现):通过人脸坐标进行裁剪图片,以便下一步检测口罩;
人脸口罩识别:识别输入图片中的人脸是否有戴口罩。

  • 预计效果:

输出图片中的人脸数以及可信度,输出未戴口罩的人数以及可信度,未戴口罩的人数达到一定占比对用户进行通知。

第三步,编写代码(高级CV工程师又上线了)

1.导入需要使用的模块,以及阿里云视觉相关的模块

import os
import json
import time
from urllib import request
import numpy as np
import cv2

from viapi.fileutils import FileUtils
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkfacebody.request.v20191230.DetectFaceRequest import DetectFaceRequest
from aliyunsdkfacebody.request.v20191230.DetectMaskRequest import DetectMaskRequest

2.出于安全以及模块化的考虑,将阿里云的AccessKey和AccessSecret写入配置文件,需要的时候通过函数调用,代码如下。

#获取accesskeyId和AccessSecret
def get_access():
    with open(r'accesskey.conf', 'r') as f:
        KeyId, Secret = f.read().split()  #split切割
        return KeyId, Secret

3.由于将图片交由阿里云视觉平台处理需要使用阿里云OSS,在阿里云OSS的文档中有关于各大编程语言的上传下载等操作的sdk,但是出于懒惰的考虑,我决定使用阿里云视觉平台提供的临时OSS,默认region就是上海的,而上传图片只需要几行代码就搞定了,简直完美;由于在调用的时候需要区分是上传的是本地文件还是图片URL,所以我多加了一个参数‘bool’,用于方便上传本地或者网络的图片,具体代码如下。

# 上传图片到临时OSS
def uploadImage_2_oss(accessKeyId, accessSecret, uploadUrl, bool):
    file_utils = FileUtils(accessKeyId, accessSecret)
    oss_url = file_utils.get_oss_url(uploadUrl,"jpg",bool)
    return (oss_url)
    # oss_url = file_utils.get_oss_url("/home/xxx.mp4","mp4",True)
    # print(oss_url)

4.准备就绪,编写代码调用阿里云视觉平台的人脸检测定位能力,对通过上传到临时OSS的图片进行处理,并格式化返回的结果,因为我们不需要一些无用的返回结果,只需要返回FaceProbabilityList以及Credibility和FaceCoordinate,对于人脸坐标,其实后面还有的用处,返回json数据以及Face_Number,具体代码如下。

#人脸检测并返回人脸数量、可信度、人脸坐标
def Face_Number_Check(accessKeyId, accessSecret, oss_url):       
    client = AcsClient(accessKeyId, accessSecret, 'cn-shanghai')
    request_Face_Number = DetectFaceRequest()
    request_Face_Number.set_accept_format('json')
    request_Face_Number.set_ImageURL(oss_url)
    response_Face_Number = client.do_action_with_exception(request_Face_Number)
    response_Face_Number = str(response_Face_Number, encoding='utf-8')
    res_Face_Data_List = json.loads(response_Face_Number)
    Face_Number = len(res_Face_Data_List['Data']['FaceProbabilityList'])
    Face_Credibility = res_Face_Data_List['Data']['FaceProbabilityList']
    #返回人脸矩形框,分别是[left, top, width, height]
    face_Coordinate = list_split(res_Face_Data_List['Data']['FaceRectangles'],4) 
    C_C_json = {'Coordinate':[], 'Credibility':[]}
    # class1_value.append ('检测到图像中的人脸数共有 %d 个' %Face_Number)
    for i in range(Face_Number):
        C_C_json['Coordinate'].append (face_Coordinate[i])
        C_C_json['Credibility'].append ('%.2f%%' %(Face_Credibility[i]*100))
        # print (face_Coordinate[i])
    return C_C_json, Face_Number

5.由于上方拿到了图片中所有的FaceCoordinate,我们在格式化之前对列表进行分割,以便后续定位切割方便使用,代码如下。

#定义一个数组分割函数,对应一张人脸四个坐标
def list_split(items, n):   
    return [items[i:i+n] for i in range(0, len(items), n)]

6.接下来就要通过本地的处理将图片中的人脸切割出来,我使用的是cv2进行处理的,所以上方格式化的Coordinate就有了用处,切割出来之后临时存入本地即刻上传临时OSS,并在完成后删除切割的图片,将上传好的人脸图片链接写入list,最后返回一个OSS_IMG_List,方便需要的时候使用。代码如下。

#图像人脸分割
def Face_Mask_Recognition(oss_url,ccjson):
    oss_url_list = []
    for i in range(len(ccjson['Coordinate'])):
        x0 = ccjson['Coordinate'][i][0]
        y0 = ccjson['Coordinate'][i][1]
        x1 = ccjson['Coordinate'][i][2] + x0
        y1 = ccjson['Coordinate'][i][3] + y0

        resp = request.urlopen(oss_url)
        image = np.asarray(bytearray(resp.read()), dtype="uint8")
        image = cv2.imdecode(image, cv2.IMREAD_COLOR)
        cropped = image[y0:y1, x0:x1]
        path = "./images/" + str(i) + ".jpg"
        print ('一共%d张人脸图片,正在分割第%d张图片...' %(len(ccjson['Coordinate']), i+1))
        cv2.imwrite(path, cropped)

        #上传至region为上海的临时OSS并返回链接
        uploadPath = path
        oss_url_list.append (uploadImage_2_oss(accessKeyId, accessSecret, uploadPath, True))
        #上传完毕删除文件
        os.remove(path)
    print ('分割完毕,准备进行口罩佩戴识别...')
    print ('-'*80+'\n')
    return oss_url_list

7.有了图片中的人脸图片的OSS链接之后,通过调用阿里云视觉平台的人脸口罩识别能力,对切割好的人脸进行处理识别,对处理的结果进行简单的处理之后,便可以格式化输出了。代码如下。

#人脸口罩识别
def Mask_Detection(accessKeyId, accessSecret, oss_url_list):
    client = AcsClient(accessKeyId, accessSecret, 'cn-shanghai')
    request_Mask = DetectMaskRequest()
    request_Mask.set_accept_format('json')

    res_Mask_List = []
    for i in range(len(oss_url_list)):
        print ('正在识别图像中第%d个人脸口罩佩戴情况...' %(i+1))
        request_Mask.set_ImageURL(oss_url_list[i])
        response_Mask = client.do_action_with_exception(request_Mask)
        response_Mask = str(response_Mask, encoding='utf-8')
        res_Mask = json.loads(response_Mask)['Data']['Mask']
        res_Mask_List.append (res_Mask)
        time.sleep(0.5)
    print ('识别完毕,准备格式化输出结果...')
    print ('-'*80+'\n')
    return res_Mask_List

8.由于对于口罩识别的API返回的数据并不是我们想要的,没有戴口罩返回1,戴了返回2,通过简单的转换之后,就可以显示成百分百了,不过只有100%和0%,不过我不尴尬,尴尬的是阿里云,谁叫它只返回1或者2,即戴了或者没戴,代码如下。

#转换口罩识别结果
def numlist2str(islist):
    for x in range(len(islist)):
        if islist[x] == 1:
            islist[x] = '0%'
        else:
            islist[x] = '100%'
    return islist

9.口说无凭,你说图片有几个人脸就几个人脸吗?你说戴了口罩就戴了口罩?为了更直观的表达,还是把原图读取出来,并对人脸进行圈圈,就是画个框框,(本来想要做成戴了口罩的用绿框框,没戴的用红框框,但是由于我比较懒,加上没有时间,以及代码写的太乱了,就不搞了,有兴趣的小伙伴可以搞一下,不难的)

#读取检测的图片,并通过cv2对人脸进行标记,最后显示出来
def showimg():
    #显示检测的图片
    resp = request.urlopen(oss_url)
    image = np.asarray(bytearray(resp.read()), dtype="uint8")
    image = cv2.imdecode(image, cv2.IMREAD_COLOR)

    # 输入参数分别为图像、左上角坐标、右下角坐标、颜色数组、粗细
    for x in range(len(ccjson['Coordinate'])):
        x0 = ccjson['Coordinate'][x][0]
        y0 = ccjson['Coordinate'][x][1]
        x1 = ccjson['Coordinate'][x][2] + x0
        y1 = ccjson['Coordinate'][x][3] + y0
        cv2.rectangle(image, (x0,y0), (x1,y1), (0,0,255), 2)

    cv2.namedWindow("image" , cv2.WINDOW_NORMAL)
    cv2.imshow('image', image)
    cv2.waitKey(0)

10.好了,到最后一步了,写个入口,调用下把子函数,输出下需要的数据就好了。代码如下。

if '__main__' == __name__:

    uploadUrl = input('输入需要检测人脸的图片链接(路径)后回车:\n')
    accessKeyId, accessSecret = get_access()
    oss_url = uploadImage_2_oss(accessKeyId, accessSecret, uploadUrl, False)

    #分割符
    print ('-'*80+'\n')

    #人脸数量及坐标的结果
    ccjson, Face_Number = Face_Number_Check(accessKeyId, accessSecret, oss_url)
    # print (len(ccjson['Coordinate']))
    
    #分割图片中的人脸并返回分割好的图片链接
    oss_url_list = Face_Mask_Recognition(oss_url,ccjson)


    #识别人脸是否佩戴口罩结果
    result_Mask = Mask_Detection(accessKeyId, accessSecret, oss_url_list)
    result_Mask = numlist2str(result_Mask)

    for x in range(len(ccjson['Coordinate'])):
        print ('检测到第%d张人脸坐标为%s\t人脸概率为%s\t佩戴口罩概率为%s' %(x+1, ccjson['Coordinate'][x], ccjson['Credibility'][x], result_Mask[x]))


    #标记图片中人脸
    showimg()

11.经过简单的图片处理和视觉平台能力的整合,我们来试验一下效果。

首先来一张本地图片

image.png

接着我们进行试验,动图如下。

image.png

再来一张网络图片

image.png

再来一次看看效果。

image.png

第四步,查看返回结果

大概长这样

image.png

结语

至此,就结束了,由于本人学艺不精,算是一个不入门级的选手,如果小伙伴们对此有更好的方法或者思路,欢迎一起讨论。最后的话,我,希望有机会能再参加阿里云的活动!

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
相关文章
|
5天前
|
人工智能 前端开发 小程序
2024年12月30日蜻蜓蜻蜓AI工具系统v1.0.0发布-优雅草科技本产品前端源代码已对外开源可免费商用-优雅草老八
2024年12月30日蜻蜓蜻蜓AI工具系统v1.0.0发布-优雅草科技本产品前端源代码已对外开源可免费商用-优雅草老八
2024年12月30日蜻蜓蜻蜓AI工具系统v1.0.0发布-优雅草科技本产品前端源代码已对外开源可免费商用-优雅草老八
|
2天前
|
存储 人工智能 开发框架
Eliza:TypeScript 版开源 AI Agent 开发框架,快速搭建智能、个性的 Agents 系统
Eliza 是一个开源的多代理模拟框架,支持多平台连接、多模型集成,能够快速构建智能、高效的AI系统。
28 8
Eliza:TypeScript 版开源 AI Agent 开发框架,快速搭建智能、个性的 Agents 系统
|
3天前
|
人工智能 UED
VersaGen:生成式 AI 代理,基于 Stable Diffusion 生成图像,专注于控制一至多个视觉主体等生成细节
VersaGen 是一款生成式 AI 代理,专注于文本到图像合成中的视觉控制能力,支持多种视觉控制类型,并通过优化策略提升图像生成质量和用户体验。
20 8
VersaGen:生成式 AI 代理,基于 Stable Diffusion 生成图像,专注于控制一至多个视觉主体等生成细节
|
9天前
|
人工智能 自然语言处理 并行计算
ASAL:Sakana AI 联合 OpenAI 推出自动探索人工生命的系统,通过计算机模拟生命进化的过程
ASAL 是由 Sakana AI 联合 OpenAI 等机构推出的自动化搜索人工生命系统,基于基础模型实现多种搜索机制,扩展了人工生命研究的边界。
60 1
ASAL:Sakana AI 联合 OpenAI 推出自动探索人工生命的系统,通过计算机模拟生命进化的过程
|
6天前
|
人工智能 智能硬件
SPAR:智谱 AI 推出自我博弈训练框架,基于生成者和完善者两个角色的互动,提升了执行准确度和自我完善能力
SPAR 是智谱团队推出的自我博弈训练框架,旨在提升大型语言模型在指令遵循方面的能力,通过生成者和完善者的互动以及树搜索技术优化模型响应。
19 0
SPAR:智谱 AI 推出自我博弈训练框架,基于生成者和完善者两个角色的互动,提升了执行准确度和自我完善能力
|
8天前
|
机器学习/深度学习 传感器 人工智能
开源AI视频监控系统在监狱安全中的应用——实时情绪与行为分析、暴力预警技术详解
针对监狱环境中囚犯情绪波动和复杂人际互动带来的监控挑战,传统CCTV系统难以有效预警暴力事件。AI视频监控系统基于深度学习与计算机视觉技术,实现对行为、情绪的实时分析,尤其在低光环境下表现优异。该系统通过多设备协同、数据同步及自适应训练,确保高精度识别(95%以上)、快速响应(<5秒),并具备24小时不间断运行能力,极大提升了监狱安全管理的效率与准确性。
|
9天前
|
人工智能 API 数据库
Browser Use:开源 AI 浏览器助手,自动完成网页交互任务,支持多标签页管理、视觉识别和内容提取等功能
Browser Use 是一款专为大语言模型设计的智能浏览器工具,支持多标签页管理、视觉识别、内容提取等功能,并能记录和重复执行特定动作,适用于多种应用场景。
145 0
Browser Use:开源 AI 浏览器助手,自动完成网页交互任务,支持多标签页管理、视觉识别和内容提取等功能
|
1天前
|
人工智能 运维 API
PAI企业级能力升级:应用系统构建、高效资源管理、AI治理
PAI平台针对企业用户在AI应用中的复杂需求,提供了全面的企业级能力。涵盖权限管理、资源分配、任务调度与资产管理等模块,确保高效利用AI资源。通过API和SDK支持定制化开发,满足不同企业的特殊需求。典型案例中,某顶尖高校基于PAI构建了融合AI与HPC的科研计算平台,实现了作业、运营及运维三大中心的高效管理,成功服务于校内外多个场景。
|
机器学习/深度学习 新零售 人工智能
阿里云高校计划视觉AI五天训练营 Day 1——视觉应用探索
在这个人工智能已经普及的时代,各行各业都充斥着AI的身影。大部分人认为人工智能起点高,入门难,想要使用AI服务又无法独立完成编写,开发者可以通过阿里云视觉平台提供的通用且标准化的接入方式,快速接入及使用阿里云视觉平台提供的包括人脸人体、文字识别、商品理解、内容安全、图像识别、图像生产、分割抠图、视觉搜索、目标检测、图像分析处理、视频理解、视频生产、视频分割13个类目多个API能力,为其提供高易用、普惠的视觉API服务,帮助企业快速建立视觉智能技术的应用能力的综合性视觉AI能力平台。
1304 0
阿里云高校计划视觉AI五天训练营 Day 1——视觉应用探索
|
人工智能 前端开发 算法
视觉AI五天训练营教程 Day 3
简介: 在这个人工智能已经普及的时代,各行各业都充斥着AI的身影。大部分人认为人工智能起点高,入门难,想要使用AI服务又无法独立完成编写,阿里云视觉平台是基于阿里巴巴视觉智能技术实践经验,面向视觉智能技术企业和开发商(含开发者),为其提供高易用、普惠的视觉API服务,帮助企业快速建立视觉智能技术的应用能力的综合性视觉AI能力平台。开发者可以通过阿里云视觉平台提供的通用且标准化的接入方式,快速接入及使用阿里云视觉平台提供的包括人脸人体、文字识别、商品理解、内容安全、图像识别、图像生产、分割抠图、视觉搜索、目标检测、图像分析处理、视频理解、视频生产、视频分割13个类目多个API能力。本期直播将带你
580 0
视觉AI五天训练营教程 Day 3