欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于Python實現(xiàn)口罩佩戴檢測功能

 更新時間:2022年05月23日 09:13:17   作者:biyezuopinvip  
這篇文章主要介紹了基于Python實現(xiàn)的口罩佩戴檢測,在本次實驗中,我們要建立一個目標檢測的模型,可以識別圖中的人是否佩戴了口罩,本文通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧

口罩佩戴檢測

一 題目背景

1.1 實驗介紹

今年一場席卷全球的新型冠狀病毒給人們帶來了沉重的生命財產(chǎn)的損失。有效防御這種傳染病毒的方法就是積極佩戴口罩。我國對此也采取了嚴肅的措施,在公共場合要求人們必須佩戴口罩。在本次實驗中,我們要建立一個目標檢測的模型,可以識別圖中的人是否佩戴了口罩。

1.2 實驗要求

  • 建立深度學習模型,檢測出圖中的人是否佩戴了口罩,并將其盡可能調(diào)整到最佳狀態(tài)。
  • 學習經(jīng)典的模型 MTCNN 和 MobileNet 的結(jié)構(gòu)。
  • 學習訓練時的方法。

1.3 實驗環(huán)境

實驗使用重要python包:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.callbacks import ModelCheckpoint, ReduceLROnPlateau, EarlyStopping

由于擔心平臺GPU時長不夠用,所以在自己電腦上搭建了配套實驗環(huán)境,由于電腦顯卡CUDA版本較老,所以最終本地配置如下:

  • Python: 3.8
  • Tensorflow-GPU: 2.3.0
  • Keras: 2.7.0

1.4 實驗思路

針對目標檢測的任務,可以分為兩個部分:目標識別和位置檢測。通常情況下,特征提取需要由特有的特征提取神經(jīng)網(wǎng)絡來完成,如 VGG、MobileNet、ResNet 等,這些特征提取網(wǎng)絡往往被稱為 Backbone 。而在 BackBone 后面接全連接層***(FC)***就可以執(zhí)行分類任務。但 FC 對目標的位置識別乏力。經(jīng)過算法的發(fā)展,當前主要以特定的功能網(wǎng)絡來代替 FC 的作用,如 Mask-Rcnn、SSD、YOLO 等。我們選擇充分使用已有的人臉檢測的模型,再訓練一個識別口罩的模型,從而提高訓練的開支、增強模型的準確率。

常規(guī)目標檢測:

本次案例:

圖1 實驗口罩佩戴檢測流程

二 實驗內(nèi)容

2.1 已知文件與數(shù)據(jù)集

首先,導入已經(jīng)寫好的python文件并對數(shù)據(jù)集進行處理。

  • image 文件夾:圖片分成兩類,戴口罩的和沒有戴口罩的
  • train.txt: 存放的是 image 文件夾下對應圖片的標簽
  • keras_model_data 文件夾:存放 keras 框架相關預訓練好的模型

2.2 圖片尺寸調(diào)整

將圖片尺寸調(diào)整到網(wǎng)絡輸入的圖片尺寸

2.3 制作訓練時需要用到的批量數(shù)據(jù)集

圖片生成器的主要方法:

  • fit(x, augment=False, rounds=1):計算依賴于數(shù)據(jù)的變換所需要的統(tǒng)計信息(均值方差等)。
  • flow(self, X, y, batch_size=32, shuffle=True, seed=None, save_to_dir=None, save_prefix='', save_format='png'):接收 Numpy 數(shù)組和標簽為參數(shù),生成經(jīng)過數(shù)據(jù)提升或標準化后的 batch 數(shù)據(jù),并在一個無限循環(huán)中不斷的返回 batch 數(shù)據(jù)。
  • flow_from_directory(directory): 以文件夾路徑為參數(shù),會從路徑推測 label,生成經(jīng)過數(shù)據(jù)提升/歸一化后的數(shù)據(jù),在一個無限循環(huán)中無限產(chǎn)生 batch 數(shù)據(jù)。

結(jié)果:

Found 693 images belonging to 2 classes.
Found 76 images belonging to 2 classes.
{'mask': 0, 'nomask': 1}
{0: 'mask', 1: 'nomask'}

2.4 調(diào)用MTCNN

