利用機器學習和圖像識別技術對時裝進行分類

時尚-MNIST 數據集

時尚-MNIST 數據集是仿照 MNIST 數據集建模的,目的是提供最簡單快捷的建模途徑。如果您已經熟悉 MNIST 手寫數字數據集,這一點尤為重要。 事實上,在加載時尚數據時,可以使用與加載 MNIST 數據相同的代碼。

與手寫數字數據集一樣,時尚數據集由 10 個類別組成。這些類別如下所示。

標簽說明
0T 恤/上衣
1褲裝
2套頭衫
3連衣裙
4外套
5涼鞋
6襯衫
7運動鞋
8袋子
9踝靴

可以使用與 MNIST 數據集 相同的代碼 下載和加載該數據集。代碼示例可在 多種 編程語言中找到,但本教程將使用 R 語言。

加載時尚數據集

以下代碼可用于加載時裝數據集 文件

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33load_mnist <- function() { load_image_file <- function(filename) { ret = list() f = gzfile(filename,’rb’) readBin(f,’integer’,n=1,size=4,endian=’big’) ret$n = readBin(f,’integer’,n=1,size=4,endian=’big’) nrow = readBin(f,’integer’,n=1,size=4,endian=’big’) ncol = readBin(f,’integer’,n=1,size=4,endian=’big’) x = readBin(f,’integer’,n=ret$n*nrow*ncol,size=1,signed=F) ret$x = matrix(x, ncol=nrow*ncol, byrow=T) close(f) ret } load_label_file <- function(filename) { f = gzfile(filename,’rb’) readBin(f,’integer’,n=1,size=4,endian=’big’) n = readBin(f,’integer’,n=1,size=4,endian=’big’) y = readBin(f,’integer’,n=n,size=1,signed=F) close(f) y } trainData <<- load_image_file(‘data/train-images-idx3-ubyte.gz’) testData <<- load_image_file(‘data/t10k-images-idx3-ubyte.gz’) trainData$y <<- load_label_file(‘data/train-labels-idx1-ubyte.gz’) testData$y <<- load_label_file(‘data/t10k-labels-idx1-ubyte.gz’) } show_digit <- function(arr784, col=gray(12:1/12), …) { image(matrix(arr784, nrow=28)[,28:1], col=col, …) }

上述代碼讀取時尚數據集文件。共有 4 個文件,分別對應訓練圖像集、相關標簽以及測試圖像集和相關標簽。您可以 下載 這些文件,并將它們放在 /data 目錄中以便加載。

1 2 3 4 5 6 7 8 960,000 training images: t10k-images-idx3-ubyte.gz t10k-labels-idx1-ubyte.gz 10,000 test images: train-images-idx3-ubyte.gz train-labels-idx1-ubyte.gz

請注意,同樣的代碼也可用于加載 MNIST 手寫數字數據集!

最后,要執行加載圖像的調用,只需運行以下命令即可:

1 2load_mnist()

檢查數據

現在我們已經加載了圖像數據,讓我們來看看它的內容。圖像數據已加載到一個名為 trainData 的變量中。這個變量包含三個部分

1 2 3trainData$n – the number of records that were loaded (60,000). trainData$y – the label for each image (0-9), representing a fashion category. trainData$x – a matrix of 28×28 pixel images, each record is an array of 784 integers for each pixel in the image.

檢查像素

讓我們檢查第一幅圖像。我們可以運行以下命令查看第一幅圖像的整數數據。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42trainData$x[1,] [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 [21] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 [41] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 [61] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 [81] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 13 [101] 73 0 0 1 4 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 [121] 0 0 0 0 3 0 36 136 127 62 54 0 0 0 1 3 4 0 0 3 [141] 0 0 0 0 ] 0 0 155 236 207 178 107 156 161 109 64 23 77 130 72 15 0 0 0 0 [201] 0 0 0 0 0 0 0 1 0 69 207 223 218 216 216 188 154 191 210 204 209 222 228 225 0 98 233 198 210 222 229 229 234 [541] 249 220 194 215 217 241 65 73 106 117 168 219 221 215 217 223 223 224 229 29 [561] 75 204 212 204 193 205 211 225 216 185 197 206 198 213 240 195 227 245 239 223 [581] 218 212 209 222 220 221 230 67 48 203 183 194 213 197 185 190 194 192 202 214 [601] 219 221 220 236 225 216 199 206 186 181 177 172 181 205 206 115 0 122 219 193 [621] 179 171 183 196 204 210 213 207 211 210 200 196 194 191 195 191 198 192 176 156 [641] 167 177 210 92 0 0 74 189 212 191 175 172 175 191 179 182 182 181 176 166 168 99 58 0 0 [701] 0 0 0 0 0 0 0 40 61 44 72 41 35 0 0 0 0 0 0 0 [721] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 [741] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 [761] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 [781] 0 0 0 0

