12.【Orangepi Zero2】基于orangepi_Zero_2 Linux的智能家居项目

news2024/11/27 9:46:22

基于orangPi Zero 2的智能家居项目

需求及项目准备

  • 语音接入控制各类家电,如客厅灯、卧室灯、风扇
  • 回顾二阶段的Socket编程,实现Sockect发送指令远程控制各类家电
  • 烟雾警报监测, 实时检查是否存在煤气泄漏或者火灾警情,当存在警情时及时触发蜂鸣器报警及语 音播报
  • 控制人脸识别打开房门功能,并语音播报识别成功或者失败
  • 局域网实时视频监控
  • OLED屏实话显示当前主板温度、警情信息及控制指令信息

人脸识别使用阿里SDK支持Python和Java接口,目的是复习巩固智能分类时引入C语言的Python调用。

此接口是人工智能接口,阿里云识别模型是通过训练后的模型,精准度取决于训练程度,人工智能范畴 在常规嵌入式设备负责执行居多。

说白的嵌入式设备负责数据采集,然后转发给人工智能识别后,拿到结果进行执行器动作。

系统框图

在这里插入图片描述

硬件接线

硬件

USB充电头(当前实测可用:5V/2.5A)x1、USB转TYPE-Cx1、SU-03Tx1、烟雾报警模块x1、4路继 电器x1、 OLEDx1、 电磁锁x1(5V吸合开锁)、 蜂鸣器x1、小风扇+电机x1(需要自行购买)、面包 板x1、 5号1.5V电池x6 、 2节电池盒x1、4节电池盒x1、带3路led灯小房子(3.3V可驱动, 需自行 购买搭建)

接线

在这里插入图片描述

在这里插入图片描述

语音模块配置

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

阿里云人脸识别方案

在之前树莓派的人脸识别方案采用了翔云平台的方案去1V1上传比对两张人脸比对,这种方案是可行,可 以继续采用。但为了接触更多了云平台方案,在Orange Pi Zero2里, 讲采用人脸搜索1:N方案,通过提 前在阿里云人脸数据库里存储人脸照片后,输入单张已授权人脸图像,与人脸库中人脸图片进行对比, 最终获取比对结果。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

开通完后, 在”工作台->开发能力->人脸人体->人脸数据库管理 " 添加人脸照片样本 :

在这里插入图片描述

在这里插入图片描述

  • 数据库默认名字db_name/DbName:default
  • EntityId/实体Id

上传数据库后,安装阿里云人脸识别SDK:

pip install alibabacloud_facebody20191230

导入ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET环境变量:

vi ~/.bashrc #最后的结尾添加, 在垃圾分类的项目里如果已经添加过就不需要添加了
export ALIBABA_CLOUD_ACCESS_KEY_ID="你的KEY_ID"
export ALIBABA_CLOUD_ACCESS_KEY_SECRET="你的KEY_SECRECT"

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

可以拿同一人的照片和不同人的照片用官方python代码进行对比:

# -*- coding: utf-8 -*-
# 引入依赖包
# pip install alibabacloud_facebody20191230

import os
import io
from urllib.request import urlopen
from alibabacloud_facebody20191230.client import Client
from alibabacloud_facebody20191230.models import SearchFaceAdvanceRequest
from alibabacloud_tea_openapi.models import Config
from alibabacloud_tea_util.models import RuntimeOptions

config = Config(
    # 创建AccessKey ID和AccessKey Secret,请参考https://help.aliyun.com/document_detail/175144.html。
    # 如果您用的是RAM用户的AccessKey,还需要为RAM用户授予权限AliyunVIAPIFullAccess,请参考https://help.aliyun.com/document_detail/145025.html。
    # 从环境变量读取配置的AccessKey ID和AccessKey Secret。运行代码示例前必须先配置环境变量。
    access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
    access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
    # 访问的域名
    endpoint='facebody.cn-shanghai.aliyuncs.com',
    # 访问的域名对应的region
    region_id='cn-shanghai'
)

