計算機競賽 圖像識別-人臉識別與疲勞檢測 - python opencv

文章目錄

  • 0 前言
  • 1 課題背景
  • 2 Dlib人臉識別
    • 2.1 簡介
    • 2.2 Dlib優點
    • 2.3 相關代碼
    • 2.4 人臉數據庫
    • 2.5 人臉錄入加識別效果
  • 3 疲勞檢測算法
    • 3.1 眼睛檢測算法
    • 3.3 點頭檢測算法
  • 4 PyQt5
    • 4.1 簡介
    • 4.2相關界面代碼
  • 5 最后

0 前言

🔥 優質競賽項目系列,今天要分享的是

🚩 基于圖像識別的人臉識別與疲勞檢測系統

該項目較為新穎,適合作為競賽課題方向,學長非常推薦!

🥇學長這里給一個題目綜合評分(每項滿分5分)

  • 難度系數:3分
  • 工作量:3分
  • 創新點:5分

🧿 更多資料, 項目分享:

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 pltimport` `dlibimport` `numpy as npimport` `globimport` `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, Qtfrom PyQt5.QtGui import QImage, QPixmap, QIcon, QTextCursor, QRegExpValidator,QPainterfrom PyQt5.QtWidgets import *from PyQt5.uic import loadUifrom ui.untitled import Ui_Formfrom core2 import CoreUIfrom dataRecord import DataRecordUIfrom dataManage import DataManageUIfrom ui.pic import Ui_Form1from PyQt5 import QtCoreimport sysimport osfrom PyQt5 import QtGuifrom PyQt5 import QtCorefrom PyQt5.QtWidgets import *from PyQt5.QtCore import *from PyQt5.QtGui import *import sysclass 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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/43348.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/43348.shtml
英文地址,請注明出處:http://en.pswp.cn/news/43348.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在 PyTorch 中使用關鍵點 RCNN 進行人體姿勢估計--附源碼

人體姿態估計是計算機視覺領域的一個重要研究領域。它涉及估計人體上的獨特點,也稱為關鍵點。在這篇博文中,我們將討論一種在包含人類的圖像上查找關鍵點的算法,稱為Keypoint-RCNN。該代碼是使用 Pytorch 使用Torchvision庫編寫的。 假設您想要建立一名私人健身教練,可以通…

MongoDB升級經歷(4.0.23至5.0.19)

MongoDB從4.0.23至5.0.19升級經歷 引子:為了解決MongoDB的兩個漏洞決定把MongoDB升級至最新版本,期間也踩了不少坑,在這里分享出來供大家學習與避坑~ 1、MongoDB的兩個漏洞 漏洞1:MongoDB Server 安全漏洞(CVE-2021-20330) 漏洞2…

SpringBoot + Vue 微人事(十二)

