软件杯 深度学习 python opencv 实现人脸年龄性别识别

文章目录

  • 0 前言
  • 1 项目课题介绍
  • 2 关键技术
    • 2.1 卷积神经网络
    • 2.2 卷积层
    • 2.3 池化层
    • 2.4 激活函数:
    • 2.5 全连接层
  • 3 使用tensorflow中keras模块实现卷积神经网络
  • 4 Keras介绍
    • 4.1 Keras深度学习模型
    • 4.2 Keras中重要的预定义对象
    • 4.3 Keras的网络层构造
  • 5 数据集处理训练
    • 5.1 分为年龄、性别
    • 5.2 性别分为两类
    • 5.3性别训练代码
    • 5.4 年龄分为七个年龄段
    • 5.5 年龄训练代码
  • 6 模型验证预测
    • 6.1 实现效果
    • 6.2 关键代码
  • 7 最后

0 前言

🔥 优质竞赛项目系列,今天要分享的是

🚩 基于深度学习的人脸年龄性别识别算法实现

该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:4分
  • 工作量:4分
  • 创新点:3分

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate


1 项目课题介绍

年龄和性别作为人重要的生物特征, 可以应用于多种场景,
如基于年龄的人机交互系统、电子商务中个性营销、刑事案件侦察中的年龄过滤等。然而基于图像的年龄分类和性别检测在真实场景下受很多因素影响,
如后天的生活工作环境等, 并且人脸图像中的复杂光线环境、姿态、表情以及图片本身的质量等因素都会给识别造成困难。

学长这次设计的项目 基于深度学习卷积神经网络,利用Tensorflow和Keras等工具实现图像年龄和性别检测。

在这里插入图片描述

2 关键技术

2.1 卷积神经网络

受到人类大脑神经突触结构相互连接的模式启发,神经网络作为人工智能领域的重要组成部分,通过分布式的方法处理信息,可以解决复杂的非线性问题,从构造方面来看,主要包括输入层、隐藏层、输出层三大组成结构。每一个节点被称为一个神经元,存在着对应的权重参数,部分神经元存在偏置,当输入数据x进入后,对于经过的神经元都会进行类似于:y=w*x+b的线性函数的计算,其中w为该位置神经元的权值,b则为偏置函数。通过每一层神经元的逻辑运算,将结果输入至最后一层的激活函数,最后得到输出output。

在这里插入图片描述

2.2 卷积层

卷积核相当于一个滑动窗口,示意图中3x3大小的卷积核依次划过6x6大小的输入数据中的对应区域,并与卷积核滑过区域做矩阵点乘,将所得结果依次填入对应位置即可得到右侧4x4尺寸的卷积特征图,例如划到右上角3x3所圈区域时,将进行0x0+1x1+2x1+1x1+0x0+1x1+1x0+2x0x1x1=6的计算操作,并将得到的数值填充到卷积特征的右上角。

在这里插入图片描述

2.3 池化层

池化操作又称为降采样,提取网络主要特征可以在达到空间不变性的效果同时,有效地减少网络参数,因而简化网络计算复杂度,防止过拟合现象的出现。在实际操作中经常使用最大池化或平均池化两种方式,如下图所示。虽然池化操作可以有效的降低参数数量,但过度池化也会导致一些图片细节的丢失,因此在搭建网络时要根据实际情况来调整池化操作。

在这里插入图片描述

2.4 激活函数:

激活函数大致分为两种,在卷积神经网络的发展前期,使用较为传统的饱和激活函数,主要包括sigmoid函数、tanh函数等;随着神经网络的发展,研宄者们发现了饱和激活函数的弱点,并针对其存在的潜在问题,研宄了非饱和激活函数,其主要含有ReLU函数及其函数变体

2.5 全连接层

