当前位置: 首页 > news >正文

计算机竞赛 机器视觉 opencv 深度学习 驾驶人脸疲劳检测系统 -python

文章目录

  • 0 前言
  • 1 课题背景
  • 2 Dlib人脸识别
    • 2.1 简介
    • 2.2 Dlib优点
    • 2.3 相关代码
    • 2.4 人脸数据库
    • 2.5 人脸录入加识别效果
  • 3 疲劳检测算法
    • 3.1 眼睛检测算法
    • 3.2 打哈欠检测算法
    • 3.3 点头检测算法
  • 4 PyQt5
    • 4.1 简介
    • 4.2相关界面代码
  • 5 最后

0 前言

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

🚩 机器视觉 opencv 深度学习 驾驶人脸疲劳检测系统

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

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

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

🧿 更多资料, 项目分享:

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

1 课题背景

为了有效监测驾驶员是否疲劳驾驶、避免交通事故的发⽣,本项目利⽤⼈脸特征点进⾏实时疲劳驾驶检测的新⽅法。对驾驶员驾驶时的⾯部图像进⾏实时监控,⾸先检测⼈脸,并利⽤ERT算法定位⼈脸特征点;然后根据⼈脸眼睛区域的特征点坐标信息计算眼睛纵横⽐EAR来描述眼睛张开程度,根据合适的EAR阈值可判断睁眼或闭眼状态;最后基于EAR实测值和EAR阈值对监控视频计算闭眼时间⽐例(PERCLOS)值度量驾驶员主观疲劳程度,将其与设定的疲劳度阈值进⾏⽐较即可判定是否疲劳驾驶。

2 Dlib人脸识别

2.1 简介

Dlib是一个基于c++开发的开源数据工具库,其中包含了不少的机器学习的成熟算法与模型,相对于tensorflow和PyTorch,它用于图像处理以及人脸面部特征提取、分类及对比这几个方面比较具有通用性和优越性,因此,Dlib正在越来越广泛地应用在人脸识别技术领域。
Dlib具有独立使用的可移植代码。Dlib中的代码使用c++语言进行开发而成,使用独立封装,在不借助第三方数据库的情况下,可以直接移植到自己所需要设计的项目中进行使用。

2.2 Dlib优点

  • Dlib拥有全面的文档说明。作为一个开源的人脸数据库训练集,Dlib中有很多功能齐全的程序和文件,从人性化的角度而言的,Dlib在这一点上做的是非常不错的,因为它为每一个程序文档和文件都做了相对应的注释,这样开发者就可以迅速准确的调集程序文档来完成自己所需要的项目功能。

  • Dlib涵盖了支持功能完备的深度学习以及图像处理的各类算法。Dlib为开发者提供了机器深度学习的各类成熟的完备算法,并且在图像处理方面也为开发者带来了能够解决大多数实质问题的优良算法。例如基于SVM的递归和分类算法,以及专门用于面对大规模分类和递归的降维算法。当然还有能够对未知函数进行预分类和预测的相关向量机,其分类和预测训练是基于贝叶斯框架。

2.3 相关代码


import matplotlib.pyplot as plt
import dlib
import numpy as np
import glob
import re

