OpenCV-Python實戰(14)——人臉檢測詳解(僅需6行代碼學會4種人臉檢測方法)

盼小輝丶 2021-10-29 01:03:32
opencv-python opencv python 方法

0. 前言

人臉處理是人工智能中的一個熱門話題,人臉處理可以使用計算機視覺算法從人臉中自動提取大量信息,例如身份、意圖和情感。人臉在視覺交流中起著重要作用,這是由於人臉中包含大量非語言信息,因此人臉處理一直以來對於計算機視覺學習者來說都是非常有趣的話題,因為它涉及不同的專業領域,例如對象檢測、特征點檢測以及對象跟踪等。在本文中,將首先介紹常用人臉處理庫,然後通過實戰講解如何使用這些庫進行人臉檢測,為進一步進行相關處理奠定基礎。

1. 人臉處理簡介

為了專注人臉處理相關主題,我們將使用 OpenCV 庫,以及 dlibface_recognitioncvlibPython 包。同時,本文將在人臉處理中使用不同的方法,以介紹解决具體人臉處理任務的不同方法,對不同方法的介紹將有助於大家根據不同的應用需求選擇不同的方法。下圖展示了人臉處理的相關主題,以及可用的 Python 包:

人臉處理簡介
如上圖所示,人臉處理主要包括以下主題:

  • 人臉檢測:對象檢測的一種特殊情况,其任務是找到圖像中所有人臉的比特置和大小。
  • 面部特征點檢測:特征點檢測的一種特殊情况,其任務是定比特人臉中的主要特征點。
  • 人臉跟踪:對象跟踪的一種特殊情况,其任務是利用在視頻的連續幀中提取的額外信息,找到視頻中所有移動人臉的比特置和大小。
  • 人臉識別:目標識別的一種特殊情况,其任務是使用從人臉中提取的信息從圖像或視頻中識別或驗證一個人:
    • 人臉識別 (1:N):在已知人臉集合中找到與檢測到的人臉最接近的匹配項
    • 人臉驗證 (1:1):檢查檢測到的人臉是否是其所聲稱的人

如上所述,人臉處理主要包括:人臉檢測面部特征點檢測人臉追踪人臉識別,本文主要關注使用 OpenCVdlibface_recognitioncvlib 庫進行人臉檢測,關於其他人臉處理主題將在後續系列中進行介紹。

2. 安裝人臉處理相關庫

2.1 安裝 dlib

Dlib 是一個包含計算機視覺、機器學習和深度學習算法的 C++ 軟件庫,也可以在 Python 應用程序中使用,安裝 dlib,需要使用以下命令:

pip install dlib

2.2 安裝 face_recognition

face_recognition 是一個强大、簡單、易上手的人臉識別開源項目,為了在 Python 中使用 face_recognition 庫,使用以下命令進行安裝:

pip install face_recognition

2.3 安裝 cvlib

cvlib 一個高級、易用、開源的 Python 計算機視覺庫,要安裝 cvlib 包,首先需要安裝以下依賴庫:numpyopencv-pythonrequestsprogressbarpillowtensorflow 以及 keras
然後,再安裝 cvlib 包:

pip install cvlib

3. 人臉檢測

人臉檢測是確定圖像中人臉的比特置和大小的任務,通常是構建人臉處理應用程序(例如,錶情識別、睡意檢測、性別分類、人臉識別或人機交互等)的基礎,這是由於此類應用程序需要將檢測到的人臉比特置和大小作為輸入。因此,自動人臉檢測起著至關重要的作用,是人工智能學科研究最多的課題之一。
人臉檢測對人類而言並不困難,但對計算機來說通常涉及許多挑戰(例如外觀變化、比例變換、旋轉、面部錶情變換、遮擋或光照條件等)。在本節中,我們將利用 OpenCVdlibface_processing 等提供的流行人臉檢測技術(包括機器學習和深度學習方法)檢測圖像中的人臉。

3.1 使用 OpenCV 進行人臉檢測

OpenCV 提供了兩種人臉檢測方法,包括:

  • 基於 Haar 級聯的人臉檢測器
  • 基於深度學習的人臉檢測器

3.1.1 基於 Haar 級聯的人臉檢測器