在整个网络结构中起到“分类器”的作用,经过前面卷积层、池化层、激活函数层之后,网络己经对输入图片的原始数据进行特征提取,并将其映射到隐藏特征空间,全连接层将负责将学习到的特征从隐藏特征空间映射到样本标记空间,一般包括提取到的特征在图片上的位置信息以及特征所属类别概率等。将隐藏特征空间的信息具象化,也是图像处理当中的重要一环。

3 使用tensorflow中keras模块实现卷积神经网络

class CNN(tf.keras.Model):
    def __init__(self):
        super().__init__()
        self.conv1 = tf.keras.layers.Conv2D(
            filters=32,             # 卷积层神经元(卷积核)数目
            kernel_size=[5, 5],     # 感受野大小
            padding='same',         # padding策略(vaild 或 same)
            activation=tf.nn.relu   # 激活函数
        )
        self.pool1 = tf.keras.layers.MaxPool2D(pool_size=[2, 2], strides=2)
        self.conv2 = tf.keras.layers.Conv2D(
            filters=64,
            kernel_size=[5, 5],
            padding='same',
            activation=tf.nn.relu
        )
        self.pool2 = tf.keras.layers.MaxPool2D(pool_size=[2, 2], strides=2)
        self.flatten = tf.keras.layers.Reshape(target_shape=(7 * 7 * 64,))
        self.dense1 = tf.keras.layers.Dense(units=1024, activation=tf.nn.relu)
        self.dense2 = tf.keras.layers.Dense(units=10)

    def call(self, inputs):
        x = self.conv1(inputs)                  # [batch_size, 28, 28, 32]
        x = self.pool1(x)                       # [batch_size, 14, 14, 32]
        x = self.conv2(x)                       # [batch_size, 14, 14, 64]
        x = self.pool2(x)                       # [batch_size, 7, 7, 64]
        x = self.flatten(x)                     # [batch_size, 7 * 7 * 64]
        x = self.dense1(x)                      # [batch_size, 1024]
        x = self.dense2(x)                      # [batch_size, 10]
        output = tf.nn.softmax(x)
        return output

4 Keras介绍

keras是一个专门用于深度学习的开发软件。它的编程语言采用的为现在最流行的python语言,集成封装了CNTK,Tensorflow或者Theano深度学习框架为计算机后台进行深度建模,具有易于学习,高效编程的功能,数据的运算处理支持GPU和CPU,真正实现了二者的无缝切换。正是keras有如此特殊功能,所以它的优点有如下几个方面:

4.1 Keras深度学习模型

Keras深度学习模型可以分为两种:一种是序列模型,一种是通用模型。它们的区别在于其拥有不同的网络拓扑结构。序列模型是通用模型的一个范例,通常情况下应用比较广。每层之间的连接方式都是线性的,且在相邻的两

4.2 Keras中重要的预定义对象

Keras预定义了很多对象目的就是构造其网络结构,正是有了这么多的预定义对象才让Keras使用起来非常方便易用。研究中用的最多要数正则化、激活函数及初始化对象了。

  • 正则化是在建模时防止过度拟合的最常用且效果最有效的手段之一。在神经网络中采用的手段有权重参数、偏置项以及激活函数,其分别对应的代码是kernel_regularizier、bias_regularizier以及activity_regularizier。

  • 激活函数在网络定义中的选取十分重要。为了方便Keras预定义了丰富的激活函数,以此是适应不同的网络结构。使用激活对象的方式有两种:一个是单独定义一个激活函数层,二是通利用前置层的激活选项定义激活函数。

  • 初始化对象是随机给定网络层激活函数kernel_initializer or bias_initializer的开始值。权重初始化值好与坏直接影响模型的训练时间的长短。

4.3 Keras的网络层构造

在Keras框架中,不同的网络层(Layer)定义了神经网络的具体结构。在实际网络构建中常见的用Core Layer、Convolution
Layer、Pooling Layer、Emberdding Layer等。

在这里插入图片描述

5 数据集处理训练

