大創項目推薦 題目:基于機器視覺的圖像矯正 (以車牌識別為例) - 圖像畸變校正

文章目錄

  • 0 簡介
  • 1 思路簡介
    • 1.1 車牌定位
    • 1.2 畸變校正
  • 2 代碼實現
    • 2.1 車牌定位
      • 2.1.1 通過顏色特征選定可疑區域
      • 2.1.2 尋找車牌外圍輪廓
      • 2.1.3 車牌區域定位
    • 2.2 畸變校正
      • 2.2.1 畸變后車牌頂點定位
      • 2.2.2 校正
  • 7 最后

0 簡介

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

基于機器視覺的圖像矯正 (以車牌識別為例)

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

🧿 更多資料, 項目分享:

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

1 思路簡介

目前車牌識別系統在各小區門口隨處可見,識別效果貌似都還可以。查閱資料后,發現整個過程又可以細化為車牌定位、畸變校正、車牌分割和內容識別四部分。本篇隨筆主要介紹車牌定位及畸變校正兩部分,在python環境下通過opencv實現。

1.1 車牌定位

目前主流的車牌定位方法從大的方面來說可以分為兩類:一種是基于車牌的背景顏色特征;另一種基于車牌的輪廓形狀特征。基于顏色特征的又可分為兩類:一種在RGB空間識別,另一種在HSV空間識別。經測試后發現,單獨使用任何一種方法,效果均不太理想。目前比較普遍的做法是幾種定位方法同時使用,或用一種識別,另一種驗證。本文主要通過顏色特征對車牌進行定位,以HSV空間的H分量為主,以RGB空間的R分量和B分量為輔,后續再用車牌的長寬比例排除干擾。

1.2 畸變校正

在車牌的圖像采集過程中,相機鏡頭通常都不是垂直于車牌的,所以待識別圖像中車牌或多或少都會有一定程度的畸變,這給后續的車牌內容識別帶來了一定的困難。因此需要對車牌進行畸變校正,消除畸變帶來的不利影響。

2 代碼實現

2.1 車牌定位

2.1.1 通過顏色特征選定可疑區域

取了不同光照環境下車牌的圖像,截取其背景顏色,利用opencv進行通道分離和顏色空間轉換,經試驗后,總結出車牌背景色的以下特征:

  • (1)在HSV空間下,H分量的值通常都在115附近徘徊,S分量和V分量因光照不同而差異較大(opencv中H分量的取值范圍是0到179,而不是圖像學中的0到360;S分量和V分量的取值范圍是到255);

  • (2)在RGB空間下,R分量通常較小,一般在30以下,B分量通常較大,一般在80以上,G分量波動較大;

  • (3)在HSV空間下對圖像進行補光和加飽和度處理,即將圖像的S分量和V分量均置為255,再進行色彩空間轉換,由HSV空間轉換為RGB空間,發現R分量全部變為0,B分量全部變為255(此操作會引入較大的干擾,后續沒有使用)。

根據以上特征可初步篩選出可疑的車牌區域。隨后對灰度圖進行操作,將可疑位置的像素值置為255,其他位置的像素值置為0,即根據特征對圖像進行了二值化。二值化圖像中,可疑區域用白色表示,其他區域均為黑色。隨后可通過膨脹腐蝕等操作對圖像進一步處理。

?

for i in range(img_h):for j in range(img_w):# 普通藍色車牌,同時排除透明反光物質的干擾if ((img_HSV[:, :, 0][i, j]-115)**2 < 15**2) and (img_B[i, j] > 70) and (img_R[i, j] < 40):img_gray[i, j] = 255else:img_gray[i, j] = 0

在這里插入圖片描述

2.1.2 尋找車牌外圍輪廓

選定可疑區域并將圖像二值化后,一般情況下,圖像中就只有車牌位置的像素顏色為白,但在一些特殊情況下還會存在一些噪聲。如上圖所示,由于圖像右上角存在藍色支架,與車牌顏色特征相符,因此也被當做車牌識別了出來,由此引入了噪聲。

經過觀察可以發現,車牌區域與噪聲之間存在較大的差異,且車牌區域特征比較明顯:

  • (1)根據我國常規車牌的形狀可知,車牌的形狀為扁平矩形,長寬比約為3:1;

  • (2)車牌區域面積遠大于噪聲區域,一般為圖像中最大的白色區域。

在這里插入圖片描述

