iOS+Tensorflow实现图像识别

前言


人工智能在去年大火过后,Google开源了其机器学习工具Tensorflow,现在Tensorflow支持了移动端,支持的平台包括AndroidiOSRaspberry Pi


最近我也根据教程在电脑上装上了TF,跑了一下iOS的Demo,下面这幅图就是Camera这个工程的截图,如果按照教程可以下载训练好的pb,可以实现1000种物体的识别(看pb体量估计是inception_v1,训练图片来自ImageNet)。

官方效果图

但如何添加自己想识别的物体?官方给了简单的教程,但是有很多坑,本文就逐步介绍如何训练自己的图片,然后在iOS设备上运行。

构建训练图片


  • 首先需要将用来训练的图片按标签准备好。如下:
images文件夹
  • 标签里面就是所有类别,我这里有9类:
范冰冰
吴彦祖
陈乔恩
周杰伦
电视机
安全帽
头盔
笔记本电脑
长虹
  • 然后按教程编译build_image_data,运行就能的到供inception模型训练的图片数据。
# location to where to save the TFRecord data.
OUTPUT_DIRECTORY=$HOME/my-custom-data/

# build the preprocessing script.
bazel build inception/build_image_data

# convert the data.
bazel-bin/inception/build_image_data \
  --train_directory="${TRAIN_DIR}" \
  --validation_directory="${VALIDATION_DIR}" \
  --output_directory="${OUTPUT_DIRECTORY}" \
  --labels_file="${LABELS_FILE}" \
  --train_shards=128 \
  --validation_shards=24 \
  --num_threads=8

得到的文件如下:

images

至此就完成了训练与验证数据的准备工作。

训练模型


由于内存的限制,为了更好的体验和使用效果,最好降低精度,训练inception_v1模型,但是我比较懒就直接按教程重新训练的inception_v3模型。

这里我用的是教程中的flowers_train,然后将num_classes设为9,因为我的图片一共9类。同时inception_train.py记录model.ckpt的操作改成每10次记录一次(inception模型比较庞大,我又是单核cpu跑,运行比较耗时,如果按原来的5000次记录一次那么要等大概83小时,才会记录一次)。

设置好,编译flowers_train,运行就可以得到输出的checkpoints了。

# Build the model. Note that we need to make sure the TensorFlow is ready to
# use before this as this command will not build TensorFlow.
bazel build inception/flowers_train

# Path to the downloaded Inception-v3 model.
MODEL_PATH="${INCEPTION_MODEL_DIR}/inception-v3/model.ckpt-157585"

# Directory where the flowers data resides.
FLOWERS_DATA_DIR=/tmp/flowers-data/

# Directory where to save the checkpoint and events files.
TRAIN_DIR=/tmp/flowers_train/

# Run the fine-tuning on the flowers data set starting from the pre-trained
# Imagenet-v3 model.
bazel-bin/inception/flowers_train \
  --train_dir="${TRAIN_DIR}" \
  --data_dir="${FLOWERS_DATA_DIR}" \
  --pretrained_model_checkpoint_path="${MODEL_PATH}" \
  --fine_tune=True \
  --initial_learning_rate=0.001 \
  --input_queue_memory_factor=1

运行截图与生成的ckpt:

train
checkpoints

生成PB文件

为了在iOS设备上运行,必须把前面训练的参数写入graph中,生成protobuf格式的文件。
Google提供了freeze_graph,可以直接使用,将运算图和参数写成pb。
这里有4个步骤:

  1. 生成一个执行预测的计算图,写成input.pb。
  2. 调用freeze_graph,合成input.pb和ckpt。
  3. 调用optimize_for_inference,缩减运算,替换掉不能在iOS中运行的计算,生成inference.pb。
  4. 调用quantize_graph,进一步优化运算图,(这一步开始没操作,导入iOS设备中后大部分时间都崩溃)生成rounded_graph.pb。

完成上面这些步骤过后就得到可以导入iOS运行的pb文件:

pbs

下面是我集合整个流程的一个shell脚本:

cd /Users/Jiao/Desktop/SecurityKeeper/tensorflow

bazel-bin/tensorflow/python/tools/freeze_graph \
--input_graph=/Users/Jiao/Desktop/TFProject/inception_v3/protobuf/input.pb --input_checkpoint=/Users/Jiao/Desktop/TFProject/inception_v3/checkpoints/model.ckpt-80 \
--output_node_names=inception_v3/logits/predictions --input_binary=False \
--output_graph=/Users/Jiao/Desktop/TFProject/inception_v3/protobuf/frozen.pb

bazel-bin/tensorflow/python/tools/optimize_for_inference \
--input=/Users/Jiao/Desktop/TFProject/inception_v3/protobuf/frozen.pb --output=/Users/Jiao/Desktop/TFProject/inception_v3/protobuf/inference.pb \
--input_names=input --output_names=inception_v3/logits/predictions \
--frozen_graph=True

bazel-bin/tensorflow/tools/quantization/quantize_graph \
--input=/Users/Jiao/Desktop/TFProject/inception_v3/protobuf/inference.pb \
--output=/Users/Jiao/Desktop/TFProject/inception_v3/protobuf/rounded_graph.pb \
--output_node_names=inception_v3/logits/predictions  \
--mode=weights_rounded

配置iOS参数、运行、Boom...

由于前面用的是inception_v3模型,所以camera这个demo中某些参数需要改变一下,首先是const int wanted_input_widthconst int wanted_input_height,都要变成299,因为模型输入图片大小是299*299的,其次是采集图片像素归一化方式,直接除以255.0,归一化到[0,1]区间。

 //        out_pixel[c] = (in_pixel[c] - input_mean) / input_std;
          out_pixel[c] = in_pixel[c] / 255.0;

运行结果:

电视机
安全帽

结语

以上是第80次迭代参数的预测结果,并不是很理想。但整体流程完成了模型训练与iOS设备运行TF😊。

参考:
Getting started with TensorFlow on iOS

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

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,943评论 4 60
  • 我有个公众号叫“滕吠吠”,运营到第11天拿到原创功能,第20天,拿到赞赏功能,有小伙伴问我怎样才能拿到,在此我也做...
    滕吠吠阅读 949评论 0 2
  • 最近好久也没去宇宙中心,沉迷学习无法自拔。一个月左右的时间,又能见到大家啦~这一次更多的是温馨的团聚,闪电、朱琳主...
    森和阅读 189评论 1 0
  • 第四篇 同时,我们学习到所有生命中最大、最重要的问题基本上是无法解决的。因为他们表达了存在于每个自律系统中必要的...
    怒放的生命1889阅读 500评论 0 0
  • 文/晴天过后上一章 目录 玫瑰暗自轻舒了口气,结合毒荆棘剧毒的妖力果然不俗,没想到融合了通天珠好处多...
    晴天过后阅读 494评论 12 11