訂閱
糾錯(cuò)
加入自媒體

一文了解如何使用CNN進(jìn)行圖像分類(lèi)

介紹

計(jì)算機(jī)視覺(jué)中,我們有一個(gè)卷積神經(jīng)網(wǎng)絡(luò),它非常適用于計(jì)算機(jī)視覺(jué)任務(wù),例如圖像分類(lèi)、對(duì)象檢測(cè)、圖像分割等等。

圖像分類(lèi)是當(dāng)今時(shí)代最需要的技術(shù)之一,它被用于醫(yī)療保健、商業(yè)等各個(gè)領(lǐng)域,因此,了解并制作最先進(jìn)的計(jì)算機(jī)視覺(jué)模型是AI的一個(gè)必須的領(lǐng)域。

在本文中,我們將學(xué)習(xí)涵蓋CNN 的基礎(chǔ)知識(shí)和高級(jí)概念,然后我們將構(gòu)建一個(gè)模型,使用 Tensorflow 將圖像分類(lèi)為貓或狗,然后我們將學(xué)習(xí)高級(jí)計(jì)算機(jī)視覺(jué),其中將涵蓋遷移學(xué)習(xí)以及我們將使用**卷積神經(jīng)網(wǎng)絡(luò) (CNN)**構(gòu)建多圖像分類(lèi)器。

卷積神經(jīng)網(wǎng)絡(luò)

卷積神經(jīng)網(wǎng)絡(luò) (CNN)是一種用于處理圖像的神經(jīng)網(wǎng)絡(luò),這種類(lèi)型的神經(jīng)網(wǎng)絡(luò)從圖像中獲取輸入并從圖像中提取特征,并提供可學(xué)習(xí)的參數(shù)以有效地進(jìn)行分類(lèi)、檢測(cè)和更多任務(wù)。

我們使用稱(chēng)為“過(guò)濾器”的東西從圖像中提取特征,我們使用不同的過(guò)濾器從圖像中提取不同的特征。

讓我們舉個(gè)例子,你正在構(gòu)建一個(gè)分類(lèi)模型來(lái)檢測(cè)圖像是貓還是非貓。因此,我們有不同的過(guò)濾器用于從圖像中提取不同的特征,例如在這種情況下,一個(gè)過(guò)濾器可以學(xué)習(xí)檢測(cè)貓的眼睛,另一個(gè)可以學(xué)習(xí)檢測(cè)耳朵等。

我們?nèi)绾问褂眠@些過(guò)濾器提取信息?

我們使用過(guò)濾器和卷積操作來(lái)卷積我們的圖像,讓我們通過(guò)一些可視化來(lái)詳細(xì)了解。我們采用圖像(5 x 5),這里我們有灰度圖像,然后采用可學(xué)習(xí)的過(guò)濾器(3 x3),接著進(jìn)行卷積操作。

步驟1: 做元素乘積,然后把它加起來(lái),然后填充第一個(gè)單元格。[ 4 * 0 + 1 * 2 + 1 * 3 + 0 * 0 + 1 * 1 + 2 * 1 + 3 * 1 + 2 * 0 + 5 * 1 = 16 ]

然后滑動(dòng) 1 倍,再次做同樣的事情,這就是所謂的卷積操作,只需做元素乘積并將其求和?梢圆榭 GIF 格式的可視化。

你可能會(huì)問(wèn)一個(gè)問(wèn)題,我們?nèi)绾翁幚?RGB 比例或彩色圖像,你必須這樣做:

1) 步幅卷積在上面的例子中,我們用因子 1 滑過(guò)我們的圖像,所以為了更快地計(jì)算圖像,所以在下面的例子中,我們用因子 2 滑過(guò)圖像。

2) 填充在卷積運(yùn)算中,我們經(jīng)常會(huì)丟失一些信息,因此為了保留信息,我們用零填充圖像,然后開(kāi)始對(duì)圖像進(jìn)行卷積。

3) 池化層為了在保留信息的同時(shí)對(duì)圖像進(jìn)行下采樣,我們使用池化層,我們有兩種類(lèi)型的池化層,即最大池化和平均池化。

在上圖中,我們正在做最大池化,而且如果你想使用平均池化,那么你可以取平均值而不是最大值。

4) 上采樣層為了對(duì)圖像進(jìn)行上采樣或使圖像變大,你可以使用這些類(lèi)型的圖層,它有時(shí)會(huì)模糊你的圖像或其他缺點(diǎn)。

