首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python+Tensorflow+Opencv人脸识别(任意数量人脸)[通俗易懂]

Python+Tensorflow+Opencv人脸识别(任意数量人脸)[通俗易懂]

作者头像
全栈程序员站长
发布于 2022-06-26 05:07:07
发布于 2022-06-26 05:07:07
2.2K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

Python+Tensorflow+Opencv的人脸识别

简单的人脸识别

一直想做机器学习的东东,最近由于工作的调整,终于有开始接触的机会了,哈哈。本文主要代码是来源于“就是这个七昂”的博文,传送门在此:https://blog.csdn.net/qq_42633819/article/details/81191308。”就是这个七昂”大大在他的博文中已经将人脸识别的过程讲的很清楚了。说来忏愧,在算法上我没有改变(我自己还没搞清楚,打算好好看看keras),因为在大大博文评论区看到好多人问怎么实现多个用户的人脸识别。刚开始我也在纳闷,怎么做呢?于是我就大胆尝试了一把,

准备工作

在做人脸识别前,你的有一个可以做的环境吧,在这里我当一次搬运工。开发环境的配置可以在网上找一堆,这里简单介绍一下我自己的。

  1. 安装Anaconda 官网下载地址 https://www.anaconda.com/download/ 选择相应的Anaconda进行安装(可能会很慢) 网盘分享链接:https://pan.baidu.com/s/1gtvSnoo7f0-Iu8SvZtospw 密码:3pzr 我电脑是win10 64位系统,我选择安装的是Anaconda3-2019.03-Windows-x86_64.exe这个版本。下载好了安装包,就像安装普通软件一样,安装就行。

一路点下去,在Advanced Option界面时,如果你电脑里面没有其他版本Python就两个都选了。

那就等着吧,时间有点儿长,安装完了可以测试一下 打开cmd,输入conda --version

  1. 安装Pycharm 首先去Pycharm官网,或者直接输入网址:http://www.jetbrains.com/pycharm/download/#section=windows,下载PyCharm安装包,根据自己电脑的操作系统进行选择,对于windows系统选择下图的框框所包含的安装包。这个也可以从网上找很多,而且安装很成功,个人学习的话,建议安装免费版本。
  2. pycharm环境配置 打开Pycharm,随便先创建一个工程或者.py文件

点击File→Setting,打开界面在这个选择你刚才安装的anconda,具体可以找找教程(我承认,我懒了)

同时你可以在箭头2的位置添加我们这个项目的第三方库。 你需要到的库有:(我python3.7.1,以下是我安装的版本) 1.tensorflow 1.13.1 2.keras 2.2.4 3.scikit-learn 0.20.3 4.numpy(这个随便) 5.opecv-python 4.1.0.25 OK,差不多就这些。

开始——先获取必要的人脸图像

人脸识别其实就是分类和聚类的过程。 人脸图像获取的代码,我分为了三个脚本,代码如下: 首先是一个newuser_information_collection.py,这个脚本将调用其他脚本

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
###################################################
#相当于公司人力组织一次所有员工人脸信息采集
###################################################
from gain_face import CatchPICFromVideo

while True:
    print("是否录入员工信息(Yes or No)?")
    if input() == 'Yes':
        #员工姓名(要输入英文,汉字容易报错)
        new_user_name = input("请输入您的姓名:")

        print("请看摄像头!")

        #采集员工图像的数量自己设定,越多识别准确度越高,但训练速度贼慢
        window_name = '信息采集'                                                                                  #图像窗口
        camera_id = 0                                                                                            #相机的ID号
        images_num = 200                                                                                         #采集图片数量
        path = 'C:\\Users\\Administrator\\Documents\\Python Project\\Face recognition\\data\\' + new_user_name   #图像保存位置

        CatchPICFromVideo(window_name,camera_id,images_num,path)
    else:
        break

这个脚本可以让你不断写入图像数据,自定义每组数据大小,自动以你输入命名文件夹,这样就有了多个人脸的分类。 下面是gain_face.py的代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
################
#获取人的脸部信息,并保存到所属文件夹
################


import cv2
import sys
from createfolder import CreateFolder


from PIL import Image


