MobileNet V1官方预训练模型的使用

最近看到一个巨牛的人工智能教程,分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。平时碎片时间可以当小说看,【点这里可以去膜拜一下大神的“小说”】

1. 下载网络结构及模型

1.1 下载MobileNet V1定义网络结构的文件

MobileNet V1的网络结构可以直接从官方Github库中下载定义网络结构的文件,地址为:https://raw.githubusercontent.com/tensorflow/models/master/research/slim/nets/mobilenet_v1.py

1.2 下载MobileNet V1预训练模型

MobileNet V1预训练的模型文在如下地址中下载:
https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet_v1.md
打开以上网址,可以看到MobileNet V1官方预训练的模型,官方提供了不同输入尺寸和不同网络中通道数的多个模型,并且提供了每个模型对应的精度。可以根据实际的需要下载对应的模型,如下图所示。

MobileNet V1不同输入和不同通道数的官方预训练模型

这里以选择MobileNet_v1_1.0_192为例,表示网络中的所有卷积后的通道数为标准通道数(即1.0倍),输入图像尺寸为192X192。

2. 构建网络结构及加载模型参数

2.1 构建网络结构

在1.1小节中下载mobilenet_v1.py文件后,使用其中的mobilenet_v1函数构建网络结构静态图,如下代码所示。

import tensorflow as tf
from mobilenet_v1 import mobilenet_v1,mobilenet_v1_arg_scope
slim = tf.contrib.slim
def build_model(inputs):   
    with slim.arg_scope(mobilenet_v1_arg_scope(is_training=False)):
        logits, end_points = mobilenet_v1(inputs, is_training=False, depth_multiplier=1.0, num_classes=1001)
    scores = end_points['Predictions']
    print(scores)
    #取概率最大的3个类别及其对应概率
    output = tf.nn.top_k(scores, k=3, sorted=True)
    #indices为类别索引,values为概率值
    return output.indices,output.values

上面代码中,使用函数tf.nn.top_k取概率最大的3个类别机器对应概率。

2.2 加载模型参数

CKPT = 'mobilenet_v1_1.0_192.ckpt' 
def load_model(sess):
    loader = tf.train.Saver()
    loader.restore(sess,CKPT)
 
inputs=tf.placeholder(dtype=tf.float32,shape=(1,192,192,3))
classes_tf,scores_tf = build_model(inputs) 
with tf.Session() as sess:
    load_model(sess)

先定义placeholder输入inputs,再通过函数build_model完成静态图的定义。接下来传入tf.Session对象到load_model函数中完成模型加载。

3. 模型测试

3.1 加载Label

网络输出结果为类别的索引值,需要将索引值转为对应的类别字符串。先从官网下载label数据,需要注意的是MobileNet V1使用的是ILSVRC-2012-CLS数据,因此需要下载对应的Label信息(本文后面附件中会提供)。解析Label数据代码如下。

def load_label():
    label=['其他']
    with open('label.txt','r',encoding='utf-8') as r:
        lines = r.readlines()
        for l in lines:
            l = l.strip()
            arr = l.split(',')
            label.append(arr[1])
    return label

3.2 测试结果

使用如下图片进行测试。


测试图片

执行inference.py后,控制台输出结果如下所示。

识别 test_images/test1.png 结果如下:
        No. 0 类别: 军用飞机 概率: 0.9363691
        No. 1 类别: 飞机翅膀 概率: 0.032617383
        No. 2 类别: 炮弹 概率: 0.01853972

识别 test_images/test2.png 结果如下:
        No. 0 类别: 小儿床 概率: 0.9455737
        No. 1 类别: 摇篮 概率: 0.044925883
        No. 2 类别: 板架 概率: 0.007288801

4 完整代码

inference.py完整的代码如下所示。

import tensorflow as tf
from mobilenet_v1 import mobilenet_v1,mobilenet_v1_arg_scope
import cv2
import os
import numpy as np
slim = tf.contrib.slim
CKPT = 'mobilenet_v1_1.0_192.ckpt' 
dir_path = 'test_images'

def build_model(inputs):   
    with slim.arg_scope(mobilenet_v1_arg_scope(is_training=False)):
        logits, end_points = mobilenet_v1(inputs, is_training=False, depth_multiplier=1.0, num_classes=1001)
    scores = end_points['Predictions']
    print(scores)
    #取概率最大的5个类别及其对应概率
    output = tf.nn.top_k(scores, k=3, sorted=True)
    #indices为类别索引,values为概率值
    return output.indices,output.values

def load_model(sess):
    loader = tf.train.Saver()
    loader.restore(sess,CKPT)
 
def get_data(path_list,idx): 
    img_path = images_path[idx]
    img = cv2.imread(img_path)
    img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
    img = cv2.resize(img,(192,192))
    img = np.expand_dims(img,axis=0)
    img = (img/255.0-0.5)*2.0
    return img_path,img
def load_label():
    label=['其他']
    with open('label.txt','r',encoding='utf-8') as r:
        lines = r.readlines()
        for l in lines:
            l = l.strip()
            arr = l.split(',')
            label.append(arr[1])
    return label

inputs=tf.placeholder(dtype=tf.float32,shape=(1,192,192,3))
classes_tf,scores_tf = build_model(inputs) 
images_path =[dir_path+'/'+n for n in os.listdir(dir_path)]
label=load_label()
with tf.Session() as sess:
    load_model(sess)
    for i in range(len(images_path)):
        path,img = get_data(images_path,i)
        classes,scores = sess.run([classes_tf,scores_tf],feed_dict={inputs:img})
        print('\n识别',path,'结果如下:')
        for j in range(3):#top 3
            idx = classes[0][j]
            score=scores[0][j]
            print('\tNo.',j,'类别:',label[idx],'概率:',score) 
    

5. 附件下载

https://download.csdn.net/download/huachao1001/10737491

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,111评论 18 139
  • 操作系统:Centos7.4 (Tensorflow Object Detection API学习)介绍了Tens...
    下里巴人也阅读 15,576评论 10 13
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,596评论 25 707
  • 离开更是是一种借口,面对很多人质问,我疲惫甚至怀疑。 是爸爸说的,参军,回家体检。就在这个十月,十月,我回到家里,...
    谷子阅读 215评论 0 0
  • 遇见你,以为你会是对的人,但是相处越久就越发现我们真的不适合。思想高度不在同一个层面,喜好不同,越来越没有话题聊,...
    七分醉三分醒阅读 175评论 0 0