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

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨熹的专栏

TensorFlow -2: 用 CNN 识别数字

昨天只是用了简单的 softmax 做数字识别,准确率为 92%,这个太低了,今天用 CNN 来提高一下准确率。关于 CNN,可以看这篇:图解何为CNN简单看一...

1.6K0
来自专栏杨熹的专栏

TensorFlow-2: 用 CNN 识别数字

---- 本文结构: CNN 建立模型 code ---- 昨天只是用了简单的 softmax 做数字识别,准确率为 92%,这个太低了,今天用 CNN 来提高...

3645
来自专栏WD学习记录

21个项目玩转深度学习 学习笔记(2)

事实上,必须先读入数据后才能进行计算,假设读入用时0.1s,计算用时0.9秒,那么没过1s,GPU都会有0.1s无事可做,大大降低了运算的效率。

3451
来自专栏MelonTeam专栏

全卷积神经网络 fcn 学习笔记

导语: 前段时间学习了一下全卷积神经网络fcn,现以笔记的形式总结学习的过程。主要包括四个部分: (1)caffe框架的搭建;(2)fcn原理介绍;(3)分析具...

7896
来自专栏ACM算法日常

第五篇:《机器学习之逻辑回归(下)》

https://pan.baidu.com/s/1tnMHvLWB_qXyuoPiBgnhaQ

943
来自专栏PaddlePaddle

【进阶篇】命令行参数使用案例

编写|PaddlePaddle 排版|wangp 1 本地训练 本地训练的实验,诸如图像分类,自然语言处理等,通常都会使用下面这些命令行参数 paddle ...

3204
来自专栏瓜大三哥

基于FPGA的均值滤波(三)

基于FPGA的均值滤波(三) 之二维求和模块 在实现了窗口内一维行方向上的求和操作,现在要得到整个窗口内的像素之和,还必须将每一行的计算结果再叠加起来。但是每一...

2309
来自专栏北京马哥教育

实战Google深度学习框架:TensorFlow计算加速

作者:才云科技Caicloud,郑泽宇,顾思宇 要将深度学习应用到实际问题中,一个非常大的问题在于训练深度学习模型需要的计算量太大。比如Inception-v3...

3297
来自专栏机器之心

教程 | TensorEditor :一个小白都能快速玩转的神经网络搭建工具

2226
来自专栏计算机视觉与深度学习基础

【深度学习】使用tensorflow实现VGG19网络

转载注明出处:http://blog.csdn.net/accepthjp/article/details/70170217 接上一篇AlexNet,本文讲...

7999

扫码关注云+社区

领取腾讯云代金券