請注意圖像數據的第一條記錄包含 784 個整數值。每個數字對應 28×28 圖像中的一個像素。我們將使用這些值作為機器學習模型的輸入,處理圖像識別。

審查類別

我們可以通過 trainData$y[1] 值來查看該圖像的類別。如下所示。

1 2trainData$y[1] 9

第一張圖片的類別是 9 ,對應的是 踝靴

圖像可視化

我們還有一個可視化圖像數據的輔助方法,名為 show_digit 。我們可以用它來查看每張圖像,了解數據的實際顯示效果。

1 2show_digit(trainData$x[1,])

運行上述代碼后,圖像輸出如下所示。

顯示 fashion-mnist 數據集中的第一張圖片

設計圖像識別模型

讓我們來看看處理時尚數據集的模型是什么樣的。既然要進行圖像識別,我們就需要為機器學習模型提供像素輸入。 我們還需要從模型中獲取 10 個不同的類別作為輸出,并確定每張圖像的分類類型。讓我們從輸入開始。

由于輸入是一幅 28×28 像素的灰度圖像,我們最終會有 28 * 28 = 784 個輸入。我們還將有 10 個輸出,每個類別或等級一個。我們可以用下面的神經網絡模型來直觀地展示這一設計。

用于識別 28×28 像素圖像的神經網絡機器學習模型

在上述設計中,我們提供了 784 個輸入,(28×28)圖像中的每個像素都有一個輸入。我們將收到 10 個不同的輸出,每個輸出代表時尚對象可被歸類為的每個獨特類別。 隱藏層可以由任意數量的神經元和層組成,這取決于你希望你的神經網絡有多深或多淺。 要實現更深的抽象和更高的處理結果,例如深度學習,一般需要更多的隱藏層和神經元。就我們的目的而言,一個相對淺層的神經網絡就足夠了。

當然,神經網絡只是一種可用于圖像識別和分類的機器學習模型。實際上,我們將使用幾種不同的機器學習算法來建立模型,并比較它們的準確性結果。 其中包括邏輯回歸、支持向量機和提升樹。

讓我們來看看上述簡單圖像識別模型所能達到的一些精確度結果。

準備標簽

首先,讓我們將每張圖像的 Y 標簽轉換成一個因子。這樣,它們就可以在所有圖像數據中成為唯一的類別。我們可以使用下面顯示的代碼來完成這項工作。

1 2 3trainData$y <- as.factor(trainData$y) testData$y <- as.factor(testData$y)

此外,讓我們為因子分配可讀標簽,這樣我們就能識別每張圖像的類別,而無需查找每個預測類別的數值。

1 2 3 4 5 6 7 8labels <- c(‘T-shirt/top’, ‘Trouser’, ‘Pullover’, ‘Dress’, ‘Coat’, ‘Sandal’, ‘Shirt’, ‘Sneaker’, ‘Bag’, ‘Ankle boot’) levels(trainData$y) <- labels levels(testData$y) <- labels dataTrain <- data.frame(x = trainData$x[1:10000,], y = trainData$y[1:10000]) dataTest <- data.frame(x = testData$x, y = testData$y)

正如您在上述代碼中看到的,我們將訓練數據限制在前 10,000 張圖像。通過這種方式,我們可以加快訓練機器學習模型的處理時間。根據您的電腦速度,您可能希望在全部數據集上進行訓練。 請記住,由于我們擁有訓練集和測試集的標簽,因此可以將兩者結合起來,在整個數據集(70,000 張圖像)上進行訓練,從而進一步提高準確率。

數據設置完成后,我們就可以開始訓練了。但首先,讓我們看看在不使用任何機器學習的情況下,數據的基準準確率是多少。

確定基準精度

在訓練機器學習模型之前,重要的是查看在沒有機器學習的情況下對圖像進行分類的基準準確率。 這樣,我們就能更好地了解人工智能機器學習模型是否真的在學習,從而改進非機器學習算法方法。

產生基準準確度結果的常用方法是簡單地猜測。在這種情況下,我們可以簡單地選擇出現頻率最高的時尚對象類別,并假設每張圖像都是這一類別。 畢竟,如果我們預測每張圖片最常出現的類別,那么我們對每張圖片預測正確的幾率就會比猜測其他類別的幾率稍高一些。

