iOS 推出的turiCreate功能(一) 圖片識別

前序文章:讓我們談談turiCreate.聊聊iOS的機器學習這篇文章有講到如何布置環境,以及turiCreate的基本功能塊.

概括

對于這個功能來說.我第一實現試用的時候 很驚訝!準度非常高!效果也是非常不錯的.隨著我深入,發現他的問題也還是挺大的.他不是多標簽的.不能像蘋果提供CoreML模型一樣反饋的一樣的.而且最可怕的是:如果我要識別貓和狗,那么有可能是除了貓,其他的全部都是狗.當然有可能是全部是貓.

功能

數據

我們今天也不分辨貓和狗,這個CoreML的模型里基本都有了.我這邊的資源是哆啦A夢,瓦力,我的同事,以及我.那這樣他識別的如何呢!!

首先我們準備圖片
分類.png

我們要自己先分類好
哆啦A夢.png

瓦力

搞笑的同事

我們有數據就可以開動了 環境我們在上一章就配置好了.我就默認大家配置好直接跳過配置環境這一塊了!

打開環境

我們Mac打開terminal.app 就是命令框
打開到我們要放置圖片的位置的上個文件夾

cd /Users/admin/Desktop/script/demo-python-image-classification-master

啟動turiCreate的環境

source activate turi
jupyter notebook

創建腳本筆記本



然后我們給新的筆記本重命名就可以開始我們的征途了!

代碼

一般我們習慣在引入turiCreate的庫之后,用tc來替代它!

import turicreate as tc

指定圖像文件夾

image_folder = 'image'

然后使用turiCreate讀取所有圖像文件,并且存儲到data數據框

data = tc.image_analysis.load_images(image_folder, with_path=True)

然后在這里turiCreate讀取所有的圖像文件之后會反饋一些信息. 是說這個文件無法識別.并不影響.(應該是一些隱藏文件)

Unsupported image format. Supported formats are JPEG and PNG     file: /Users/admin/Desktop/script/doraemon/.DS_Store

然后我們直接使用data數據 可以打印一些數據.

data

可以看到data的包含的數據是 地址和圖片的像素.當然我們也可以使用print_rows(num_rows=m, num_columns=n)函數,可以看到你想要看數量.但是我沒有找到如何然數據全部顯示的方法.

接下來是重點.添加標簽.告訴turiCreat哪些是哪些.才能進行訓練.
我們通過文件夾的名稱來給圖片打標記.
我們會使用到apply(lambda :)函數

data['label'] = data['path'].apply(lambda path: 'doraemon' if 'doraemon' in path else 'yizhong' if 'yiz' in path else 'walle' if 'walle' in path else 'yyx' )

把Doraemon目錄下的圖片,按照文件夾的名稱進行分類.這只是給我們對應的圖片打上標記.比不意味著說分類就是這樣其他剩下的都是 'yyx'.
我們在打印一下data

data

則得到了我們需要對應圖片的類別
我們可以吧數據存儲一下.之后 就可以直接讀取這些數據,而不需要重新標記一遍

data.save('doraemon-walle.sframe')

只看數據并不一定分配對了.turiCreate提供了explore()函數可以彈出一個頁面.供我們查看

data.explore()

這樣我們就可以查看數據.我不知道我的turiCreate是不是版本問題,還是存在bug.鼠標懸停在某張圖片上,并沒有顯示出大圖.(如果有大佬知道因為的話,請告知).我的是在每條線出右鍵可以點擊open frame in new window




數據探索完畢,都正確了,我們繼續我們接下來的操作
我們然turiCreate吧data數據框分為訓練集合和測試集合.

train_data, test_data = data.random_split(0.8, seed=2)

訓練集合是用來讓機器進行觀察學習的。電腦會利用訓練集合的數據自己建立模型。但是模型的效果(例如分類的準確程度)如何?我們需要用測試集來進行驗證測試。

這就如同老師不應該把考試題目都拿來給學生做作業和練習一樣。只有考學生沒見過的題,才能區分學生是掌握了正確的解題方法,還是死記硬背了作業答案。

我們讓TuriCreate把80%的數據分給了訓練集,把剩余20%的數據拿到一邊,等待測試。這里我設定了隨機種子取值為2,這是為了保證數據拆分的一致性。以便重復驗證我們的結果。

