手把手程式實作分享系列:用簡單的CNN模型訓練模型建立貓貓狗狗辨識程式

Walter Chiu
Bandai的機器學習筆記
7 min readJan 28, 2020

這篇要跟大家分享的是經典的CNN範例 — 貓貓狗狗的分類器

想要練習的朋友,數據集可以去kaggle上面找,我下面隨便提供一個給大家

進入程式碼之前,隨便打點感想跟我遇到的問題

把這篇放上來是因為接了學長的case,想要來分類被光學Filter阻擋過的影像,看能不能分辨出原來的圖像是哪一個。

我先往二個方向去Search,一個是影像修復,另一個就是影像分類。

但我發現影像修復的原理是使用該圖片的影像,透過CNN的演算法,把Feature攝取出來,然後慢慢套在圖片上。

在我對輸入影像還沒有概念時,我會對這個方法能不能使用抱持存疑

如果影像distortion到一個地步,可能無法對該影像修復。

因此目前對此專案的看法,我還是認為使用影像分類即可,想到的問題就是Training data太少,畢竟輸入集是用人工拍攝出來的,最後一定是多不到哪裡去,到時候只好對影像左轉右轉,產生更多的輸入......

好啦,那來談談遇到的問題

因為是一個很簡單的分類器

模型就是一般的CNN架構即可,其實問題只有一個

  1. tensorflow 版本

如果大家參考我的code有問題的話,就檢查一下自己的版本吧

我這篇的版本是使用2.0.0

進入正題

以下code大家自己參考參考瞜

1. Import 需要的套件

import numpy as np 
import pandas as pd
import cv2
import matplotlib.pyplot as plt
import tensorflow as tf
import os
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten, Dropout, Activation, Conv2D, MaxPooling2D

2. 把訓練集拉進來,並且標籤完成


train_dir = "train"
path = os.path.join(train_dir)
X = []
y = []
convert = lambda category : int(category == 'dog')
def create_test_data(path):
for p in os.listdir(path):
category = p.split(".")[0]
category = convert(category)
img_array = cv2.imread(os.path.join(path,p),cv2.IMREAD_GRAYSCALE)
new_img_array = cv2.resize(img_array, dsize=(80, 80))
X.append(new_img_array)
y.append(category)
create_test_data(path)
X = np.array(X).reshape(-1, 80,80,1)
y = np.array(y)
#Normalize data
X = X/255.0

以上在function的部分,對照片的名字做一個判別

如果有dog的字眼,則label為0,反之貓貓的話就是label為1

3. CNN 模型的建立

model = Sequential()
# Adds a densely-connected layer with 64 units to the model:
model.add(Conv2D(64,(3,3), activation = 'relu', input_shape = X.shape[1:]))
model.add(MaxPooling2D(pool_size = (2,2)))
# Add another:
model.add(Conv2D(64,(3,3), activation = 'relu'))
model.add(MaxPooling2D(pool_size = (2,2)))
model.add(Flatten())
model.add(Dense(64, activation='relu'))
# Add a softmax layer with 10 output units:
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer="adam",
loss='binary_crossentropy',
metrics=['accuracy'])

以上不多加敘述,看不懂何謂Conv2D、Pooling layer的朋友

左轉先Google,學一下CNN基礎

4. Run CNN

model.fit(X, y, epochs=10, batch_size=32)

跑的次數(epochs)自己決定

5. 把測試集拉進來分類

分類完成拉,重點就是把testing的資料拿來分類,看看自己的正確率到底有多少吧~

這邊就完成一個簡單的貓狗分類器瞜,大家有問題的話,歡迎一起討論

train_dir = "test1"
path = os.path.join(train_dir)
#os.listdir(path)
X_test = []
id_line = []
def create_test1_data(path):
for p in os.listdir(path):
id_line.append(p.split(".")[0])
img_array = cv2.imread(os.path.join(path,p),cv2.IMREAD_GRAYSCALE)
new_img_array = cv2.resize(img_array, dsize=(80, 80))
X_test.append(new_img_array)
create_test1_data(path)
X_test = np.array(X_test).reshape(-1,80,80,1)
X_test = X_test/255
predictions = model.predict(X_test)
predicted_val = [int(round(p[0])) for p in predictions]
submission_df = pd.DataFrame({'id':id_line, 'label':predicted_val})
submission_df.to_csv("submission.csv", index=False)

Reference :

--

--

Walter Chiu
Bandai的機器學習筆記

台大電機博士候選人,主要學習電腦科學、資訊教育,關心各種時事議題,歡迎一起討論有趣的專題 dodo0095@hotmail.com