我們有多少種圖像?

既然我們要找出出現頻率最高的圖像類別,為了計算出一個簡單的基線結果,讓我們看看我們的數據集中到底有多少種不同的圖像類別。

1table(dataTrain$y)

通過上述代碼,我們可以得到下表中的機器學習圖像識別類別(記住,我們只查看了前 10,000 張圖像!):

1 2 3 4T-shirt/top Trouser Pullover Dress Coat Sandal Shirt 942 1027 1016 1019 974 989 1021 Sneaker Bag Ankle boot 1022 990 1000

從上表可以看出, "褲子 " 是出現頻率最高的圖像類別。因此,如果我們對數據集中的每張圖像都預測為 "褲子" ,那么在完全猜測一個類別時,我們就能獲得盡可能高的準確率。這就是我們的基準準確率。

基準精度

現在,只要用類別列表中的最大數量除以訓練集中的圖像數量,就能計算出這個 “猜測 “指標的基準準確率。

1max(table(dataTrain$y)) / nrow(dataTrain)

我們最終得到的準確率為 0.102710.27% 。這似乎并不太理想,尤其是考慮到我們有 10 個不同類別的圖像。在 10 個類別中,猜測任何一個類別(在完全平衡的數據集上)的準確率約為 10%。 當然,由于我們的數據集在不同類別之間確實(大部分)是平衡的,這也解釋了為什么我們的基準準確率約為 10%。由于數據集中 “褲子 “對象的圖片數量比其他類型的圖片多,所以我們的準確率略有提高。

回想一下,我們只查看了數據集中前 10,000 張圖片的類別。如果你實際查看訓練集中所有 60,000 張圖片的類別,它們在所有類別中實際上是完全平衡的! 在整個訓練圖像數據集中,每個類別有 6000 張圖像。測試數據集也是如此,每個類別有 1,000 張圖像。

現在我們有了 10.27% 的基準猜測準確率,讓我們看看機器學習圖像識別是否能做得更好。

成果

對于我們應用到數據中的每個機器學習模型,我們都將使用以下代碼來測量混淆矩陣中的準確性結果和總體準確性。回想一下,為了更快地獲得結果,我們只在 10,000 張圖片的數據子集上進行訓練。

1trainctrl <- trainControl(verboseIter = TRUE, number=5, repeats=1, method=’repeatedcv’) fit <- train(y ~ ., data=dataTrain, method = ‘gbm’, trControl = trainctrl) confusionMatrix(predict(fit, dataTrain), dataTrain$y) confusionMatrix(predict(fit, dataTest), dataTest$y) length(which(predict(fit, dataTrain) == dataTrain$y)) / nrow(dataTrain) length(which(predict(fit, dataTest) == dataTest$y)) / nrow(dataTest)

混淆矩陣如下

1 2 3 4 5 6Confusion Matrix and Statistics Reference Prediction T-shirt/top Trouser Pullover Dress Coat Sandal Shirt Sneaker Bag Ankle boot T-shirt/top 815 2 7 25 3 0 115 0 0 0 Trouser 1 1012 0 5 0 1 0 0 3 0 Pullover 8 1 823 9 72 0 81 0 2 0 Dress 39 11 10 941 27 0 34 0 6 0 Coat 6 1 96 23 817 0 75 0 7 0 Sandal 0 0 1 0 0 969 1 6 0 5 Shirt 63 0 75 16 54 0 703 0 10 0 Sneaker 0 0 0 0 0 12 0 989 2 18 Bag 10 0 4 0 1 2 12 1 958 0 Ankle boot 0 0 0 0 0 5 0 26 2 977

在混淆矩陣中,最佳準確度將顯示為一條從預測類別的左上方到右下方的大值對角線。對于每個參考類別,您希望看到同一類別預測的最高值。

上述混淆矩陣(基于梯度提升機模型的結果)的準確率為 90%。

讓我們來看看我們的成果。

邏輯回歸

81.3% / 74.8%

使用 提升邏輯回歸 的機器學習模型,我們可以用以下代碼計算出準確率。

1fit <- train(y ~ ., data=dataTrain, method = ‘LogitBoost’, trControl = trainctrl)

增強樹(GBM / XGBoost)

90.1% / 85.3%

通過 提升樹 ,我們可以得到以下結果。

1fit <- train(y ~ ., data=dataTrain, method = ‘gbm’, trControl = trainctrl)

神經網絡/多項式回歸

83.5% / 78.3%

通過 多項式回歸 ,我們可以得到以下結果。