该项目将采集的照片分为男女两个性别;‘0-9’, ‘10-19’, ‘20-29’, ‘30-39’, ‘40-49’, ‘50-59’,
‘60+’,七个年龄段;分别把性别和年龄段的图片分别提取出来,并保存到性别和年龄段两个文件夹下,构造如下图:

5.1 分为年龄、性别

在这里插入图片描述

5.2 性别分为两类

在这里插入图片描述

5.3性别训练代码



    # ----------------------------------------------------------------------------------------------------------------------
    # 导入一些第三方包
    # ----------------------------------------------------------------------------------------------------------------------
    
    import tensorflow as tf
    from nets import net
    
    EPOCHS = 40
    BATCH_SIZE = 32
    image_height = 128
    image_width = 128
    model_dir = "./models/age.h5"
    train_dir = "./data/age/train/"
    test_dir = "./data/age/test/"
    
    def get_datasets():
        train_datagen = tf.keras.preprocessing.image.ImageDataGenerator(
            rescale=1.0 / 255.0
        )
    
        train_generator = train_datagen.flow_from_directory(train_dir,
                                                            target_size=(image_height, image_width),
                                                            color_mode="rgb",
                                                            batch_size=BATCH_SIZE,
                                                            shuffle=True,
                                                            class_mode="categorical")
    
        test_datagen = tf.keras.preprocessing.image.ImageDataGenerator(
            rescale=1.0 /255.0
        )
        test_generator = test_datagen.flow_from_directory(test_dir,
                                                          target_size=(image_height, image_width),
                                                          color_mode="rgb",
                                                          batch_size=BATCH_SIZE,
                                                          shuffle=True,
                                                          class_mode="categorical"
                                                          )
    
        train_num = train_generator.samples
        test_num = test_generator.samples
    
        return train_generator, test_generator, train_num, test_num


    # ----------------------------------------------------------------------------------------------------------------------
    # 网络的初始化 ---  net.CNN(num_classes=7)
    # model.compile --- 对神经网络训练参数是设置 --- tf.keras.losses.categorical_crossentropy --- 损失函数(交叉熵)
    # tf.keras.optimizers.Adam(learning_rate=0.001) --- 优化器的选择,以及学习率的设置
    # metrics=['accuracy'] ---  List of metrics to be evaluated by the model during training and testing
    # return model --- 返回初始化之后的模型
    # ----------------------------------------------------------------------------------------------------------------------
    
    def get_model():
        model = net.CNN(num_classes=7)
        model.compile(loss=tf.keras.losses.categorical_crossentropy,
                      optimizer=tf.keras.optimizers.Adam(lr=0.001),
                      metrics=['accuracy'])
        return model


    if __name__ == '__main__':
    
        train_generator, test_generator, train_num, test_num = get_datasets()
        model = get_model()
        model.summary()
    
        tensorboard = tf.keras.callbacks.TensorBoard(log_dir='./log/age/')
        callback_list = [tensorboard]
    
        model.fit_generator(train_generator,
                            epochs=EPOCHS,
                            steps_per_epoch=train_num // BATCH_SIZE,
                            validation_data=test_generator,
                            validation_steps=test_num // BATCH_SIZE,
                            callbacks=callback_list)
    
        model.save(model_dir)
    
    # ----------------------------------------------------------------------------------------------------------------------



5.4 年龄分为七个年龄段

在这里插入图片描述

