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和深度神经网络寻找近似图片?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,012评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,589评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,819评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,652评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,954评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,381评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,687评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,404评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,082评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,355评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,880评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,249评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,864评论 3 232
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,007评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,760评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,394评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,281评论 2 259

推荐阅读更多精彩内容