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

請輸入評論內容...
請輸入評論/評論長度6~500個字
最新活動更多
推薦專題
- 1 AI 眼鏡讓百萬 APP「集體失業(yè)」?
- 2 大廠紛紛入局,百度、阿里、字節(jié)搶奪Agent話語權
- 3 深度報告|中國AI產業(yè)正在崛起成全球力量,市場潛力和關鍵挑戰(zhàn)有哪些?
- 4 上海跑出80億超級獨角獸:獲上市公司戰(zhàn)投,干人形機器人
- 5 國家數(shù)據(jù)局局長劉烈宏調研格創(chuàng)東智
- 6 下一代入口之戰(zhàn):大廠為何紛紛押注智能體?
- 7 百億AI芯片訂單,瘋狂傾銷中東?
- 8 Robotaxi新消息密集釋放,量產元年誰在領跑?
- 9 格斗大賽出圈!人形機器人致命短板曝光:頭腦過于簡單
- 10 “搶灘”家用機器人領域,聯(lián)通、海爾、美的等紛紛入局