5.5 年龄训练代码



    # ----------------------------------------------------------------------------------------------------------------------
    # 导入一些第三方包
    # ----------------------------------------------------------------------------------------------------------------------
    
    import tensorflow as tf
    from nets import net
    
    EPOCHS = 20
    BATCH_SIZE = 32
    image_height = 128
    image_width = 128
    model_dir = "./models/gender.h5"
    train_dir = "./data/gender/train/"
    test_dir = "./data/gender/test/"


    def get_datasets():
        train_datagen = tf.keras.preprocessing.image.ImageDataGenerator(
            rescale=1.0 / 255.0
        )
    
        train_generator = train_datagen.flow_from_directory(train_dir,
                                                            target_size=(image_height, image_width),
                                                            color_mode="rgb",
                                                            batch_size=BATCH_SIZE,
                                                            shuffle=True,
                                                            class_mode="categorical")
    
        test_datagen = tf.keras.preprocessing.image.ImageDataGenerator(
            rescale=1.0 /255.0
        )
        test_generator = test_datagen.flow_from_directory(test_dir,
                                                          target_size=(image_height, image_width),
                                                          color_mode="rgb",
                                                          batch_size=BATCH_SIZE,
                                                          shuffle=True,
                                                          class_mode="categorical"
                                                          )
    
        train_num = train_generator.samples
        test_num = test_generator.samples
    
        return train_generator, test_generator, train_num, test_num
    
    def get_model():
        model = net.CNN(num_classes=2)
        model.compile(loss=tf.keras.losses.categorical_crossentropy,
                      optimizer=tf.keras.optimizers.Adam(lr=0.001),
                      metrics=['accuracy'])
        return model


    if __name__ == '__main__':
    
        train_generator, test_generator, train_num, test_num = get_datasets()
        model = get_model()
        model.summary()
    
        tensorboard = tf.keras.callbacks.TensorBoard(log_dir='./log/gender/')
        callback_list = [tensorboard]
    
        model.fit_generator(train_generator,
                            epochs=EPOCHS,
                            steps_per_epoch=train_num // BATCH_SIZE,
                            validation_data=test_generator,
                            validation_steps=test_num // BATCH_SIZE,
                            callbacks=callback_list)
    
        model.save(model_dir)
    
    # ----------------------------------------------------------------------------------------------------------------------



6 模型验证预测

6.1 实现效果

在这里插入图片描述
在这里插入图片描述

6.2 关键代码