#正脸检测器
detector``=``dlib.get_frontal_face_detector()
#脸部关键形态检测器
sp``=``dlib.shape_predictor(r``"D:LBJAVAscriptshape_predictor_68_face_landmarks.dat"``)
#人脸识别模型
facerec ``=` `dlib.face_recognition_model_v1(r``"D:LBJAVAscriptdlib_face_recognition_resnet_model_v1.dat"``)#候选人脸部描述向量集
descriptors``=``[]photo_locations``=``[]for` `photo ``in` `glob.glob(r``'D:LBJAVAscriptfaces*.jpg'``):``photo_locations.append(photo)``img``=``plt.imread(photo)``img``=``np.array(img)``#开始检测人脸``dets``=``detector(img,``1``)``for` `k,d ``in` `enumerate``(dets):``#检测每张照片中人脸的特征``shape``=``sp(img,d)``face_descriptor``=``facerec.compute_face_descriptor(img,shape)``v``=``np.array(face_descriptor)``descriptors.append(v)#输入的待识别的人脸处理方法相同
img``=``plt.imread(r``'D:test_photo10.jpg'``)
img``=``np.array(img)
dets``=``detector(img,``1``)
#计算输入人脸和已有人脸之间的差异程度(比如用欧式距离来衡量)
differences``=``[]
for` `k,d ``in` `enumerate``(dets):``shape``=``sp(img,d)``face_descriptor``=``facerec.compute_face_descriptor(img,shape)``d_test``=``np.array(face_descriptor)``#计算输入人脸和所有已有人脸描述向量的欧氏距离``for` `i ``in` `descriptors:``distance``=``np.linalg.norm(i``-``d_test)``differences.append(distance)#按欧式距离排序 欧式距离最小的就是匹配的人脸
candidate_count``=``len``(photo_locations)
candidates_dict``=``dict``(``zip``(photo_locations,differences))
candidates_dict_sorted``=``sorted``(candidates_dict.items(),key``=``lambda` `x:x[``1``])#matplotlib要正确显示中文需要设置
plt.rcParams[``'font.family'``] ``=` `[``'sans-serif'``]
plt.rcParams[``'font.sans-serif'``] ``=` `[``'SimHei'``]plt.rcParams[``'figure.figsize'``] ``=` `(``20.0``, ``70.0``)ax``=``plt.subplot(candidate_count``+``1``,``4``,``1``)
ax.set_title(``"输入的人脸"``)
ax.imshow(img)for` `i,(photo,distance) ``in` `enumerate``(candidates_dict_sorted):``img``=``plt.imread(photo)``face_name``=``""``photo_name``=``re.search(r``'([^\]*).jpg$'``,photo)``if` `photo_name:``face_name``=``photo_name[``1``]``ax``=``plt.subplot(candidate_count``+``1``,``4``,i``+``2``)``ax.set_xticks([])``ax.set_yticks([])``ax.spines[``'top'``].set_visible(``False``)``ax.spines[``'right'``].set_visible(``False``)``ax.spines[``'bottom'``].set_visible(``False``)``ax.spines[``'left'``].set_visible(``False``)``if` `i``=``=``0``:``ax.set_title(``"最匹配的人脸nn"``+``face_name``+``"nn差异度:"``+``str``(distance))``else``:``ax.set_title(face_name``+``"nn差异度:"``+``str``(distance))``ax.imshow(img)plt.show()

2.4 人脸数据库

本项目中将识别到的人脸保存的.db文件中,相关代码如下:

class CoreUI(QMainWindow):database = './FaceBase.db'trainingData = './recognizer/trainingData.yml'cap = cv2.VideoCapture()captureQueue = queue.Queue()  # 图像队列alarmQueue = queue.LifoQueue()  # 报警队列,后进先出logQueue = multiprocessing.Queue()  # 日志队列receiveLogSignal = pyqtSignal(str)  # LOG信号def __init__(self):super(CoreUI, self).__init__()loadUi('./ui/Core.ui', self)self.setWindowIcon(QIcon('./icons/icon.png'))#self.setFixedSize(1161, 620)'''self.pushButton = QPushButton('rush', self)layout = QVBoxLayout()layout.addWidget(self.pushButton)self.setLayout(layout)'''#self.pushButton.clicked.connect(self.open)=# 图像捕获self.isExternalCameraUsed = Falseself.useExternalCameraCheckBox.stateChanged.connect(lambda: self.useExternalCamera(self.useExternalCameraCheckBox))self.faceProcessingThread = FaceProcessingThread()self.startWebcamButton.clicked.connect(self.startWebcam)#A\B功能开关# 数据库self.initDbButton.setIcon(QIcon('./icons/warning.png'))self.initDbButton.clicked.connect(self.initDb)self.timer = QTimer(self)  # 初始化一个定时器self.timer.timeout.connect(self.updateFrame)

2.5 人脸录入加识别效果

录入过程
在这里插入图片描述

识别效果
在这里插入图片描述

3 疲劳检测算法

该系统采用Dlib库中人脸68个关键点检测shape_predictor_68_face_landmarks.dat的dat模型库及视频中的人脸,之后返回人脸特征点坐标、人脸框及人脸角度等。本系统利用这68个关键点对驾驶员的疲劳状态进行检测,算法如下:

  1. 初始化Dlib的人脸检测器(HOG),然后创建面部标志物预测;
  2. 使用dlib.get_frontal_face_detector() 获得脸部位置检测器;
  3. 使用dlib.shape_predictor获得脸部特征位置检测器;
  4. 分别获取左、右眼面部标志的索引;
  5. 打开cv2本地摄像头。

Dlib库68个特征点模型如图所示:
在这里插入图片描述

3.1 眼睛检测算法

基于EAR算法的眨眼检测,当人眼睁开时,EAR在某个值域范围内波动,当人眼闭合时,EAR迅速下降,理论上接近于0。当EAR低于某个阈值时,眼睛处于闭合状态;当EAR由某个值迅速下降至小于该阈值,再迅速上升至大于该阈值,则判断为一次眨眼。为检测眨眼次数,需要设置同一次眨眼的连续帧数。眨眼速度较快,一般1~3帧即可完成眨眼动作。眼部特征点如图:

在这里插入图片描述