def CatchPICFromVideo(window_name,camera_idx,catch_pic_num,path_name):

    #检查输入路径是否存在——不存在就创建
    CreateFolder(path_name)

    cv2.namedWindow(window_name)

    # 视频来源,可以来自一段已存好的视频,也可以直接来自USB摄像头
    cap = cv2.VideoCapture(camera_idx)

    # 告诉OpenCV使用人脸识别分类器
    classfier = cv2.CascadeClassifier("C:\Program Files (x86)\Python\Python37\Lib\site-packages\cv2\data\haarcascade_frontalface_alt2.xml")

    #识别出人脸后要画的边框的颜色,RGB格式
    color = (0, 255, 0)

    num = 0
    while cap.isOpened():
        ok, frame = cap.read()  # 读取一帧数据
        if not ok:
            break

        grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  # 将当前桢图像转换成灰度图像

        # 人脸检测,1.22分别为图片缩放比例和需要检测的有效点数
        faceRects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=2, minSize=(32, 32))
        if len(faceRects) > 0:  # 大于0则检测到人脸
            for faceRect in faceRects:  # 单独框出每一张人脸
                x, y, w, h = faceRect
                if w > 200:

                    # 将当前帧保存为图片
                    img_name = '%s\%d.jpg' % (path_name, num)

                    #image = frame[y - 10: y + h + 10, x - 10: x + w + 10]
                    image = grey[y:y+h,x:x+w]           #保存灰度人脸图
                    cv2.imwrite(img_name, image)

                    num += 1
                    if num > (catch_pic_num):  # 如果超过指定最大保存数量退出循环
                        break

                    #画出矩形框的时候稍微比识别的脸大一圈
                    cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, 2)

                    # 显示当前捕捉到了多少人脸图片了,这样站在那里被拍摄时心里有个数,不用两眼一抹黑傻等着
                    font = cv2.FONT_HERSHEY_SIMPLEX
                    cv2.putText(frame, 'num:%d' % (num), (x + 30, y + 30), font, 1, (255, 0, 255), 4)

        # 超过指定最大保存数量结束程序
        if num > (catch_pic_num): break

        # 显示图像
        cv2.imshow(window_name, frame)
        #按键盘‘Q’中断采集
        c = cv2.waitKey(10)
        if c & 0xFF == ord('q'):
            break

    # 释放摄像头并销毁所有窗口
    cap.release()
    cv2.destroyAllWindows()

#判断本程序是独立运行还是被调用
if __name__ == '__main__':
    if len(sys.argv) != 1:
        print("Usage:%s camera_id face_num_max path_name\r\n" % (sys.argv[0]))
    else:
        CatchPICFromVideo("截取人脸", 0, 200, 'C:\\Users\\Administrator\\Documents\\Python Project\\Face recognition\\data\\huangsongmao')

在gain_face中调用了createfold脚本,用来检查写入的地址是否存在,不存在就建立。 下面是createfold.py的代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import os

def CreateFolder(path):
    #去除首位空格
    del_path_space = path.strip()
    #去除尾部'\'
    del_path_tail = del_path_space.rstrip('\\')
    #判读输入路径是否已存在
    isexists = os.path.exists(del_path_tail)
    if not isexists:
        os.makedirs(del_path_tail)
        return True
    else:
        return False

OK,人脸数据获取就完成了,只要运行newuser_information_colletion.py就可以了。

训练——分类吧

想训练我们保存好的人脸图像,就得先把它们读取出来,然后写到一个数组array中,对吧。 load_dataset.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import sys
import numpy as np
import os
import cv2
################################################
#读取待训练的人脸图像,指定图像路径即可
################################################
IMAGE_SIZE = 64
#将输入的图像大小统一
def resize_image(image,height = IMAGE_SIZE,width = IMAGE_SIZE):
    top,bottom,left,right = 0,0,0,0
    #获取图像大小
    h,w,_ = image.shape
    #对于长宽不一的,取最大值
    longest_edge = max(h,w)
    #计算较短的边需要加多少像素
    if h < longest_edge:
        dh = longest_edge - h
        top = dh // 2
        bottom = dh - top
    elif w < longest_edge:
        dw = longest_edge - w
        left = dw // 2
        right = dw - left
    else:
        pass
    #定义填充颜色
    BLACK = [0,0,0]

    #给图像增加边界,使图片长、宽等长,cv2.BORDER_CONSTANT指定边界颜色由value指定
    constant_image = cv2.copyMakeBorder(image,top,bottom,left,right,cv2.BORDER_CONSTANT,value=BLACK)

    return cv2.resize(constant_image,(height,width))
#读取数据
images = []     #数据集
labels = []     #标注集
def read_path(path_name):
    for dir_item in os.listdir(path_name):
        full_path = path_name + '\\' + dir_item
        if os.path.isdir(full_path):
            read_path(full_path)
        else:
            #判断是人脸照片
            if dir_item.endswith('.jpg'):
                image = cv2.imread(full_path)
                image = resize_image(image)

                images.append(image)
                labels.append(path_name)

    return images,labels

#为每一类数据赋予唯一的标签值
def label_id(label,users,user_num):
    for i in range(user_num):
        if label.endswith(users[i]):
            return i

#从指定位置读数据
def load_dataset(path_name):
    users = os.listdir(path_name)
    user_num = len(users)

    images,labels = read_path(path_name)
    images_np = np.array(images)
    #每个图片夹都赋予一个固定唯一的标签
    labels_np = np.array([label_id(label,users,user_num) for label in labels])

    return images_np,labels_np

if __name__ == '__main__':
    if len(sys.argv) != 1:
        print("Usage:%s path_name\r\n" % (sys.argv[0]))
    else:
        images,labels = load_dataset('C:\\Users\\Administrator\\Documents\\Python Project\\Face recognition\\data')
        #print(labels)

