一文了解如何使用CNN進行圖像分類
介紹
在計算機視覺中,我們有一個卷積神經(jīng)網(wǎng)絡(luò),它非常適用于計算機視覺任務(wù),例如圖像分類、對象檢測、圖像分割等等。
圖像分類是當今時代最需要的技術(shù)之一,它被用于醫(yī)療保健、商業(yè)等各個領(lǐng)域,因此,了解并制作最先進的計算機視覺模型是AI的一個必須的領(lǐng)域。
在本文中,我們將學(xué)習涵蓋CNN 的基礎(chǔ)知識和高級概念,然后我們將構(gòu)建一個模型,使用 Tensorflow 將圖像分類為貓或狗,然后我們將學(xué)習高級計算機視覺,其中將涵蓋遷移學(xué)習以及我們將使用**卷積神經(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é)習的參數(shù)以有效地進行分類、檢測和更多任務(wù)。
我們使用稱為“過濾器”的東西從圖像中提取特征,我們使用不同的過濾器從圖像中提取不同的特征。
讓我們舉個例子,你正在構(gòu)建一個分類模型來檢測圖像是貓還是非貓。因此,我們有不同的過濾器用于從圖像中提取不同的特征,例如在這種情況下,一個過濾器可以學(xué)習檢測貓的眼睛,另一個可以學(xué)習檢測耳朵等。
我們?nèi)绾问褂眠@些過濾器提取信息?
我們使用過濾器和卷積操作來卷積我們的圖像,讓我們通過一些可視化來詳細了解。我們采用圖像(5 x 5),這里我們有灰度圖像,然后采用可學(xué)習的過濾器(3 x3),接著進行卷積操作。
步驟1: 做元素乘積,然后把它加起來,然后填充第一個單元格。[ 4 * 0 + 1 * 2 + 1 * 3 + 0 * 0 + 1 * 1 + 2 * 1 + 3 * 1 + 2 * 0 + 5 * 1 = 16 ]
然后滑動 1 倍,再次做同樣的事情,這就是所謂的卷積操作,只需做元素乘積并將其求和?梢圆榭 GIF 格式的可視化。
你可能會問一個問題,我們?nèi)绾翁幚?RGB 比例或彩色圖像,你必須這樣做:
1) 步幅卷積在上面的例子中,我們用因子 1 滑過我們的圖像,所以為了更快地計算圖像,所以在下面的例子中,我們用因子 2 滑過圖像。
2) 填充在卷積運算中,我們經(jīng)常會丟失一些信息,因此為了保留信息,我們用零填充圖像,然后開始對圖像進行卷積。
3) 池化層為了在保留信息的同時對圖像進行下采樣,我們使用池化層,我們有兩種類型的池化層,即最大池化和平均池化。
在上圖中,我們正在做最大池化,而且如果你想使用平均池化,那么你可以取平均值而不是最大值。
4) 上采樣層為了對圖像進行上采樣或使圖像變大,你可以使用這些類型的圖層,它有時會模糊你的圖像或其他缺點。
5) 了解尺寸在你的圖像被卷積之后,你將如何了解尺寸?這里是計算卷積后圖像尺寸的公式:((n-f+2p)/s) + 1n 是輸入的大小,如果你有一個 32x32x3 的圖像,那么 n 將為 32。f 是過濾器的大小,如果過濾器的大小是 3×3,那么 f 將是 3。p 是填充。s 是你要滑動的系數(shù)對CNN的了解就到此為止,希望大家對CNN有所了解,我們會構(gòu)建一個完整的CNN進行分類。圖像分類圖像分類:它是從圖像中提取信息并對圖像進行標記或分類的過程。有兩種分類:二元分類:在這種類型的分類中,我們的輸出是二進制值 0 或 1,讓我們舉個例子,給你一張貓的圖像,你必須檢測圖像是貓的還是非貓的。多類分類:在這種類型的分類中,我們的輸出將是多類的,讓我們舉個例子,給你一個圖像,你必須在 37 個類中檢測狗的品種。
使用 CNN 構(gòu)建貓狗圖像分類器問題陳述:我們得到一個圖像,我們需要制作一個模型來分類該圖像是貓還是狗。數(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)在,我們將可視化每個類的圖像數(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)準備訓(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)在,我們將準備測試數(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 中實現(xiàn)的完整架構(gòu)。我們將從具有 64 個濾波器的卷積塊開始,內(nèi)核大小為 (3×3),步幅為 2,然后是 relu 激活層。然后我們將以同樣的方式改變過濾器,最后我們添加了 4 個全連接層,因為這是二元分類,所以我們的最后一個激活層是 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é)習遷移學(xué)習背后的基本直覺是,你使用一個預(yù)先訓(xùn)練好的模型,該模型已經(jīng)在更大的數(shù)據(jù)集上訓(xùn)練過,并進行了大量的超參數(shù)調(diào)整,你只需刪除一些層就可以根據(jù)數(shù)據(jù)對這個模型進行微調(diào)。它可以幫助你將知識從一種模型轉(zhuǎn)移到另一種模型。

請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個字
最新活動更多
推薦專題
- 1 UALink規(guī)范發(fā)布:挑戰(zhàn)英偉達AI統(tǒng)治的開始
- 2 北電數(shù)智主辦酒仙橋論壇,探索AI產(chǎn)業(yè)發(fā)展新路徑
- 3 降薪、加班、裁員三重暴擊,“AI四小龍”已折戟兩家
- 4 “AI寒武紀”爆發(fā)至今,五類新物種登上歷史舞臺
- 5 國產(chǎn)智駕迎戰(zhàn)特斯拉FSD,AI含量差幾何?
- 6 光計算迎來商業(yè)化突破,但落地仍需時間
- 7 東陽光:2024年扭虧、一季度凈利大增,液冷疊加具身智能打開成長空間
- 8 地平線自動駕駛方案解讀
- 9 封殺AI“照騙”,“淘寶們”終于不忍了?
- 10 優(yōu)必選:營收大增主靠小件,虧損繼續(xù)又逢關(guān)稅,能否乘機器人東風翻身?