首页 > 其他分享 >识别图片和视频中不同肤色的人数

识别图片和视频中不同肤色的人数

时间:2023-08-15 11:00:38浏览次数:55  
标签:视频 img cv2 face 图片 人脸 识别 肤色 255

前面利用ResNet18实现了二分类,这里借助分类网络来识别图片和视频中不同肤色的人数。大体流程可以分为以下几步:数据获取、数据处理、模型训练、图片识别以及视频识别,其中大部分内容参考《机器视觉之TensorFlow2入门、原理与应用实践》第4章。

一、数据获取

这里获取黑人和白人模特数据用于训练。

黑人

二、数据处理

前面爬取得到的图片不仅仅包含人脸,还有身体及其他背景等内容,而且图片大小也不一致,所以这里需要对获取的图片进行预处理,主要分为以下两个步骤:

  • 获取每张图片上人脸位置
  • 依据人脸位置对图片进行裁剪,得到人脸图像

1. 获取人脸位置

为了快速获得图片中人脸位置信息,这里借助face_recognition库直接得到人脸位置。

  • 安装face_recognition

    pip install face_recognition
    
  • 识别流程

    import face_recognition
    import cv2
    
    img_path = "./test.jpg"
    img = cv2.imread(img_path) 
    
    # 获取位置信息
    faces = face_recognition.face_locations(img)
    print("faces location: ", faces)
    
  • 结果

2. 裁剪图片

通过上一步获得了人脸的包围框信息,借助openCV库对其进行裁剪,并保存至相应文件夹。

import os

file_name = os.path.basename(img_path)
save_dir = "./dataset/black"
sampleNum = 1
for (top, right, bottom, left) in faces:
    if not os.path.exists(save_dir):
        os.makedirs(save_dir)
        
    # save img
    cv2.imwrite(os.path.join(save_dir, file_name + str(sampleNum) + ".jpg"), img[top:bottom, left:right])
    sampleNum += 1

裁剪后图片

三、模型训练

经过以上步骤,数据集就制作完成了,沿用Resnet18实现二分类的内容制作对应的数据集并进行训练,得到黑人和白人两个类别的分类模型。

训练过程这里就不重复,直接贴出训练过程中visdom可视化结果

四、图片识别

对于给定图片,我们按照先确定人脸位置,然后再对人脸进行分类的思路进行处理。这里确定人脸位置同样采用face_recognition模块,裁剪得到对应的人脸图片,然后输入到人脸二分类模型,进行预测,进而得到不同肤色的人数。接下来按照以下步骤进行展开。

  • 检测图片中人脸位置
  • 绘制人脸边界框
  • 图片左上角显示不同肤色的人数
test_dir = r"./test_img"   
img_size = 64
class_names = ["black", "white"] 
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = resnet18(pretrained=True)  # model
model = nn.Sequential(*list(model.children())[:-1],  # [b, 512, 1, 1] -> 接全连接层
                      nn.Flatten(),  # [b, 512, 1, 1] -> [b, 512]
                      nn.Linear(512, 2)).to(device)  # 添加全连接层