数据和对应的标注都以array形式对出来了,是不是该分类训练了啊。 face_train.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
########################
#人脸特征训练
########################

import random

import os
from sklearn.model_selection import train_test_split
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Convolution2D, MaxPooling2D
from keras.optimizers import SGD
from keras.utils import np_utils
from keras.models import load_model
from keras import backend as K

from load_dataset import load_dataset, resize_image

IMAGE_SIZE = 64

class Dataset:
    def __init__(self, path_name):
        # 训练集
        self.train_images = None
        self.train_labels = None

        # 验证集
        self.valid_images = None
        self.valid_labels = None

        # 测试集
        self.test_images = None
        self.test_labels = None

        # 数据集加载路径
        self.path_name = path_name
        # 图像种类
        self.user_num = len(os.listdir(path_name))
        #当前库采用的维度顺序
        self.input_shape = None

    # 加载数据集并按照交叉验证的原则划分数据集并进行相关预处理工作
    def load(self, img_rows=IMAGE_SIZE, img_cols=IMAGE_SIZE,
             img_channels=3):
        #数据种类
        nb_classes = self.user_num
        #加载数据集到内存
        images, labels = load_dataset(self.path_name)

        train_images, valid_images, train_labels, valid_labels = train_test_split(images, labels, test_size=0.3,
                                                                                  random_state=random.randint(0, 100))
        # _, test_images, _, test_labels = train_test_split(images, labels, test_size=0.5,
        #                                                   random_state=random.randint(0, 100))

        # 当前的维度顺序如果为'th',则输入图片数据时的顺序为:channels,rows,cols,否则:rows,cols,channels
        # 这部分代码就是根据keras库要求的维度顺序重组训练数据集
        if K.image_dim_ordering() == 'th':
            train_images = train_images.reshape(train_images.shape[0], img_channels, img_rows, img_cols)
            valid_images = valid_images.reshape(valid_images.shape[0], img_channels, img_rows, img_cols)
            #test_images = test_images.reshape(test_images.shape[0], img_channels, img_rows, img_cols)
            self.input_shape = (img_channels, img_rows, img_cols)
        else:
            train_images = train_images.reshape(train_images.shape[0], img_rows, img_cols, img_channels)
            valid_images = valid_images.reshape(valid_images.shape[0], img_rows, img_cols, img_channels)
            #test_images = test_images.reshape(test_images.shape[0], img_rows, img_cols, img_channels)
            self.input_shape = (img_rows, img_cols, img_channels)

            # 输出训练集、验证集、测试集的数量
            print(train_images.shape[0], 'train samples')
            print(valid_images.shape[0], 'valid samples')
            #print(test_images.shape[0], 'test samples')

            # 我们的模型使用categorical_crossentropy作为损失函数,因此需要根据类别数量nb_classes将
            # 类别标签进行one-hot编码使其向量化,在这里我们的类别只有两种,经过转化后标签数据变为二维
            train_labels = np_utils.to_categorical(train_labels, nb_classes)
            valid_labels = np_utils.to_categorical(valid_labels, nb_classes)
            #test_labels = np_utils.to_categorical(test_labels, nb_classes)

            # 像素数据浮点化以便归一化
            train_images = train_images.astype('float32')
            valid_images = valid_images.astype('float32')
            #test_images = test_images.astype('float32')

            # 将其归一化,图像的各像素值归一化到0~1区间
            train_images /= 255
            valid_images /= 255
            #test_images /= 255

            self.train_images = train_images
            self.valid_images = valid_images
            #self.test_images = test_images
            self.train_labels = train_labels
            self.valid_labels = valid_labels
            #self.test_labels = test_labels