search_face_request = SearchFaceAdvanceRequest()
#场景一:文件在本地
def alicloud_Search_Face():
    stream0 = open(r'/home/orangepi/smarthouse/face.jpg', 'rb')
    search_face_request.image_url_object = stream0

    #场景二:使用任意可访问的url
    #url = 'https://viapi-test-bj.oss-cn-beijing.aliyuncs.com/viapi-3.0domepic/facebody/SearchFace1.png'
    #img = urlopen(url).read()
    #search_face_request.image_url_object = io.BytesIO(img)
    search_face_request.db_name = 'default' #数据库默认名字db_name/DbName : default
    search_face_request.limit = 5

    runtime_option = RuntimeOptions()
    try:
        # 初始化Client
        client = Client(config)
        response = client.search_face_advance(search_face_request, runtime_option)
        # 获取整体结果
        print(response.body)
        if 'MatchList' in response.body.to_map()['Data']:
            message = response.body.to_map()['Data']['MatchList']
            scores = []
            for match in message:
                for item in match.get('FaceItems', []):
                    score = item.get('Score')
                    if score is not None:  # 确保分数不为 None
                        scores.append(score)
            if scores:  # 确保至少有一个分数
                max_score = max(scores)
                value = round(max_score, 2)
                print(f"The max score = {value}")
                return value
                
            else:
                print("No scores found.")
                
        else:
            print("No matches found.")

    except Exception as error:
        # 获取整体报错信息
        print(error)
        # 获取单个字段
        print(error.code)
        # tips: 可通过error.__dict__查看属性名称

if __name__ == "__main__":
    alicloud_Search_Face()

#关闭流
#stream0.close()

一般比对成功的Python字典数据里的score会有大于0.6的值,而比对失败score普遍低于0.1。

例如下面是比对成功的数据:


orangepi@orangepizero2:~/smarthouse$ python3.10 face_test.py
{'Data': {'MatchList': [{'FaceItems': [{'Confidence': 85.15245, 'DbName': 'default', 'EntityId': 'liuyifei', 'FaceId': '150447260', 'Score': 0.814702570438385}, {'Confidence': 84.88723, 'DbName': 'default', 'EntityId': 'liuyifei', 'FaceId': '150447272', 'Score': 0.8113926649093628}, {'Confidence': 7.232084, 'DbName': 'default', 'EntityId': 'linfeng', 'FaceId': '150443939', 'Score': 0.041851237416267395}, {'Confidence': 4.7650957, 'DbName': 'default', 'EntityId': 'Pakho', 'FaceId': '150437504', 'Score': 0.027575060725212097}, {'Confidence': 0.0, 'DbName': 'default', 'EntityId': 'Zillion', 'FaceId': '156036363', 'Score': -0.005117176100611687}], 'Location': {'Height': 162, 'Width': 120, 'X': 220, 'Y': 205}, 'QualitieScore': 99.81394}]}, 'RequestId': '13B42F67-CDAF-5DEF-A3A4-B2ECFCB84679'}
The max score = 0.81

比对失败的数据则如下所示:


orangepi@orangepizero2:~/smarthouse$ python3.10 face_test.py
{'Data': {'MatchList': [{'FaceItems': [{'Confidence': 14.181928, 'DbName': 'default', 'EntityId': 'linfeng', 'FaceId': '150443939', 'Score': 0.08206918835639954}, {'Confidence': 9.166144, 'DbName': 'default', 'EntityId': 'linfeng', 'FaceId': '150443926', 'Score': 0.0530434250831604}, {'Confidence': 7.3621774, 'DbName': 'default', 'EntityId': 'liuyifei', 'FaceId': '150447272', 'Score': 0.042604073882102966}, {'Confidence': 4.4048343, 'DbName': 'default', 'EntityId': 'Pakho', 'FaceId': '150435069', 'Score': 0.02549027092754841}, {'Confidence': 3.6446795, 'DbName': 'default', 'EntityId': 'Pakho', 'FaceId': '150437504', 'Score': 0.021091341972351074}], 'Location': {'Height': 200, 'Width': 157, 'X': 97, 'Y': 134}, 'QualitieScore': 98.50028}, {'FaceItems': [{'Confidence': 5.9368124, 'DbName': 'default', 'EntityId': 'Zillion', 'FaceId': '156036363', 'Score': 0.03435565158724785}, {'Confidence': 4.0936313, 'DbName': 'default', 'EntityId': 'Pakho', 'FaceId': '150435069', 'Score': 0.023689374327659607}, {'Confidence': 2.6310804, 'DbName': 'default', 'EntityId': 'linfeng', 'FaceId': '150443939', 'Score': 0.015225759707391262}, {'Confidence': 2.4909613, 'DbName': 'default', 'EntityId': 'liuyifei', 'FaceId': '150447260', 'Score': 0.01441490650177002}, {'Confidence': 1.2927439, 'DbName': 'default', 'EntityId': 'linfeng', 'FaceId': '150443926', 'Score': 0.007480960339307785}], 'Location': {'Height': 119, 'Width': 135, 'X': 369, 'Y': 531}, 'QualitieScore': 51.177025}]}, 'RequestId': '62CA237A-CC70-5486-9909-22108C853CD1'}
The max score = 0.08

