MobileNet V1官方預訓練模型的使用 1. 下載網絡結構及模型 2. 構建網絡結構及加載模型參數 3. 模型測試 4 完整代碼 5. 附件下載

最近看到一個巨牛的人工智能教程,分享一下給大家。教程不僅是零基礎,通俗易懂,而且非常風趣幽默,像看小說一樣!覺得太牛了,所以分享給大家。平時碎片時間可以當小說看,【點這裏可以去膜拜一下大神的“小說”】

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_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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章