可以通過cv2.findContours()函數尋找二值化后圖像中白色區域的輪廓。

注意:在opencv2和opencv4中,cv2.findContours()的返回值有兩個,而在opencv3中,返回值有3個。視opencv版本不同,代碼的寫法也會存在一定的差異。

?

# 檢測所有外輪廓,只留矩形的四個頂點
# opencv4.0, opencv2.x
contours, _ = cv2.findContours(img_bin, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
# opencv3.x
_, contours, _ = cv2.findContours(img_bin, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

這里,因為二值化圖像中共有三塊白色區域(車牌及兩處噪聲),因此返回值contours為長度為3的list。list內裝有3個array,每個array內各存放著一塊白色區域的輪廓信息。每個array的shape均為(n,
1, 2),即每個array存放著對應白色區域輪廓上n個點的坐標。

目前得到了3個array,即3組輪廓信息,但我們并不清楚其中哪個是車牌區域對應的那一組輪廓信息。此時可以根據車牌的上述特征篩選出車牌區域的輪廓。

?

#形狀及大小篩選校驗
det_x_max = 0
det_y_max = 0
num = 0
for i in range(len(contours)):x_min = np.min(contours[i][ :, :, 0])x_max = np.max(contours[i][ :, :, 0])y_min = np.min(contours[i][ :, :, 1])y_max = np.max(contours[i][ :, :, 1])det_x = x_max - x_mindet_y = y_max - y_minif (det_x / det_y > 1.8) and (det_x > det_x_max ) and (det_y > det_y_max ):det_y_max = det_ydet_x_max = det_xnum = i
# 獲取最可疑區域輪廓點集
points = np.array(contours[num][:, 0])

最終得到的points的shape為(n, 2),即存放了n個點的坐標,這n個點均分布在車牌的邊緣上

2.1.3 車牌區域定位

獲取車牌輪廓上的點集后,可用cv2.minAreaRect()獲取點集的最小外接矩形。返回值rect內包含該矩形的中心點坐標、高度寬度及傾斜角度等信息,使用cv2.boxPoints()可獲取該矩形的四個頂點坐標。

?

# 獲取最小外接矩陣,中心點坐標,寬高,旋轉角度
rect = cv2.minAreaRect(points)
# 獲取矩形四個頂點,浮點型
box = cv2.boxPoints(rect)
# 取整
box = np.int0(box)

但我們并不清楚這四個坐標點各對應著矩形的哪一個頂點,因此無法充分地利用這些坐標信息。

可以從坐標值的大小特征入手,將四個坐標與矩形的四個頂點匹配起來:在opencv的坐標體系下,縱坐標最小的是top_point,縱坐標最大的是bottom_point,
橫坐標最小的是left_point,橫坐標最大的是right_point。

?

# 獲取四個頂點坐標
left_point_x = np.min(box[:, 0])
right_point_x = np.max(box[:, 0])
top_point_y = np.min(box[:, 1])
bottom_point_y = np.max(box[:, 1])left_point_y = box[:, 1][np.where(box[:, 0] == left_point_x)][0]
right_point_y = box[:, 1][np.where(box[:, 0] == right_point_x)][0]
top_point_x = box[:, 0][np.where(box[:, 1] == top_point_y)][0]
bottom_point_x = box[:, 0][np.where(box[:, 1] == bottom_point_y)][0]
# 上下左右四個點坐標
vertices = np.array([[top_point_x, top_point_y], [bottom_point_x, bottom_point_y], [left_point_x, left_point_y], [right_point_x, right_point_y]])

在這里插入圖片描述
在這里插入圖片描述

2.2 畸變校正

2.2.1 畸變后車牌頂點定位

要想實現車牌的畸變矯正,必須找到畸變前后對應點的位置關系。

可以看出,本是矩形的車牌畸變后變成了平行四邊形,因此車牌輪廓和得出來的矩形輪廓并不契合。但有了矩形的四個頂點坐標后,可以通過簡單的幾何相似關系求出平行四邊形車牌的四個頂點坐標。

在本例中,平行四邊形四個頂點與矩形四個頂點之間有如下關系:矩形頂點Top_Point、Bottom_Point與平行四邊形頂點new_top_point、new_bottom_point重合,矩形頂點Top_Point的橫坐標與平行四邊形頂點new_right_point的橫坐標相同,矩形頂點Bottom_Point的橫坐標與平行四邊形頂點new_left_point的橫坐標相同。

在這里插入圖片描述

但事實上,由于拍攝的角度不同,可能出現兩種不同的畸變情況。可以根據矩形傾斜角度的不同來判斷具體是哪種畸變情況。

在這里插入圖片描述

判斷出具體的畸變情況后,選用對應的幾何相似關系,即可輕易地求出平行四邊形四個頂點坐標,即得到了畸變后車牌四個頂點的坐標。

要想實現車牌的校正,還需得到畸變前車牌四個頂點的坐標。因為我國車牌的標準尺寸為440X140,因此可規定畸變前車牌的四個頂點坐標分別為:(0,0),(440,0),(0,140),(440,140)。順序上需與畸變后的四個頂點坐標相對應。

?

# 畸變情況1
if rect[2] > -45:new_right_point_x = vertices[0, 0]new_right_point_y = int(vertices[1, 1] - (vertices[0, 0]- vertices[1, 0]) / (vertices[3, 0] - vertices[1, 0]) * (vertices[1, 1] - vertices[3, 1]))new_left_point_x = vertices[1, 0]new_left_point_y = int(vertices[0, 1] + (vertices[0, 0] - vertices[1, 0]) / (vertices[0, 0] - vertices[2, 0]) * (vertices[2, 1] - vertices[0, 1]))# 校正后的四個頂點坐標point_set_1 = np.float32([[440, 0],[0, 0],[0, 140],[440, 140]])
# 畸變情況2
elif rect[2] < -45:new_right_point_x = vertices[1, 0]new_right_point_y = int(vertices[0, 1] + (vertices[1, 0] - vertices[0, 0]) / (vertices[3, 0] - vertices[0, 0]) * (vertices[3, 1] - vertices[0, 1]))new_left_point_x = vertices[0, 0]new_left_point_y = int(vertices[1, 1] - (vertices[1, 0] - vertices[0, 0]) / (vertices[1, 0] - vertices[2, 0]) * (vertices[1, 1] - vertices[2, 1]))# 校正后的四個頂點坐標point_set_1 = np.float32([[0, 0],[0, 140],[440, 140],[440, 0]])# 校正前平行四邊形四個頂點坐標
new_box = np.array([(vertices[0, 0], vertices[0, 1]), (new_left_point_x, new_left_point_y), (vertices[1, 0], vertices[1, 1]), (new_right_point_x, new_right_point_y)])
point_set_0 = np.float32(new_box)

2.2.2 校正

該畸變是由于攝像頭與車牌不垂直而引起的投影造成的,因此可用cv2.warpPerspective()來進行校正。

?

# 變換矩陣
mat = cv2.getPerspectiveTransform(point_set_0, point_set_1)
# 投影變換
lic = cv2.warpPerspective(img, mat, (440, 140))

在這里插入圖片描述

?

import cv2import numpy as np# 預處理def imgProcess(path):img = cv2.imread(path)# 統一規定大小img = cv2.resize(img, (640,480))# 高斯模糊img_Gas = cv2.GaussianBlur(img,(5,5),0)# RGB通道分離img_B = cv2.split(img_Gas)[0]img_G = cv2.split(img_Gas)[1]img_R = cv2.split(img_Gas)[2]# 讀取灰度圖和HSV空間圖img_gray = cv2.cvtColor(img_Gas, cv2.COLOR_BGR2GRAY)img_HSV = cv2.cvtColor(img_Gas, cv2.COLOR_BGR2HSV)return img, img_Gas, img_B, img_G, img_R, img_gray, img_HSV# 初步識別def preIdentification(img_gray, img_HSV, img_B, img_R):for i in range(480):for j in range(640):# 普通藍色車牌,同時排除透明反光物質的干擾if ((img_HSV[:, :, 0][i, j]-115)**2 < 15**2) and (img_B[i, j] > 70) and (img_R[i, j] < 40):img_gray[i, j] = 255else:img_gray[i, j] = 0# 定義核kernel_small = np.ones((3, 3))kernel_big = np.ones((7, 7))img_gray = cv2.GaussianBlur(img_gray, (5, 5), 0) # 高斯平滑img_di = cv2.dilate(img_gray, kernel_small, iterations=5) # 腐蝕5次img_close = cv2.morphologyEx(img_di, cv2.MORPH_CLOSE, kernel_big) # 閉操作img_close = cv2.GaussianBlur(img_close, (5, 5), 0) # 高斯平滑_, img_bin = cv2.threshold(img_close, 100, 255, cv2.THRESH_BINARY) # 二值化return img_bin# 定位def fixPosition(img, img_bin):# 檢測所有外輪廓,只留矩形的四個頂點contours, _ = cv2.findContours(img_bin, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)#形狀及大小篩選校驗det_x_max = 0det_y_max = 0num = 0for i in range(len(contours)):x_min = np.min(contours[i][ :, :, 0])x_max = np.max(contours[i][ :, :, 0])y_min = np.min(contours[i][ :, :, 1])y_max = np.max(contours[i][ :, :, 1])det_x = x_max - x_mindet_y = y_max - y_minif (det_x / det_y > 1.8) and (det_x > det_x_max ) and (det_y > det_y_max ):det_y_max = det_ydet_x_max = det_xnum = i# 獲取最可疑區域輪廓點集points = np.array(contours[num][:, 0])return points#img_lic_canny = cv2.Canny(img_lic_bin, 100, 200)def findVertices(points):# 獲取最小外接矩陣,中心點坐標,寬高,旋轉角度rect = cv2.minAreaRect(points)# 獲取矩形四個頂點,浮點型box = cv2.boxPoints(rect)# 取整box = np.int0(box)# 獲取四個頂點坐標left_point_x = np.min(box[:, 0])right_point_x = np.max(box[:, 0])top_point_y = np.min(box[:, 1])bottom_point_y = np.max(box[:, 1])left_point_y = box[:, 1][np.where(box[:, 0] == left_point_x)][0]right_point_y = box[:, 1][np.where(box[:, 0] == right_point_x)][0]top_point_x = box[:, 0][np.where(box[:, 1] == top_point_y)][0]bottom_point_x = box[:, 0][np.where(box[:, 1] == bottom_point_y)][0]# 上下左右四個點坐標vertices = np.array([[top_point_x, top_point_y], [bottom_point_x, bottom_point_y], [left_point_x, left_point_y], [right_point_x, right_point_y]])return vertices, rectdef tiltCorrection(vertices, rect):# 畸變情況1if rect[2] > -45:new_right_point_x = vertices[0, 0]new_right_point_y = int(vertices[1, 1] - (vertices[0, 0]- vertices[1, 0]) / (vertices[3, 0] - vertices[1, 0]) * (vertices[1, 1] - vertices[3, 1]))new_left_point_x = vertices[1, 0]new_left_point_y = int(vertices[0, 1] + (vertices[0, 0] - vertices[1, 0]) / (vertices[0, 0] - vertices[2, 0]) * (vertices[2, 1] - vertices[0, 1]))# 校正后的四個頂點坐標point_set_1 = np.float32([[440, 0],[0, 0],[0, 140],[440, 140]])# 畸變情況2elif rect[2] < -45:new_right_point_x = vertices[1, 0]new_right_point_y = int(vertices[0, 1] + (vertices[1, 0] - vertices[0, 0]) / (vertices[3, 0] - vertices[0, 0]) * (vertices[3, 1] - vertices[0, 1]))new_left_point_x = vertices[0, 0]new_left_point_y = int(vertices[1, 1] - (vertices[1, 0] - vertices[0, 0]) / (vertices[1, 0] - vertices[2, 0]) * (vertices[1, 1] - vertices[2, 1]))# 校正后的四個頂點坐標point_set_1 = np.float32([[0, 0],[0, 140],[440, 140],[440, 0]])# 校正前平行四邊形四個頂點坐標new_box = np.array([(vertices[0, 0], vertices[0, 1]), (new_left_point_x, new_left_point_y), (vertices[1, 0], vertices[1, 1]), (new_right_point_x, new_right_point_y)])point_set_0 = np.float32(new_box)return point_set_0, point_set_1, new_boxdef transform(img, point_set_0, point_set_1):# 變換矩陣mat = cv2.getPerspectiveTransform(point_set_0, point_set_1)# 投影變換lic = cv2.warpPerspective(img, mat, (440, 140))return licdef main():path = 'F:\\Python\\license_plate\\test\\9.jpg'# 圖像預處理img, img_Gas, img_B, img_G, img_R, img_gray, img_HSV = imgProcess(path)# 初步識別img_bin  = preIdentification(img_gray, img_HSV, img_B, img_R)points = fixPosition(img, img_bin)vertices, rect = findVertices(points)point_set_0, point_set_1, new_box = tiltCorrection(vertices, rect)img_draw = cv2.drawContours(img.copy(), [new_box], -1, (0,0,255), 3)lic = transform(img, point_set_0, point_set_1)# 原圖上框出車牌cv2.namedWindow("Image")cv2.imshow("Image", img_draw)# 二值化圖像cv2.namedWindow("Image_Bin")cv2.imshow("Image_Bin", img_bin)# 顯示校正后的車牌cv2.namedWindow("Lic")cv2.imshow("Lic", lic)# 暫停、關閉窗口cv2.waitKey(0)cv2.destroyAllWindows()if __name__ == '__main__':main()

在這里插入圖片描述

7 最后

🧿 更多資料, 項目分享:

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

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

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

相關文章

題目的起名

整個經濟社會描繪為無數個交織的方程組。機場航班的起降時間、物流的路徑規劃、金屬冶煉的原料配比、工廠店鋪的選址……”而這些方程組的價值在于&#xff0c;“為了實現經濟學最簡單而又最權威的目標——對稀缺資源進行最佳利用&#xff0c;必須快速求出這些方程組的最優解。…

Leetcode3192. 使二進制數組全部等于 1 的最少操作次數 II

Every day a Leetcode 題目來源&#xff1a;3192. 使二進制數組全部等于 1 的最少操作次數 II 解法1&#xff1a;遍歷 由于 nums[i] 會被其左側元素的操作影響&#xff0c;所以我們先從最左邊的 nums[0] 開始思考。 分類討論&#xff1a; 如果 nums[0]1&#xff0c;無需反…

debian 安裝mongodb

安裝所需工具 apt install gnupg curl 添加公鑰 wget -qO - https://www.mongodb.org/static/pgp/server-4.2.asc | sudo apt-key add - 添加源 echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-6.0.gpg ] https://repo.mongodb.org/apt…

amis-editor 注冊自定義組件

建議先將amis文檔從頭到尾&#xff0c;仔細看一遍。 參考&#xff1a;amis - 低代碼前端框架 amis 的渲染過程是將 json 轉成對應的 React 組件。先通過 json 的 type 找到對應的 Component&#xff0c;然后把其他屬性作為 props 傳遞過去完成渲染。 import * as React from …

Linux開發講課17--- 在shell腳本中,如何將一個命令存儲在一個變量中

問&#xff1a; 將一個命令保存到一個變量中&#xff0c;以便稍后再使用&#xff08;不是命令的輸出&#xff0c;而是命令本身&#xff09;。 有一個簡單的腳本如下&#xff1a; command"ls"; echo "Command: $command"; #Output is: Command: ls b$com…

c++ 給定一個非常巨大的數組,如何找到它的中值

快速選擇算法&#xff08;最優解&#xff09; #include <iostream> #include <vector> #include <algorithm>using namespace std;class Solution { private:// 快速選擇算法中的分區函數int partition(vector<int>& nums, int left, int right)…

逆向學習匯編篇:參數傳遞與返回地址的使用

本節課在線學習視頻&#xff08;網盤地址&#xff0c;保存后即可免費觀看&#xff09;&#xff1a; ??https://pan.quark.cn/s/b5b046015da2?? 在匯編語言中&#xff0c;函數調用和參數傳遞是編程的基礎組成部分。了解如何在匯編中傳遞參數以及如何處理返回地址對于逆向工…

LeetCode 78. 子集

更多題解盡在 https://sugar.matrixlab.dev/algorithm 每日更新。 組隊打卡&#xff0c;更多解法等你一起來參與哦&#xff01; LeetCode 78. 子集&#xff0c;難度中等。 迭代 解題思路&#xff1a; 初始化結果集 result&#xff0c;其中包含一個空集 []&#xff1b;遍歷數…

flex講解

隨著前端技術的不斷發展和更新&#xff0c;flex布局成為前端布局的主流。但是仍然有很多前端新手搞不懂flex到底怎么用&#xff01;&#xff01;&#xff01;今天我們就來好好講講flex布局 老規矩先上定義 什么是flex布局 布局的傳統解決方案&#xff0c;基于盒狀模型&#x…

鄭州高校大學智能制造實驗室數字孿生可視化系統平臺建設項目驗收

隨著制造業的轉型升級&#xff0c;智能化、信息化已成為制造業發展的必然趨勢。數字孿生技術作為智能制造領域的關鍵技術之一&#xff0c;它通過構建與實體系統相對應的虛擬模型&#xff0c;實現對實體系統的實時監測、預測和優化&#xff0c;為制造業的智能化、信息化提供了強…

LitelDE安裝---附帶每一步截圖以及測試

LiteIDE LiteIDE 是一款專為Go語言開發而設計的開源、跨平臺、輕量級集成開發環境&#xff08;IDE&#xff09;&#xff0c;基于 Qt 開發&#xff08;一個跨平臺的 C 框架&#xff09;&#xff0c;支持 Windows、Linux 和 Mac OS X 平臺。LiteIDE 的第一個版本發布于 2011 年 …

PTA-線性表實驗(JAVA)

題目1&#xff1a;Josephus環的問題及算法 【實驗內容】 編程實現如下功能&#xff1a; 題意說明&#xff1a;古代某法官要判決n個犯人的死刑&#xff0c;他有一條荒唐的法律&#xff0c;將犯人站成一個圓圈&#xff0c;從第start個犯人開始數起&#xff0c;每數到第distance的…

【Spring Boot AOP通知順序】

文章目錄 一、Spring Boot AOP簡介二、通知順序1. 通知類型及其順序示例代碼 2. 控制通知順序示例代碼 一、Spring Boot AOP簡介 AOP&#xff08;Aspect-Oriented Programming&#xff0c;面向切面編程&#xff09;是對OOP&#xff08;Object-Oriented Programming&#xff0c…

使用Dockerfile構建鏡像 使用docker-compose 一鍵部署IM項目

本文講解&#xff1a;使用Dockerfile構建鏡像 & 使用docker-compose 一鍵部署IM項目。 im項目地址&#xff1a;xzll-im &#xff0c;歡迎志同道合的開發者 一起 維護&#xff0c;學習&#xff0c;歡迎star &#x1f604; 1、Dockerfile編寫與鏡像構建&容器運行 Dockerf…

Spring Boot中使用Thymeleaf進行頁面渲染

Spring Boot中使用Thymeleaf進行頁面渲染 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;今天我們將探討如何在Spring Boot應用中使用Thymeleaf模板引擎進行頁面…

Nginx和CDN運用

一.Web緩存代理 1.工作機制 代替客戶機向網站請求數據&#xff0c;從而可以隱藏用戶的真實IP地址。將獲得的網頁數據&#xff08;靜態Web元素&#xff09;保存到緩存中并發送給客戶機&#xff0c;以便下次請求相同的數據時快速響應。 2.代理服務器的概念 代理服務器是一個位…

Kubernetes面試整理-如何監控Kubernetes集群的健康和性能?

監控 Kubernetes 集群的健康和性能是確保集群穩定運行的重要任務。以下是一些常用的方法和工具來監控 Kubernetes 集群: 1. Prometheus 和 Grafana Prometheus 是一個開源的系統監控和報警工具,Grafana 是一個開源的分析和監控平臺。兩者通常一起使用來監控 Kubernetes 集群。…

k8s token加新節點

在 master 節點執行 kubeadm token create --print-join-command得到token和cert&#xff0c;這兩個參數在2個小時內可以重復使用&#xff0c;超過以后就得再次生成 kubeadm join apiserver.k8s.com --token mpfjma.4vjjg8flqihor4vt --discovery-token-ca-cert-hash sha…

【入門】5分鐘了解卷積神經網絡CNN是什么

本文來自《老餅講解-BP神經網絡》https://www.bbbdata.com/ 目錄 一、卷積神經網絡的結構1.1.卷積與池化的作用2.2.全連接層的作用 二、卷積神經網絡的運算2.1.卷積層的運算2.2.池化的運算2.3.全連接層運算 三、pytorch實現一個CNN例子3.1.模型的搭建3.2.CNN完整訓練代碼 CNN神…

【Dison夏令營 Day 04】如何用 Python 編寫簡單的數字猜謎游戲代碼

上個周末&#xff0c;我整理了一份可以用 Python 編寫的游戲列表。但為什么呢&#xff1f; 如果您是 Python 程序員初學者&#xff0c;編寫有趣的游戲可以幫助您更快更好地學習 Python 語言&#xff0c;而不會被語法之類的東西所困擾。我在學習 Python 的時候曾制作過一些這樣…