# CNN网络模型类
class Model:
    def __init__(self):
        self.model = None

        # 建立模型
    def build_model(self, dataset,nb_classes=4):

        # 构建一个空的网络模型,它是一个线性堆叠模型,各神经网络层会被顺序添加,专业名称为序贯模型或线性堆叠模型
        self.model = Sequential()

        #以下代码将顺序添加CNN网络需要的各层,一个add就是一个网络层
        self.model.add(Convolution2D(32, 3, 3, border_mode='same',
                                     input_shape=dataset.input_shape))  # 1 2维卷积层
        self.model.add(Activation('relu'))  # 2 激活函数层

        self.model.add(Convolution2D(32, 3, 3))  # 3 2维卷积层
        self.model.add(Activation('relu'))  # 4 激活函数层

        self.model.add(MaxPooling2D(pool_size=(2, 2)))  # 5 池化层
        self.model.add(Dropout(0.25))  # 6 Dropout层

        self.model.add(Convolution2D(64, 3, 3, border_mode='same'))  # 7  2维卷积层
        self.model.add(Activation('relu'))  # 8  激活函数层

        self.model.add(Convolution2D(64, 3, 3))  # 9  2维卷积层
        self.model.add(Activation('relu'))  # 10 激活函数层

        self.model.add(MaxPooling2D(pool_size=(2, 2)))  # 11 池化层
        self.model.add(Dropout(0.25))  # 12 Dropout层

        self.model.add(Flatten())  # 13 Flatten层
        self.model.add(Dense(512))  # 14 Dense层,又被称作全连接层
        self.model.add(Activation('relu'))  # 15 激活函数层
        self.model.add(Dropout(0.5))  # 16 Dropout层
        self.model.add(Dense(nb_classes))  # 17 Dense层
        self.model.add(Activation('softmax'))  # 18 分类层,输出最终结果

        #输出模型概况
        self.model.summary()

    # 训练模型
    def train(self, dataset, batch_size=20, nb_epoch=10, data_augmentation=True):
        sgd = SGD(lr=0.01, decay=1e-6,
                  momentum=0.9, nesterov=True)  # 采用SGD+momentum的优化器进行训练,首先生成一个优化器对象
        self.model.compile(loss='categorical_crossentropy',
                           optimizer=sgd,
                           metrics=['accuracy'])  # 完成实际的模型配置工作

        # 不使用数据提升,所谓的提升就是从我们提供的训练数据中利用旋转、翻转、加噪声等方法创造新的
        # 训练数据,有意识的提升训练数据规模,增加模型训练量
        if not data_augmentation:
            self.model.fit(dataset.train_images,
                           dataset.train_labels,
                           batch_size=batch_size,
                           nb_epoch=nb_epoch,
                           validation_data=(dataset.valid_images, dataset.valid_labels),
                           shuffle=True)
        # 使用实时数据提升
        else:
            # 定义数据生成器用于数据提升,其返回一个生成器对象datagen,datagen每被调用一
            # 次其生成一组数据(顺序生成),节省内存,其实就是python的数据生成器
            datagen = ImageDataGenerator(
                featurewise_center=False,  # 是否使输入数据去中心化(均值为0),
                samplewise_center=False,  # 是否使输入数据的每个样本均值为0
                featurewise_std_normalization=False,  # 是否数据标准化(输入数据除以数据集的标准差)
                samplewise_std_normalization=False,  # 是否将每个样本数据除以自身的标准差
                zca_whitening=False,  # 是否对输入数据施以ZCA白化
                rotation_range=20,  # 数据提升时图片随机转动的角度(范围为0180)
                width_shift_range=0.2,  # 数据提升时图片水平偏移的幅度(单位为图片宽度的占比,0~1之间的浮点数)
                height_shift_range=0.2,  # 同上,只不过这里是垂直
                horizontal_flip=True,  # 是否进行随机水平翻转
                vertical_flip=False)  # 是否进行随机垂直翻转

            # 计算整个训练样本集的数量以用于特征值归一化、ZCA白化等处理
            datagen.fit(dataset.train_images)

            # 利用生成器开始训练模型
            self.model.fit_generator(datagen.flow(dataset.train_images, dataset.train_labels,
                                                  batch_size=batch_size),
                                     samples_per_epoch=dataset.train_images.shape[0],
                                     nb_epoch=nb_epoch,
                                     validation_data=(dataset.valid_images, dataset.valid_labels))

    MODEL_PATH = './aggregate.face.model.h5'

    def save_model(self, file_path=MODEL_PATH):
        self.model.save(file_path)

    def load_model(self, file_path=MODEL_PATH):
        self.model = load_model(file_path)

    def evaluate(self, dataset):
        score = self.model.evaluate(dataset.test_images, dataset.test_labels, verbose=1)
        print("%s: %.2f%%" % (self.model.metrics_names[1], score[1] * 100))

    # 识别人脸
    def face_predict(self, image):
        # 依然是根据后端系统确定维度顺序
        if K.image_dim_ordering() == 'th' and image.shape != (1, 3, IMAGE_SIZE, IMAGE_SIZE):
            image = resize_image(image)  # 尺寸必须与训练集一致都应该是IMAGE_SIZE x IMAGE_SIZE
            image = image.reshape((1, 3, IMAGE_SIZE, IMAGE_SIZE))  # 与模型训练不同,这次只是针对1张图片进行预测
        elif K.image_dim_ordering() == 'tf' and image.shape != (1, IMAGE_SIZE, IMAGE_SIZE, 3):
            image = resize_image(image)
            image = image.reshape((1, IMAGE_SIZE, IMAGE_SIZE, 3))

        # 浮点并归一化
        image = image.astype('float32')
        image /= 255

        #给出输入属于各个类别的概率
        result_probability = self.model.predict_proba(image)
        #print('result:', result_probability)

        #给出类别预测(改)
        if max(result_probability[0]) >= 0.9:
            result = self.model.predict_classes(image)
            print('result:', result)
            # 返回类别预测结果
            return result[0]
        else:
            return -1


if __name__ == '__main__':
    user_num = len(os.listdir('./data/'))

    dataset = Dataset('./data/')
    dataset.load()

    model = Model()
    model.build_model(dataset,nb_classes=user_num)

    # 先前添加的测试build_model()函数的代码
    model.build_model(dataset,nb_classes=user_num)
    # 测试训练函数的代码
    model.train(dataset)
    
	model.save_model(file_path='./model/aggregate.face.model.h5')  