model.load_state_dict(torch.load(r"D:\AI\Classify/resnet18-2Class_black_white.pkl"))
model.eval()
with torch.no_grad():
    # print(model)
    tf = transforms.Compose([
                transforms.Resize((img_size, img_size)),
                # transforms.CenterCrop(self.resize),
                transforms.ToTensor(),
                transforms.Normalize(mean=[0.485, 0.456, 0.406],
                                     std=[0.229, 0.224, 0.225])
            ])

    img_paths = glob.glob(os.path.join(test_dir, "*.jpg"))
    for image_path in img_paths:
        img = cv2.imread(image_path)
        faces = face_recognition.face_locations(img)
        print(image_path, faces)
        nums = [0, 0]
        for (top, right, bottom, left) in faces:
            face_img = img[top:bottom, left:right]
            face_img = Image.fromarray(face_img)
            pre_img = tf(face_img).unsqueeze(0)
            pred = model(pre_img.to(device))
            cls_id = pred.argmax(dim=1).item()
            nums[cls_id] += 1
            print("pred: ", pred, "cls: ", cls_id, "name: ", class_names[cls_id])

            cv2.rectangle(img, (left, top), (right, bottom), (255 * cls_id, 255 * cls_id, 255 * cls_id), 2)
            # 添加类别
            cv2.putText(img, str(class_names[cls_id]), (left, top - 5), cv2.FONT_ITALIC, 0.6, (255 * cls_id, 255 * cls_id, 255 * cls_id), 1)

        # 添加计数信息
        cv2.putText(img, "black: " + str(nums[0]), (10, 30), cv2.FONT_ITALIC, 0.5, (0, 0, 255), 2)
        cv2.putText(img, "white: " + str(nums[1]), (10, 50), cv2.FONT_ITALIC, 0.5, (0, 0, 255), 2)

        cv2.imshow("img", img)
        cv2.waitKey(0)



五、视频识别

视频和图片类似,在图片识别的基础上多了一个获取视频单帧图片和按Q退出程序的步骤。

  • 获取视频每一帧图片
  • 检测图片中人脸位置
  • 绘制人脸边界框
  • 图片左上角显示不同肤色的人数
  • 随着人脸移动、框也进行位置变动
  • 按Q键退出程序

这里借助openCV直接调取电脑摄像头

import cv2
from PIL import Image
import numpy as np


cap = cv2.VideoCapture(0)            # 打开摄像头
while(True):
    ret, frame = cap.read()          # 获取摄像头信息
    img = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    faces = face_recognition.face_locations(img)   # 检测人脸位置
    nums = [0, 0]
    
    for (top, right, bottom, left) in faces:
        face_img = img[top:bottom, left:right]
        face_img = Image.fromarray(face_img)
        face_img = face_img.resize((32, 32), Image.ANTIALIAS)
        face_img = np.reshape(face_img, (-1, 32, 32, 3))
        pred = model.predict(face_img)
        
        classes = pred[0].tolist().index(max(pred[0]))
        nums[classes] += 1
        
        cv2.rectangle(img, (left, top), (right, bottom), (255*classes, 255*classes, 255*classes), 2)
        # 添加类别
        cv2.putText(img, str(classesnum[classes]), (left, top-5), cv2.FONT_ITALIC, 0.6, (255*classes, 255*classes, 255*classes), 1)
        
    # 添加计数信息
    cv2.putText(img, "black: " + str(nums[0]), (10, 30), cv2.FONT_ITALIC, 0.5, (255, 255, 255), 2)
    cv2.putText(img, "white: " + str(nums[1]), (10, 50), cv2.FONT_ITALIC, 0.5, (255, 255, 255), 2)
        
    cv2.imshow("img", img)
    if cv2.waitKey(1) &oxFF == ord("q"):
        break
        
cap.release()
cv2.destroyAllWindows()
    

参考资料

1、《机器视觉之TensorFlow2入门、原理与应用实践》第4章

标签:视频,img,cv2,face,图片,人脸,识别,肤色,255
From: https://www.cnblogs.com/xiaxuexiaoab/p/17620894.html

