一文了解如何使用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)移到另一種模型。
請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個(gè)字
最新活動(dòng)更多
-
10月31日立即下載>> 【限時(shí)免費(fèi)下載】TE暖通空調(diào)系統(tǒng)高效可靠的組件解決方案
-
即日-11.13立即報(bào)名>>> 【在線會議】多物理場仿真助跑新能源汽車
-
11月28日立即報(bào)名>>> 2024工程師系列—工業(yè)電子技術(shù)在線會議
-
12月19日立即報(bào)名>> 【線下會議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會
-
即日-12.26火熱報(bào)名中>> OFweek2024中國智造CIO在線峰會
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書》
推薦專題
- 1 【一周車話】沒有方向盤和踏板的車,你敢坐嗎?
- 2 特斯拉發(fā)布無人駕駛車,還未迎來“Chatgpt時(shí)刻”
- 3 特斯拉股價(jià)大跌15%:Robotaxi離落地還差一個(gè)蘿卜快跑
- 4 馬斯克給的“驚喜”夠嗎?
- 5 打完“價(jià)格戰(zhàn)”,大模型還要比什么?
- 6 馬斯克致敬“國產(chǎn)蘿卜”?
- 7 神經(jīng)網(wǎng)絡(luò),誰是盈利最強(qiáng)企業(yè)?
- 8 比蘋果偉大100倍!真正改寫人類歷史的智能產(chǎn)品降臨
- 9 諾獎(jiǎng)進(jìn)入“AI時(shí)代”,人類何去何從?
- 10 Open AI融資后成萬億獨(dú)角獸,AI人才之爭開啟
- 高級軟件工程師 廣東省/深圳市
- 自動(dòng)化高級工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市