EAR计算公式如下:
在这里插入图片描述
当后帧眼睛宽高比与前一帧差值的绝对值(EAR)大于0.2时,认为驾驶员在疲劳驾驶。(68点landmark中可以看到37-42为左眼,43-48为右眼)
在这里插入图片描述
右眼开合度可以通过以下公式:
在这里插入图片描述
眼睛睁开度从大到小为进入闭眼期,从小到大为进入睁眼期,计算最长闭眼时间(可用帧数来代替)。闭眼次数为进入闭眼、进入睁眼的次数。通过设定单位时间内闭眼次数、闭眼时间的阈值判断人是否已经疲劳了。

相关代码:


# 疲劳检测,检测眼睛和嘴巴的开合程度

from scipy.spatial import distance as dist
from imutils.video import FileVideoStream
from imutils.video import VideoStream
from imutils import face_utils
import numpy as np  # 数据处理的库 numpy
import argparse
import imutils
import time
import dlib
import cv2
import math
import time
from threading import Threaddef eye_aspect_ratio(eye):# 垂直眼标志(X,Y)坐标A = dist.euclidean(eye[1], eye[5])  # 计算两个集合之间的欧式距离B = dist.euclidean(eye[2], eye[4])# 计算水平之间的欧几里得距离# 水平眼标志(X,Y)坐标C = dist.euclidean(eye[0], eye[3])# 眼睛长宽比的计算ear = (A + B) / (2.0 * C)# 返回眼睛的长宽比return ear

3.2 打哈欠检测算法

基于MAR算法的哈欠检测,利用Dlib提取嘴部的6个特征点,通过这6个特征点的坐标(51、59、53、57的纵坐标和49、55的横坐标)来计算打哈欠时嘴巴的张开程度。当一个人说话时,点51、59、53、57的纵坐标差值增大,从而使MAR值迅速增大,反之,当一个人闭上嘴巴时,MAR值迅速减小。

嘴部主要取六个参考点,如下图:
在这里插入图片描述
计算公式:
在这里插入图片描述
通过公式计算MAR来判断是否张嘴及张嘴时间,从而确定驾驶员是否在打哈欠。阈值应经过大量实验,能够与正常说话或哼歌区分开来。为提高判断的准确度,采用双阈值法进行哈欠检测,即对内轮廓进行检测:结合张口度与张口时间进行判断。Yawn为打哈欠的帧数,N为1
min内总帧数,设双阈值法哈欠检测的阈值为10%,当打哈欠频率Freq>10%时,则认为驾驶员打了1个深度哈欠或者至少连续2个浅哈欠,此时系统进行疲劳提醒。

相关代码:


# 疲劳检测,检测眼睛和嘴巴的开合程度

from scipy.spatial import distance as dist
from imutils.video import FileVideoStream
from imutils.video import VideoStream
from imutils import face_utils
import numpy as np  # 数据处理的库 numpy
import argparse
import imutils
import time
import dlib
import cv2
import math
import time
from threading import Threaddef mouth_aspect_ratio(mouth):  # 嘴部A = np.linalg.norm(mouth[2] - mouth[10])  # 51, 59B = np.linalg.norm(mouth[4] - mouth[8])  # 53, 57C = np.linalg.norm(mouth[0] - mouth[6])  # 49, 55mar = (A + B) / (2.0 * C)return mar

相应的演示效果如下:

在这里插入图片描述

3.3 点头检测算法

基于HPE算法的点头检测

HPE(Head Pose
Estimation,HPE)算法步骤:2D人脸关键点检测,3D人脸模型匹配,求解3D点和对应2D点的转换关系,根据旋转矩阵求解欧拉角。检测过程中需要使用世界坐标系(UVW)、相机坐标系(XYZ)、图像中心坐标系(uv)和像素坐标系(xy)。一个物体相对于相机的姿态可以使用旋转矩阵和平移矩阵来表示。

  • 平移矩阵:物体相对于相机的空间位置关系矩阵,用T表示;
  • 旋转矩阵:物体相对于相机的空间姿态关系矩阵,用R表示。

因此必然少不了坐标系转换。如图所示:
在这里插入图片描述
于是世界坐标系(UVW)、相机坐标系(XYZ)、图像中心坐标系(uv)和像素坐标系(xy)四兄弟闪亮登场。相对关系如下:
世界坐标系转换到相机坐标:
在这里插入图片描述
相机坐标系转换到像素坐标系:
在这里插入图片描述
像素坐标系与世界坐标系的关系为:
在这里插入图片描述
图像中心坐标系转换到像素坐标系:
在这里插入图片描述
得到旋转矩阵后,求欧拉角:
在这里插入图片描述
设定参数阈值为0.3,在一个时间段,如10
s内,当低头欧拉角|Pitch|≥20°或者头部倾斜欧拉角|Roll|≥20°的时间比例超过0.3时,则认为驾驶员处于瞌睡状态,发出预警。
在这里插入图片描述
相关效果展示:
在这里插入图片描述