# ----------------------------------------------------------------------------------------------------------------------
# 加载基本的库
# ----------------------------------------------------------------------------------------------------------------------
import tensorflow as tf
from PIL import Image
import numpy as np
import cv2
import os
# ----------------------------------------------------------------------------------------------------------------------
# tf.keras.models.load_model('./model/age.h5') --- 加载年龄模型
# tf.keras.models.load_model('./model/gender.h5') --- 加载性别模型
# ----------------------------------------------------------------------------------------------------------------------
model_age = tf.keras.models.load_model('./models/age.h5')
model_gender = tf.keras.models.load_model('./models/gender.h5')
# ----------------------------------------------------------------------------------------------------------------------
# 类别名称
# ----------------------------------------------------------------------------------------------------------------------
classes_age = ['0-9', '10-19', '20-29', '30-39', '40-49', '50-59', '60+']
classes_gender = ['female', 'male']
# ----------------------------------------------------------------------------------------------------------------------
# cv2.dnn.readNetFromCaffe --- 加载人脸检测模型
# ----------------------------------------------------------------------------------------------------------------------
net = cv2.dnn.readNetFromCaffe('./models/deploy.prototxt.txt', './models/res10_300x300_ssd_iter_140000.caffemodel')
# ----------------------------------------------------------------------------------------------------------------------
# os.listdir('./images/') --- 得到文件夹列表
# ----------------------------------------------------------------------------------------------------------------------
files = os.listdir('./images/')
# ----------------------------------------------------------------------------------------------------------------------
# 遍历信息
# ----------------------------------------------------------------------------------------------------------------------
for file in files:
    # ------------------------------------------------------------------------------------------------------------------
    # image_path = './images/' + file --- 拼接得到图片文件路径
    # cv2.imread(image_path) --- 使用opencv读取图片
    # ------------------------------------------------------------------------------------------------------------------
    image_path = './images/' + file
    print(image_path)
    image = cv2.imread(image_path)
    # ------------------------------------------------------------------------------------------------------------------
    # (h, w) = image.shape[:2] --- 得到图像的高度和宽度
    # cv2.dnn.blobFromImage --- 以DNN的方式加载图像
    # net.setInput(blob) -- 设置网络的输入
    # detections = net.forward() --- 网络前相传播过程
    # ------------------------------------------------------------------------------------------------------------------
    (h, w) = image.shape[:2]
    blob = cv2.dnn.blobFromImage(cv2.resize(image, (300, 300)), 1.0, (300, 300), 127.5)
    net.setInput(blob)
    detections = net.forward()
    # ------------------------------------------------------------------------------------------------------------------
    # for i in range(0, detections.shape[2]): --- 遍历检测结果
    # ------------------------------------------------------------------------------------------------------------------
    for i in range(0, detections.shape[2]):
        # --------------------------------------------------------------------------------------------------------------
        # confidence = detections[0, 0, i, 2] 得到检测的准确率
        # --------------------------------------------------------------------------------------------------------------
        confidence = detections[0, 0, i, 2]
        # --------------------------------------------------------------------------------------------------------------
        # if confidence > 0.85: --- 对置信度的判断
        # --------------------------------------------------------------------------------------------------------------
        if confidence > 0.85:
            # ----------------------------------------------------------------------------------------------------------
            # detections[0, 0, i, 3:7] * np.array([w, h, w, h]) --- 得到检测框的信息
            # (startX, startY, endX, endY) = box.astype("int") --- 将信息分解成左上角的x,y,以及右下角的x,y
            # cv2.rectangle --- 将人脸框起来
            # ----------------------------------------------------------------------------------------------------------
            box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
            (startX, startY, endX, endY) = box.astype("int")
            cv2.rectangle(image, (startX, startY), (endX, endY), (0, 255, 0), 1)
            # ----------------------------------------------------------------------------------------------------------
            # 提取人脸部分区域
            # ----------------------------------------------------------------------------------------------------------
            roi = image[startY-15:endY+15, startX-15:endX+15]
            # ----------------------------------------------------------------------------------------------------------
            # Image.fromarray(cv2.cvtColor(roi, cv2.COLOR_BGR2RGB)) --- 将opencv专程PIL格式的数据
            # img.resize((128, 128)) --- 改变图像的大小
            # np.array(img).reshape(-1, 128, 128, 3).astype('float32') / 255 --- 改变数据的形状,以及归一化处理
            # ----------------------------------------------------------------------------------------------------------
            img = Image.fromarray(cv2.cvtColor(roi, cv2.COLOR_BGR2RGB))
            img = img.resize((128, 128))
            img = np.array(img).reshape(-1, 128, 128, 3).astype('float32') / 255
            # ----------------------------------------------------------------------------------------------------------
            # 调用年龄识别模型得到检测结果
            # ----------------------------------------------------------------------------------------------------------
            prediction_age = model_age.predict(img)
            final_prediction_age = [result.argmax() for result in prediction_age][0]
            # ----------------------------------------------------------------------------------------------------------
            # 调用性别识别模型得到检测结果
            # ----------------------------------------------------------------------------------------------------------
            prediction_gender = model_gender.predict(img)
            final_prediction_gender = [result.argmax() for result in prediction_gender][0]
            # ----------------------------------------------------------------------------------------------------------
            # 将识别的信息拼接,然后使用cv2.putText显示
            # ----------------------------------------------------------------------------------------------------------
            res = classes_gender[final_prediction_gender] + ' ' + classes_age[final_prediction_age]
            y = startY - 10 if startY - 10 > 10 else startY + 10
            cv2.putText(image, str(res), (startX, y), cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 0, 255), 2)
    # ------------------------------------------------------------------------------------------------------------------
    # 显示
    # ------------------------------------------------------------------------------------------------------------------
    cv2.imshow('', image)
    if cv2.waitKey(0) & 0xFF == ord('q'):
        break

