前序文章:讓我們談談turiCreate.聊聊iOS的機器學習這篇文章有講到如何布置環境,以及turiCreate的基本功能塊.
概括
對于這個功能來說.我第一實現試用的時候 很驚訝!準度非常高!效果也是非常不錯的.隨著我深入,發現他的問題也還是挺大的.他不是多標簽的.不能像蘋果提供CoreML模型一樣反饋的一樣的.而且最可怕的是:如果我要識別貓和狗,那么有可能是除了貓,其他的全部都是狗.當然有可能是全部是貓.
功能
數據
我們今天也不分辨貓和狗,這個CoreML的模型里基本都有了.我這邊的資源是哆啦A夢,瓦力,我的同事,以及我.那這樣他識別的如何呢!!
我們要自己先分類好
我們有數據就可以開動了 環境我們在上一章就配置好了.我就默認大家配置好直接跳過配置環境這一塊了!
打開環境
我們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和深度神經網絡尋找近似圖片?