4 PyQt5

4.1 简介

Qt是一个跨平台的 C++ 开发库,主要用来开发图形用户界面程序(GUI),当然也可以开发不带界面的命令行程序。
但Qt 是纯 C++ 开发的,PyQt5是基于图形程序框架Qt5的Python语言实现,由一组Python模块构成。

  • QLabel控件:用来显示文本或图像。

  • QLineEdit窗口控件:提供了一个单页面的单行文本编辑器。

  • QTextEdit窗口控件:提供了一个单页面的多行文本编辑器。

  • QPushButton窗口控件:提供了一个命令按钮。

  • QRadioButton控件:提供了一个单选钮和一个文本或像素映射标签。

  • QCheckBox窗口控件:提供了一个带文本标签的复选框。

  • QspinBox控件:允许用户选择一个值,要么通过按向上/向下键增加/减少当前显示值,要么直接将值输入到输入框中。

  • QScrollBar窗口控件:提供了一个水平的或垂直的滚动条。

  • QSlider控件:提供了一个垂直的或水平的滑动条。

  • QComboBox控件:一个组合按钮,用于弹出列表。

  • QMenuBar控件:提供了一个横向菜单栏。

  • QStatusBar控件:提供了一个适合呈现状态信息的水平条,通常放在QMainWindow的底部。

  • QToolBar控件:提供了一个工具栏,可以包含多个命令按钮,通常放在QMainWindow的顶部。

  • QListView控件:可以显示和控制可选的多选列表,可以设置ListMode或IconMode。

  • QPixmap控件:可以在绘图设备上显示图像,通常放在QLabel或QPushButton类中。

  • Qdialog控件:对话框窗口的基类。

  • QWidget是所有用户界面类的基类,它能接收所有的鼠标、键盘和其他系统窗口事件。没有被嵌入到父窗口中的Widget会被当作一个窗口来调用,当然,它也可以使用setWindowFlags(Qt.WindowFlags)函数来设置窗口的显示效果。QWidget的构造函数可以接收两个参数,其中第一个参数是该窗口的父窗口;第二个参数是该窗口的Flag,也就是- Qt.WindowFlags。根据父窗口来决定Widget是嵌入到父窗口中还是被当作一个独立的窗口来调用,根据Flag来设置Widget窗口的一些属性。

  • QMainWindow(主窗口)一般是应用程序的框架,在主窗口中可以添加所需要的Widget,比如添加菜单栏、工具栏、状态栏等。主窗口通常用于提供一个大的中央窗口控件(如文本编辑或者绘制画布)以及周围的菜单栏、工具栏和状态栏。QMainWindow常常被继承,这使得封装中央控件、菜单栏,工具栏以及窗口状态变得更容易,也可以使用Qt Designer来创建主窗口。

4.2相关界面代码