通過搭建 MTCNN 網(wǎng)絡實現(xiàn)人臉檢測

  • keras_py/mtcnn.py 文件是在搭建 MTCNN 網(wǎng)絡。
  • keras_py/face_rec.py 文件是在繪制人臉檢測的矩形框。

這里直接使用現(xiàn)有的表現(xiàn)較好的 MTCNN 的三個權(quán)重文件,它們已經(jīng)保存在datasets/5f680a696ec9b83bb0037081-momodel/data/keras_model_data 文件夾下

2.5 加載預訓練模型MobileNet

# 加載 MobileNet 的預訓練模型權(quán)重
weights_path = basic_path + 'keras_model_data/mobilenet_1_0_224_tf_no_top.h5'

2.6 訓練模型

2.6.1 加載和保存

為了避免訓練過程中遇到斷電等突發(fā)事件,導致模型訓練成果無法保存。我們可以通過 ModelCheckpoint 規(guī)定在固定迭代次數(shù)后保存模型。同時,我們設置在下一次重啟訓練時,會檢查是否有上次訓練好的模型,如果有,就先加載已有的模型權(quán)重。這樣就可以在上次訓練的基礎上繼續(xù)模型的訓練了。

2.6.2 手動調(diào)整學習率

學習率的手動設置可以使模型訓練更加高效。這里我們設置當模型在三輪迭代后,準確率沒有上升,就調(diào)整學習率。

# 學習率下降的方式,acc三次不下降就下降學習率繼續(xù)訓練
reduce_lr = ReduceLROnPlateau(
                        monitor='accuracy',  # 檢測的指標
                        factor=0.5,     # 當acc不下降時將學習率下調(diào)的比例
                        patience=3,     # 檢測輪數(shù)是每隔三輪
                        verbose=2       # 信息展示模式
                    )

2.6.3 早停法

當我們訓練深度學習神經(jīng)網(wǎng)絡的時候通常希望能獲得最好的泛化性能。但是所有的標準深度學習神經(jīng)網(wǎng)絡結(jié)構(gòu)如全連接多層感知機都很容易過擬合。當網(wǎng)絡在訓練集上表現(xiàn)越來越好,錯誤率越來越低的時候,就極有可能出現(xiàn)了過擬合。早停法就是當我們在檢測到這一趨勢后,就停止訓練,這樣能避免繼續(xù)訓練導致過擬合的問題。

early_stopping = EarlyStopping(
                            monitor='val_accuracy',  # 檢測的指標
                            min_delta=0.0001,         # 增大或減小的閾值
                            patience=3,         # 檢測的輪數(shù)頻率
                            verbose=1            # 信息展示的模式
                        )

2.6.4 亂序訓練數(shù)據(jù)

打亂txt的行,這個txt主要用于幫助讀取數(shù)據(jù)來訓練,打亂的數(shù)據(jù)更有利于訓練。

    np.random.seed(10101)
    np.random.shuffle(lines)
    np.random.seed(None)

2.6.5 訓練模型

一次訓練集大小設定為64,優(yōu)化器使用Adam,初始學習率設定為0.001,優(yōu)化目標為accuracy,總的學習輪次設定為20輪。(通過多次實驗測定,在這些參數(shù)條件下,準確率較高)

# 一次的訓練集大小
batch_size = 64
# 編譯模型
model.compile(loss='binary_crossentropy',  # 二分類損失函數(shù)   
              optimizer=Adam(lr=0.001),   # 優(yōu)化器
              metrics=['accuracy'])        # 優(yōu)化目標
# 訓練模型
history = model.fit(train_generator,    
                    epochs=20, # epochs: 整數(shù),數(shù)據(jù)的迭代總輪數(shù)。
                    # 一個epoch包含的步數(shù),通常應該等于你的數(shù)據(jù)集的樣本數(shù)量除以批量大小。
                    steps_per_epoch=637 // batch_size,
                    validation_data=test_generator,
                    validation_steps=70 // batch_size,
                    initial_epoch=0, # 整數(shù)。開始訓練的輪次(有助于恢復之前的訓練)。
                    callbacks=[checkpoint_period, reduce_lr])

三 算法描述

3.1 MTCNN

  • 三階段的級聯(lián)(cascaded)架構(gòu)
  • coarse-to-fine 的方式
  • new online hard sample mining 策略
  • 同時進行人臉檢測和人臉對齊
  • state-of-the-art 性能