7 最后

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HTML详细教程

文章目录 前言一、快速开发网站最简模板二、HTML标签1.编码2.title3.标题4.div和span5.超链接6.图片7.列表8.表格9.input系列10.下拉框11.多行文本 三、GET方式和POST方式1.GET请求2.POST请求 前言 HTML的全称为超文本标记语言,是一种标记语言,是网站开发…

HCIP —— 交换 (VLAN)

VLAN --- 虚拟局域网 在 HCIA 中 ,已经学过交换机的一些基础配置,下面进行回顾一些简单的内容。 1.创建VLAN VLAN ID --- 区别和标识不同的VLAN 使用范围:0-4095 , 由12位二进制构成。 0 和 4095 作为 保留的VLAN。 …

Python零基础---爬虫技术相关

python 爬虫技术,关于数据相关的拆解: 1.对页面结构的拆解 2.数据包的分析(是否加密了参数)(Md5 aes)难易程度,价格 3.对接客户(433,334) # 数据库 CSV 4.结单(发一部分数据&a…

13 - grace数据处理 - 泄露误差改正 -正演建模法(Forward-Modeling)

grace数据处理 - 泄露误差改正 -正演建模法(Forward-Modeling) *0* 引言*1* Matlab代码实现0 引言 正演建模法最早是由Chen等提出的,本质是通过迭代的思想反求真实信号的过程,为什么要反求呢?因为在数据处理过程中做了球谐截断和空间滤波,使部分有用信号被湮灭,也就是有…

Blocks —— 《Objective-C高级编程 iOS与OS X多线程和内存管理》

目录 Blocks概要什么是BlocksOC转C方法关于几种变量的特点 Blocks模式Block语法Block类型 变量截获局部变量值__block说明符截获的局部变量 Blocks的实现Block的实质 Blocks概要 什么是Blocks Blocks是C语言的扩充功能,即带有局部变量的匿名函数。 顾名思义&#x…

如何在WSL中的ubuntu编译Linux内核并且安装使用ebpf?

如何在WSL中的ubuntu编译Linux内核并且安装使用ebpf? 步骤1 编译安装内核获取源码修改配置编译编译成功后配置重启WSL测试 步骤2 安装bcc安装依赖下载bcc,编译测试 环境: wsl2windows 11 步骤1 编译安装内核 去https://kernel.org/找你想要的版本, …

CCDP.01.使用NotePad++辅助部署OpenStack的说明

前言 对于象OpenStack(OS)这样的复杂分布式系统(云计算平台),一次部署通过是需要相当的Linux基础、网络基础、分布式系统基础、云计算基础的。这里类比在开发大型复杂系统常常采用的“防御式编程”方法论,探…

Gin 框架中实现路由的几种方式介绍

本文将为您详细讲解 Gin 框架中实现路由的几种方式,并给出相应的简单例子。Gin 是一个高性能的 Web 框架,用于构建后端服务。在 Web 应用程序中,路由是一种将客户端请求映射到特定处理程序的方法。以下是几种常见的路由实现方式: …

llama笔记:官方示例解析 example_chat_completion.py

1 导入库 from typing import List, Optional从typing模块中导入List和Optional。typing模块用于提供类型注解的支持,以帮助明确函数预期接收和返回的数据类型。List用于指定列表类型Optional用于指定一个变量可能是某个类型,也可能是None。 import fir…

Laravel11.0.3安装完后运行项目报错

Laravel11.0.3安装完后运行项目报错:could not find driver (Connection: sqlite, SQL: PRAGMA foreign_keys ON;) 运行项目报错时提示链接sqlite错误 解决方案: 1.确认机器安装了sqlite,https://blog.csdn.net/centaury32/article/detail…

C#,人工智能,机器学习,聚类算法,训练数据集生成算法、软件与源代码