因此,就可以利用获取的最大score的值判断是否大于0.6来判断是否比对成功。

返回数据的说明:

Data:这是一个对象,其中包含了匹配列表的信息。
MatchList:这是一个数组,其中包含了匹配的结果。每个元素都是一个对象,代表一个匹配项。
FaceItems:这是一个数组,其中包含了匹配项中所有人脸的信息。每个元素都是一个对象,包含了一些关于该人脸的信息,如自信度(Confidence)、数据库名(DbName)、实体ID(EntityId)、面部ID(FaceId)和分数(Score)。
Location:这是一个对象,包含了人脸在原始图像中的位置信息,包括宽度(Width)、高度(Height)、左上角的x坐标(X)和y坐标(Y)。
QualitieScore:这是一个浮点数,表示了整个匹配过程的质量得分。

C语言调用阿里云人脸识别接口

face.c
#include <Python.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void face_Init(void)
{
    Py_Initialize();
    
    PyObject *sys = PyImport_ImportModule("sys");
    PyObject *path = PyObject_GetAttrString(sys, "path");
    PyList_Append(path, PyUnicode_FromString("."));
}

void face_Finalize(void)
{
    Py_Finalize();
}
  
double alicloud_Search_Face(void)
{
    PyObject *pModule = PyImport_ImportModule("face");
    if (!pModule)
    {
        PyErr_Print();
        printf("Error: failed to load face.py\n");
        goto FAILED_MODULE;
    }
    
    PyObject *pFunc = PyObject_GetAttrString(pModule, "alicloud_Search_Face");
    if (!pFunc)
    {
        PyErr_Print();
        printf("Error: failed to load alicloud_Search_Face\n");
        goto FAILED_FUNC;
    }
		
    PyObject *pValue = PyObject_CallObject(pFunc, NULL);
	if (!pValue)
    {
        PyErr_Print();
        printf("Error: function call failed\n");
        goto FAILED_VALUE;
    }
		
	double result = 0.00;
	if(!PyArg_Parse(pValue, "d", &result))
    {
        PyErr_Print();
        printf("Error: parse failed\n");
        goto FAILED_RESULT;
    }
    
    printf("result = %lf\n", result);
    
FAILED_RESULT:
    Py_DECREF(pValue);
FAILED_VALUE:
    Py_DECREF(pFunc);
FAILED_FUNC:
    Py_DECREF(pModule);
FAILED_MODULE:
    return result;
}
main.c
#include <stdio.h>
#include <stdlib.h>
#include "face.h"

int main()
{
    double face = 0.00;
    face_Init();
    face  = alicloud_Search_Face();
    printf("face = %f\n", face);
    face_Finalize();
    
    return 0;
}
face.py
# -*- coding: utf-8 -*-
# 引入依赖包
# pip install alibabacloud_facebody20191230

import os
import io
from urllib.request import urlopen
from alibabacloud_facebody20191230.client import Client
from alibabacloud_facebody20191230.models import SearchFaceAdvanceRequest
from alibabacloud_tea_openapi.models import Config
from alibabacloud_tea_util.models import RuntimeOptions