好了,下面我們讓機器開始觀察學習訓練集中的每一個數據,并且嘗試自己建立模型。

下面代碼第一次執行的時候,需要等候一段時間。因為TuriCreate需要從蘋果開發者官網上下載一些數據。這些數據大概100M左右。

需要的時長,依你和蘋果服務器的連接速度而異。反正在我這兒,下載挺慢的。

好在只有第一次需要下載。之后的重復執行,會跳過下載步驟。

model = tc.image_classifier.create(train_data, target='label')

下載完畢后,你會看到TuriCreate的訓練信息。
當你看到一下類似信息則 訓練成功了



可以看出幾輪下來 訓練的準確還是驗證的準確度,都已經非常高了。

我們用獲得圖片分類模型,來對測試集做預測

predictions = model.predict(test_data)

我們把預測的結果(一系列圖片對應的標記序列)存入了predictions變量。

然后,我們讓TuriCreate告訴我們,在測試集上,我們的模型表現如何。

先別急著往下看,猜猜結果正確率大概是多少?從0到1之間,猜測一個數字。

猜完后,請繼續。

metrics = model.evaluate(test_data)
print(metrics['accuracy'])

這就是正確率的結果:

0.914285714286

為了驗證這不是準確率計算部分代碼的失誤,我們來實際看看預測結果。

predictions

這是打印出的預測標記序列:

dtype: str
Rows: 35
['doraemon', 'doraemon', 'walle', 'walle', 'doraemon', 'walle', 'doraemon', 'walle', 'walle', 'walle', 'doraemon', 'doraemon', 'yyx', 'doraemon', 'doraemon', 'doraemon', 'doraemon', 'doraemon', 'yizhong', 'walle', 'walle', 'doraemon', 'yizhong', 'yyx', 'walle', 'doraemon', 'yyx', 'doraemon', 'walle', 'doraemon', 'doraemon', 'yyx', 'doraemon', 'doraemon', 'doraemon']

再看看實際的標簽。

test_data['label']

這是實際標記序列

dtype: str
Rows: 35
['doraemon', 'doraemon', 'walle', 'walle', 'doraemon', 'walle', 'doraemon', 'walle', 'walle', 'yizhong', 'doraemon', 'doraemon', 'yyx', 'doraemon', 'doraemon', 'doraemon', 'doraemon', 'doraemon', 'yizhong', 'doraemon', 'walle', 'doraemon', 'yizhong', 'yyx', 'walle', 'doraemon', 'yyx', 'doraemon', 'walle', 'walle', 'doraemon', 'yyx', 'doraemon', 'doraemon', 'doraemon']

我們查找一下,到底哪些圖片預測失誤了。

你當然可以一個個對比著檢查。但是如果你的測試集有成千上萬的數據,這樣做效率就會很低。

我們分析的方法,是首先找出預測標記序列(predictions)和原始標記序列(test_data['label'])之間有哪些不一致,然后在測試數據集里展示這些不一致的位置。

test_data[test_data['label'] != predictions]

我們獲得這個數據點對應的原始文件路徑。

wrong_pred_img_path = test_data[predictions != test_data['label']][0]['path']
wrong_pred_img_path1 = test_data[predictions != test_data['label']][1]['path']
wrong_pred_img_path2 = test_data[predictions != test_data['label']][2]['path']

然后我顯示這些圖片

img = tc.Image(wrong_pred_img_path)
img.show()

我們就會發現確實存在一定層度上的干擾
到這里我們模型訓練好了就是導出為CoreML模型.然后加載到Xcode上使用了!

model.export_coreml('test1.mlmodel')

這里發現這個模型竟然要94M.而且基本不受資源多少的影響.如果我們可以適當減低準確度的話.可以在
創建模型的時候對他轉移學習的模型選定為squeezenet_v1.1,默認是'resnet-50'

model = tc.image_classifier.create(train_data,target='label',model='squeezenet_v1.1')

則生成的模型



那么我們只需要導入到Xcode就可以使用了.

****************************** 修改5月23 *******************

分類器的健壯問題

如何提高分類器的健壯性

簡單來說就是加多一個其他類. 對于這個其他類 是 不能包括有我們識別類中的 物體出現.

原創文章轉載需獲授權并注明出處
請在后臺留言聯系轉載
參考文章:1. 如何用Python和深度神經網絡尋找近似圖片?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容