#部分代码
from PyQt5.QtCore import QTimer, QThread, pyqtSignal, QRegExp, Qt
from PyQt5.QtGui import QImage, QPixmap, QIcon, QTextCursor, QRegExpValidator,QPainter
from PyQt5.QtWidgets import *
from PyQt5.uic import loadUi
from ui.untitled import Ui_Form
from core2 import CoreUI
from dataRecord import DataRecordUI
from dataManage import DataManageUIfrom ui.pic import Ui_Form1
from PyQt5 import QtCore
import sys
import os
from PyQt5 import QtGui
from PyQt5 import QtCore
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
class Main(CoreUI,QMainWindow):def __init__(self):super(Main, self).__init__()qssStyle = open(os.path.join('sip/123.qss')).read()self.setStyleSheet(qssStyle)self.setWindowFlag(QtCore.Qt.FramelessWindowHint)#设置无边框  但是按键得重新设置了#self.startWebcamButton()self.startWebcamButton.setStyleSheet("startWebcamButton{color:black}""startWebcamButton:hover{color:red}""startWebcamButton{background-color:rgb(180,180,180)}""startWebcamButton{border:2px}""startWebcamButton{border-radius:10px}""startWebcamButton{padding:2px 4px}""startWebcamButton{font-size:14pt}")self.pushButton.setStyleSheet("#pushButton {color:rgb(255,255,255);border-image:url(sip/anniu.png);text-aligh:left;font-size:18px;font-weight:bold;};")self.pushButton_2.setStyleSheet("#pushButton_2 {color:rgb(255,255,255);border-image:url(sip/anniu.png);text-aligh:left;font-size:18px;font-weight:bold;};")self.pushButton_3.setStyleSheet("#pushButton_3 {color:rgb(255,255,255);border-image:url(sip/anniu.png);text-aligh:left;font-size:18px;font-weight:bold;};")self.pushButton_4.setStyleSheet("#pushButton_4 {color:rgb(255,255,255);border-image:url(sip/anniu.png);text-aligh:left;font-size:18px;font-weight:bold;};")#self.setStyleSheet("color:white")#颜色全变self.pushButton_4.clicked.connect(QCoreApplication.instance().quit)def closewin(self):self.close()def mouseMoveEvent(self, e: QMouseEvent):  # 重写移动事件self._endPos = e.pos() - self._startPosself.move(self.pos() + self._endPos)def mousePressEvent(self, e: QMouseEvent):if e.button() == Qt.LeftButton:self._isTracking = Trueself._startPos = QPoint(e.x(), e.y())def mouseReleaseEvent(self, e: QMouseEvent):if e.button() == Qt.LeftButton:self._isTracking = Falseself._startPos = Noneself._endPos = Nonedef paintEvent(self, a0: QtGui.QPaintEvent) -> None:painter = QPainter(self)pixmap = QPixmap("sip/5.jfif")painter.drawPixmap(self.rect(), pixmap)#self.setupUi(self)'''def open(self):path = r"sip/new"QDesktopServices.openUrl(QUrl.fromLocalFile(path))'''
class Child(DataRecordUI,QMainWindow):def __init__(self):super(Child, self).__init__()self.setWindowFlag(QtCore.Qt.FramelessWindowHint)qssStyle = open(os.path.join('sip/123.qss')).read()self.setStyleSheet(qssStyle)#self.setupUi(self)def OPEN(self):self.show()def closewin(self):self.close()def returnmain(self):self.pushButton.clicked.connect(main.show)self.pushButton.clicked.connect(ch.hide)def paintEvent(self, a0: QtGui.QPaintEvent) -> None:painter = QPainter(self)pixmap = QPixmap("sip/5.jfif")painter.drawPixmap(self.rect(), pixmap)class Child1(DataManageUI,QMainWindow):def __init__(self):super(Child1,self).__init__()self.setWindowFlag(QtCore.Qt.FramelessWindowHint)qssStyle = open(os.path.join('sip/123.qss')).read()self.setStyleSheet(qssStyle)def OPEN(self):self.show()def closewin(self):self.close()def returnmain(self):self.pushButton.clicked.connect(main.show)self.pushButton.clicked.connect(ch1.hide)def paintEvent(self, a0: QtGui.QPaintEvent) -> None:painter = QPainter(self)pixmap = QPixmap("sip/5.jfif")painter.drawPixmap(self.rect(), pixmap)class help(Ui_Form,QWidget):def __init__(self):super(help,self).__init__()self.setWindowFlag(QtCore.Qt.FramelessWindowHint)self.setupUi(self)qssStyle = open(os.path.join('sip/123.qss')).read()self.setStyleSheet(qssStyle)'''qssStyle1 = open(os.path.join('sip/123.qss')).read()self.setStyleSheet(qssStyle1)'''def OPEN(self):self.show()def returnmain(self):self.pushButton.clicked.connect(main.show)self.pushButton.clicked.connect(Help.hide)def paintEvent(self, a0: QtGui.QPaintEvent) -> None:painter = QPainter(self)pixmap = QPixmap("sip/5.jfif")painter.drawPixmap(self.rect(), pixmap)class add(Ui_Form1,QWidget):def __init__(self):super(add,self).__init__()#self.setWindowFlag(QtCore.Qt.FramelessWindowHint)self.setupUi(self)self.setWindowFlag(QtCore.Qt.FramelessWindowHint)qssStyle = open(os.path.join('sip/123.qss')).read()self.setStyleSheet(qssStyle)#qssStyle = open(os.path.join('123.qss')).read()self.pushButton.clicked.connect(self.close)#self.setStyleSheet(qssStyle)def OPEN(self):self.show()def paintEvent(self, a0: QtGui.QPaintEvent) -> None:painter = QPainter(self)pixmap = QPixmap("./sip/5.jfif")painter.drawPixmap(self.rect(), pixmap)if __name__ =="__main__":#QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)app = QApplication(sys.argv)main = Main()ch = Child()ch1 = Child1()Help = help()ADD=add()main.show()#main.setStyleSheet("{border-image:url(sip/background.jpg)}")main.pushButton.clicked.connect(main.hide)main.pushButton.clicked.connect(ch.OPEN)main.pushButton_2.clicked.connect(main.hide)main.pushButton_2.clicked.connect(ch1.OPEN)main.pushButton_3.clicked.connect(main.hide)main.pushButton_3.clicked.connect(Help.OPEN)main.pushButton_11.clicked.connect(ADD.OPEN)ch.pushButton.clicked.connect(ch.returnmain)ch1.pushButton.clicked.connect(ch1.returnmain)Help.pushButton.clicked.connect(Help.returnmain)#ADD.pushButton.clicked.connect(ADD.close)sys.exit(app.exec_())