注意:上面的代码,我没有进行训练结果的测试,想要测试的小伙伴们,把我屏蔽的代码解开就好了。 另外解释一下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 图像种类
self.user_num = len(os.listdir(path_name))

这是获取path_name下有多少个文件夹,因为我们统一在data文件夹下只放各个图像文件夹,所以在训练的时候,分多少种类别就由self.user_num说了算

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#数据种类
nb_classes = self.user_num

对了,这里好像有些小伙伴会和我一样错点儿错误,那就是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model.save_model(file_path='./model/aggregate.face.model.h5')

model文件夹,你建立了吗?没建立的,请在工程文件写新建,不要建立在data文件夹下哦。 另外,我在人脸识别函数face_predict()中修改了返回值的返回方式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#给出类别预测(改)
if max(result_probability[0]) >= 0.9:
    result = self.model.predict_classes(image)
    print('result:', result)
    # 返回类别预测结果
    return result[0]
else:
    return -1

这样子就能让返回结果比较让人可信了。 运行face_train.py脚本吧,等待…(反正我电脑很慢,这怎么能用到工程上呢?)我在这里就不上图了,以上所有代码都是我实际使用过的。 当在model文件夹下生成了.h5文件,OK训练完成! 下面应该就是激动人心的时刻了

识别大脸

上代码face_recognition.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import cv2
import sys
import os
from face_train import Model

if __name__ == '__main__':
    if len(sys.argv) != 1:
        print("Usage:%s camera_id\r\n" % (sys.argv[0]))
        sys.exit(0)

    #加载模型
    model = Model()
    model.load_model(file_path='./model/aggregate.face.model.h5')

    # 框住人脸的矩形边框颜色
    color = (0, 255, 0)

    # 捕获指定摄像头的实时视频流
    cap = cv2.VideoCapture(0)

    # 人脸识别分类器本地存储路径
    cascade_path = "C:\Program Files (x86)\Python\Python37\Lib\site-packages\cv2\data\haarcascade_frontalface_alt2.xml"

    # 循环检测识别人脸
    while True:
        ret, frame = cap.read()  # 读取一帧视频

        if ret is True:

            # 图像灰化,降低计算复杂度
            frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        else:
            continue
        # 使用人脸识别分类器,读入分类器
        cascade = cv2.CascadeClassifier(cascade_path)

        # 利用分类器识别出哪个区域为人脸
        faceRects = cascade.detectMultiScale(frame_gray, scaleFactor=1.2, minNeighbors=2, minSize=(32, 32))
        if len(faceRects) > 0:
            for faceRect in faceRects:
                x, y, w, h = faceRect

                # 截取脸部图像提交给模型识别这是谁
                image = frame[y: y + h, x: x + w]       #()
                faceID = model.face_predict(image)

                cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, thickness=2)
                #face_id判断(改)
                for i in range(len(os.listdir('./data/'))):
                    if i == faceID:
                        # 文字提示是谁
                        cv2.putText(frame,os.listdir('./data/')[i],
                                    (x + 30, y + 30),  # 坐标
                                    cv2.FONT_HERSHEY_SIMPLEX,  # 字体
                                    1,  # 字号
                                    (255, 0, 255),  # 颜色
                                    2)  # 字的线宽

        cv2.imshow("login", frame)

        # 等待10毫秒看是否有按键输入
        k = cv2.waitKey(10)
        # 如果输入q则退出循环
        if k & 0xFF == ord('q'):
            break

    # 释放摄像头并销毁所有窗口
    cap.release()
    cv2.destroyAllWindows()

好了,运行该代码就能识别几位小伙伴的大脸了。代码中我修改了一点儿,主要是判断谁的脸的部分。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#face_id判断
for i in range(len(os.listdir('./data/'))):
    if i == faceID:
        # 文字提示是谁
        cv2.putText(frame,os.listdir('./data/')[i],
                    (x + 30, y + 30),  # 坐标
                    cv2.FONT_HERSHEY_SIMPLEX,  # 字体
                    1,  # 字号
                    (255, 0, 255),  # 颜色
                    2)  # 字的线宽

因为我们在标注图像id的时候就是按照os.listdir(’./data/’)列表中显示的顺序,所以识别出的id和os.listdir(’./data/’)列表的索引号匹配,匹配到谁就在图像上标出谁os.listdir(’./data/’)[i]。