5) 了解尺寸在你的圖像被卷積之后,你將如何了解尺寸?這里是計(jì)算卷積后圖像尺寸的公式:((n-f+2p)/s) + 1n 是輸入的大小,如果你有一個(gè) 32x32x3 的圖像,那么 n 將為 32。f 是過(guò)濾器的大小,如果過(guò)濾器的大小是 3×3,那么 f 將是 3。p 是填充。s 是你要滑動(dòng)的系數(shù)對(duì)CNN的了解就到此為止,希望大家對(duì)CNN有所了解,我們會(huì)構(gòu)建一個(gè)完整的CNN進(jìn)行分類(lèi)。圖像分類(lèi)圖像分類(lèi):它是從圖像中提取信息并對(duì)圖像進(jìn)行標(biāo)記或分類(lèi)的過(guò)程。有兩種分類(lèi):二元分類(lèi):在這種類(lèi)型的分類(lèi)中,我們的輸出是二進(jìn)制值 0 或 1,讓我們舉個(gè)例子,給你一張貓的圖像,你必須檢測(cè)圖像是貓的還是非貓的。多類(lèi)分類(lèi):在這種類(lèi)型的分類(lèi)中,我們的輸出將是多類(lèi)的,讓我們舉個(gè)例子,給你一個(gè)圖像,你必須在 37 個(gè)類(lèi)中檢測(cè)狗的品種。

使用 CNN 構(gòu)建貓狗圖像分類(lèi)器問(wèn)題陳述:我們得到一個(gè)圖像,我們需要制作一個(gè)模型來(lái)分類(lèi)該圖像是貓還是狗。數(shù)據(jù)集:我正在使用來(lái)自 kaggle 的貓和狗數(shù)據(jù)集,你可以找到鏈接。方法:Github鏈接:步驟1)導(dǎo)入必要的庫(kù)import numpy as np 

import pandas as pd  
import os
from pathlib import Path
import glob
import seaborn as sns
import matplotlib.pyplot as plt
import tensorflow as tf  
from tensorflow.keras import layers
from tensorflow.keras import Model  
from tensorflow.keras.optimizers import RMSprop
from keras_preprocessing.image import ImageDataGenerator
步驟2) 加載數(shù)據(jù)和基本 EDAdata_dir = Path('../input/cat-and-dog') # data directory
train_dir = data_dir / "training_set/training_set"
test_dir = data_dir / "test_set/test_set"
cat_samples_dir_train = train_dir / "cats" # directory for cats images
dog_samples_dir_train = train_dir / "dogs" # directory for dogs images
def make_csv_with_image_labels(CATS_PATH, DOGS_PATH):  
   '''
   Function for making a dataframe that contains images path as well as their labels.
   Parameters:-
    - CATS_PATH - Path for Cats  Images  
    - DOGS_PATH - Path for Dogs Images
   Output:-
   It simply returns dataframe  
   '''
   cat_images = CATS_PATH.glob('*.jpg')
   dog_images = DOGS_PATH.glob('*.jpg')
   df = []
   for i in cat_images:
       df.a(chǎn)ppend((i, 0)) # appending cat images as 0
   for j in dog_images:
       df.a(chǎn)ppend((i, 1)) # appending dog images as 0
   df = pd.DataFrame(df, columns=["image_path", "label"], index = None) # converting into dataframe
   df = df.sample(frac = 1).reset_index(drop=True)
   return df  
train_csv = make_csv_with_image_labels(cat_samples_dir_train,dog_samples_dir_train)
train_csv.head()
現(xiàn)在,我們將可視化每個(gè)類(lèi)的圖像數(shù)量。len_cat = len(train_csv["label"][train_csv.label == 0])
len_dog = len(train_csv["label"][train_csv.label == 1])
arr = np.a(chǎn)rray([len_cat , len_dog])
labels = ['CAT', 'DOG']
print("Total No. Of CAT Samples :- ", len_cat)
print("Total No. Of DOG Samples :- ", len_dog)
plt.pie(arr, labels=labels, explode = [0.2,0.0] , shadow=True)
plt.show()

步驟3)準(zhǔn)備訓(xùn)練和測(cè)試數(shù)據(jù)def get_train_generator(train_dir, batch_size=64, target_size=(224, 224)):  
   '''
   Function for preparing training data
   '''
   train_datagen = ImageDataGenerator(rescale = 1./255., # normalizing the image
                                  rotation_range = 40,
                                  width_shift_range = 0.2,
                                  height_shift_range = 0.2,
                                  shear_range = 0.2,
                                  zoom_range = 0.2,
                                  horizontal_flip = True)
   train_generator = train_datagen.flow_from_directory(train_dir,
                                                   batch_size = batch_size,
                                                   color_mode='rgb',
                                                   class_mode = 'binary',
                                                   target_size = target_size)  
   return train_generator  