5 最后

🧿 更多资料, 项目分享:

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

相关文章:

计算机竞赛 机器视觉 opencv 深度学习 驾驶人脸疲劳检测系统 -python

文章目录 0 前言1 课题背景2 Dlib人脸识别2.1 简介2.2 Dlib优点2.3 相关代码2.4 人脸数据库2.5 人脸录入加识别效果 3 疲劳检测算法3.1 眼睛检测算法3.2 打哈欠检测算法3.3 点头检测算法 4 PyQt54.1 简介4.2相关界面代码 5 最后 0 前言 🔥 优质竞赛项目系列&#x…...

DFS寻找从s到t的所有路径

问题描述&#xff1a; 输入一个有向图&#xff0c;输出从s到t的所有路径的结点 输入&#xff1a; 3 3 0 1 1 2 0 2输出&#xff1a; 0 1 2 0 2 代码&#xff1a; #include<bits/stdc.h> using namespace std;const int N 103; vector<int>e[N];//用行为N的…...

分享!JetBrains IDE中的GitLab支持

GitLab是流行的基于git的软件开发和部署平台之一&#xff0c;虽然很长一段时间以来&#xff0c;所有基本git操作都已经可以通过GitLab实现&#xff0c;但GitLab集成仍是JetBrains社区的一大最热门请求。为此&#xff0c;JetBrains团队今年与GitLab联手提供了这种类型的集成。 …...

jq弹窗拖动改变宽高

预览效果 <div classtishiMask><div class"tishiEm"><div id"coor"></div><div class"topNew ismove"><span class"ismove">提示</span><p onclick"closeTishi()"></p&…...

时间不确定度在分布式系统中的说明

On the one hand 时间不确定度问题和影响在分布式系统中 说明 时钟不确定度&#xff08;Clock Uncertainty&#xff09;是指在分布式系统中&#xff0c;由于网络延迟、时钟漂移等因素导致系统中各个节点时钟的不同步现象。这种不同步可能会影响到分布式系统的一致性和正确性…...

VMware vCenter 从6.7跨版本升级至7.0U3N

本文尝试使用 vCenter Server Appliance 管理界面 (VAMI) 进行对vCenter Server Appliance7应用进行小版本升级&#xff0c;从6.7.0.47000升级到7.0.3.01600&#xff08;7.0U3N&#xff09;。 一、升级前的准备工作 1、检查当前运行环境&#xff08;当前为6.7.0.47000&#x…...

大麦订单生成器最新版 大麦订单一键生成截图

1.可以一键添加&#xff0c;生成的假订单没有水印&#xff0c;界面也很真实。 2.在软件中输入生成的信息&#xff0c;这是产品信息&#xff0c;选择生成的产品图像&#xff0c;最后生成它。 后台一键生成&#xff0c;独立后台管理 教程&#xff1a;解压源码&#xff0c;修改数…...

如何对Map集合的key进行大小写转换?

工具类&#xff1a; ToUpperCaseKeyMapUtil.java public class ToUpperCaseKeyMapUtil {//对单一的mappublic static <T> Map<String, T> toUpperCaseKeyMap(Map<String, T> map) {if (map ! null) {List<String> mapKeyList new ArrayList<>…...

将函数实现放到CPP报“无法解析的外部符号...”,系VS Bug

发现一个现象&#xff0c;就是项目中有一个类&#xff0c;如果将函数实现全部放到头文件中&#xff0c;编译不报错&#xff0c;如果将函数实现放到CPP中则始终提示“无法解析的外部符号...”&#xff0c;考虑到放到头文件中能正常编译运行&#xff0c;显然这里不符合“无法解析…...

异步FIFO设计的仿真与综合技术(3)

概述 本文主体翻译自C. E. Cummings and S. Design, “Simulation and Synthesis Techniques for Asynchronous FIFO Design 一文&#xff0c;添加了笔者的个人理解与注释&#xff0c;文中蓝色部分为笔者注或意译。前文链接&#xff1a; 异步FIFO设计的仿真与综合技术&#xf…...

什么是区块链,解释区块链的原理和应用场景

1、什么是区块链&#xff0c;解释区块链的原理和应用场景。 区块链是一种分布式数据库&#xff0c;它由一系列按照时间顺序排列的数据块组成&#xff0c;并采用密码学方式保证不可篡改和不可伪造。区块链技术最初起源于比特币&#xff0c;作为比特币的底层技术&#xff0c;用于…...

