[深度学习入门案例2]基于卷积神经网络与Keras构建人脸识别模型

news2024/11/22 14:07:02

文章目录

一、工具与环境

二、深度学习环境的搭建

三、基于卷积神经网络人脸识别模型的构建与测试

1.核心代码

第一步:采集自己和他人的人脸特征数据,分别对应数据标签0和1

 第二步:训练识别人脸特征的模型,并将模型保存为.h5格式的文件

 第三步:读取.h5文件格式的人脸识别模型,对摄像头录入的人脸图像进行识别

2.识别的基本原理

3.运行与测试

第一步:采集本人与他人的人脸特征数据(注意需要打开电脑摄像头,否则会报错!)

第二步:进行10轮次的人脸数据模型的训练

第三步:人脸识别与比对测试

四、分析与小结

参考文章


一、工具与环境

  • Pycharm 2022.1.4
  • conda version : 4.5.4
  • python version : 3.6.5.final.0
  • platform : win-64

二、深度学习环境的搭建

详情见我写的这篇文章的第二部分,这里不再赘述

[深度学习入门案例1]基于Keras的手写数字图像识别icon-default.png?t=N4P3https://blog.csdn.net/qq_52487066/article/details/131048466?spm=1001.2014.3001.5501环境搭建好之后,还需要额外下载下面的工具包,依次在Anaconda Prompt 中执行以下命令

conda install py-opencv -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install dlib==19.7.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install face_recognition -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install Pillow -i https://pypi.tuna.tsinghua.edu.cn/simple

工具包下载导入完成,下面进行项目的构建与运行


三、基于卷积神经网络人脸识别模型的构建与测试

1.核心代码

第一步:采集自己和他人的人脸特征数据,分别对应数据标签0和1

get_my_face.py

import cv2
import dlib
import os
import random

output_dir = './my_crop_faces'
size = 160
if not os.path.exists(output_dir):
    os.makedirs(output_dir)

# 改变图片的亮度与对比度
def relight(img, light=1, bias=0):
    w = img.shape[1]
    h = img.shape[0]
    #image = []
    for i in range(0,w):
        for j in range(0,h):
            for c in range(3):
                tmp = int(img[j,i,c]*light + bias)
                if tmp > 255:
                    tmp = 255
                elif tmp < 0:
                    tmp = 0
                img[j,i,c] = tmp
    return img

#使用dlib自带的frontal_face_detector作为我们的特征提取器
detector = dlib.get_frontal_face_detector()
# 打开摄像头 参数为输入流,可以为摄像头或视频文件
camera = cv2.VideoCapture(0)

index = 0
while True:
    if (index <= 1000):
        print('Being processed picture %s' % index)
        # 从摄像头读取照片
        success, img = camera.read()
        # 转为灰度图片
        gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        # 使用detector进行人脸检测
        dets = detector(gray_img, 1)

        for i, d in enumerate(dets):
            x1 = d.top() if d.top() > 0 else 0
            y1 = d.bottom() if d.bottom() > 0 else 0
            x2 = d.left() if d.left() > 0 else 0
            y2 = d.right() if d.right() > 0 else 0

            face = img[x1:y1,x2:y2]
            # 调整图片的对比度与亮度, 对比度与亮度值都取随机数,这样能增加样本的多样性
            face = relight(face, random.uniform(0.5, 1.5), random.randint(-50, 50))
            face = cv2.resize(face, (size,size))
            cv2.imshow('image', face)
            cv2.imwrite(output_dir+'/'+str(index)+'.jpg', face)
            index += 1
        key = cv2.waitKey(30) & 0xff
        if key == 27:
            break
    else:
        print('Finished!')
        break

 第二步:训练识别人脸特征的模型,并将模型保存为.h5格式的文件

model_train.py

#-*- coding: utf-8 -*-
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
import os
import cv2
import numpy as np
from sklearn.model_selection import train_test_split
import random

def get_files(input_dir):
    file_list = []
    for (path, dirnames, filenames) in os.walk(input_dir):
        # print(path) #输出对应顶层文件夹
        # print(dirnames)#在当前文件夹下的文件夹
        # print(filenames)#在当前文件夹下的文件夹
        for filename in filenames:
            if filename.endswith('.jpg') or filename.endswith('.bmp'):
                # print(filename)
                full_path = os.path.join(path, filename)
                # print(full_path)
                file_list.append(full_path)
    return file_list