職位批量刪除實現 編寫后端接口 PositionController DeleteMapping("/")public RespBean deletePositionByIds(Integer[] ids){if(positionsService.deletePositionsByIds(ids)ids.length){return RespBean.ok("刪除成功");}return RespBean.err("刪…

工業視覺相機鏡頭選型方法

一、相機選型 1、首先,根據檢測需求確定選用黑白/彩色、面陣/線陣相機,接口類型一般選擇GigE 2、確定檢測精度要求(最小特征尺寸mm)、視野范圍,一個測量精度對應幾個像素數(一般取3-5) 3、計…

GPT法律領域

法律領域 LaWGPT Github: https://github.com/pengxiao-song/LaWGPT 簡介:基于中文法律知識的大語言模型。 數據:基于中文裁判文書網公開法律文書數據、司法考試數據等數據集展開,利用Stanford_alpaca、self-instruct方式生成對話問答數據…

esp32c3 micropython oled實時天氣信息

目錄 簡介 效果展示 代碼 main.py ssd1306.py font.py 實現思路 簡介 合宙esp32c3 micropython框架,只支持128*64 I2C oled ssd1306驅動我優化過的,與其他的不一樣,為避免出錯,使用我的驅動 把下面兩個py文件放入單片機內…

SqlServer的with(nolock)關鍵字的用法介紹

舉個例子 下面就來演示這個情況。 為了演示兩個事務死鎖的情況,我們下面的測試都需要在SQL Server Management Studio中打開兩個查詢窗口。保證事務不被干擾。 --1、 沒有提交的事務,NOLOCK 和 READPAST處理的策略: --查詢窗口一請執行如下…

【馬蹄集】第二十三周——進位制專題

進位制專題 目錄 MT2186 二進制?不同!MT2187 excel的煩惱MT2188 單條件和MT2189 三進制計算機1MT2190 三進制計算機2 MT2186 二進制?不同! 難度:黃金 ?? 時間限制:1秒 ?? 占用內存:128M 題目…

Kotlin的Map

在 Kotlin 中,Map 是一種鍵值對的集合數據結構,用于存儲一組關聯的鍵和值。Kotlin 標準庫提供了 Map 接口和多種實現類,使得操作和處理鍵值對數據更加方便。下面詳細描述 Kotlin 的 Map 的用法: 創建 Map Kotlin 提供了幾種方式…

SQL力扣練習(十一)

目錄 1.樹節點(608) 示例 1 解法一(case when) 解法二(not in) 2.判斷三角形(610) 示例 1 解法一(case when) 解法二(if) 解法三(嵌套if) 3.只出現一次的最大數字(619) 示例 1 解法一(count limit) 解法二(max) 4.有趣的電影(620) 解法一 5.換座位(626) 示例 …

同步jenkinsfile流水線(sync-job)

環境 變量:env(環境變量:sit/dev/simulation/prod/all),job(job-name/all)目錄:/var/lib/jenkins/jenkinsfile environment.json: [roottest-01 jenkinsfile]# cat env…

C++ string類的模擬實現

模擬實現string類不是為了造一個更好的輪子,而是更加理解string類,從而來掌握string類的使用 string類的接口設計繁多,故而不會全部涵蓋到,但是核心的會模擬實現 庫中string類是封裝在std的命名空間中的,所以在模擬…

webpack5和webpack4的一些區別

自動清除打包目錄 webpack4 // bash npm i clean-webpack-plugin -D //webpack.config.js const {CleanWebpackPlugin} require(clean-webpack-plugin); module.exports {plugins: [new CleanWebpackPlugin()} } webpack5 module.exports {output: {clean: true} } topLevel…

使用PostgreSQL構建強大的Web應用程序:最佳實踐和建議

PostgreSQL是一個功能強大的開源關系型數據庫,它擁有廣泛的用戶群和活躍的開發社區。越來越多的Web應用選擇PostgreSQL作為數據庫 backend。如何充分利用PostgreSQL的特性來構建健壯、高性能的Web應用?本文將給出一些最佳實踐和建議。 一、選擇合適的PostgreSQL數據類型 Pos…

【Vue】Mixin 混入

Vue Mixin 混入 1.簡介 混入(mixin)提供了一種非常靈活的方式,來分發 Vue 組件中的可復用功能。一個混入對象可以包含任意組件選項(如data、methods、mounted等等)。當組件使用混入對象時,所有混入對象的…

Java將時間戳轉化為特定時區的日期字符串

先上代碼: ZonedDateTime dateTime ZonedDateTime.ofInstant(Instant.ofEpochMilli(System.currentTimeMillis()),zone ); //2019-12-01T19:01:4608:00String formattedDate dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd") ); //2019-12-…

.git內存清理方式

查看前15個大文件 git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -15 | awk {print$1})"刪除文件夾(public/housimg文件夾目錄) git filter-branch --tree-filter rm -rf publ…

解決使用element ui時el-input的屬性type=number,仍然可以輸入e的問題。

使用element ui時el-input的屬性typenumber,仍然可以輸入e, 其他的中文特殊字符都不可以輸入,但是只有e是可以輸入的,原因是e也輸入作為科學計數法的時候,e是可以被判定為數字的, 但是有些場景是需要把e這種…

DICOM圖像的常用一些參數解析

醫學圖像DICOM醫學影像文件格式詳解 Dicom文件基本操作 DICOM圖像參數? 像素:構成圖片的小色點。圖像每個維度的像素個數——該維度一共有多少個均勻分布的像素點。 分辨率(單位DPI):每英寸(Inch&#xf…