动物分类识别教程+分类释义+界面展示

news2025/1/24 22:49:36

1.项目简介

动物分类教程+分类释义+界面展示

动物分类是生物学中的一个基础知识,它是对动物进行分类、命名和描述的科学方法。本教程将向您介绍动物分类的基本原则和方法,并提供一些常见的动物分类释义。

  1. 动物分类的基本原则

动物分类根据动物的形态、结构、生活习性、遗传等特征进行分类。动物分类的基本原则包括以下几点:

(1)分类的基础:分类应该以形态学为基础,主要从外部形态、内部结构、发育过程和生理生化特征等方面进行分类。

(2)系统的体系分类:采用分层次、阶梯式的分类方法,把各个分类单元按一定顺序排列成一个大的分类系统。

(3)分类的稳定性:分类的稳定性是指在一定的时间和空间范围内,由于物种的进化和分化关系而形成的分类不会轻易发生变动。

  1. 常见动物分类释义

(1)哺乳动物:是一类具有乳腺并能哺育幼崽的动物,如猫、狗、猪、牛等。

(2)鸟类:是一类具有翅膀和羽毛的脊椎动物,如鹰、鸽子、鸡等。

(3)爬行动物:是一类冷血动物,具有鳞片、角质板、甲壳等外壳,如蛇、龟、鳄鱼等。

(4)两栖动物:是一类既能在水中生活,也能在陆地上生活的动物,如青蛙、蝾螈等。

  1. 界面展示

本教程提供了一个简单易用的动物分类界面,用户可以上传自己拍摄的动物图片,系统会自动识别出动物的种类,并显示相应的分类释义。同时,用户还可以通过界面查看其他用户上传的动物图片及其分类结果,以便更好地了解动物分类知识。

总之,本教程旨在向广大用户介绍动物分类的基本原则和方法,帮助用户更好地了解动物世界,同时提供一个方便快捷的界面,让用户可以轻松地进行动物分类。
在这里插入图片描述

主要功能:利用tinker封装InceptionV3[论文]MOD进行图像分类的一个小Demo

环境anaconda+Python3+tensorflow

IDEpycharm + jupyter notebook

2.代码框架

需要的库模块:

  • os
    tarfile
    requests
    tensorflow
    numpy
    translate
    PIL
    

一共四个代码文件:

  • get_Inception_model.py

    方法模块,下载模型将模型保存到本地

    def download_inception_model(): #下载模型将模型保存到本地
        '......'
        
    
  • nodelookup.py

    类文件,主要功能将官方标签解码成可读文本

    class NodeLookup(object):
        def __init__(self):
            self.node_lookup  # 字典,id to string
            '......'
            
        @staticmethod
        def _load(labels_path, uids_path):  # 输入:node_id, 输出:id to string字典
        	'......'
        	return dict
        
        def id_to_string(self, node_id):  # 输入:node_id, 输出:可读字符串
            '......'
        	return str
    
  • tensorflow_predictor.py

    类文件,主要功能实现图像预测

    class TensorflowPredictor():
        def __init__(self):  # 加载模型,新建session,
            '......'
    
        def predict_image(self, image_path):  # 
            '......'
            return str
    
    
  • gui.py

    界面代码,面向用户

    btn_sel  # 选择图片按钮
    img_label  # 这是是显示预测图片的全局变量
    res_label  # 这是是显示预测文字的全局变量
    
    def translator_prediction_result(pre_res):# 翻译模块 输入:英文字符串,输出:格式化中文字符串
    	'......'
        return res
    
    def selector_image():  # 选择图片按钮点击发生的事件
        '......'
        
    root.mainloop()  # 进入消息循环
    

3.实现细节

3.1.下载模型

3.1.1.实现功能

下载模型将模型保存到本地

3.1.2.Inception文件简介

Inception_v3模型源码下载

Inception为Google开源的CNN模型,至今已经公开四个版本,每一个版本都是基于大型图像数据库ImageNet中的数据训练而成。因此我们可以直接利用Google的Inception模型来实现图像分类。本项目主要以Inception_v3模型为基础。分类一张图像可以在几秒内完成。

3.1.3.流程图

Created with Raphaël 2.3.0 不存在"inception_model"文件夹? 创建"inception_model"文件夹 下载模型压缩包inception-2015-12-05.tgz 解压inception-2015-12-05.tgz 打印"Done." 结束 yes no