#设置hujianhua文件夹的对应标签为0
def getPaddingSize(img):
    h, w, _ = img.shape
    top, bottom, left, right = (0,0,0,0)
    longest = max(h, w)

    if w < longest:
        tmp = longest - w
        # //表示整除符号
        left = tmp // 2
        right = tmp - left
    elif h < longest:
        tmp = longest - h
        top = tmp // 2
        bottom = tmp - top
    else:
        pass
    return top, bottom, left, right

def read_img_label(file_list, label):
    size = 64
    imgs = []
    labs = []
    #01
    num = 0
    for filename in file_list:
        # print(filename)
        img = cv2.imread(filename)
        # print(img.shape)
        top, bottom, left, right = getPaddingSize(img)
        # 将图片放大, 扩充图片边缘部分
        img = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_CONSTANT, value=[0, 0, 0])
        img = cv2.resize(img, (size, size))
        imgs.append(img)
        labs.append(label)
        num = num + 1

    # print(len(imgs))
    # print(len(labs))
    return imgs, labs


def read_dataset():
    input_dir = "./data_collection/my_crop_faces"


    all_imgs_list = []
    all_label_list = []
    my_file_list = get_files(input_dir)
    # 0->[0,1] 1->[1,0]
    label = 0 #[0, 1]
    my_imgs_list, my_labs_list = read_img_label(my_file_list, label)

    input_dir = "./data_collection/others_img_crop"

    others_file_list = get_files(input_dir)
    label = 1 #[1, 0] #->0
    others_imgs_list, others_labs_list = read_img_label(others_file_list, label)

    for img in my_imgs_list:
        all_imgs_list.append(img)
    for img in others_imgs_list:
        all_imgs_list.append(img)

    for label in my_labs_list:
        all_label_list.append(label)
    for label in others_labs_list:
        all_label_list.append(label)

    imgs_array = np.array(all_imgs_list)
    # print(imgs_array.shape)

    labs_array = np.array(all_label_list)
    # print(labs_array.shape)

    return imgs_array,labs_array


#加载数据集并按照交叉验证的原则划分数据集并进行相关预处理工作
def load_data(img_rows = 64, img_cols = 64,
         img_channels = 3, nb_classes = 2):
    #加载数据集到内存
    images, labels = read_dataset()
    print(images.shape)
    print(labels.shape)

    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))

    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)
    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)
    print(train_labels.shape)
    print(valid_labels.shape)
    print(test_labels.shape)
    #像素数据浮点化以便归一化
    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

    return train_images, train_labels, valid_images, valid_labels, test_images, test_labels

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

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

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

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

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

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

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

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

model = build_model()

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

train_images, train_labels, valid_images, valid_labels, test_images, test_labels = load_data()

batch_size = 20
nb_epoch = 10
train_history = model.fit(train_images,
               train_labels,
               batch_size=batch_size,
               nb_epoch=nb_epoch,
               validation_data=(valid_images, valid_labels),
               shuffle=True)

scores = model.evaluate(test_images, test_labels)
print('accuracy=', scores[1])
prediction = model.predict_classes(test_images)
# print(prediction)
model.save('./me.face.model.h5')

 第三步:读取.h5文件格式的人脸识别模型,对摄像头录入的人脸图像进行识别

video_predict.py

import cv2
import dlib
from keras.models import load_model
import sys

size = 64

# 使用dlib自带的frontal_face_detector作为我们的特征提取器
detector = dlib.get_frontal_face_detector()

cam = cv2.VideoCapture(0)

model = load_model('./me.face.model.h5')

while True:
    _, img = cam.read()
    gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    dets = detector(gray_image, 1)
    for i, d in enumerate(dets):
        x1 = d.top() if d.top() > 0 else 0
        y1 = d.bottom() if d.bottom() > 0 else 0
        x2 = d.left() if d.left() > 0 else 0
        y2 = d.right() if d.right() > 0 else 0
        face = img[x1:y1, x2:y2]
        # 调整图片的尺寸
        face = cv2.resize(face, (size, size))
        shape_img = (face.reshape(1, size, size, 3)).astype('float32') / 255

        prediction = model.predict_classes(shape_img)
        print(prediction[0])
        name = "unknown"
        if prediction[0] == 0:
            print("识别出本人")
            name = "Aricl."
        else:
            print("不是本人")
            name = "unknown"
        cv2.rectangle(img, (x2, x1), (y2, y1), (255, 0, 0), 3)
        font = cv2.FONT_HERSHEY_SIMPLEX
        cv2.putText(img, name, (x2, x1), font, 0.8, (255, 255, 255), 1)

    cv2.imshow('image', img)
    key = cv2.waitKey(30) & 0xff
    if key == 27:
        sys.exit(0)