config = Config(
    # 创建AccessKey ID和AccessKey Secret,请参考https://help.aliyun.com/document_detail/175144.html。
    # 如果您用的是RAM用户的AccessKey,还需要为RAM用户授予权限AliyunVIAPIFullAccess,请参考https://help.aliyun.com/document_detail/145025.html。
    # 从环境变量读取配置的AccessKey ID和AccessKey Secret。运行代码示例前必须先配置环境变量。
    access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
    access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
    # 访问的域名
    endpoint='facebody.cn-shanghai.aliyuncs.com',
    # 访问的域名对应的region
    region_id='cn-shanghai'
)

search_face_request = SearchFaceAdvanceRequest()
#场景一:文件在本地
def alicloud_Search_Face():
    stream0 = open(r'/home/orangepi/smarthouse/liuyifei_test.jpg', 'rb')
    search_face_request.image_url_object = stream0

    #场景二:使用任意可访问的url
    #url = 'https://viapi-test-bj.oss-cn-beijing.aliyuncs.com/viapi-3.0domepic/facebody/SearchFace1.png'
    #img = urlopen(url).read()
    #search_face_request.image_url_object = io.BytesIO(img)
    search_face_request.db_name = 'default' #数据库默认名字db_name/DbName : default
    search_face_request.limit = 5

    runtime_option = RuntimeOptions()
    try:
        # 初始化Client
        client = Client(config)
        response = client.search_face_advance(search_face_request, runtime_option)
        # 获取整体结果
        print(response.body)
        if 'MatchList' in response.body.to_map()['Data']:
            message = response.body.to_map()['Data']['MatchList']
            scores = []
            for match in message:
                for item in match.get('FaceItems', []):
                    score = item.get('Score')
                    if score is not None:  # 确保分数不为 None
                        scores.append(score)
            if scores:  # 确保至少有一个分数
                max_score = max(scores)
                value = round(max_score, 2)
                print(f"The max score = {value}")
                return value
                
            else:
                print("No scores found.")
                
        else:
            print("No matches found.")

    except Exception as error:
        # 获取整体报错信息
        print(error)
        # 获取单个字段
        print(error.code)
        # tips: 可通过error.__dict__查看属性名称

if __name__ == "__main__":
    alicloud_Search_Face()

#关闭流
#stream0.close()

智能家居项目的软件实现

软件框架
语音监听线程
消息队列
网络监听线程
火灾监测线程
消息接收处理线程
GPIO引脚状态配置
OLED对指令状态的实时显示
语音播报线程
人脸识别
开关卧室灯
开关客厅灯
开关风扇
开门

整个项目开启4个监听线程, 分别是:

  1. 语音监听线程:用于监听语音指令, 当有语音指令过来后, 通过消息队列的方式给消息处理线程发 送指令。
  2. 网络监听线程:用于监听网络指令,当有网络指令过来后, 通过消息队列的方式给消息处理线程发 送指令。
  3. 火灾检测线程:当存在煤气泄漏或者火灾闲情时, 发送警报指令给消息处理线程。
  4. 消息监听线程: 用于处理以上3个线程发过来的指令,并根据指令要求配置GPIO引脚状态,OLED 屏显示、语音播报,还有人脸识别开门。

上述四个线程采用统一个对外接口接口,同时添加到监听链表中。

代码实现

之前讲过智能分类的项目,因为会用到语音模块、OLED显示、网络模块、这些代码都可以从智能分类的 项目中直接拷贝过来使用,另外添加之前准备好的人脸识别的代码 。 另外根据软件框架。再定义gdevice.h和control.h的头文件。

control.h
#ifndef _CONTROL_H_
#define _CONTROL_H_

#include <stdlib.h>
#include <stdio.h>

struct control
{
	char control_name[128]; //监听模块名称 
	int (*init)(void); //初始化函数
	void (*final)(void);//结束释放函数
	void *(*get)(void *arg);//监听函数,如语音监听
	void *(*set)(void *arg); //设置函数,如语音播报
	struct control *next;
};

struct control *add_control_to_ctrl_list(struct control *phead, struct control *device);

#endif
control.c
#include "control.h"