使用bert进行文本二分类

构建BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;的训练网络可以使用PyTorch来实现。下面是一个简单的示例代码&#xff1a; import torch import torch.nn as nn from transformers import BertModel, BertTokenizer# Load BERT to…...

用Windows Installer CleanUp Utility 在windows server上面将软件卸载干净,比如SQLSERVER

这里写自定义目录标题 下载文件&#xff1a;Windows Installer CleanUp Utility。 通过以上工具可以将一个应用程序卸载干净。...

Java手写LinkedList和拓展

Java手写LinkedList和拓展 思维导图 #mermaid-svg-K0RTlFFvnikDRvqp {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-K0RTlFFvnikDRvqp .error-icon{fill:#552222;}#mermaid-svg-K0RTlFFvnikDRvqp .error-text{fill…...

机器学习(14)---逻辑回归(含手写公式、推导过程和手写例题)

逻辑回归 一、逻辑回归概述二、模型、策略和优化&#xff08;手写&#xff09;三、w和b的梯度下降公式推导四、例题分析4.1 题目4.2 解答 一、逻辑回归概述 1. 逻辑回归也称作logistic回归分析&#xff0c;是一种广义的线性回归分析模型&#xff0c;属于机器学习中的监督学习。…...

LLFormer 论文阅读笔记

Ultra-High-Definition Low-Light Image Enhancement: A Benchmark and Transformer-Based Method 这是南京大学在AAAI 2023发表的一篇AAAI2023 超高清图像暗图增强的工作。提出了一个超高清暗图增强数据集&#xff0c;提供了4K和8K的图片&#xff0c;同时提出了一个可用于暗图…...

JSP语法基础习题

目录 简答题&#xff1a;jsp中静态include和动态include的区别是什么&#xff1f; 简答题&#xff1a;jsp有哪些内置对象&#xff0c;作用分别是什么&#xff1f; 简答题&#xff1a;Request对象的主要方法有哪些&#xff1f; 代码题&#xff1a; 简答题&#xff1a;jsp中静态…...

vue类与样式的绑定列表渲染

目录 1.类与样式的绑定 1.1绑定 HTML class 1.2绑定数组 1.3绑定内联样式 绑定数组 2.列表渲染 2.1v-for​ 2.2v-for 与对象 2.3在 v-for 里使用范围值​ 1.类与样式的绑定 1.1绑定 HTML class 我们可以给 :class (v-bind:class 的缩写) 传递一个对象来动态切换 class…...

vue3+element-plus权限控制实现(el-tree父子级不关联情况处理)

文章目录 前言一、遇到的交互场景el-tree 中 check-strictly 属性 二、处理父级的半选中以及选中交互el-treecheck&#xff0c;check-change 事件编辑进来&#xff0c;父级的半选状态处理 总结 前言 在开发后台管理系统的时候&#xff0c;用户的权限控制是一个常见的需求。这里…...

js中事件委托和事件绑定之间的区别

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 事件绑定&#xff08;Event Binding&#xff09;⭐事件委托&#xff08;Event Delegation&#xff09;⭐ 选择事件绑定或事件委托⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本…...

Android 11.0 系统system模块开启禁用adb push和adb pull传输文件功能

1.使用场景 在进行11.0的系统定制化开发中,在一些产品中由于一些开发的功能比较重要,防止技术点外泄在出货产品中,禁用 adb pull 和adb push等命令 来获取系统system下的jar 和apk 等文件,所以需要禁用这些命令 2.系统system模块开启禁用adb push和adb pull传输文件功能的…...

实战经验分享:如何通过HTTP代理解决频繁封IP问题

在网络爬虫和数据采集等应用中&#xff0c;频繁遇到目标网站封锁或限制IP的情况是非常常见的。为了解决这个问题&#xff0c;使用HTTP代理是一种有效的方法。本文将与您分享一些实战经验&#xff0c;帮助您通过HTTP代理解决频繁封IP问题&#xff0c;确保您的数据采集工作顺利进…...

通讯网关软件001——利用CommGate X2Access-U实现OPC UA数据转储Access

本文介绍利用CommGate X2ACCESS-U实现从OPC UA Server读取数据并同步转储至ACCESS数据库。CommGate X2ACCESS-U是宁波科安网信开发的网关软件&#xff0c;软件可以登录到网信智汇(http://wangxinzhihui.com)下载。 【案例】如下图所示&#xff0c;实现从OPC UA Server实时读取…...

Mybatis sql参数自动填充

问题描述 在日常开发中&#xff0c;经常会遇到Mybatis sql语句的操作问题&#xff0c;由于Mybatis实现sql的动态拼接&#xff0c;开发过程中&#xff0c;为了验证sql是否书写正确&#xff0c;通常需要获取的控制台打印的sql语句来检查是否拼接正确。如下图所示&#xff1a; 那…...