2.识别的基本原理

        核心之一是使用OpenCV(Open source Computer Vision Library),即开放源代码计算机视觉库进行图像的处理。

        它是一套关于计算机视觉的开放源代码的API函数库。这也就意味着,(1)不管是科学研究,还是商业应用,都可以利用它来作开发;(2)所有API函数的源代码都是公开的,你可以看到其内部实现的程序步骤;(3)你可以修改OpenCV的源代码,编译生成你需要的特定API函数。但是,作为一个库,它所提供的,仅仅是一些常用、经典、大众化算法的API。

        一个典型的计算机视觉算法,一般包含以下步骤:

  1. 数据获取
  2. 预处理
  3. 特征提取
  4. 特征选择
  5. 分类器设计与训练
  6. 分类判别

而OpenCV对这六个部分,都分别提供了API以供开发者调用。

        核心之二是使用Keras搭建卷积神经网络

        Keras对人工智能来说,是一款比较好的入门框架。它是一个高级的Python神经网络框架,已经被添加到TensorFlow中,成为其默认的框架,为TensorFlow提供更高级的API。

        如果将TensorFlow比喻为编程界的Java或者C++,那么Keras就是编程界的Python,它作为TensorFlow的高层封装,可以与TensorFlow联合使用,用它可以快速搭建模型。

        并且Keras是TensorFlow官方支持的。当机器上有可用的GPU时,代码会自动调用GPU进行并行计算,功能十分强大!

3.运行与测试

第一步:采集本人与他人的人脸特征数据(注意需要打开电脑摄像头,否则会报错!)

 

第二步:进行10轮次的人脸数据模型的训练

第三步:人脸识别与比对测试

上图是本人(博主Aricl.),下图是我室友(未知人脸),可见人脸识别的准确率还是不错的!


四、分析与小结

        本次通过构建基于卷积神经网络与Keras的人脸识别模型,实现的基本原理是:引用Python中的OpenCV库,调用其中的人脸分类器,然后调用电脑的摄像头循环读取单帧数据,进行实时人脸检测,并框出人脸,标注信息。

        首先我们需要进行人脸数据的采集,总共采集了1000张本人与他人的人脸特征数据,采集完毕后,进行数据模型的训练,共训练了10轮次,每轮次六千多,将训练好的模型保存为.h5格式的文件。然后调用摄像头读取每一帧的人脸照片,对图片进行灰度化处理,检测出人脸并框出对应的区域,读取.h5人脸识别模型文件进行人脸识别与比对,并在上方标注出是本人或者未知等信息。

        另外,采集时对被采集人和环境有一定要求,光线应该明亮使得摄像头能看清楚人脸,并且人脸应该正对着摄像头,这样采集得到的人脸特征数据才较为准确,识别的效果就越好

        本次仅仅是人脸识别的一次初步入门,我对此也产生了浓厚的学习兴趣,但博主正在备战考研,只能初步了解,后续有机会再继续学习与研究该领域相关技术,加油!!

参考文章

Python+Keras+opencv实现人脸识别icon-default.png?t=N4P3https://blog.csdn.net/gf19960103/article/details/91038858?ops_request_misc=&request_id=&biz_id=102&utm_term=%E4%BD%BF%E7%94%A8Keras%E6%9E%84%E5%BB%BA%E4%BA%BA%E8%84%B8%E8%AF%86%E5%88%AB%E6%A8%A1%E5%9E%8B&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-3-91038858.nonecase&spm=1018.2226.3001.4187人脸检测及识别python实现系列(5)——利用keras库训练人脸识别模型icon-default.png?t=N4P3https://blog.csdn.net/weixin_44491431/article/details/113839543?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168601107216800185824691%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168601107216800185824691&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-113839543-null-null.142^v88^control_2,239^v2^insert_chatgpt&utm_term=%E4%BD%BF%E7%94%A8Keras%E6%9E%84%E5%BB%BA%E4%BA%BA%E8%84%B8%E8%AF%86%E5%88%AB%E6%A8%A1%E5%9E%8B&spm=1018.2226.3001.4187手把手教你使用Keras进行人脸检测和识别icon-default.png?t=N4P3https://blog.csdn.net/m0_55479420/article/details/115268470?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168601107216800185824691%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168601107216800185824691&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-115268470-null-null.142^v88^control_2,239^v2^insert_chatgpt&utm_term=%E4%BD%BF%E7%94%A8Keras%E6%9E%84%E5%BB%BA%E4%BA%BA%E8%84%B8%E8%AF%86%E5%88%AB%E6%A8%A1%E5%9E%8B&spm=1018.2226.3001.4187

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/614482.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络排障全景指南手册v1.0pdf 全网发布