圖2 MTCNN架構(gòu)

3.2 MobileNet

圖3 MobileNet架構(gòu)

MobileNet的網(wǎng)絡結(jié)構(gòu)如圖3所示。首先是一個3x3的標準卷積,然后后面就是堆積depthwise separable convolution,并且可以看到其中的部分depthwise convolution會通過strides=2進行down sampling。然后采用average poolingfeature變成1x1,根據(jù)預測類別大小加上全連接層,最后是一個softmax層。

四 求解結(jié)果

最終確定最佳取值為batch_size=64,lr=0.0001,epochs=20,其它參數(shù)如下,連續(xù)訓練兩次,可以獲得最佳結(jié)果。此處僅展示兩個參數(shù)條件下的結(jié)果作為對比

# 一次的訓練集大小
batch_size = 64
# 編譯模型
model.compile(loss='binary_crossentropy',  # 二分類損失函數(shù)   
              optimizer=Adam(lr=0.001),   # 優(yōu)化器
              metrics=['accuracy'])        # 優(yōu)化目標
# 訓練模型
history = model.fit(train_generator,    
                    epochs=20, # epochs: 整數(shù),數(shù)據(jù)的迭代總輪數(shù)。
                    # 一個epoch包含的步數(shù),通常應該等于你的數(shù)據(jù)集的樣本數(shù)量除以批量大小。
                    steps_per_epoch=637 // batch_size,
                    validation_data=test_generator,
                    validation_steps=70 // batch_size,
                    initial_epoch=0, # 整數(shù)。開始訓練的輪次(有助于恢復之前的訓練)。
                    callbacks=[checkpoint_period, reduce_lr])

條件1: 取batch_size=48, lr=0.001epochs=20,對訓練之后的模型進行測試,得到結(jié)果如下:

圖4 條件1 loss曲線

loss曲線可以看出,隨著訓練迭代次數(shù)的加深,驗證集上的損失在逐漸的減小,最終穩(wěn)定在0.2左右;而在訓練集上loss始終在0附近。

圖5 條件1 acc曲線

從驗證集和測試集的準確率變化曲線上可以看出,隨著訓練輪次的增加,驗證集的準確率逐漸上升,最終穩(wěn)定在96%左右,效果還是不錯的。

圖6 條件1 測試樣例1

使用樣例照片進行測試,首先人臉識別部分順利識別到了五張人臉,但是口罩識別部分將一個沒有帶口罩的人識別成了帶著口罩的人,說明還有進步空間,實際錯誤率達到了20%。

圖7 條件1 測試樣例2

另一張樣例照片的測試結(jié)果同樣是人臉識別部分沒有出現(xiàn)問題,正確識別到了四張人臉,但是同樣將一個沒有帶口罩的人識別成了帶有口罩的人。

平臺測試:

后續(xù)通過調(diào)整各項參數(shù)并打亂測試集和訓練集圖片順序來進行了多次實驗,最終確定的最佳狀態(tài)如下:

條件2: 取batch_size=64, lr=0.0001epochs=20,對訓練之后的模型進行測試,得到結(jié)果如下:

圖8 條件2 loss曲線

觀察準確率曲線可以看出,在該條件下,驗證集上的準確率最終穩(wěn)定在98%附近,效果非常的好,說明我們做出的一些優(yōu)化還是具有一定效果的。

圖9 條件2 acc曲線

觀察此條件下的loss曲線可以看到最終驗證集的loss穩(wěn)定在0.2左右,訓練集的loss非常小,基本趨近于0

圖10 條件2 測試樣例1

使用兩張測試樣例對模型進行檢測,第一張圖片所有檢測點均正確,正確識別出了五張人臉并且口罩佩戴檢測均正確,識別正確率100%。

圖11 條件2 測試樣例2

第二章測試樣例上,正確識別出了4張人臉并且口罩佩戴檢測結(jié)果均正確。

兩張測試樣例上所有檢測點檢測結(jié)果均正確,說明在此參數(shù)條件下,模型識別效果較好,達到了口罩佩戴檢測的要求。

平臺測試:

條件3:

使用更多測試樣例發(fā)現(xiàn)MTCNN人臉識別部分存在不能正確識別人臉的問題,故通過多次實驗和測試,修改了mask_rec()的門限函數(shù)權(quán)重self.threshold,由原來的self.threshold = [0.5,0.6,0.8] 修改為self.threshold = [0.4,0.15,0.65]

在本地使用更多自選圖片進行測試,發(fā)現(xiàn)人臉識別準確率有所提升。在條件2訓練參數(shù)不變的情況下,使用同一模型進行平臺測試,結(jié)果如下:

平臺測試成績有所提升。

條件4:

繼續(xù)調(diào)整mask_rec()的門限函數(shù)權(quán)重self.threshold,通過系統(tǒng)測試反饋來決定門限函數(shù)的權(quán)重,通過多次測試,由原來的self.threshold = [0.4,0.15,0.65] 修改為self.threshold = [0.4,0.6,0.65]

平臺測試,結(jié)果如下:

平臺測試成績有所提升,達到95分。

為了達到條件4所展示的效果,對門限函數(shù)的數(shù)值進行了大量的嘗試,根據(jù)提交測試的反饋結(jié)果,最終確定數(shù)值為條件4時,可以達到最優(yōu)。由于不知道后臺測試圖片是什么且沒有反饋數(shù)據(jù),所以最終再次修改人臉識別的門限函數(shù)或者修改參數(shù)重新訓練口罩識別模型依舊沒有提升。

五 比較分析

驗證集準確率測試樣例結(jié)果平臺成績
條件196%7/977.5
條件298%9/988.33333334
條件398%9/990
條件498%9/995

最終通過不斷調(diào)試與優(yōu)化算法,得到了95分的平臺成績。

六 心得與感想

本次實驗過程中主要使用了keras方法進行訓練,由于初次使用這些方法,所以前期實現(xiàn)的過程相對困難。最初我想通過調(diào)用GPU資源來進行訓練,所以給自己的電腦配套安裝了tensorflow-gpu、CUDA等等配套的軟件和包,由于個人電腦的顯卡版本較老,所以安裝的過程也是非常的曲折。好在最終安裝好了所有的東西,但是由于顯卡顯存比較小,所以bath_size大小一直上不去,最大只能給到32,不過影響也不大。調(diào)整參數(shù)的過程花費了很多的時間,優(yōu)化算法也花費了很多的時間。之后又對門限函數(shù)進行了修改,雖然過程非常的辛苦,但最終的結(jié)果還是很不錯的,最終整體達到95分,在兩張給定的測試樣例上所有檢測點都是正確的,由于不知道平臺的五張檢測照片是什么,所以不知道到底出錯在哪里,希望之后平臺可以反饋一些修改意見~??偟膩碚f在過程中收獲還是很大的,受益匪淺。

訓練源代碼:

import warnings
# 忽視警告
warnings.filterwarnings('ignore')
import os
import matplotlib
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.callbacks import ModelCheckpoint, ReduceLROnPlateau, EarlyStopping
from tensorflow.keras.applications.imagenet_utils import preprocess_input
from tensorflow.keras import backend as K
from tensorflow.keras.optimizers import Adam
K.image_data_format() == 'channels_last'
from keras_py.utils import get_random_data
from keras_py.face_rec import mask_rec
from keras_py.face_rec import face_rec
from keras_py.mobileNet import MobileNet
from tensorflow.keras.preprocessing.image import ImageDataGenerator
# 數(shù)據(jù)集路徑
basic_path = "./datasets/5f680a696ec9b83bb0037081-momodel/data/"

def letterbox_image(image, size):  # 調(diào)整圖片尺寸,返回經(jīng)過調(diào)整的照片
    new_image = cv.resize(image, size, interpolation=cv.INTER_AREA)
    return new_image
read_img = cv.imread("test1.jpg")
print("調(diào)整前圖片的尺寸:", read_img.shape)
read_img = letterbox_image(image=read_img, size=(50, 50))
print("調(diào)整前圖片的尺寸:", read_img.shape)

