運用已經在imagenet上訓練的inception_v3網絡,識别各種圖檔:
1. 在網上下載下傳Inception_v3的訓練模型,解壓後會得到如下檔案(需要的可以私信我):
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2Lc1TP31kMZR1TzEFRNBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2LcRHelR3LcJzLctmch1mclRXY39jN4QzMyQzM3ETNyATM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
其中第一個第二個是imagenet中數字标号和英文label的檔案:
第三個是該模型結構的帶權重的Graph.
2.運用下面的代碼可以生成一個tfevents檔案,然後用tensorboard檢視他的網絡結構.
import tensorflow as tf
import os
inception_pretrain_model_dir = './inception_v3'
log_dir = 'inception_v3_log'
if not os.path.exists(log_dir):
os.makedirs(log_dir)
inception_graph_def_file = os.path.join(inception_pretrain_model_dir, 'classify_image_graph_def.ckpt')
with tf.Session() as sess:
with tf.gfile.FastGFile(inception_graph_def_file, 'rb') as f:
graph_def = tf.GraphDef()
graph_def.ParseFromString(f.read())
tf.import_graph_def(graph_def, name='')
writer = tf.summary.FileWriter(log_dir, sess.graph)
writer.close()
3.然後加載模型到圖中,把label寫入新的字典,友善後期數字和英文轉換.然後進行檢測.
import tensorflow as tf
import os
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
label_lookup_path = './imagenet_2012_challenge_label_map_proto.pbtxt'
id_lookup_path ='./imagenet_synset_to_human_label_map.txt'
class Nodelookup(object):
def __init__(self,label_lookup_path, id_lookup_path):
self.label_lookup_path = label_lookup_path
self.id_lookup_path =id_lookup_path
self.node_lookup = self.load(self.label_lookup_path, self.id_lookup_path)
def load(self, label_lookup_path, id_lookup_path):
#分類字元串對應的類别名稱 (n00004475 organism, being)
human_label = tf.gfile.GFile(id_lookup_path).readlines()
id_to_human = {}
for line in human_label:
line = line.strip('\n')
parsed_item = line.split('\t')
uid = parsed_item[0]
human_string = parsed_item[1]
id_to_human[uid] = human_string
#分類字元串與對應的編号
'''entry {
target_class: 449
target_class_string: "n01440764"
}'''
label_to_id = tf.gfile.GFile(label_lookup_path).readlines()
id_to_label = {}
for line in label_to_id:
if line.startswith(' target_class:'):
target_class = int(line.split(': ')[1])
if line.startswith(' target_class_string:'):
target_class_string = line.split(': ')[1]
#不要左右的引号是以是從1:-2
id_to_label[target_class] = target_class_string[1:-2]
#建立一個新的字典,第二個字典的val作為第一個字典的key,得到的數值(也就是英文類别名稱)作為新字典的val.
#再把第二個字典的key作為新字典的key,建立新的對應(44----dog)
id_to_name = {}
for key, val in id_to_label.items():
number = id_to_human[val]
id_to_name[key] = number
return id_to_name
#傳入分類編号傳回英文名稱
def id_to_string(self, node_id):
if node_id not in self.node_lookup:
return ' ***** '
return self.node_lookup[node_id]
#建立一個圖來存放inception訓練好的模型
with tf.gfile.FastGFile('./classify_image_graph_def.pb', 'rb') as f:
graph_def = tf.GraphDef()
graph_def.ParseFromString(f.read())
tf.import_graph_def(graph_def, name='')
with tf.Session() as sess:
softmax_tensor = sess.graph.get_tensor_by_name('softmax:0')
for root, dirs, files in os.walk('image/'):
for file in files:
image_data = tf.gfile.FastGFile(os.path.join(root,file), 'rb').read()
predictions = sess.run(softmax_tensor, {'DecodeJpeg/contents:0':image_data})
predictions = np.squeeze(predictions)
img_path = os.path.join(root, file)
print(img_path)
img = Image.open(img_path)
plt.imshow(img)
plt.axis('off')
plt.show()
node_lookup =Nodelookup(label_lookup_path, id_lookup_path)
top_k = predictions.argsort()[-1:]
for node_id in top_k:
result = node_lookup.id_to_string(node_id)
score = predictions[node_id]
print('識别為: %s | 機率為: %.4f'% (result, score))
print('\n')