大家好&#xff0c;这里是极客重生&#xff0c;我是大师兄&#xff0c;我把之前关于丢包排障文章整理了一下&#xff0c;形成一个网络丢包排障手册pdf文档 &#xff0c;希望可以帮助大家快速排障网络问题。 当前版本主要针对是服务端网络问题排障&#xff0c;包括网卡&#xff…

怎么将文件转为扫描件

推荐两个工具&#xff0c;也算是给自己记一下 1、手机&#xff1a;扫描全能王APP 太好使了&#xff0c;可以直接拍照并转换为扫描件 不开会员的话会出现水印&#xff0c;因为我都是自己用或者交作业就没开 支持读取相册&#xff0c;一次一张、多张都可以 如果不想要水印也…

chatgpt赋能python:Python制图:让数据图像化

Python制图&#xff1a;让数据图像化 数据可视化是近年来越来越流行的技术&#xff0c;其能够将大量的数字和信息变成直观有趣的图形。Python是一个广泛使用的编程语言&#xff0c;也是制图利器。Python的绘图库非常丰富&#xff0c;包括流行的Matplotlib、Seaborn和Plotly等&…

进程的控制

文章目录 1. Linux线程创建和等待2. 线程ID3. 线程的局部存储4. 分离线程 1. Linux线程创建和等待 这是前面写过的创建线程的代码&#xff0c;现在我们把线程的ID打印看一下&#xff1a; 我们可以看到线程的id特别大&#xff0c;这是为什么呢&#xff1f;我们后面再说。 如果…

一文简介Spring的IOC和AOP

1、IOC 概念&#xff1a;所谓控制反转&#xff0c;就是把原先我们代码里面需要实现的对象创建、依赖的代码&#xff0c;反转给容器来帮忙实现。当应用了IoC&#xff0c;一个对象依赖的其它对象会通过被动的方式传递进来&#xff0c;而不是这个对象自己创建或者查找依赖对象。 …

飞桨AI Day落地澳门高校!助力大湾区打造产教融合新范式

为了推动大湾区建设产教融合的人工智能技术生态&#xff0c;加快培养助力社会经济高质量发展的复合型 AI 人才&#xff0c;飞桨校园 AI Day 登陆澳门&#xff0c;开展《AI 技术发展趋势与人才培养》主题讲座 &#xff0c;邀请多位澳门科技大学及百度嘉宾&#xff0c;解读当下AI…

【中兴ZXV10 B860A1.1】

这里写自定义目录标题 开启adb开启adb 部分盒子的ADB调试位置,在设置页面中可以有开启开发者选项。地区界面不同,位置不同有的在设置里。 如果找不到,直接按住遥控器【返回】不放,5秒后,快速不停按【左键】。 点击【打开ADB调试】这时侯让你输入密码 下载zikaikeji.ap…

chatgpt赋能python:Python如何创建集合——你必须知道的所有知识

Python 如何创建集合——你必须知道的所有知识 作为一位有10年 Python 编程经验的工程师&#xff0c;我可以告诉你&#xff0c;Python 集合是编程中非常重要的一部分。如果你不知道如何创建集合&#xff0c;那么你可能会错过很多东西。所以&#xff0c;让我们深入探讨 Python …

提供一个使用Npoi生成excel文档的例子,应能帮助到各位使用Npoi的朋友,因为具有多种情形处理

提供一个使用Npoi生成excel文档的例子&#xff0c;应能帮助到各位使用Npoi的朋友&#xff0c;因为具有多种情形处理 照例&#xff0c;文章开始之前&#xff0c;先看下最终效果&#xff1a; 实现的需求点如下&#xff1a; 1.第一行大标题加了背景色&#xff0c;且这个背景色&…

解密 JS 参数:逆向工程的实用技巧

