热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

图像识别讲解以一个简单的图像识别任务为例

图像识别概念图像识别是识别图像中物体的类别(属于哪一个类)的任务。图像识别通常被称为ImageClassification、Categorization、Clustering。卷积

图像识别概念


图像识别是识别图像中物体的类别(属于哪一个类)的任务。图像识别通常被称为Image Classification、Categorization、Clustering。
卷积神经网络(CNN)出现之前,一般用HOG、SIFT、SURF等方法先从图像中提取特征,然后通过特征确定物体的类别。



利用图像直方图实现简单的图像识别任务


算法流程:


  1. 将训练集中的图像进行减色处理(图像色彩量化:图像色彩量化详解)。RGB每个分量都只取4个值。
  2. 创建训练集减色图像的直方图。RGB图像的直方图中,B=[1,4],G=[5,8]、R=[9,12],此时bin=12,但是我还需要保留每张训练图所属的类别,所以,bin=13。数据这样存储:database = np.zeros( (训练数据数,13),dtype=np.int )。所有训练数据的柱状图如下:
    色彩量化后训练数据的柱状图
    database具有如下的形状和内容(每一行最后一列是图像所属的类别):
    database的形状和内容
  3. 将测试集图像进行色彩量化,计算测试集图像的直方图与训练集中每个直方图的差,将差称作特征向量。
  4. 直方图差异总和最小的训练集中图像的类别就是我们预测的待测图像的类别。换句话说,待测图像的类别与近色图像一致。

实验代码:

import cv2
import numpy as np
import matplotlib.pyplot as plt
from glob import glob# 色彩量化
def dic_color(img):img //= 63img = img * 64 + 32return img# 创建 Database(db)
def get_DB():# get training image pathtrain = glob("../dataset/train/*")train.sort()# prepare databasedb = np.zeros((len(train), 13), dtype=np.int32)# prepare path databasepdb = []# each imagefor i, path in enumerate(train):# read imageimg = dic_color(cv2.imread(path))#get histogramfor j in range(4):db[i, j] = len(np.where(img[..., 0] == (64 * j + 32))[0])db[i, j+4] = len(np.where(img[..., 1] == (64 * j + 32))[0])db[i, j+8] = len(np.where(img[..., 2] == (64 * j + 32))[0])# get classif 'akahara' in path:cls = 0elif 'madara' in path:cls = 1# store class labeldb[i, -1] = cls# store image pathpdb.append(path)return db, pdb# 判断测试集中图像类别
def test_DB(db, pdb):# get test image pathtest = glob("../dataset/test/*")test.sort()accurate_N = 0.# each imagefor path in test:# read imageimg = dic_color(cv2.imread(path))# get histogramhist = np.zeros(12, dtype=np.int32)for j in range(4):hist[j] = len(np.where(img[..., 0] == (64 * j + 32))[0])hist[j+4] = len(np.where(img[..., 1] == (64 * j + 32))[0])hist[j+8] = len(np.where(img[..., 2] == (64 * j + 32))[0])# get histogram differencedifs = np.abs(db[:, :12] - hist)# axis=1表示以行为单位,求每一行的和difs = np.sum(difs, axis=1)# get argmin of differencepred_i = np.argmin(difs)# get prediction labelpred = db[pred_i, -1]if pred == 0:pred_label = "akahara"elif pred == 1:pred_label = "madara"gt = "akahara" if "akahara" in path else "madara"if gt == pred_label:accurate_N += 1print(path, "is similar >>", pdb[pred_i], " Pred >>", pred_label)accuracy = accurate_N / len(test)print("Accuracy >>", accuracy, "({}/{})".format(int(accurate_N), len(test)))if __name__ == '__main__':db, pdb = get_DB()test_DB(db, pdb)

实验输出(包含识别出的图像的类别和识别准确率):

图像识别结果及识别准确率


推荐阅读
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
author-avatar
凡秘能
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有