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

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

介紹

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

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

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

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

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

我們使用稱為“過濾器”的東西從圖像中提取特征,我們使用不同的過濾器從圖像中提取不同的特征。

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

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

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

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

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

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

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

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

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

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

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

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

使用 CNN 構(gòu)建貓狗圖像分類器問題陳述:我們得到一個(gè)圖像,我們需要制作一個(gè)模型來分類該圖像是貓還是狗。數(shù)據(jù)集:我正在使用來自 kaggle 的貓和狗數(shù)據(jù)集,你可以找到鏈接。方法:Github鏈接:步驟1)導(dǎo)入必要的庫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è)類的圖像數(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)練和測試數(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)備測試數(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)在,我們將開始構(gòu)建我們的模型,下面是在 Tensorflow 中實(shí)現(xiàn)的完整架構(gòu)。我們將從具有 64 個(gè)濾波器的卷積塊開始,內(nèi)核大小為 (3×3),步幅為 2,然后是 relu 激活層。然后我們將以同樣的方式改變過濾器,最后我們添加了 4 個(gè)全連接層,因?yàn)檫@是二元分類,所以我們的最后一個(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)評估模型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í)背后的基本直覺是,你使用一個(gè)預(yù)先訓(xùn)練好的模型,該模型已經(jīng)在更大的數(shù)據(jù)集上訓(xùn)練過,并進(jìn)行了大量的超參數(shù)調(diào)整,你只需刪除一些層就可以根據(jù)數(shù)據(jù)對這個(gè)模型進(jìn)行微調(diào)。它可以幫助你將知識從一種模型轉(zhuǎn)移到另一種模型。

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

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

請輸入評論/評論長度6~500個(gè)字

您提交的評論過于頻繁,請輸入驗(yàn)證碼繼續(xù)

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

暫無評論

暫無評論

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

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