卷积神经网络分类实战:疫情期间戴口罩识别
今天在云創大數據人工智能課程學習了用alexnet做了一個是否戴口罩的二分類問題 ,筆記如下
首先總結幾個重要的知識點:
圖片的數據格式
工業顯示系統均通過RGB(red, green, blue)三色合成色彩, 計算機圖像數據的存儲也是保存RGB三通道的像素圖像, 圖像即三通道的像素值矩陣,矩陣的大小即圖像的分辨率 。比如分辨率為500x400的圖像,儲存為500x400x3的三階數組 。
卷積
卷積就是一種算子,卷積運算將一個矩陣與其同樣的大小的卷積核執行矩陣點乘 。可以實現圖片的提取核壓縮, 本質上也是一個濾波器 。看這個圖就很非常清楚了
補零(pading)和步長可以控制映射后圖片的尺寸 。補零就是四周補充全為0的值,步長控制每次移動的跨度。
池化
池化(Pooling)是卷積神經網絡中的一個重要的概念,它實際上是一種形式的降采樣。有多種不同形式的非線性池化函數,而其中“最大池化(Max pooling)”是最為常見的。它是將輸入的圖像劃分為若干個矩形區域,對每個子區域輸出最大值。直覺上,這種機制能夠有效的原因在于,在發現一個特征之后,它的精確位置遠不及它和其他特征的相對位置的關系重要。池化層會不斷地減小數據的空間大小,因此參數的數量和計算量也會下降,這在一定程度上也控制了過擬合。
Alexnet
Alexnet共有八層, 包括五層卷積層和三層全連接層。
Data->
(layer1) conv1->relu1->LRN1->pooling1->
(layer2)conv2->relu2->LRN2->pooling2->
(layer3)conv3-relu3->
(layer4)conv4-relu4->
(layer5)conv5->relu5->pooling5->
(layer6)fc6->relu6->drop6->
(layer7)fc7->relu7->drop7->
(layer8)fc8
數據集
數據集分類兩類,一類是戴口罩的圖像,一類是不帶口罩的圖像 。分別如下
代碼展示
import os import glob import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers # ----------------------------------------------------------------------------- resize = 224 # 重設大小 total_num = 200 train_num = 160 epochs = 50 batch_size = 10 # ----------------------------------------------------------------------------- dir_data = './01_classify/train/' # 數據路徑 dir_mask = os.path.join(dir_data, 'mask') dir_nomask = os.path.join(dir_data, 'nomask')assert os.path.exists(dir_mask), 'Could not find ' + dir_mask assert os.path.exists(dir_nomask), 'Could not find ' + dir_nomaskfpath_mask = [os.path.abspath(fp) for fp in glob.glob(os.path.join(dir_mask, '*.jpg'))] fpath_nomask = [os.path.abspath(fp) for fp in glob.glob(os.path.join(dir_nomask, '*.jpg'))]num_mask = len(fpath_mask) # 樣本量 num_nomask = len(fpath_nomask)label_mask = [0] * num_mask # 標簽 label_nomask = [1] * num_nomaskprint('#mask: ', num_mask) print('#nomask: ', num_nomask)RATIO_TEST = 0.1 # 測試樣本比列num_mask_test = int(num_mask * RATIO_TEST) num_nomask_test = int(num_nomask * RATIO_TEST)# train fpath_train = fpath_mask[num_mask_test:] + fpath_nomask[num_nomask_test:] label_train = label_mask[num_mask_test:] + label_nomask[num_nomask_test:] # test fpath_test = fpath_mask[:num_mask_test] + fpath_nomask[:num_nomask_test] label_test = label_mask[:num_mask_test] + label_nomask[:num_nomask_test]num_train = len(fpath_train) num_test = len(fpath_test)print(num_train) print(num_test)def preproc(fpath, label): # 讀取圖片image_byte = tf.io.read_file(fpath)image = tf.io.decode_image(image_byte)image_resize = tf.image.resize_with_pad(image, 224, 224)image_norm = tf.cast(image_resize, tf.float32) / 255.label_onehot = tf.one_hot(label, 2)return image_norm, label_onehotdataset_train = tf.data.Dataset.from_tensor_slices((fpath_train, label_train)) dataset_train = dataset_train.shuffle(num_train).repeat() dataset_train = dataset_train.map(preproc, num_parallel_calls=tf.data.experimental.AUTOTUNE) dataset_train = dataset_train.batch(batch_size).prefetch(tf.data.experimental.AUTOTUNE)dataset_test = tf.data.Dataset.from_tensor_slices((fpath_test, label_test)) dataset_test = dataset_test.shuffle(num_test).repeat() dataset_test = dataset_test.map(preproc, num_parallel_calls=tf.data.experimental.AUTOTUNE) dataset_test = dataset_test.batch(batch_size).prefetch(tf.data.experimental.AUTOTUNE) # -----------------------------------------------------------------------------# AlexNet model = keras.Sequential(name='Alexnet') # 搭建模型model.add(layers.Conv2D(filters=96, kernel_size=(11,11),strides=(4,4), padding='valid',input_shape=(resize,resize,3),activation='relu')) model.add(layers.BatchNormalization()) model.add(layers.MaxPooling2D(pool_size=(3,3), strides=(2,2), padding='valid'))model.add(layers.Conv2D(filters=256, kernel_size=(5,5), strides=(1,1), padding='same', activation='relu')) model.add(layers.BatchNormalization()) model.add(layers.MaxPooling2D(pool_size=(3,3), strides=(2,2), padding='valid'))model.add(layers.Conv2D(filters=384, kernel_size=(3,3), strides=(1,1), padding='same', activation='relu')) model.add(layers.Conv2D(filters=384, kernel_size=(3,3), strides=(1,1), padding='same', activation='relu')) model.add(layers.Conv2D(filters=256, kernel_size=(3,3), strides=(1,1), padding='same', activation='relu')) model.add(layers.MaxPooling2D(pool_size=(3,3), strides=(2,2), padding='valid'))model.add(layers.Flatten()) model.add(layers.Dense(4096, activation='relu')) model.add(layers.Dropout(0.5))model.add(layers.Dense(4096, activation='relu')) model.add(layers.Dropout(0.5))model.add(layers.Dense(1000, activation='relu')) model.add(layers.Dropout(0.5))# Output Layer model.add(layers.Dense(2, activation='softmax'))# Training model.compile(loss='categorical_crossentropy', # lossoptimizer='sgd',metrics=['accuracy'])history = model.fit(dataset_train,steps_per_epoch = num_train//batch_size,epochs = epochs,validation_data = dataset_test,validation_steps = num_test//batch_size,verbose = 1)# scores = model.evaluate(train_data, train_label, verbose=1) scores = model.evaluate(dataset_train, steps=num_train//batch_size, verbose=1) print(scores)# scores = model.evaluate(test_data, test_label, verbose=1) scores = model.evaluate(dataset_test, steps=num_test//batch_size, verbose=1) print(scores)model.save('./model/mask.h5') # Record loss and acc history_dict = history.history train_loss = history_dict['loss'] train_accuracy = history_dict['accuracy'] val_loss = history_dict['val_loss'] val_accuracy = history_dict['val_accuracy']模型在訓練
預測
讀取模型并預測,預測下面這張圖片試試
但是如果用測試集測試,模型效果并不好, 對于這個問題而言,可能是訓練數據質量不高,有的是全身圖,有的是側臉圖, 而且數據量較小。
總結
以上是生活随笔為你收集整理的卷积神经网络分类实战:疫情期间戴口罩识别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 普通话智能测试系统软件,普通话智能学习软
- 下一篇: 现在Php、Java、Python横行霸