struct control *add_control_to_ctrl_list(struct control *phead, struct control *ctrl_interface)
{
//    struct control *p = phead;

    if (phead == NULL)
    {
        phead = ctrl_interface;

        printf("%s|%s|%d:\n", __FILE__, __FUNCTION__, __LINE__);

        return phead;
    }
    else
    {
        ctrl_interface->next = phead;
        phead = ctrl_interface;

        printf("%s|%s|%d:\n", __FILE__, __FUNCTION__, __LINE__);

        return phead;
    }
    
    return phead;
}
device.h
#ifndef _DEVICE_H_
#define _DEVICE_H_

#include <stdio.h>
#include <stdlib.h>
#include <wiringPi.h>

struct gdevice
{
	char dev_name[128]; //设备名称
	int key; //key值,用于匹配控制指令的值
	int gpio_pin; //控制的gpio引脚
	int gpio_mode; //输入输出模式
	int gpio_status; //高低电平状态
	int check_face_status; //是否进行人脸检测状态
	int voice_set_status; //是否语音语音播报
	struct gdevice *next;
};

struct gdevice *add_device_to_gdevice_list(struct gdevice *phead, struct gdevice *device);

struct gdevice *find_gdevice_by_key(struct gdevice *pdev, unsigned char key);

int set_gpio_gdevice_status(struct gdevice *pdev);

#endif
device.c
#include "device.h"

struct gdevice *add_device_to_gdevice_list(struct gdevice *phead, struct gdevice *device)
{
	struct gdevice *p = phead;
    printf("%s|%s|%d:%p\n", __FILE__, __FUNCTION__, __LINE__, p);

    if(p == NULL)
    {
        phead = device;
        
        printf("%s|%s|%d:\n", __FILE__, __FUNCTION__, __LINE__);

        return phead;
    }
    else
    {
        device->next = phead;
        phead = device;

        printf("%s|%s|%d:\n", __FILE__, __FUNCTION__, __LINE__);

        return phead;
    }

    return phead;
}

struct gdevice *find_gdevice_by_key(struct gdevice *pdev, unsigned char key)
{
    struct gdevice *p = pdev;
    printf("%s|%s|%d:\n", __FILE__, __FUNCTION__, __LINE__);

    if(p == NULL)
    {
        printf("%s|%s|%d:\n", __FILE__, __FUNCTION__, __LINE__);
        return NULL;
    }

    while(p != NULL)
    {
        if(p->key == key)
        {
            printf("%s|%s|%d:\n", __FILE__, __FUNCTION__, __LINE__);
            return p;
        }

        p = p->next;

        if(p == NULL)
        {
            p = pdev;
        }
    }

    return NULL;
}

#if 0

struct gdevice
{
	char dev_name[128]; //设备名称
	int key; //key值,用于匹配控制指令的值
	int gpio_pin; //控制的gpio引脚
	int gpio_mode; //输入输出模式
	int gpio_status; //高低电平状态
	int check_face_status; //是否进行人脸检测状态
	int voice_set_status; //是否语音语音播报
	struct gdevice *next;
};

#endif

int set_gpio_gdevice_status(struct gdevice *pdev)
{
//    printf("\033[41;30m%s|%s|%d:pdev->gpio_status = %d\033[0m\n", __FILE__, __FUNCTION__, __LINE__, pdev->gpio_status);
    if (pdev != NULL)
    {
        printf("%s|%s|%d:pdev->gpio_status = %d\n", __FILE__, __FUNCTION__, __LINE__, pdev->gpio_status);
        if (pdev->gpio_pin != -1)
        {
            pinMode(pdev->gpio_pin, pdev->gpio_mode);
            printf("\033[45;30m%s|%s|%d:gpio_pin = %d, gpio_mode = %d\033[0m\n", __FILE__, __FUNCTION__, __LINE__, pdev->gpio_pin, pdev->gpio_mode);
        }

        if(pdev->gpio_status != -1)
        {
            digitalWrite(pdev->gpio_pin, pdev->gpio_status);
            printf("%s|%s|%d:pdev->gpio_status = %d\n", __FILE__, __FUNCTION__, __LINE__, pdev->gpio_status);
        }

        return 0;
    }
    else
    {
//        printf("%s|%s|%d: \033[41;36m something here \033[0m\n", __FILE__, __FUNCTION__, __LINE__);
        return -1;
    }
}
剩余工程代码放在Github上