3.1.4.代码

# get_Inception_model.py

import tarfile
import requests


def download_inception_model():
    # inception_v3模型下载
    inception_pre_mod_url = 'http://download.tensorflow.org/models/image/imagenet/inception-2015-12-05.tgz'
    # 模型存放地址
    inception_pre_mod_dir = "inception_model"
    if not os.path.exists(inception_pre_mod_dir):
        os.makedirs(inception_pre_mod_dir)
    # 获取文件名,以及文件路径
    filename = inception_pre_mod_url.split('/')[-1]
    filepath = os.path.join(inception_pre_mod_dir, filename)
    # 下载模型
    if not os.path.exists(filepath):
        print('Downloading: ', filename)
        r = requests.get(inception_pre_mod_url, stream=True)
        with open(filepath, 'wb') as f:
            for chunk in r.iter_content(chunk_size=1024):
                if chunk: f.write(chunk)
    print("Done: ", filename)
    # 解压文件
    tarfile.open(filepath, 'r:gz').extractall(inception_pre_mod_dir)

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.流程图

Created with Raphaël 2.3.0 图像文件 模型预测函数 预测结果字符串

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 是一种用于图像分类任务的深度学习模型,通过使用多个并行的卷积操作和池化操作来提取图像特征。它在准确率和计算效率方面取得了良好的平衡,并被广泛应用于图像分类领域。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1329934.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

redis主从复制(在虚拟机centos的docker下)

1.安装docker Docker安装(CentOS)简单使用-CSDN博客 2.编辑3个redis配置 cd /etc mkdir redis-ms cd redis-ms/ vim redis6379.conf vim redis6380.conf vim redis6381.conf# master #端口号 port 6379#设置客户端连接后进行任何其他指定前需要使用的密码 requirepass 12345…

【SpringBoot篇】解决缓存击穿问题① — 基于互斥锁方式

文章目录 🌹什么是缓存击穿🌺基于互斥锁解决问题🛸思路 🏳️‍🌈代码实现 🌹什么是缓存击穿 缓存击穿是指在使用缓存系统时,对一个热点数据的高并发请求导致缓存失效,多个请求同时访…

ESP8266网络相框采用TFT_eSPI库TJpg_Decoder库mixly库UDP库实现图片传送

使用ESP8266和TFT_ESPI模块来显示图片数据。具体来说,我们将使用ILI9431显示器作为显示设备,并通过UDP协议将图片数据从发送端传输到ESP8266。最后,我们将解析这些数据并在TFT屏幕上显示出来。在这个过程中,我们将面临一些编程挑战…

The Cherno C++笔记 03

目录 Part 07 How the C Linker Works 1.链接 2.编译链接过程中出现的错误 2.1 缺少入口函数 注意:如何区分编译错误还是链接错误 注意:入口点可以自己设置 2.2 找不到自定义函数 2.2.1缺少声明 2.2.2自定义函数与引用函数不一致 2.3 在头文件中放入定义 …

conda环境下更改虚拟环境安装路径

1 引言 在Anaconda中如果没有指定路径,虚拟环境会默认安装在anaconda所安装的目录下,但如果默认环境的磁盘空间不足,无法满足大量安装虚拟环境的需求,此时我们需要更改虚拟环境的安装路径,有以下两种方案: 方案1: 每次…

【贪心算法】之 摆动序列(中等题)

实际操作上,其实连删除的操作都不用做,因为题目要求的是最长摆动子序列的长度,所以只需要统计数组的峰值数量就可以了(相当于是删除单一坡度上的节点,然后统计长度) 这就是贪心所贪的地方,让峰…

Java设计模式之单例模式以及如何防止通过反射破坏单例模式