相关文章

  • 基于OpenCV的车牌识别系统的设计与实现
    在新世纪的大数据与人工智能高速发展之际,大数据技术以前所未有的发展速度给用户带来的各种自动化处理技术。面对如此众多的大数据与人工智能技术,非常有必要利用这些技术进行车牌识别,通过车牌识别来帮助车辆出入管理人员自动识别是否内部车辆。人工智能与大数据技术的应用,不需要车辆......
  • 智慧工地平台的技术应用:无线传感器、人脸识别和云计算
    智慧工地云平台源码 智慧工地源码智慧工地是指通过信息化技术、物联网、人工智能技术等手段,对建筑工地进行数字化、智能化、网络化升级,实现对施工全过程的实时监控、数据分析、智能管理和优化调控。智慧工地的建设可以提高工地的安全性、效率性和质量,降低施工成本,是建筑行业数字化......
  • IT初学者在哪里可以发现一些好的基础视频呢?
     经常碰到一些粉丝说参加了某某培训机构的培训课程,什么都没写会,还白白打上了一两万块。想到这里挺为他们心痛的,我认为你如果是初学者,必然是没什么基础的;为了薪资高而学习IT行业,而没有浓厚的兴趣,很难在参加培训的脱产班3个月的时间内学习比较深入的东西。如果你是IT兴趣爱好者,而且......
  • OpenCV笔记:cv2.VideoCapture 完成视频的跳帧输出操作
    前言 我开始关注这个问题,是在使用PaddleOCR+OpenCV进行视频文字识别的时候,因为OpenCV需要循环读取视频的每一帧进行解析,这就导致视频播放特别卡顿。由于视频中相邻帧的内容是一样的,重复识别也没有意义,所以我就在考虑:有没有办法跳帧输出?来源:https://blog.csdn.net/weixin_4425......
  • 【opencv】传统图像识别:hog+svm实现图像识别详解
    图像识别技术是信息时代的一门重要的技术,其产生目的是为了让计算机代替人类去处理大量的物理信息。传统图像识别技术的过程分为信息的获取、预处理、特征抽取和选择、分类器设计和分类决策。本文也是从这四点出发进行行文,以期了解传统图像识别技术、掌握hog特征提取和svm分类器。......
  • TinyMind第一届汉字书法识别挑战赛
    报名地址:http://www.tinymind.cn/competitions/41?from=blog比赛介绍手写字体识别一直是人工智能领域一个热门研究方向,这次我们联合书法领域的权威合作伙伴举办这次书法字体识别大赛,给广大人工智能和手写字体识别技术爱好者提供一个练习和交流的机会,也希望能通过这次比赛发现一些......
  • 牛腩原创视频汇总
     牛腩原创视频SP0070.帮我选功能描述:添加一些项目,点开始按钮,随机抽中某一项详细描述:选用html+jquery实现,setinteval,再试着用blazorwebassembly实现,Timer录制时间:2023年07月03日时长:1小时6分钟在线观看:http://www.bilibili.com/video/av487965247网盘下载:链接:https:/......
  • Adobe Premiere「PR视频剪辑软件」下载 安装激活步骤
    AdobePremierePro2020中文版为用户提供从视频媒体,不管是手机拍摄的视频还是Raw5K,都能轻松导入并自由地组合,再以原生形式编辑且可以自动转码。PremiereProCC2020中文版改进了与Audition的集成,需渲染,即可在PremiereProEssentialSound面板中将关键帧、音频效果和设置发送......
  • 三代测序数据从碱基识别、基因组组装、变异检测和甲基化修饰检测等方面的内容
    王院长的报告涵盖了针对三代测序数据从碱基识别、基因组组装、变异检测和甲基化修饰检测等方面的内容。在基因组组装算法方面,王院长分享了其团队在二代和三代测序数据基因组组装算法设计与分析方面的成果和突破。其中,针对长读长测序的高错误率以及错误分布不均匀等问题,王院长介绍......
  • AppleScript成功实现FaceTime语音,FaceTime视频,FaceTime数据筛选,检测手机号是否开通
    FaceTime是苹果公司iOS和macOS(以前称MacOSX或OSX)内置的一款视频通话软件,通过Wi-Fi或者蜂窝数据接入互联网,在两个装有FaceTime的设备之间实现视频通话。其要求通话双方均具有装有FaceTime的苹果设备,苹果ID以及可接入互联网的3G/4G/5G或者Wi-Fi网络。 一、Windows电脑上部署苹......