因为 .c 文件已经多达17个了,虽然是CV但是也很麻烦,干脆直接把整个工程放在 Github 上了。

https://github.com/Zillion6/orangePi_smart_house.git

git clone https://github.com/Zillion6/orangePi_smart_house.git

内置有两个版本的智能家居项目,一个是仅用结构体配置链表,另一个则是用 .inih 轻量级的C库构成链表。

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

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

相关文章

5.在Nginx中管理目录并允许浏览器中浏览和下载目录的文件

nginx.conf文件配置 charset utf-8; 防止文件名称为乱码。 autoindex on; 开启目录列表展示。 root /usr/local/software; 文件管理目录&#xff0c;浏览器浏览文件所在目录。

【C++进阶】RBTree封装map与set

1.红黑树的迭代器 1.1 begin() begin()就是红黑树的开头&#xff0c;那么对于红黑树来说按照中序序列是该树的最左节点。 Iterator Begin(){Node* leftMin _root;while (leftMin->_left){leftMin leftMin->_left;}return Iterator(leftMin);} 1.2 end() begin()就是…

阅文集团CEO侯晓楠:建立10亿生态扶持基金,为好内容搭建舞台

6月12日&#xff0c;由安徽省文化和旅游厅、安徽省文学艺术界联合会、黄山市人民政府指导&#xff0c;阅文集团、黄山旅游发展股份有限公司主办的2024阅文创作大会在黄山召开。 据「TMT星球」了解&#xff0c;大会总结了过去一年阅文在“AIIP”业务升级思路下创作生态和IP领域…

写给大数据开发:好的指标定义、特性与业务价值

在大数据时代&#xff0c;数据的质量对于业务决策和数据分析至关重要。好的数据不仅丰富&#xff0c;而且准确、及时&#xff0c;为业务提供有力支撑。 文章目录 数据定义与特性数据对业务的价值指标展示与规范化定义一些指标的定义好的数据是业务成功的关键 数据定义与特性 好…

pycharm终端pip安装模块成功但还是显示找不到 ModuleNotFoundError: No module named

报错信息&#xff1a; ModuleNotFoundError: No module named 但是分明已经安装过此模块&#xff1a; 在cmd运行pip list 查看所有安装过的包找到了安装过&#xff1a; 如果重新安装就是这样&#xff1a;显示已经存在了 问题排查&#xff1a; 直接根据重新安装的显示已存在的…

什么是APS计划排程? 企业产能与效率提升的智能引擎

快节奏和愈发激烈的现代工业环境中&#xff0c;如何提升生产效率、降低生产成本、最大化的满足订单交期、实现企业的降本增效&#xff0c;已成为众多企业关注的焦点。而APS系统——作为高级生产计划和调度系统的代表&#xff0c;正以其卓越的生产过程实时监控、产品加工过程优化…

初级网络工程师之从入门到入狱(三)

本文是我在学习过程中记录学习的点点滴滴&#xff0c;目的是为了学完之后巩固一下顺便也和大家分享一下&#xff0c;日后忘记了也可以方便快速的复习。 中小型网络系统综合实战实验 前言一、详细拓扑图二、LSW2交换机三、LSW3交换机四、LSW1三层交换机4.1、4.2、4.3、4.4、4.5、…

【电子通识】为何焊接时要使用助焊剂?常用的助焊剂类型有哪些?

在工作中&#xff0c;我们会接触到板卡的焊接&#xff0c;会使用到助焊剂&#xff0c;如常常使用的就有松香。如下所示为焊接芯片时使用的拖焊&#xff0c;如果没有助焊剂&#xff0c;很有可能导致管脚连锡或有毛刺等现象出现。 那么助焊剂是什么&#xff1f;为什么它对焊接项目…

深度学习模型调试的9个方法