摘要:本文简述了人工智能的重要分支——机器学习的核心算法之一——聚类算法,并用C#实现了一套完全交互式的、可由用户自由发挥的,适用于聚类算法的训练数据集生成软件——Clustering。用户使用鼠标左键(拖动)即可生成任意形状,任意维度,任意簇数及各种数据范围的训练数…

尚硅谷SQL|数据库的创建,修改与删除

DDL:创建和管理表 DDL所有的操作都要慎重,尤其是删除,清空等。 创建数据库--->确认字段--->创建数据表---->插入数据 创建数据库 1.创建数据库:推荐使用方式3 #创建数据库 #方式1,使用的是默认字符集 create databa…

Matlab|【免费】基于半不变量的概率潮流计算

目录 主要内容 部分代码 结果一览 下载链接 主要内容 该程序主要内容是基于半不变量法的概率潮流,包含蒙特卡洛模拟法、半不变量法+Gram-Charlier级数展开以及半不变量法Cornish-Fisher级数展开三种方法以及效果对比,模型考虑了…

Android学习使用GitLab(保姆级)

实习生入职第一课 学习使用GitLab,熟悉Git版本控制工具 下面是我的学习笔记,希望能帮助到需要的人! 目录 一、注册你的GitLab账号 二、安装Git 三、在Android studio中配置Git 四、GitLab账户配置SSH Keys 五、GitLab账号创建项目 六…

Qt/C++监控推流设备推流/延迟极低/实时性极高/rtsp/rtmp推流/hls/flv/webrtc拉流/调整分辨率降低带宽

一、前言 算下来这个推流的项目作品写了有四年多了,最初第一个版本只有文件点播的功能,用的纯QTcpSocket通信实现,属于比较简单的功能。由于文件点播只支持文件形式的推流,不支持网络流或者本地设备采集,所以迫切需要…

【GPT-SOVITS-05】SOVITS 模块-残差量化解析

说明:该系列文章从本人知乎账号迁入,主要原因是知乎图片附件过于模糊。 知乎专栏地址: 语音生成专栏 系列文章地址: 【GPT-SOVITS-01】源码梳理 【GPT-SOVITS-02】GPT模块解析 【GPT-SOVITS-03】SOVITS 模块-生成模型解析 【G…

ChatGPT提示词方法的原理

关于提示词,我之前的一些文章可以参考: 【AIGC】AI作图最全提示词prompt集合(收藏级)https://giszz.blog.csdn.net/article/details/134815245?ydrefereraHR0cHM6Ly9tcC5jc2RuLm5ldC9tcF9ibG9nL21hbmFnZS9hcnRpY2xlP3NwbT0xMDExL…

如何在Mac中删除照片?这里有详细步骤

前言 本文介绍如何从Mac中删除照片,以释放硬盘空间或更好地组织文件和文件夹。 如何使用废纸篓删除Mac上的图片 在Mac上删除图片的最简单方法之一是使用废纸篓功能。学习只需几秒钟。下面是如何删除单个图片以及如何在Mac上删除多个图片,以及一些关键和有用的提示,以使该…

Matlab|考虑可再生能源消纳的电热综合能源系统日前经济调度模型

目录 1 主要内容 模型示意图 目标函数 程序亮点 2 部分程序 3 程序结果 4 下载链接 1 主要内容 本程序参考文献《考虑可再生能源消纳的建筑综合能源系统日前经济调度模型》模型,建立了电热综合能源系统优化调度模型,包括燃气轮机、燃气锅炉、余热…

195基于matlab的凸轮机构GUI界面

基于matlab的凸轮机构GUI界面 , 凸轮设计与仿真 绘制不同的凸轮轮廓曲线 ,凸轮机构运动参数包括推程运动角,回程运动角,远休止角,近休止角。运动方式,运动规律。运动仿真过程可视化。内容齐全详尽。用GUI打…