亚马逊云科技面向游戏运营活动的AI生图解决方案

随着Stable Diffusion等AI生图方案逐步普及&#xff0c;越来越多的场景被开发和落地。其中面向游戏C端玩家的AI生图营销活动场景正在被逐步验证&#xff1a;在某个游戏社区中&#xff0c;玩家一键从手机上传一张照片&#xff0c;AI会将自动识别该照片中的元素并替换成游戏中相应…...

腾讯mini项目-【指标监控服务重构】2023-07-30

今日已办 调研 CPU & Memory Cadivisor &#xff23;adivisor -> Prometheus -> (Grafana / SigNoz Web) google/cadvisor: Analyzes resource usage and performance characteristics of running containers. (github.com) services:cadvisor:image: gcr.io/ca…...

Windows 下 MySQL 8.1 图形化界面安装、配置详解

首先我们下载安装包 官方下载链接&#xff1a; MySQL :: Begin Your Download 网盘链接: https://pan.baidu.com/s/1FOew6-93XpknB-bYDhDYPw 提取码: brys 外网下载慢的同学可以使用上述网盘链接 下载完成后我们双击安装包即可进入安装界面 点击next 勾选同意协议&#…...

WebRTC 源码 编译 iOS端

1. 获取依赖工具 首先&#xff0c;确保你已经安装了以下工具&#xff1a; GitDepot ToolsXcode&#xff08;确保已安装命令行工具&#xff09; 2. 下载 depot_tools 使用 git 克隆 depot_tools 并将其添加到你的 PATH 中&#xff1a; /path/to/depot_tools 替换为自己的路径…...

Python编程指南:利用HTTP和HTTPS适配器实现智能路由

嗨&#xff0c;爬虫大佬们&#xff01;今天我要为大家分享一篇关于如何利用HTTP和HTTPS适配器来实现智能路由的Python编程指南。在现代互联网应用中&#xff0c;路由功能起着至关重要的作用&#xff0c;而利用Python编程语言实现智能路由则可以为我们的应用带来更高的灵活性和性…...

MySQL 权限分配

有时候&#xff0c;您需要查看某个用户被授予的权限以便复核。 MySQL 允许您使用 SHOW GRANTS 语句来显示分配给用户帐户或角色的权限。 MySQL SHOW GRANTS 语句介绍 以下是 SHOW GRANTS 语句的基本语法&#xff1a; SHOW GRANTS [FOR {user | role} [USING role [, role] .…...

wordpress读取图片loading/网络优化工具app手机版

重启网卡 root用户 systemctl restart network非root用户 sudo systemctl restart network...

如何对网站进行爬虫/app推广接单发布平台

今日任务使用JS完成页面定时弹出广告使用JS完成表单的校验使用JS完成表格的隔行换色使用JS完成复选框的全选效果使用JS完成省市的联动效果JS控制下拉列表左右选择教学导航掌握JS中的BOM对象掌握JS中的常用事件掌握JS中的常用DOM操作了解JS中的内置对象上一次内容进行复习:CSS: …...

网站内页做排名/域名查询网站

css的引入方式 css的引入方式有四种&#xff1a;内联样式&#xff0c;嵌入样式&#xff0c;链接样式&#xff0c;导入样式。 1.内联样式 内联样式也叫行内样式&#xff0c;指的是直接在HTML标签中的style属性中添加css的样式。 <div style"font-size:20px;color:#333&q…...

建站兔软件常见问题/搜索引擎营销的内容

嘿&#xff0c;你也听播客么&#xff1f; 有机构统计过&#xff0c;去年 1 月美国最热门的播客单月受众就超过了 2370 万人&#xff0c;那时疫情还未影响人们的生活。随着 RTC 技术的普及&#xff0c;还有人们生活方式的变化&#xff0c;播客也演进出了新的形态。今年 1 月&am…...

150m网站空间流量大吗/高权重友情链接

前言 在企业级项目开发过程中&#xff0c;上传文件是最常用到的功能。SpringBoot集成了SpringMVC&#xff0c;当然上传文件的方式跟SpringMVC没有什么出入。 本章目标 使用SpringBoot项目完成单个、多个文件的上传处理&#xff0c;并将上传的文件保存到指定目录下。这里我们会使…...

使用WordPress快速建站视频/app推广拉新平台

openpyxl模块介绍 openpyxl模块是一个读写Excel 2010文档的Python库&#xff0c;如果要处理更早格式的Excel文档&#xff0c;需要用到额外的库&#xff0c;openpyxl是一个比较综合的工具&#xff0c;能够同时读取和修改Excel文档。其他很多的与Excel相关的项目基本只支持读或者…...