train_generator = get_train_generator(train_dir)
Output :- Found 8005 images belonging to 2 classes.
現(xiàn)在,我們將準(zhǔn)備測(cè)試數(shù)據(jù),def get_testgenerator(test_dir,batch_size=64, target_size=(224,224)):
   '''
   Function for preparing testing data
   '''
   test_datagen = ImageDataGenerator( rescale = 1.0/255. )
   test_generator  =  test_datagen.flow_from_directory(test_dir,
                                                         batch_size  = batch_size,
                                                         color_mode='rgb',
                                                         class_mode  = 'binary',
                                                         target_size = target_size)
   return test_generator
test_generator = get_testgenerator(test_dir)
Output:- Found 2023 images belonging to 2 classes.
步驟4)構(gòu)建模型現(xiàn)在,我們將開(kāi)始構(gòu)建我們的模型,下面是在 Tensorflow 中實(shí)現(xiàn)的完整架構(gòu)。我們將從具有 64 個(gè)濾波器的卷積塊開(kāi)始,內(nèi)核大小為 (3×3),步幅為 2,然后是 relu 激活層。然后我們將以同樣的方式改變過(guò)濾器,最后我們添加了 4 個(gè)全連接層,因?yàn)檫@是二元分類(lèi),所以我們的最后一個(gè)激活層是 sigmoid。model = tf.keras.Sequential([
   layers.Conv2D(64, (3,3), strides=(2,2),padding='same',input_shape= (224,224,3),activation = 'relu'),
   layers.MaxPool2D(2,2),
   layers.Conv2D(128, (3,3), strides=(2,2),padding='same',activation = 'relu'),
   layers.MaxPool2D(2,2),
   layers.Conv2D(256, (3,3), strides=(2,2),padding='same',activation = 'relu'),
   layers.MaxPool2D(2,2),  
   layers.Flatten(),
   layers.Dense(158, activation ='relu'),
   layers.Dense(256, activation = 'relu'),
   layers.Dense(128, activation = 'relu'),
   layers.Dense(1, activation = 'sigmoid'),
])
model.summary()

構(gòu)建模型步驟5)編譯和訓(xùn)練模型model.compile(optimizer=RMSprop(lr=0.001), loss='binary_crossentropy', metrics=['acc'])
history = model.fit_generator(train_generator,
                             epochs=15,
                             verbose=1,
                             validation_data=test_generator)

編譯和訓(xùn)練模型步驟6)評(píng)估模型import matplotlib.image  as mpimg
import matplotlib.pyplot as plt
acc=history.history['acc']
val_acc=history.history['val_acc']
loss=history.history['loss']
val_loss=history.history['val_loss']
epochs=range(len(acc))
plt.plot(epochs, acc, 'r', "Training Accuracy")
plt.plot(epochs, val_acc, 'b', "Validation Accuracy")
plt.title('Training and validation accuracy')
plt.figure()
plt.plot(epochs, loss, 'r', "Training Loss")
plt.plot(epochs, val_loss, 'b', "Validation Loss")
plt.title('Training and validation loss')
model.save('my_model.h5') # saving the trained model
new_model = tf.keras.models.load_model('./my_model.h5') # loading the trained model

遷移學(xué)習(xí)遷移學(xué)習(xí)背后的基本直覺(jué)是,你使用一個(gè)預(yù)先訓(xùn)練好的模型,該模型已經(jīng)在更大的數(shù)據(jù)集上訓(xùn)練過(guò),并進(jìn)行了大量的超參數(shù)調(diào)整,你只需刪除一些層就可以根據(jù)數(shù)據(jù)對(duì)這個(gè)模型進(jìn)行微調(diào)。它可以幫助你將知識(shí)從一種模型轉(zhuǎn)移到另一種模型。

聲明: 本文由入駐維科號(hào)的作者撰寫(xiě),觀點(diǎn)僅代表作者本人,不代表OFweek立場(chǎng)。如有侵權(quán)或其他問(wèn)題,請(qǐng)聯(lián)系舉報(bào)。

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字

您提交的評(píng)論過(guò)于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無(wú)評(píng)論

暫無(wú)評(píng)論

人工智能 獵頭職位 更多
掃碼關(guān)注公眾號(hào)
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯(cuò)
x
*文字標(biāo)題:
*糾錯(cuò)內(nèi)容:
聯(lián)系郵箱:
*驗(yàn) 證 碼:

粵公網(wǎng)安備 44030502002758號(hào)