def processing_data(data_path, height, width, batch_size=32, test_split=0.1):  # 數(shù)據(jù)處理,batch_size默認大小為32

    train_data = ImageDataGenerator(
            # 對圖片的每個像素值均乘上這個放縮因子,把像素值放縮到0和1之間有利于模型的收斂
            rescale=1. / 255,  
            # 浮點數(shù),剪切強度(逆時針方向的剪切變換角度)
            shear_range=0.1,  
            # 隨機縮放的幅度,若為浮點數(shù),則相當于[lower,upper] = [1 - zoom_range, 1+zoom_range]
            zoom_range=0.1,
            # 浮點數(shù),圖片寬度的某個比例,數(shù)據(jù)提升時圖片水平偏移的幅度
            width_shift_range=0.1,
            # 浮點數(shù),圖片高度的某個比例,數(shù)據(jù)提升時圖片豎直偏移的幅度
            height_shift_range=0.1,
            # 布爾值,進行隨機水平翻轉(zhuǎn)
            horizontal_flip=True,
            # 布爾值,進行隨機豎直翻轉(zhuǎn)
            vertical_flip=True,
            # 在 0 和 1 之間浮動。用作驗證集的訓練數(shù)據(jù)的比例
            validation_split=test_split  
    )

    # 接下來生成測試集,可以參考訓練集的寫法
    test_data = ImageDataGenerator(
            rescale=1. / 255,
            validation_split=test_split)

    train_generator = train_data.flow_from_directory(
            # 提供的路徑下面需要有子目錄
            data_path, 
            # 整數(shù)元組 (height, width),默認:(256, 256)。 所有的圖像將被調(diào)整到的尺寸。
            target_size=(height, width),
            # 一批數(shù)據(jù)的大小
            batch_size=batch_size,
            # "categorical", "binary", "sparse", "input" 或 None 之一。
            # 默認:"categorical",返回one-hot 編碼標簽。
            class_mode='categorical',
            # 數(shù)據(jù)子集 ("training" 或 "validation")
            subset='training', 
            seed=0)
    test_generator = test_data.flow_from_directory(
            data_path,
            target_size=(height, width),
            batch_size=batch_size,
            class_mode='categorical',
            subset='validation',
            seed=0)

    return train_generator, test_generator
# 數(shù)據(jù)路徑
data_path = basic_path + 'image'

# 圖像數(shù)據(jù)的行數(shù)和列數(shù)
height, width = 160, 160

# 獲取訓練數(shù)據(jù)和驗證數(shù)據(jù)集
train_generator, test_generator = processing_data(data_path, height, width)

# 通過屬性class_indices可獲得文件夾名與類的序號的對應字典。
labels = train_generator.class_indices
print(labels)

# 轉(zhuǎn)換為類的序號與文件夾名對應的字典
labels = dict((v, k) for k, v in labels.items())
print(labels)
pnet_path = "./datasets/5f680a696ec9b83bb0037081-momodel/data/keras_model_data/pnet.h5"
rnet_path = "./datasets/5f680a696ec9b83bb0037081-momodel/data/keras_model_data/rnet.h5"
onet_path = "./datasets/5f680a696ec9b83bb0037081-momodel/data/keras_model_data/onet.h5"

# 加載 MobileNet 的預訓練模型權(quán)重
weights_path = basic_path + 'keras_model_data/mobilenet_1_0_224_tf_no_top.h5'
# 圖像數(shù)據(jù)的行數(shù)和列數(shù)
height, width = 160, 160
model = MobileNet(input_shape=[height,width,3],classes=2)
model.load_weights(weights_path,by_name=True)
print('加載完成...')
def save_model(model, checkpoint_save_path, model_dir):  # 保存模型

    if os.path.exists(checkpoint_save_path):
        print("模型加載中")
        model.load_weights(checkpoint_save_path)
        print("模型加載完畢")
    checkpoint_period = ModelCheckpoint(
        # 模型存儲路徑
        model_dir + 'ep{epoch:03d}-loss{loss:.3f}-val_loss{val_loss:.3f}.h5',
        # 檢測的指標
        monitor='val_acc',
        # ‘a(chǎn)uto',‘min',‘max'中選擇
        mode='max',
        # 是否只存儲模型權(quán)重
        save_weights_only=False,
        # 是否只保存最優(yōu)的模型
        save_best_only=True,
        # 檢測的輪數(shù)是每隔2輪
        period=2
    )
    return checkpoint_period