OpenCV 中提供了基於 ViolaJones 提出對象檢測框架的人臉檢測算法。此外,該對象檢測框架還可用於檢測其他物體,例如:車牌號或猫臉等。在本節中,我們將使用此框架檢測人臉。
OpenCV 提供了 4 個級聯分類器用於人臉檢測,可以從OpenCV 官方下載這些級聯分類器文件:

  • haarcascade_frontalface_alt.xml (FA1)
  • haarcascade_frontalface_alt2.xml (FA2)
  • haarcascade_frontalface_alt_tree.xml (FAT)
  • haarcascade_frontalface_default.xml (FD)

可以使用不同的數據集評估這些級聯分類器的性能,總的來說這些分類器具有相似的准確率,因此,接下來為了簡化程序,我們僅使用其中的兩個(更具體地說,僅加載級聯分類器 FA2FD),大家也可以選擇其它感興趣的分類器測試其性能。
OpenCV 提供了cv2.CascadeClassifier() 函數用於從文件中加載分類器:

# 加載級聯分類器
# 第一種方法的第一行代碼
cas_alt2 = cv2.CascadeClassifier("haarcascade_frontalface_alt2.xml")
cas_default = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")

接下來,就可以使用 cv2.CascadeClassifier.detectMultiScale() 函數執行檢測了:

# 第一種方法的第二行代碼
# 這樣就完成了第一種方法的介紹了
faces_alt2 = cas_alt2.detectMultiScale(gray)
faces_default = cas_default.detectMultiScale(gray)

cv2.CascadeClassifier.detectMultiScale() 函數檢測對象並將它們作為矩形列錶返回。為了進行可視化,最後編寫 show_detection() 函數進行可視化:

def show_detection(image, faces):
"""在每個檢測到的人臉上繪制一個矩形進行標示"""
for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x + w, y + h), (255, 0, 0), 5)
return image
# 調用 show_detection() 函數標示檢測到的人臉
img_faces_alt2 = show_detection(img.copy(), faces_alt2)
img_faces_default = show_detection(img.copy(), faces_default)

什麼,兩行代碼還覺得麻煩,那麼是時候用一行調用檢測器並檢測人臉了,這就是 OpenCV 提供的 cv2.face.getFacesHAAR() 函數:

# 一行代碼實現基於 Haar 級聯的人臉檢測器,學一送一
retval, faces_haar_alt2 = cv2.face.getFacesHAAR(img, "haarcascade_frontalface_alt2.xml")
retval, faces_haar_default = cv2.face.getFacesHAAR(img, "haarcascade_frontalface_default.xml")

cv2.CascadeClassifier.detectMultiScale() 需要灰度圖像作為輸入,而 cv2.face.getFacesHAAR() 需要 BGR 圖像作為輸入。此外, cv2.CascadeClassifier.detectMultiScale() 將檢測到的人臉輸出為矩形列錶,例如,如果檢測到兩個人臉,則輸出形式如下:

[[809 494 152 152] [168 503 188 188]]

cv2.face.getFacesHAAR() 函數則以以下格式返回檢測到的人臉:

[[[ 809 493 151 151]] [[ 167 503 189 189]]]

因此,如果使用 cv2.face.getFacesHAAR() 函數進行檢測,繪制檢測框時要調用 np.squeeze() 函數消除多餘維度:

faces_haar_alt2 = np.squeeze(faces_haar_alt2)
faces_haar_default = np.squeeze(faces_haar_default)

從加載的圖像,到檢測和繪制人臉的完整代碼如下:

# 可視化函數
def show_img_with_matplotlib(color_img, title, pos):
img_RGB = color_img[:, :, ::-1]
ax = plt.subplot(2, 2, pos)
plt.imshow(img_RGB)
plt.title(title, fontsize=8)
plt.axis('off')
# 加載圖像
img = cv2.imread("test_face_detection.jpg")
# 將 BGR 圖像轉換為灰度圖像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 加載分類器
cas_alt2 = cv2.CascadeClassifier("haarcascade_frontalface_alt2.xml")
cas_default = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
# 檢測人臉
faces_alt2 = cas_alt2.detectMultiScale(gray)
faces_default = cas_default.detectMultiScale(gray)
retval, faces_haar_alt2 = cv2.face.getFacesHAAR(img, "haarcascade_frontalface_alt2.xml")
faces_haar_alt2 = np.squeeze(faces_haar_alt2)
retval, faces_haar_default = cv2.face.getFacesHAAR(img, "haarcascade_frontalface_default.xml")
faces_haar_default = np.squeeze(faces_haar_default)
# 繪制人臉檢測框
img_faces_alt2 = show_detection(img.copy(), faces_alt2)
img_faces_default = show_detection(img.copy(), faces_default)
img_faces_haar_alt2 = show_detection(img.copy(), faces_haar_alt2)
img_faces_haar_default = show_detection(img.copy(), faces_haar_default)
# 可視化
show_img_with_matplotlib(img_faces_alt2, "detectMultiScale(frontalface_alt2): " + str(len(faces_alt2)), 1)
show_img_with_matplotlib(img_faces_default, "detectMultiScale(frontalface_default): " + str(len(faces_default)), 2)
show_img_with_matplotlib(img_faces_haar_alt2, "getFacesHAAR(frontalface_alt2): " + str(len(faces_haar_alt2)), 3)
show_img_with_matplotlib(img_faces_haar_default, "getFacesHAAR(frontalface_default): " + str(len(faces_haar_default)), 4)
plt.show()