1fit <- train(y ~ ., data=dataTrain, method = ‘multinom’, trControl = trainctrl, MaxNWts = 10000)

支持向量機 (SVM)

91.2% / 87.2%

通過 支持向量機 ,我們可以得到以下結果。

1fit <- train(y ~ ., data=dataTrain, method = ‘svmRadial’, trControl = trainctrl)

我們學到什么了嗎?

從上面顯示的機器學習圖像識別準確率中,我們可以看到機器學習模型取得的結果肯定比我們的基線 “猜測 “模型要好得多。 我們在 10,000 張圖片上訓練出的最佳模型(SVM)在訓練集上的準確率為 91%,在測試集上的準確率為 87%。 如果將其與我們的基準準確率(”猜測 “模型)進行比較,我們的準確率僅為 10%,而 “猜測 “模型只是預測了每張圖片中出現頻率最高的類別(褲子)。

與基線模型相比,我們的機器學習圖像識別預測模型的準確率大幅提高,證明我們的模型確實比簡單的猜測更好。

事實上,讓我們來看看我們的模型在處理網絡上的實時時尚圖片時效果如何。

在真實時尚圖片上測試模特

要在真實圖片上測試我們的模型,我們可以對想要測試的時尚類別進行在線 圖片搜索 。例如,讓我們試試 連衣裙 。

調整圖像大小以進行分類

由于我們的機器學習模型是在大小為 28×28 像素的圖像上訓練出來的,因此在使用人工智能機器學習圖像識別模型處理圖像之前,我們只需調整圖像的大小。為此,我們只需下載圖像,然后在任何 繪畫程序 中進行編輯,將其調整到正確的尺寸。請記住,將圖像調整為 28×28 像素的固定分辨率很可能會扭曲長寬比和圖像質量,從而導致分類預測的可靠性降低。 不過,它還是讓我們了解了圖像識別機器學習算法的工作原理。

除了將大小調整為 28×28 像素外,我們還需要將背景涂成黑色。預處理完成后,我們就可以將圖像加載到模型中了。圖像顯示如下。

用于機器學習圖像識別的 28×28 像素連衣裙圖像特寫。

由于上圖是 28×28 像素圖像的特寫(雖然人工智能對其進行分類沒有問題,但看到的圖像還是相當小的!),下面是真實分辨率的實際圖像。 您可以了解到這些圖像有多小,但人工智能仍能成功進行分類!

用于機器學習圖像識別的 28×28 像素連衣裙圖像的實際視圖。

這張圖很小,但我們的機器學習模型經過訓練可以處理它。讓我們通過圖像識別模型運行該圖像,看看人工智能將該圖像識別為哪個類別。

加載圖像并進行分類

我們可以用以下代碼加載圖像并對其進行分類。

1 2 3 4 5 6 7 8 9 10 11 12 13 14runTest <- function(filename, model) { png <- loadImage(filename) show_digit(png$bytes) pngData <- data.frame(x = matrix(png$bytes, 1, 784)) predict(model, pngData) }

上述輔助方法只是簡單地加載 png 圖像。然后顯示圖像,以便我們看到圖像的外觀。然后,它將圖片中的字節轉換為我們的模型所需的格式(灰度,共有 784 個整數值)。最后,它調用 預測 方法將圖片分類為特定類型的時尚物品。

測試圖像的最終結果

最后,我們可以運行輔助方法來加載和分類圖像。讓我們看看它是怎么做的。

1runTest(‘data/test/dress-28×28.png’, fit)

上述測試的輸出結果如下。

1[1] Dress

成功!

在真實的測試數據上檢查機器學習模型是一種方便、人性化的方法,可以展示機器學習模型的準確性。當然,實際的統計精確度要高得多,但直觀演示還是很有幫助的。 可視化測試和統計準確度測量都是顯示我們的機器學習模型實際學習準確度的方法。

我們還可以通過繪制 學習曲線 來證明我們的機器學習模型能夠預測出更好的結果,并且確實在 學習 。

學習曲線

學習曲線是 觀察準確性的 一種方法

詳細考慮一下這個想法。如果只在一張圖片上訓練一個模型,它應該很容易就能學會正確分類。畢竟,這只是 1 張圖像和 1 個類別。這很容易。這樣一來,1 張圖片的準確率就能達到 100%。 現在,在不同類別的測試圖像上運行相同的模型。它很有可能會預測這張測試圖片與單張訓練圖片的類別相同。畢竟,它所見過的唯一圖像就是單張訓練圖像。 因此,它很可能也會預測出測試圖像的相同類別。這導致準確率為 0%。在這種情況下,兩個準確率相差最大(100% 對 0%)。