大家好&#xff0c;我是安果&#xff01; 大部分网站都会对关键参数进行加密&#xff0c;JS 逆向时&#xff0c;我们首要任务是定位参数具体的加密逻辑 常见方式包含&#xff1a;关键字搜索、堆栈调试、XHR 及事件监听、AST 内存漫游、JS Hook 注入等 本篇文章以 JS Hook 注入定…

惊爆!Python打造花式照片墙!

大家注意&#xff1a;因为微信最近又改了推送机制&#xff0c;经常有小伙伴说错过了之前被删的文章&#xff0c;比如前阵子冒着风险写的爬虫&#xff0c;再比如一些限时福利&#xff0c;错过了就是错过了。 所以建议大家加个星标&#xff0c;就能第一时间收到推送。&#x1f44…

NXP IMX8M + Ethercat+Codesys工业实时运动控制解决方案

面向边缘计算应用的全新i.MX 8M Plus异构应用处理器&#xff0c;搭载专用神经网络加速器、独立实时子系统、双摄像头ISP、高性能DSP和GPU。 恩智浦半导体宣布推出i.MX 8M Plus应用处理器&#xff0c;进一步丰富其业界领先的产品组合。这是恩智浦首个集成了专用神经处理引擎&…

G0第25章:Gin框架进阶项目实战

1 Gin框架源码解析 通过阅读gin框架的源码来探究gin框架路由与中间件的秘密。 1.1 Gin框架路由详解 gin框架使用的是定制版本的httprouter&#xff0c;其路由的原理是大量使用公共前缀的树结构&#xff0c;它基本上是一个紧凑的Trie tree 或者只是&#xff08;Radix Tree&am…

Linux Tomcat服务 虚拟主机 多实例部署

Tomcat 服务 Tomcat 是 Java 语言开发的&#xff0c;Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器。Tomcat 属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试 java开发的JSP 动态页面程序的首选。一般…

Linux教程——常见Linux发行版本有哪些?

新手往往会被 Linux 众多的发行版本搞得一头雾水&#xff0c;我们首先来解释一下这个问题。 从技术上来说&#xff0c;李纳斯•托瓦兹开发的 Linux 只是一个内核。内核指的是一个提供设备驱动、文件系统、进程管理、网络通信等功能的系统软件&#xff0c;内核并不是一套完整的…

DDD领域模型

一、分层介绍 controller层&#xff1a;处理页面或者api请求的输入输出&#xff0c;定义VO(REQ,RES)&#xff0c;没有业务逻辑&#xff0c;只做请求处理和下层逻辑接application层&#xff1a;处理跨领域domain的复杂逻辑&#xff0c;定义DTOdomain层&#xff1a;领域核心逻辑…

深入理解Qt多线程编程:QThread、QTimer与QAudioOutput的内在联系__QObject的主线程的事件循环

深入理解Qt多线程编程&#xff1a;QThread、QTimer与QAudioOutput的内在联系__QObject的主线程的事件循环 1. Qt多线程编程的基础1.1 QObject和线程&#xff08;QObject and Threads&#xff09;1.2 QThread的使用和理解&#xff08;Understanding and Using QThread&#xff0…

C#,码海拾贝(35)——求“实对称矩阵““特征值与特征向量“的“雅可比法“之C#源代码

using System; namespace Zhou.CSharp.Algorithm { /// <summary> /// 矩阵类 /// 作者&#xff1a;周长发 /// 改进&#xff1a;深度混淆 /// https://blog.csdn.net/beijinghorn /// </summary> public partial class Matrix {…

编码器 | 基于 Transformers 的编码器-解码器模型

基于 transformer 的编码器-解码器模型是 表征学习 和 模型架构 这两个领域多年研究成果的结晶。本文简要介绍了神经编码器-解码器模型的历史&#xff0c;更多背景知识&#xff0c;建议读者阅读由 Sebastion Ruder 撰写的这篇精彩 博文。此外&#xff0c;建议读者对 自注意力 (…

【AUTOSAR】Bootloader说明(一)---- 时序流程

电机控制器选用TI TMS28xx DSP&#xff0c;包括boot-loader与应用软件两个部分。其中boot-loader包括下列内容&#xff1a; RAM自检应用程序有效性检查UDS命令处理FLASH操作 下面分别说明DSP上电后整个软件运行流程及程序刷新过程。 DSP软件执行流程 DSP复位后&#xff0c;将…