程序的輸出如下圖所示:

基於 Haar 級聯的人臉檢測器
如上圖所示,通過使用基於 haar 特征的不同級聯分類器檢測到的人臉會有所不同。最後,還需要說明的是,cv2.CascadeClassifier.detectMultiScale() 函數有 minSizemaxSize 參數,用以設置最小尺寸(小於 minSize 的對象將不被檢測)和最大尺寸(大於 maxSize 的對象將不被檢測到),而 cv2.face.getFacesHAAR() 函數並不提供此參數。

3.1.2 基於深度學習的人臉檢測器

除了基於 Haar 級聯的人臉檢測器外,OpenCV 提供了基於深度學習的人臉檢測器OpenCV 深度神經網絡 (Deep Neural Networks, DNN) 人臉檢測器基於使用 ResNet-10 網絡的 Single Shot MultiBox Detector (SSD) 框架。
OpenCVDNN 模塊,使用流行的深度學習框架(例如 CaffeTensorFlowTorchDarknet )通過預先訓練的深度網絡實現前向計算(即推理階段)。這意味著我們可以使用預訓練的網絡執行完整的前向計算並利用輸出在我們的應用程序中進行預測,而不需要花費數小時來訓練網絡。
接下來,我們預訓練的深度學習人臉檢測器模型執行人臉檢測,使用以下兩種模型:

接下來介紹如何使用預訓練的深度學習人臉檢測器模型來檢測人臉,第一步同樣是是加載預訓練的模型:

# 加載預訓練的模型, Caffe 實現的版本
net = cv2.dnn.readNetFromCaffe("deploy.prototxt", "res10_300x300_ssd_iter_140000_fp16.caffemodel")
# 加載預訓練的模型, Tensorflow 實現的版本
# net = cv2.dnn.readNetFromTensorflow("opencv_face_detector_uint8.pb", "opencv_face_detector.pbtxt")

為了獲得最佳精度,必須分別對藍色、綠色和紅色通道執行 (104, 177, 123) 通道均值减法,並將圖像調整為 300 x 300 的 BGR 圖像,在 OpenCV 中可以通過使用 cv2.dnn.blobFromImage() 函數進行此預處理:

blob = cv2.dnn.blobFromImage(image, 1.0, (300, 300), [104., 117., 123.], False, False)

下一步是將 blob 設置為輸入以獲得結果,對整個網絡執行前向計算以計算輸出:

# 將 blob 設置為輸入並獲取檢測結果
net.setInput(blob)
detections = net.forward()

最後一步是迭代檢測並繪制結果,僅在相應置信度大於最小閾值時才將其可視化:

# 迭代所有檢測結果
for i in range(0, detections.shape[2]):
# 獲取當前檢測結果的置信度
confidence = detections[0, 0, i, 2]
# 如果置信大於最小置信度,則將其可視化
if confidence > 0.7:
detected_faces += 1
# 獲取當前檢測結果的坐標
box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
(startX, startY, endX, endY) = box.astype('int')
# 繪制檢測結果和置信度
text = "{:.3f}%".format(confidence * 100)
y = startY -10 if startY - 10 > 10 else startY + 10
cv2.rectangle(image, (startX, startY), (endX, endY), (255, 0, 0), 3)
cv2.putText(image, text, (startX, y), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 0, 255), 2)
# 可視化
show_img_with_matplotlib(image, "DNN face detector: " + str(detected_faces), 1)
plt.show()

