1. Загрузите структуру и модель сети
1.1 Загрузите файл, определяющий структуру сети MobileNet V1.
Сетевую структуру MobileNet V1 можно загрузить непосредственно из официальной библиотеки Github, чтобы определить файл сетевой структуры, адрес:Пользовательский контент raw.GitHub.com/tensorflow/…
1.2 Загрузите модель предварительного обучения MobileNet V1
Образец текста предварительной подготовки MobileNet V1 можно загрузить по следующему адресу:
Откройте URL-адрес выше, вы можете увидеть официальную модель предварительно обученного MobileNet VL, чиновников вкладывает множество моделей разных размеров и различного количества каналов в сети и обеспечивает каждую из соответствующей точности модели. Вы можете скачать соответствующую модель в соответствии с фактическими потребностями, как показано ниже.
Здесь в качестве примера возьмем MobileNet_v1_1.0_192, указав, что количество каналов после всех сверток в сети является стандартным количеством каналов (т.е. в 1,0 раза), а размер входного изображения равен 192X192.
2. Создайте структуру сети и загрузите параметры модели.
2.1 Создайте структуру сети
После загрузки файла mobilenet_v1.py в разделе 1.1 используйте в нем функцию 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 используется для получения соответствующих вероятностей трех категорий машин с наибольшей вероятностью.
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)
Сначала определите входные данные заполнителя, а затем завершите определение статического изображения с помощью функции build_model. Затем передайте объект tf.Session функции load_model, чтобы завершить загрузку модели.
3. Тестирование модели
3.1 Загрузить этикетку
Выходным результатом сети является значение индекса категории, и значение индекса необходимо преобразовать в соответствующую строку категории. Сначала загрузите данные этикетки с официального сайта.Следует отметить, что MobileNet V1 используетILSVRC-2012-CLSданные, поэтому вам необходимо загрузить соответствующую информацию о метках (приведенную во вложении далее в этой статье). Код для разбора данных 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)