单例模式 单例模式使用场景 ​ 什么是单例模式?保障一个类只能有一个对象(实例)的代码开发模式就叫单例模式 ​ 什么时候使用? 工具类!(一种做法,所有的方法都是static,还有一种单…

Python命令行参数解析:原理、技巧与实践

文章目录 引言命令行参数解析原理命令行参数概述使用argparse模块解析命令行参数1. 创建ArgumentParser对象2. 添加命令行参数3. 解析命令行参数4. 可选参数action5. 参数的类型转换 实践示例总结结束语 引言 在Python中,命令行参数解析是一个重要的主题&#xff0…

【稳定检索|投稿优惠】2024年绿色能源与电网电力系统国际会议(ICGEGPS 2024)

2024年绿色能源与电网电力系统国际会议(ICGEGPS 2024) 2024 International Conference on Green Energy and Grid Power Systems(ICGEGPS) 一、【会议简介】 2024年绿色能源与电网电力系统国际会议(ICGEGPS 2024)将在宜宾盛大召开。本次会议将聚焦绿色能源与电网电力系统的最新…

Linux——缓冲区

我在上篇博客留下了一个问题,那个问题就是关于缓冲区的问题,我们发现 文件有缓冲区,语言有用户级缓冲区,那么缓冲区到底是什么?,或者该怎 么认识缓冲区?这篇文章或许会让你有所认识,…

单例模式的基本用法

单例模式是众多设计模式中的一种,那说到设计模式,我们要想知道什么是设计模式? 设计模式就是一套反复使用、多数人知晓的、经过分类、代码设计经验总结。 使用设计模式是为了可重用代码、让代码更容易被他人理解,保证代码的可靠性。毫无疑问…

Oracle WebLogic Server WebLogic WLS组件远程命令执行漏洞 CVE-2017-10271

Oracle WebLogic Server WebLogic WLS组件远程命令执行漏洞 CVE-2017-10271 已亲自复现 漏洞名称漏洞描述影响版本 漏洞复现环境搭建漏洞利用 修复建议 漏洞名称 漏洞描述 在Oracle WebLogic Server 10.3.6.0.0/12.1.3.0.3/2.2.1/1.10/12.2.1.1/22.0(Application …

Pipelined-ADC设计二——结构指标及非理想因素(Part1)

本章将详细介绍电路各个模块的设计思路和设计中需要注意的关键点,给出流水线ADC中的非理想因素,并计算出流水线ADC各个模块具体指标。根据电路中信号的传输方向,依次介绍采样保持电路、Sub_ADC,MDAC 等模块的设计。(本…

【GitHub精选项目】短信系统测试工具:SMSBoom 操作指南

前言 本文为大家带来的是 OpenEthan 开发的 SMSBoom 项目 —— 一种用于短信服务测试的工具。这个工具能够发送大量短信,通常用于测试短信服务的稳定性和处理能力。在合法和道德的范畴内,SMSBoom 可以作为一种有效的测试工具,帮助开发者和系统…

关于redis单线程和IO多路复用的理解

首先,Redis是一个高性能的分布式缓存中间件。其复杂性不言而喻,对于Redis整体而言肯定不是只有一个线程。 我们常说的Redis 是单线程,主要是指 Redis 在网络 IO和键值对读写是采用一个线程来完成的,这也是 Redis 对外提供键值存储…

【ARMv8M Cortex-M33 系列 1 -- SAU 介绍】

文章目录 Cortex-M33 SAU 介绍SAU 的主要功能包括SAU 寄存器配置示例 Cortex-M33 SAU 介绍 在 ARMv8-M 架构中,SAU(Security Attribution Unit)是安全属性单元,用于配置和管理内存区域的安全属性。SAU 是 ARM TrustZone 技术的一…

论文阅读——Flamingo

Flamingo: a Visual Language Model for Few-Shot Learning 模型建模了给定交织的图片或支视频的条件下文本y的最大似然: 1 Visual processing and the Perceiver Resampler Vision Encoder:from pixels to features。 预训练并且冻结的NFNet&#xff…

kindeditor The method toJSONString() is undefined for the type JSONObject

kindeditor 插件上传文件出错的 json_simple-1.1.jar 也不知道是多老的项目,多老的包了,稀有东西

助力智能人群检测计数,基于DETR(DEtectionTRansformer)开发构建通用场景下人群检测计数识别系统

在一些人流量比较大的场合,或者是一些特殊时刻、时段、节假日等特殊时期下,密切关注当前系统所承载的人流量是十分必要的,对于超出系统负荷容量的情况做到及时预警对于管理团队来说是保障人员安全的重要手段,本文的主要目的是想要…

Liteos移植_STM32_HAL库

0 开发环境 STM32CubeMX(HAL库)keil 5正点原子探索者STM32F4ZET6LiteOS-develop分支 1 STM32CubeMX创建工程 如果有自己的工程,直接从LiteOS源码获取开始 关于STM32CubeMX的安装,看我另一篇博客STM32CubeMX安装 工程配置 创建新工程 选择芯片【STM32F…