终于搬运完了,因为第一次接触机器学习,所以才疏学浅,希望大佬们多多指教。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/133810.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年6月7,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
福利|QQJOY无畏潮前,新品全曝光!
QQJOY是由QQ打造的全新潮流文化盛典。在这里,你可以一站抢购潮牌尖货、可以与心爱的二次元角色亲密互动、还有机会看到你喜爱的idol亲临现场。 亮点路透大曝光: ✔ 全新潮流舞台厂牌「QQJOY潮流之夜」阵容全曝光 ✔ 艺术潮流限定发售提前预览——品牌重磅限量发售阵容亮相 ✔ 次元潮顶级IP抢先看——现场首发、爆款盲盒、人气IP超全集合 ✔ “神秘嘉宾”现身现场,解锁NBA潮酷空间  QQJOY潮流之夜 ——全新潮流舞台厂牌「QQJOY潮流之夜」阵容全曝光 QQJOY潮流之夜致力于打造有影响
腾讯ISUX
2020/11/06
1.7K0
倒计时!QQ潮玩展2021全攻略
QQ潮玩展倒计时开始!今年五一,顽鹅工厂释放无限潮力,打造顶级潮流艺术体验!顽鹅即将出厂,所有的CQQL PLAYERS,你准备好了吗? ▲ 点击海报购票 5月1日-5月3日,QQ潮玩展2021降落深圳(福田)会展中心。本次QTX,超重磅国际潮流艺术家联名展中展带来顶级艺术享受;200+潮玩品牌&设计师携巨量展会限定品亮相,满足玩家的收藏喜好;潮玩艺术家签售、QQ白模大赛创意展、集章打卡抽奖、线上直播专场……活动丰富,惊喜不断! QTX 2021以“顽鹅出厂 CQQL PLAYERS' SHOW”
腾讯ISUX
2021/04/27
1.9K0
开发者嘉年华直播观看指南!9月7日「云」上见!
腾讯全球数字生态大会开发者嘉年华,即将在9月7日于深圳宝安国际会展中心开幕。本届开发者嘉年华面向所有对计算机及互联网感兴趣的一线技术人员及高校学生开放。同时,本届开发者嘉年华以「增一行代码」为主题,期待与各位开发者相见!无法来到线下的开发者们也不要灰心,届时我们将开启直播和各位开发者们一起「云」探展。
腾讯云开发者
2024/09/06
3151
开发者嘉年华直播观看指南!9月7日「云」上见!
倒计时!QQ潮玩展全攻略
QTX本周五开展,倒计时开始! 天生顽鹅降临深圳侨城坊 充满潮趣的平行时空之旅即将开启! 点开视频,提前体验QTX平行世界。↑ QQ潮玩展8月28日-8月30日深圳侨城坊开幕,鹅厂携手百家知名潮玩品牌与设计师,打造创意爆棚的潮玩市集。 侨城坊QPlex坐落于深圳华侨城片区侨香路西段,集街区商业、酒店式公寓、商务办公、生态园林于一体的大型现代化生态综合体。本次,QQ STUDIOS将携手侨城坊QPlex共举潮玩盛事! QQ潮玩展有什么好看的、好玩的、好吃的、好拍的? 看完这篇全攻略,QTX
腾讯ISUX
2020/08/27
1.4K0
QTX潮玩展 | 企划最IN潮玩系统
前言:上两篇给大家分享了核心的「品牌系统」与「美陈空间」的设计思路和实现效果全过程,而它们也只是整个潮玩展设计的冰山一角,潮玩展中还包括了许多其他模块需要规划&设计,并且流程紧密结合、环环相扣,才会形成一个庞大而完整的“嘉年华盛事”。 本篇为大家带来QTX最终章,将会从「活动策划」「环境设计」「拍摄计划」「搭建现场」这几个模块进行详细剖析,让大家了解到“顽鹅”是如何贯穿在策划与实际场景中,以及现场搭建是如何进行并且顺利打造的。 「QTX2020纪录片」 一、活动策划&设计 为了丰富本次QTX潮玩展
腾讯ISUX
2020/11/19
1.7K0
QTX直播 | 超多限定品!首场QQ潮玩直播周五开播
2021第一场QQ潮玩云端嘉年华即将开启! 2021/1/15  19:30-22:00 QTX AIR 第1期 即将开播! QQ潮玩直播将为你带来连环惊喜! ◀向左滑动查看更多图片 ↑长按海报左下角小程序码订阅直播间 多款限量潮玩新品购买权线上抽选 牛年新年系列潮玩超萌亮相 还有超多直播间专属福利随机掉落 QTX AIR有什么必抢潮玩? 攻略在此! 限量新品首发 大兽志异·招财哥是鹅 数量 20体(共50体) 价格 599元/体 规则 1月15日21:30,QTX AIR直播间线
腾讯ISUX
2021/01/13
8520
元宇宙音乐,无界的狂欢party!
最近一段时间,“买菜难”成为上海最牵动人心的公共话题。但富有娱乐精神,善于苦中作乐的上海人,也在居家封控中制造各种“云娱乐”。
科技旋涡
2022/04/28
6210
元宇宙音乐,无界的狂欢party!
理所当燃 | 打造会员20周年超燃盛典
项目背景 2000年QQ会员诞生,不断探索如何带给用户更好的增值服务,正值20周年的时间节点,QQ会员推出20周年系列庆典活动,携手靓号、会员游戏、个性化装扮、QQ音乐、bilibili等多个分会场,通过多种好礼折扣、豪华大礼包等联合回馈用户,和广大QQ用户一起携手为QQ会员20周年庆生。 整个项目主要从以下六个部分进行规划:概念脑暴、品牌重塑、主活动(portal聚合、QQ能量值等)、设计衍生、外部联动、庆典宣传等。通过系统有节奏的整体规划,设计团队一步一步建立会员20周年品牌,体系化的构建以“渠
腾讯ISUX
2021/05/26
1.4K0
2021全球硬科技嘉年华 | 一场现象级科技狂欢节即将开启!
这是最好的时代,智能科技迅速发展,各式各样的智能产品层出不穷,各种各样的科技手段应用于生活,当科技开始跨界,当现实颠覆想象,我们的未来将拥有怎样的主旋律,我们的生活将拥抱怎样的改变? 也许在这场数字文化中关村2021之全球硬科技嘉年华上我们能率先找到答案。 2021(第三届)全球硬科技嘉年华 10月15-18日每晚17点到21点 在中关村壹号重磅开启 以“打破边界,科技狂欢”为主题 3场科技峰会,大咖名企荟聚 4场跨界盛典,与科技近距离 5大场景空间,全新超前体验 前所未见的“科技边界”将被打破 触手可
量子位
2023/03/01
3910
2021全球硬科技嘉年华 | 一场现象级科技狂欢节即将开启!
究极硬核!如何塑造QTX品牌设计语言?
1.关于QQ潮玩展 QQ潮玩展2021 (QTX - QQ TOYS EXPO) 是一个以QQ企鹅IP形象联盟为起点,汇聚顶级潮流艺术作品,集合行业人气潮流玩具的大型线下展会,旨在引领IP形象设计与潮玩艺术文化趋势,让玩家娱有所乐,玩有所得。 5月3日,为期三天的QQ潮玩展2021(QTX)在深圳(福田)会展中心完美收官。在这次展会中,Michael Lau、Daniel Arsham等超重磅国际潮流艺术家在QTX呈现极具艺术价值的展中展,带来了顶级艺术享受;200+潮玩品牌&设计师携巨量展会限定品亮
腾讯ISUX
2021/05/18
1K0
大福利 | QQ X Miniso天生企鹅设计揭秘
01 概述 | OVERVIEW QQ x Miniso天生企鹅系列盲盒在线上与线下与粉丝见面,国风诠释天生不凡。天生企鹅系列汲取了当下年轻人喜爱的生活、娱乐元素,并以街头与国潮相融合的风格来演绎与包装,尽显年轻一代自由多元的潮流态度,与年轻用户产生共鸣。同时也传达了“天生企鹅”(“天生”谐音 Tencent)QQ在潮玩中追求百变画风的创变精神。 此套盲盒结合国风诞生出的六个身份 02 手办设计&玩法 | TOY DESIGN 【鱼跃龙门】 鱼跃龙门表达年轻人积极向上的精神,设计
腾讯ISUX
2020/10/19
1.6K0
2022全球数字经济大会丨腾讯携数字新技术“数”说未来
数字经济正日益成为拉动经济增长的新引擎。7月28日至30日,2022全球数字经济大会在北京举办。大会以“启航数字文明——新要素、新规则、新格局”为主题,设置开幕式及主论坛、六个主题峰会、近五十场专题论坛,组织“周、展、赛、秀”四大特色活动,全面推动全球数字经济领域交流合作。 首届全球数字经济大会于2021年在北京举办。本届大会在去年基础上实现全面升级,其中首设数字孪生手段复刻的元宇宙会场,支持千万量级观众线上同步参与和跨语言实时互动。 互联网3.0峰会迎来国内首秀,是本次峰会的又一大亮点。作为全球数字经济
腾讯文旅
2022/08/26
6280
2022全球数字经济大会丨腾讯携数字新技术“数”说未来
100万人沉浸式「云斗舞」!这个节目凭啥火了?
---- 新智元报道   编辑:好困 桃子 【新智元导读】五一宅家,无迪可蹦?你可能错过了一场和虚拟人的超级狂欢! 上方是演出大屏,下方是人潮嗨舞的迪厅,两侧滚动的是表白宣言,身旁还有「虚拟」的央视主持人尼格买提。 央视一场自带话题度的五四特别节目,当晚便冲上热搜。 它,凭什么火了? 100万人「云斗舞」 时间回到2021年,「TMELAND」腾讯音乐虚拟世界在12月31日正式亮相。 当晚,在高雄世运主场馆线下开唱的五月天,也空降到了TMELAND这个「虚拟音乐嘉年华」。 全球110万乐迷陆续「登岛
新智元
2022/05/06
6800
100万人沉浸式「云斗舞」!这个节目凭啥火了?
元宇宙将有750亿新人类?新智元发布《中国AI和元宇宙产业七大趋势》及2021创新大奖
---- 新智元报道   编辑:编辑部 【新智元导读】元宇宙市场复合增长率将是AI的10倍,真人与虚拟人交互爆发式增长。未来元宇宙里10个人可能有9个是虚拟人。2021年,新智元选出的TOP10虚拟人都有谁? 137亿年前发生的一次大爆炸,我们所处的「宇宙」形成了。 时间来到2021年,虚拟的「元宇宙」再一次大爆发。 2022,元宇宙奇点爆发才第2个年头,这个Metaverse却以惊人的速度疯长! 元宇宙大爆发是否突破了物理世界的约束,让人类来到了一个自由的新世界? 无数的虚拟人涌现,谁将主导未来的元
新智元
2022/04/01
8700
元宇宙将有750亿新人类?新智元发布《中国AI和元宇宙产业七大趋势》及2021创新大奖
2021-2022设计趋势ISUX报告·日系潮玩篇
潮流玩具最初起源于日本,盛行于美国、香港,又叫艺术家玩具或设计师玩具,是玩具与艺术摆件融合的产物。谈及潮流玩具的历史,最早可以追溯到20世纪90年代的日本和中国香港。这些作品的设计往往带有一点街头、叛逆和反主流风格,并且限量生产,价格相对昂贵,因而潮流玩具的消费最初一直限于一个小圈子。 潮流玩具最初起源于日本,盛行于美国、香港,又叫艺术家玩具或设计师玩具,是玩具与艺术摆件融合的产物。谈及潮流玩具的历史,最早可以追溯到20世纪90年代的日本和中国香港。最近大火的盲盒,对于日本的消费者来说也并不陌生。
腾讯ISUX
2021/09/23
1.2K0
元宇宙一周报:鱿物数字藏品平台上线,鲸探、百度智能云、支付宝将元宇宙搬进文博领域
  本周,优酷上线鱿物数字藏品平台,字节头戴式VR设备外观专利获授权,鲸探、百度智能云、支付宝等将带元宇宙走进文博领域,接下来,和速途元宇宙研究院一起来回顾下本周的元宇宙最新动态吧。