基於深度學習的人臉檢測器的檢測結果如下所示:

基於深度學習的人臉檢測器
從上圖中可以看出,三個正面人臉都可以被兩個深度學習模型高置信度地檢測到。

3.2 使用 dlib 進行人臉檢測

3.2.1 基於 HOG 特征和滑動窗口的人臉檢測器

dlib 中提供了基於方向梯度直方圖 (Histogram of Oriented Gradients, HOG) 特征和滑動窗口檢測方法中的線性分類器,使用基於結構 SVM 的訓練算法用於人臉檢測,分類器能够在每個訓練圖像的所有子窗口中進行訓練,此人臉檢測器使用來自戶外標記人臉 (Labeled Faces in the Wild, LFW) 數據集的 3,000 張圖像進行了訓練。
如需使用 dlib 中的基於 HOG 特征和滑動窗口的人臉檢測器檢測人臉,第一步是從 dlib 加載人臉檢測器:

# 加載人臉檢測器
# 第二種方法的第一行代碼
detector = dlib.get_frontal_face_detector()
# 加載圖像並轉換為灰度圖像
img = cv2.imread('example.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

下一步是執行檢測:

# 執行檢測
# 第二種方法的第二行代碼,至此第二種方法也講解完畢了
rects_1 = detector(gray, 0)
rects_2 = detector(gray, 1)

detector() 的第二個參數錶示在執行檢測過程之前對圖像進行上采樣的次數,因為圖像越大檢測器檢測到更多的人臉的可能性就越高,但執行時間相應也會增加。
最後可視化檢測結果:

def show_detection(image, faces):
for face in faces:
cv2.rectangle(image, (face.left(), face.top()), (face.right(), face.bottom()), (255, 255, 0), 5)
return image
# 繪制檢測框
img_faces_2 = show_detection(img.copy(), rects_2)
img_faces_2 = show_detection(img.copy(), rects_2)
# 繪制圖像
show_img_with_matplotlib(img_faces_1, "detector(gray, 0): " + str(len(rects_1)), 1)
show_img_with_matplotlib(img_faces_2, "detector(gray, 1): " + str(len(rects_2)), 2)
plt.show()

基於 HOG 特征和滑動窗口的人臉檢測器

如上圖所示,如果使用原始灰度圖像 (rects_1 = detection(gray, 0)) 檢測人臉,則只能找到三張人臉。但是,如果我們使用上采樣 1 次的灰度圖像 (rects_2 = detection(gray, 1)) 檢測人臉,則可以正確的檢測到四個人臉。
值得注意的是,該檢測器同樣也可以用於發現人臉以外的目標。可以通過查看 dlib 庫中的 train_object_detector.py 源碼,了解如何僅使用少量訓練圖像訓練自定義對象檢測器。例如,可以僅使用十張交通標志圖像來訓練出色的交通標志檢測器。

3.2.2 基於 CNN 的人臉檢測器

dlib 庫同樣也提供了 CNN 人臉檢測器,可以使用 dlib.cnn_face_detection_model_v1() 創建 CNN 人臉檢測器。 dlib.cnn_face_detection_model_v1() 函數從傳入的文件加載人臉檢測模型,因此首先下載預訓練模型。創建 CNN 人臉檢測器時,將下載完成的預訓練模型傳遞給此方法:

cnn_face_detector = dlib.cnn_face_detection_model_v1("mmod_human_face_detector.dat")

之後,我們使用此檢測器來檢測人臉:

rects = cnn_face_detector(img, 0)

檢測器返回 mmod_rectangles 對象,它是一個 mmod_rectangle 對象的列錶,並且 mmod_rectangle 對象有兩個成員變量—— dlib.rectangle 對象和預測的置信度分數,為了顯示檢測結果,編寫 show_detection() 函數:

def show_detection(image, faces):
"""使用矩形檢測框顯式標示每個檢測到的人臉"""
for face in faces:
cv2.rectangle(image, (face.rect.left(), face.rect.top()), (face.rect.right(), face.rect.bottom()), (255, 255, 0), 5)
return image
# 繪制檢測框
img_faces = show_detection(img.copy(), rects)
# 可視化
show_img_with_matplotlib(img_faces, "cnn_face_detector(img, 0): " + str(len(rects)), 1)
plt.show()

基於 CNN 的人臉檢測器

dlib-CNN 人臉檢測器比 dlib-HOG 人臉檢測器准確得多,但需要更多的算力來運行。例如,對於 600 x 400 的圖像,HOG 人臉檢測器需要大約 0.25 秒,而 CNN 人臉檢測器卻需要大約 5 秒。因此,為了加快 CNN 人臉檢測器的執行速度,則可以通過在含有 GPU 的計算機上啟用 CUDA 以達到合理的速度,但是需要從源碼編譯安裝 dlib

3.3 使用 face_recognition 進行人臉檢測

使用 face_recognition 檢測人臉,僅需要調用 face_locations() 函數:

# 第三種方法需要且僅需要一行代碼
rects_1 = face_recognition.face_locations(rgb, 0, "hog")
rects_2 = face_recognition.face_locations(rgb, 1, "hog")

face_locations() 的第一個參數是輸入圖像 (RGB);第二個參數設置在執行檢測之前對輸入圖像上采樣的次數;第三個參數是要使用的人臉檢測模型。
上述示例使用 hog 檢測模型,此外 face_locations() 也可以配置為使用 cnn 人臉檢測器檢測人臉:

# 使用 cnn 人臉檢測器檢測人臉
rects_1 = face_recognition.face_locations(rgb, 0, "cnn")
rects_2 = face_recognition.face_locations(rgb, 1, "cnn")

最後可視化檢測結果:

def show_detection(image, faces):
for face in faces:
top, right, bottom, left = face
cv2.rectangle(image, (left, top), (right, bottom), (255, 255, 0), 10)
return image
# 顯示檢測結果
img_faces_1 = show_detection(img.copy(), rects_1)
img_faces_2 = show_detection(img.copy(), rects_2)
show_img_with_matplotlib(img_faces_1, "face_locations(rgb, 0, hog): " + str(len(rects_1)), 1)
show_img_with_matplotlib(img_faces_2, "face_locations(rgb, 1, hog): " + str(len(rects_2)), 2)
plt.show()

使用 face_recognition 進行人臉檢測

3.4 使用 cvlib 進行人臉檢測

最後我們介紹 cvlib 包中的人臉檢測算法。cvlib 中提供了 detect_face() 函數用於檢測人臉,在底層,此函數使用 OpenCV DNN 人臉檢測器和預訓練的 Caffe 模型,函數返回所有檢測到的人臉的邊界框和相應的置信度:

import cvlib as cv
# 第四種方法同樣需要且僅需要一行代碼
faces, confidences = cv.detect_face(image)
# 繪制邊界框
def show_detection(image, faces):
for (startX, startY, endX, endY) in faces:
cv2.rectangle(image, (startX, startY), (endX, endY), (255, 0, 0), 3)
return image
# 可視化
img_result = show_detection(img.copy(), faces)
show_img_with_matplotlib(img_result, "cvlib face detector: " + str(len(faces)), 1)
plt.show()

使用 cvlib 進行人臉檢測

小結

本文中我們介紹了人臉處理包含的主要主題,同時介紹了相關庫的安裝,並介紹了利用 OpenCVdlibface_recognitioncvlib 進行人臉檢測的相關方法,在後續的系列中,我們將了解包括人臉識別在內的所有人臉處理主題。

系列鏈接

OpenCV-Python實戰(1)——OpenCV簡介與圖像處理基礎
OpenCV-Python實戰(2)——圖像與視頻文件的處理
OpenCV-Python實戰(3)——OpenCV中繪制圖形與文本
OpenCV-Python實戰(4)——OpenCV常見圖像處理技術
OpenCV-Python實戰(5)——OpenCV圖像運算
OpenCV-Python實戰(6)——OpenCV中的色彩空間和色彩映射
OpenCV-Python實戰(7)——直方圖詳解
OpenCV-Python實戰(8)——直方圖均衡化
OpenCV-Python實戰(9)——OpenCV用於圖像分割的閾值技術
OpenCV-Python實戰(10)——OpenCV輪廓檢測
OpenCV-Python實戰(11)——OpenCV輪廓檢測相關應用
OpenCV-Python實戰(12)——一文詳解AR增强現實
OpenCV-Python實戰(13)——OpenCV與機器學習的碰撞

版权声明
本文为[盼小輝丶]所创,转载请带上原文链接,感谢
https://pythonmana.com/2021/10/20211029010247759j.html

  1. django 自定義中間件如何忽略部分視圖函數
  2. python map函数的使用
  3. python map函數的使用
  4. Utilisation de la fonction de carte Python
  5. 通过对于Arduino或是Python(包括相关库)的使用,结合自己的日常工作,描述相关知识在工作中起到了什么作用。
  6. 2021最全Python接口测试自动化教程【附学习资料】
  7. Python读取配置文件(config.ini),写入配置文件
  8. Python lit le profil (config.ini), écrit le profil
  9. python 两个数据列表匹配查找
  10. python 兩個數據列錶匹配查找
  11. Recherche de correspondance de deux listes de données Python
  12. python循环结构程序编写题目
  13. 【算法学习】1603. 设计停车系统(java / c / c++ / python / go / rust)
  14. Problèmes de programmation de la structure de la boucle Python
  15. 有人能用python写出代码吗wwww
  16. [apprentissage de l'algorithme] 1603. Conception du système de stationnement (Java / C / C + + / python / go / Rust)
  17. Python中if和else,总是显示无效语法是缩进问题吗?是的话可以详细讲解一下吗?
  18. Python的问题,希望有人帮帮忙
  19. Python的問題,希望有人幫幫忙
  20. J'espère que quelqu'un peut m'aider.
  21. Si et autrement en python, est - ce un problème d'indentation d'afficher toujours une syntaxe invalide? Oui, puis - je vous expliquer en détail?
  22. Quelqu'un peut écrire du Code en python?
  23. Dataframe数据,用pandas.to_excel导出成excel问题
  24. Données du cadre de données, en utilisant pandas.to Exporter Excel vers un problème Excel
  25. 请问这个过期的要怎么弄呀,Python是下载的3.10版本的
  26. 請問這個過期的要怎麼弄呀,Python是下載的3.10版本的
  27. Qu'est - ce qu'on fait de ce vieux python?
  28. Python数据处理转置问题??
  29. Problèmes de transposition du traitement des données python??
  30. 使用python的pdfkit把html转pdf时,echarts无法显示
  31. python利用3维的0,1矩阵再matplotlib中画图
  32. Pycham developing Django project template tutorial
  33. Libraries commonly used in Python data analysis
  34. Python utilise une matrice tridimensionnelle 0, 1 pour redessiner les graphiques dans matplotlib
  35. 预备知识-python核心用法常用数据分析库(上)
  36. 預備知識-python核心用法常用數據分析庫(上)
  37. 我在python上创建了个web静态服务器,把一个前端页面,放进去然后在静态服务器上访问只出现了前段页面的代码,代码运行正常,这是怎么回事
  38. Preliminary Knowledge - Python Core use Common Data Analysis Library (ⅰ)
  39. 预备知识-python核心用法常用数据分析库(上)
  40. J'a i créé un serveur Web statique sur Python, j'ai mis une page frontale, j'ai accédé au Code sur le serveur statique qui n'avait que des pages frontales, et le Code fonctionnait correctement
  41. 预备知识-python核心用法常用数据分析库(下)
  42. python 文件排版,怎么控制写入在对应文件的位置(要写吐了,真是服了)
  43. Preliminary Knowledge - Python Core use Common Data Analysis Library (ⅰ)
  44. Typographie de fichiers Python, comment contrôler l'écriture à l'emplacement du fichier correspondant (pour écrire et vomir, vraiment pris)
  45. python:例题求解,不知道怎么等输入完所有数字后再输出
  46. 用python来实现:根据实际查询结果补充完整数据
  47. Mise en œuvre en python: compléter les données complètes en fonction des résultats réels de la requête
  48. python对excel进行分组但不进行聚合统计操作,且输出到不同的表格中?
  49. Python regroupe Excel, mais n'effectue pas de statistiques agrégées, et l'affiche dans différents tableaux.
  50. python如何提交,不要用太复杂的函数
  51. Comment soumettre Python sans utiliser de fonctions trop complexes
  52. Python,数据文件操作问题,想要代码
  53. python 提取多个字符串中的多个字段
  54. python 读入用户输入的一组正整数,到-1结束
  55. Python lit un ensemble d'entiers positifs entrés par l'utilisateur, se terminant par - 1
  56. 测试逐飞的MM32F3277 MicroPython开发板的基本功能
  57. Python timer reference
  58. 关于#python#的问题:python3队列维护
  59. Developing Hongmeng equipment program using python (3-prototype of security system)
  60. Questions sur # # Python #: maintenance de la file d'attente Python 3