第一个计算机漏洞实际上是一个 bug。1947 年&#xff0c;一只飞蛾飞进哈佛大学的一台计算机&#xff0c;导致计算中断。当工程师打开计算机机箱时&#xff0c;他们很快就发现了导致问题的 bug。如今&#xff0c;bug 不太可能爬进我们的计算机并破坏计算流程。但是&#xff0c;原…

RedHat9 | 防火墙配置与管理

RedHat9中默认安装Firewalld&#xff0c;也可安装iptables。但是两者不可同时运行。 软件或程序主要作用firewalld、iptables策略限制MAC、IP、PORT、ARPSELinux上下文、布尔值、端口软件权限读写执行权限文件系统rwx、隐藏权限、ACL 1、Netfilter 包过滤防火墙工作在TCP/IP的…

【Java】JDBC+Servlet+JSP实现搜索数据和页面数据呈现

目录 1 .功能介绍 2. 实现流程 3. 项目环境 4. 相关代码 4.1 Maven配置 4.2 SQL语句 4.3 Java代码 4.4 HTML代码 4.5 JSP代码 5. 结果展示 &#xff08;原创文章&#xff0c;转载请注明出处&#xff09; 博主是计算机专业大学生&#xff0c;不定期更新原创优质文章&…

服务架构的设计原则

墨菲定律与康威定律 在系统设计的时候&#xff0c;可以依据于墨菲定律 任何事情都没有表面上看起来那么简单所有的事情都会比你预计的时间长可能出错的事总会出错担心的某一个事情的发送&#xff0c;那么它就更有可能发生 在系统划分的时候&#xff0c;可以依据康威定律 系…

0604 集成电路运算放大器

6.4.1 集成电路运算放大器CMOS MC14573 6.4.2 集成运算放大器741

搭建社区团购系统,广泛应用便捷高效新体验

前言 在数字化浪潮的推动下&#xff0c;社区团购系统如雨后春笋般崭露头角&#xff0c;为小区居民们带来了前所未有的便捷与实惠。如今&#xff0c;搭建社区团购系统已成为一种新趋势&#xff0c;其广泛应用正逐渐改变着人们的购物方式&#xff0c;让便捷高效的新体验深入人心…

ADS基础教程19 - 电磁仿真(EM)基本概念和实操

EM介绍 一、引言二、基本概念1.EM介绍2.Momentum介绍3.FEM介绍4.Substrate介绍 三、创建Layout并进行Momentum仿真1.创建Layout2.添加Microtrip&#xff08;微带线&#xff09;3.添加Substrate4.Momentum仿真 四、总结 一、引言 本章节开始介绍EM的基本概念、内容以及实现具体…

简单脉冲动画效果实现

简单脉冲动画效果实现 效果展示 CSS 知识点 CSS 变量的灵活使用CSS 动画使用 页面整体结构实现 <div class"pulse"><span style"--i: 1"></span><span style"--i: 2"></span><span style"--i: 3"…

IntelliJ IDEA 2024.1最新安装 亲测有效2099年

标题一&#xff1a;IDEA官方下载 ①如题&#xff0c;先到IDEA官方下载&#xff0c;简简单单 ②IDEA官方&#xff1a;IntelliJ IDEA – the Leading Java and Kotlin IDE 标题二&#xff1a;获取脚本 点这里获取 &#x1f31f;获取完后压缩&#xff0c;推荐与IDEA放在同一目…

Spring框架是如何查找方法上的异步任务注解@Async

结论先行 Spring框架层面&#xff0c;查找方法上的注解的原理与机制是一样的。 在方法层面&#xff0c;Spring框架已经找到子类的Async注解&#xff0c;原因是查找注解会搜索整棵类型继承树&#xff0c;包括超类和实现的接口。 异步任务代码示例 Async注解&#xff0c;在父类…

⌈ 传知代码 ⌋ ERA-CoT: 实体关系推理

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

48【Aseprite 作图】荷塘月色——拆解

1 荷叶&#xff0c;不要完全对称&#xff0c;下面是深色的&#xff0c;上面是浅色的&#xff0c;加一点高光 2 鱼的轮廓 上色彩&#xff0c;主要用三种颜色&#xff0c;修改透明度&#xff0c;叠加颜色