基于卷積神經(jīng)網(wǎng)絡(CNN)的仙人掌圖像分類
點擊上方“小白學視覺”,選擇加"星標"或“置頂”
重磅干貨,第一時間送達
今天我們的目標是建立一個分類器,將圖像分類為“仙人掌”或“非仙人掌”。


這種分類問題是kaggle挑戰(zhàn)的內(nèi)容之一。目標是建立一個分類器,將圖像分類為“仙人掌”或“非仙人掌”。訓練集包含17500張圖像,而驗證集包含4000張圖像。具有仙人掌跡象的圖像位于名為cactus的文件夾中,反之亦然。以下是訓練數(shù)據(jù)集中的示例。

仙人掌

沒有仙人掌
當我們通過用pyplot庫繪制其中一些圖像時,我們可以觀察到它們的大小不同,這對于以后的訓練過程是不利的。另請注意,我們已用指示仙人掌和非仙人掌的1和0標記了所有圖像。

因此,我們需要將所有圖像規(guī)格化為相同大小。根據(jù)我們的實驗,最佳策略是將這些圖像裁剪為48 x 48像素大小。以下是一些裁剪的圖像。第一行顯示原始圖像,第二行顯示更改的圖像。

這種方法的好處是它可以保存圖像的所有細節(jié),但是有時會丟失圖像的邊緣,如果圖像太小,我們需要使用黑色背景擴展圖像以使其與圖像的大小相同。丟失邊緣可能是一個大問題,因為我們可能會把仙人掌從原圖像中切除了。
卷積神經(jīng)網(wǎng)絡包含3層卷積層和2個完全連接層。每個卷積層都有一個3 x 3的濾波器,該濾波器的步幅為2,輸出為64個節(jié)點。之后,數(shù)據(jù)會通過最大池化層,以防止過度擬合并提取有用的信息。
model = Sequential()model.add(Conv2D(64, (3,3), input_shape = X_train.shape[1:]))model.add(Activation(‘relu’))model.add(MaxPooling2D(pool_size=(2,2)))model.add(Conv2D(64, (3,3)))model.add(Activation(‘relu’))model.add(MaxPooling2D(pool_size=(2,2)))model.add(Conv2D(64, (3,3)))model.add(Activation(‘relu’))model.add(MaxPooling2D(pool_size=(2,2)))model.add(Flatten())model.add(Dense(64))model.add(Dense(1))model.add(Activation(‘sigmoid’))model.compile(loss=”binary_crossentropy”,optimizer=”adam”,metrics=[‘a(chǎn)ccuracy’])history = model.fit(X_train, Y_train, batch_size=32, epochs=10, validation_split=0.1, use_multiprocessing=True)model.save(‘model_48_crop’)
以下是模型結構的概述。

模型總結
我們用10個epochs對模型進行訓練,結果顯示出驚人的效果。在下面的代碼段中,第一個精度是訓練精度,第二個精度是驗證精度。請注意,在最終預測之前,我們將訓練集的一部分(10%)用作驗證集。

現(xiàn)在,我們使用kaggle提供的validation_set作為測試集,以對我們的訓練模型進行最終預測。
testdata = pd.read_pickle(“pickled_data_validation/crop_images(48, 48).pkl”)test_images = testdata.loc[:, data.columns != ‘class’]test_images = test_images.to_numpy()test_images = test_images.reshape((len(test_images),48, 48, 3))test_images = test_images/255.0print(test_images.shape)test_labels = testdata[‘class’]test_labels = test_labels.to_numpy()type(test_labels)test_labels = test_labels.reshape((len(test_labels),1))loss, acc = new_model.evaluate(test_images, test_labels, verbose=2)print(‘Restored model, accuracy: {:5.2f}%’.format(100*acc))
這是結果。它達到了近99%的準確率,這是驚人的。

這篇文章的主要目的是與大家分享卷積網(wǎng)絡的結構,解決了這類二元分類問題,例如貓和狗的圖像分類。
交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學影像、GAN、算法競賽等微信群(以后會逐漸細分),請掃描下面微信號加群,備注:”昵稱+學校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進入相關微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~

