动物分类识别教程+分类释义+界面展示-1
https://developer.aliyun.com/article/1446457
3.2.标签解码
3.2.1.实现功能
将标签编码和标签内容一一对应(解码)
3.2.2.文件
官方下载的文件夹下有两个文件
- imagenet_synset_to_human_label_map.txt
- imagenet_2012_challenge_label_map_proto.pbtx
target_class对应着一个class_string,这里我们要做的任务就是将traget_class与human_string一一对应
3.2.3.代码
# nodelookup.py import tensorflow.compat.v1 as tf tf.disable_v2_behavior class NodeLookup(object): def __init__(self): labels_path = 'inception_model/imagenet_2012_challenge_label_map_proto.pbtxt' uids_path = 'inception_model/imagenet_synset_to_human_label_map.txt' self.node_lookup = self.load(labels_path, uids_path) @staticmethod def _load(labels_path, uids_path): uid_to_human = {} for line in tf.gfile.GFile(uids_path).readlines(): items = line.strip('\n').split('\t') uid_to_human[items[0]] = items[1] node_id_to_uid = {} for line in tf.gfile.GFile(labels_path).readlines(): if line.startswith(' target_class:'): target_class = int(line.split(': ')[1]) if line.startswith(' target_class_string:'): target_class_string = line.split(': ')[1] node_id_to_uid[target_class] = target_class_string[1:-2] node_id_to_name = {} for key, val in node_id_to_uid.items(): name = uid_to_human[val] node_id_to_name[key] = name return node_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]
3.3.运行模型
3.3.1.流程图
3.3.2.代码
import tensorflow.compat.v1 as tf tf.disable_v2_behavior import numpy as np import nodelookup class TensorflowPredictor(): def __init__(self): self.sess = tf.Session() with tf.gfile.FastGFile('./inception_model/classify_image_graph_def.pb', 'rb') as f: graph_def = tf.GraphDef() # 定义一个计算图 graph_def.ParseFromString(f.read()) # tf.import_graph_def(graph_def, name='') self.softmax_tensor = self.sess.graph.get_tensor_by_name('softmax:0') def predict_image(self, image_path): # 载入图片 image_data = tf.gfile.FastGFile(image_path, 'rb').read() predictions = self.sess.run(self.softmax_tensor, {'DecodeJpeg/contents:0': image_data}) # 图片格式是jpg格式 predictions = np.squeeze(predictions) # 把结果转为1维 # 打印图片路径及名称 res_str = '' res_str += '图片路径: ' + image_path + '\n' # 排序 top_k = predictions.argsort()[-5:][::-1] node_lookup = nodelookup.NodeLookup() for node_id in top_k: # 获取分类名称 name_str = node_lookup.id_to_string(node_id) # 获取该分类的置信度 score = predictions[node_id] * 100 res_str += '(%.2f' % (score) + '%), ' + name_str + '\n' return res_str
3.4.GUI
3.4.1.运行图
3.4.2.代码
import os import tkinter from tkinter import * from tkinter import filedialog from PIL import ImageTk from translate import Translator import get_Inception_model from tensorflow_predictor import TensorflowPredictor root = tkinter.Tk() # 生成root主窗口 root.title("图像分类") # 设置窗体标题 root.geometry("800x800") # 设置窗体大小 if not os.path.exists('./inception_model/classify_image_graph_def.pb'): # 如果没下载model,则下载model get_Inception_model.download_inception_model() # 下载model translator = Translator(to_lang="chinese") # 新建Translator对象 def translator_prediction_result(pre_res): # 翻译模块 res = pre_res.split("\n")[0] + '\n' for line in pre_res.split("\n")[1:-1]: s = translator.translate(line.split(',')[1]) res += line + " (机翻结果: " + s + ")\n" return res # 返回翻译结果 img_label = Label(root, width='800', height='533') # 这是是显示预测图片的全局变量 res_label = Label(root) # 这是是显示预测文字的全局变量 pdt = TensorflowPredictor() # 新建预测类(自己写的) def selector_image(): # 选择图片按钮点击发生的事件 img_path = filedialog.askopenfilename(initialdir='./images') # 弹窗选择图像文件返回图像地址 pre_res = pdt.predict_image(image_path=img_path) # 利用地址调用预测函数返回结果字符串 pre_res = translator_prediction_result(pre_res) # 机器翻译结果字符串 photo = ImageTk.PhotoImage(file=img_path) img_label.config(imag=photo) # 更新图片 img_label.pack() res_label.config(text=pre_res, justify=LEFT) # 更新文字 res_label.pack() root.mainloop() # 进入消息循环 return btn_sel = tkinter.Button(root, text='选择图片', command=selector_image) # 选择图片按钮 btn_sel.pack() root.mainloop() # 进入消息循环(必需组件)
果字符串 photo = ImageTk.PhotoImage(file=img_path) img_label.config(imag=photo) # 更新图片 img_label.pack() res_label.config(text=pre_res, justify=LEFT) # 更新文字 res_label.pack() root.mainloop() # 进入消息循环 return btn_sel = tkinter.Button(root, text='选择图片', command=selector_image) # 选择图片按钮 btn_sel.pack() root.mainloop() # 进入消息循环(必需组件)
总结
- Inception 是一种深度学习模型,主要用于图像分类任务。它是由 Google 团队于 2014 年开发的,并在 ImageNet
- 图像识别竞赛中取得了很好的成绩。
- Inception 模型的设计目标是在保持高准确率的同时,降低模型的计算复杂度。它采用了一种称为 Inception
- 模块的特殊结构,该模块可以同时应用多个不同大小的卷积核和池化操作,并将它们的输出拼接在一起。这样可以捕捉到不同尺度和层次的图像特征。
- Inception
- 模型的核心思想是使用多个并行的卷积操作来处理输入图像,并通过合并它们的输出来提取更丰富的特征表示。这种设计可以减少网络的参数数量,并增加模型的计算效率。
- Inception 模型的经典版本是 Inception V3,它包含多个 Inception
- 模块,每个模块都包含多个并行的卷积和池化操作。Inception V3 在 ImageNet
- 数据集上取得了很好的性能,同时也被广泛应用于其他图像分类任务。
除了 Inception V3,还有其他版本的 Inception 模型,如 Inception V1、Inception V2 等,每个版本在模型结构和性能上都有所不同。
总结起来,Inception 是一种用于图像分类任务的深度学习模型,通过使用多个并行的卷积操作和池化操作来提取图像特征。它在准确率和计算效率方面取得了良好的平衡,并被广泛应用于图像分类领域。