科技旋涡
2022/08/30
9550
元宇宙一周报:鱿物数字藏品平台上线,鲸探、百度智能云、支付宝将元宇宙搬进文博领域
元宇宙一周报:中青宝董事长变更,荔枝、网易、百度、智度股份布局元宇宙新动作
本周,央视携手腾讯音乐TMELAND共同打造虚拟音乐世界节目,倍轻松、李宁、绿地集团相继购买“无聊猿”,中青宝董事长李瑞杰辞任董事长职位,又因披露虚假信息被深交所公开通报批评,荔枝、网易、谷歌云、百度、智度股份各有玩法,接下来,和速途元宇宙研究院一起来回顾下本周的元宇宙最新动态吧。
科技旋涡
2022/06/28
7710
元宇宙一周报:中青宝董事长变更,荔枝、网易、百度、智度股份布局元宇宙新动作
2017年数据库技术盘点
作者介绍: 那海蓝蓝,腾讯金融云数据库技术专家,熟悉PostgreSQL、MySQL、Informix等数据库内核技术,著有《数据库查询优化器的艺术》、《数据库事务处理的艺术》,在业界皆享有“里程碑”式的评价。小编0.7,毕业于北京邮电大学,MySQL社区Oracle Contributor,目前就职于腾讯TDSQL团队,研发分布式数据库。大米,毕业于中国人民大学,目前就职于腾讯TDSQL团队,研发分布式数据库。 责编:仲培艺 在数据库领域,回顾2017这一年,精彩纷呈,热点不断,而且不乏标志性的事件发生。
腾讯技术工程官方号
2018/03/01
7K1
2017年数据库技术盘点
腾讯WE大会延续高逼格,10分钟让你看完16场演讲
没有任何前戏,腾讯WE大会今天(11月08日)在北展剧场举行,在波涛汹涌的人群两侧,不时有几个叫卖门票的黄牛,现场也几乎座无虚席,可见这场跟未来科技有关的大会吸引了不少人的关注。 从上午10点开始,一场接一场的演讲接踵而至,如同一个个初露头角的小明星在展望未来,给我们描绘了一种我们生活可能的前景,无论是量子悬浮、虚拟现实、人工智能、机器人、医学、教育……都让人看得有些血脉喷张,但是,走出会场,吹着冷风,脑袋也顿时冷静了不少,这些科学家、初创企业,以及巨无霸企业所秀的这些“未来智能”何时才能普惠到寻常百姓呢?
腾讯大讲堂
2018/02/12
1.3K0
腾讯WE大会延续高逼格,10分钟让你看完16场演讲
罗振宇《时间的朋友2018》跨年演讲全文
2018年12月31日20:30,深圳“春茧”体育馆,罗振宇2018“时间的朋友”跨年演讲如约而至。罗胖曾发下大愿望:跨年演讲要连办二十年。今年,是第四场,也是倒数第十七场。在历时四个小时的演讲中,罗胖通过对过去一整年的回顾和未来的展望,连发“扎心五问”,最终揭示出——比起普通人无法把控的大趋势,真正能给所有人带来机会,从细微处引发大变化的,恰恰是我们身边的各种 “小趋势”。
ytkah
2019/01/03
3.2K0
推荐阅读
相关推荐
福利|QQJOY无畏潮前,新品全曝光!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档