checkpoint_save_path = "./results/last_one88.h5"
model_dir = "./results/"
checkpoint_period = save_model(model, checkpoint_save_path, model_dir)
# 學習率下降的方式,acc三次不下降就下降學習率繼續(xù)訓練
reduce_lr = ReduceLROnPlateau(
                        monitor='accuracy',  # 檢測的指標
                        factor=0.5,     # 當acc不下降時將學習率下調(diào)的比例
                        patience=3,     # 檢測輪數(shù)是每隔三輪
                        verbose=2       # 信息展示模式
                    )
early_stopping = EarlyStopping(
                            monitor='val_accuracy',  # 檢測的指標
                            min_delta=0.0001,         # 增大或減小的閾值
                            patience=3,         # 檢測的輪數(shù)頻率
                            verbose=1            # 信息展示的模式
                        )
# 一次的訓練集大小
batch_size = 64
# 圖片數(shù)據(jù)路徑
data_path = basic_path + 'image'
# 圖片處理
train_generator, test_generator = processing_data(data_path, height=160, width=160, batch_size=batch_size, test_split=0.1)
# 編譯模型
model.compile(loss='binary_crossentropy',  # 二分類損失函數(shù)   
              optimizer=Adam(lr=0.001),   # 優(yōu)化器
              metrics=['accuracy'])        # 優(yōu)化目標
# 訓練模型
history = model.fit(train_generator,    
                    epochs=20, # epochs: 整數(shù),數(shù)據(jù)的迭代總輪數(shù)。
                    # 一個epoch包含的步數(shù),通常應該等于你的數(shù)據(jù)集的樣本數(shù)量除以批量大小。
                    steps_per_epoch=637 // batch_size,
                    validation_data=test_generator,
                    validation_steps=70 // batch_size,
                    initial_epoch=0, # 整數(shù)。開始訓練的輪次(有助于恢復之前的訓練)。
                    callbacks=[checkpoint_period, reduce_lr])
# 保存模型
model.save_weights(model_dir + 'temp.h5')
plt.plot(history.history['loss'],label = 'train_loss')
plt.plot(history.history['val_loss'],'r',label = 'val_loss')
plt.legend()
plt.show()

plt.plot(history.history['accuracy'],label = 'acc')
plt.plot(history.history['val_accuracy'],'r',label = 'val_acc')
plt.legend()
plt.show()

到此這篇關于基于Python實現(xiàn)的口罩佩戴檢測的文章就介紹到這了,更多相關python口罩佩戴檢測內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Python中關鍵字global和nonlocal的區(qū)別詳解

    Python中關鍵字global和nonlocal的區(qū)別詳解

    這篇文章主要給大家介紹了關于Python中關鍵字global和nonlocal的區(qū)別的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-09-09
  • Ubuntu下安裝PyV8

    Ubuntu下安裝PyV8

    本文給大家簡單介紹了下在ubuntu下安裝pyv8的方法和注意事項,非常的實用,有需要的小伙伴可以參考下
    2016-03-03
  • Python+Opencv實現(xiàn)表格邊框線檢測

    Python+Opencv實現(xiàn)表格邊框線檢測

    Python數(shù)據(jù)開發(fā)工作時偶爾會要求對圖片做邊框線檢查和圖片中的直線,本文為大家整理了相關的實現(xiàn)方法,非常實用,建議有需要的小伙伴收藏一下
    2023-05-05
  • Python分布式異步任務框架Celery使用教程

    Python分布式異步任務框架Celery使用教程

    Celery 是由Python 編寫的簡單,靈活,可靠的用來處理大量信息的分布式系統(tǒng),它同時提供操作和維護分布式系統(tǒng)所需的工具
    2023-05-05
  • 如何使用python批量修改文本文件編碼格式

    如何使用python批量修改文本文件編碼格式

    把文本文件的編碼格式進行批量幻化,比如ascii, gb2312, utf8等,相互轉(zhuǎn)化,字符集的大小來看,utf8>gb2312>ascii,因此最好把gb2312轉(zhuǎn)為utf8,否則容易出現(xiàn)亂碼,這篇文章主要介紹了如何使用python批量修改文本文件編碼格式,需要的朋友可以參考下
    2023-03-03
  • Python提取頻域特征知識點淺析

    Python提取頻域特征知識點淺析

    在本文里我們給大家分享了關于Python提取頻域特征的相關知識點以及基礎內(nèi)容,需要的朋友們跟著學習下。
    2019-03-03
  • 最新評論