接下來,我們考慮用稍大一點的 10 幅圖像數據集來實現同樣的想法。由于機器學習模型只需學習 10 張不同的圖像,因此它仍能獲得很高的準確率。現在針對測試集運行該模型。 雖然它的準確率可能比 0% 稍高一些(正如我們在只對 1 幅圖像進行訓練時所看到的那樣),但我們預計它的表現仍然會很差。 這是因為模型現在已經看到了 10 張不同的圖像,使其更有可能在測試集中至少正確獲得 1 張圖像。這可能會表現為 99% 的準確率相對于 1% 或類似的準確率。

一般來說,機器學習模型接觸的訓練數據越多,訓練準確率就越低,測試準確率就越高。模型在更多的訓練數據中學習會變得更加困難。 不過,數據范圍可以讓它更好地歸納出以前未見過的新圖像。到了一定程度,兩種準確度開始趨同(或至少接近趨同)。

通過這種方式,學習曲線可以告訴我們,我們的模型是否真的在從數據中學習,并在交叉驗證或測試集上通過越來越大的數據集獲得更好的準確度。 我們還可以了解更多的數據是否會使我們的模型變得更好!

我們的時尚學習曲線

為了證明我們的機器學習圖像識別模型確實在學習,我們可以繪制數據在越來越大的訓練集中的學習曲線。我們將繪制訓練集準確率和測試集準確率的對比圖。 我們可以使用從 1,000 張圖像到 60,000 張圖像的訓練集。這樣會產生如下學習曲線。

用于時裝分類的圖像識別學習曲線

正如上文所述,我們可以清楚地看到,學習曲線由兩條向下和向右的弧線組成,似乎最終趨于一致。訓練集的準確率幾乎達到 100%,而測試集的準確率則低得多,大約只有 60% 或更低。 隨著更多的訓練數據被輸入到機器學習模型中,我們的訓練準確率迅速下降到 80% 左右,而測試集的準確率則逐漸提高到 75% 或更高。

如果我們在訓練集和測試集之間繪制一條趨勢線,就會更清楚地看到,在大約 55000 張訓練圖像之后,準確率水平開始趨近于 75% 左右。

收斂時帶有平滑趨勢線的時裝分類圖像識別學習曲線

從學習曲線圖中可以看出,在使用 60,000 張圖像進行訓練后,訓練集和測試集的準確率似乎都趨近于 78% 左右。 如果我們輸入更多的圖像數據來訓練模型,我們的模型似乎不會比這更好。 這是使用學習曲線的主要好處,因為它可以告訴我們是否應該花時間尋找更多的訓練數據,或者花時間微調我們的模型和特征列表。

建立學習曲線

既然我們知道了學習曲線的作用,那就讓我們來看看如何 構建 學習曲線吧

要從我們的圖像識別時尚數據集中建立學習曲線,我們只需在一個循環中迭代,每次都在更大的數據集上訓練我們的模型。我們可以用下面的代碼來實現這一目標。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27library(reshape2) results <- data.frame() for (i in 1:30) { partialSet <- dataTrain[1:1000 * i,] fit <- train(y ~ ., data=partialSet, method = ‘LogitBoost’, trControl = trainctrl) correct1 <- length(which(predict(fit, partialSet) == partialSet$y)) / nrow(partialSet) correct2 <- length(which(predict(fit, dataTest) == dataTest$y)) / nrow(dataTest) results <- rbind(results, c(correct1, correct2)) names(results) <- c(‘Train’, ‘CV’) r <- melt(results) r <- cbind(r, seq(from = 1000, to = nrow(results) * 1000, by = 1000)) names(r) <- c(‘Set’, ‘Accuracy’, ‘Count’) print(ggplot(data = r, aes(x = Count, y = Accuracy, colour = Set)) + geom_line() + geom_smooth(method = ‘lm’, se=F)) }

在上述代碼中,請注意我們只是調用了一個 for

學習曲線在分析機器學習模型的性能方面可以發揮難以置信的作用。例如,它們可以顯示模型內部的 偏差和差異 ,以及在更大數據集上學習的成功率。因此,在驗證人工智能機器學習模型時, 了解 并考慮使用學習曲線非常重要。

下載 @ GitHub

該項目的 源代碼 可在 GitHub 上獲取。

原文鏈接: https://www.primaryobjects.com/2017/10/23/image-recognition-for-fashion-with-machine-learning/

上一篇:

情感人工智能

下一篇:

人工智能安全漏洞:保護生成式人工智能時代的系統
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費