使用OpenCV-python对植物图片进行分类

文章目录

  • 图片分类的思路和需要加载的库函数说明
  • 核心代码分析
    • 数据预处理:文件处理和命名匹配
    • 数据预处理:特征提取和标签提取
    • 学习模型:数据划分和模型训练
    • 预测输出:利用训练好的模型进行图片分类
  • 完整代码附录和运行结果

图片分类的思路和需要加载的库函数说明

图片分类的基本思路如下

  1. 首先需要有一个标注好图片里面花朵名称的数据集,例如命名好的rose.png
  2. 特征提取,即提取图片中的重要特征(能区别于其他图片的特征),并把重要特征加工成可以训练的数据,因为每种花的颜色分布不同,这里的思路是计算图片的彩色直方图信息,作为图片的特征。
  3. 标签提取,即把图片标注加工成数值信息,这里的思路是把图片的字符串名字转换成唯一的数字序列。
  4. 挑选一个分类器模型,例如随机森林分类器,然后划分训练集和测试集进行训练,得到学习器,即分类模型。
  5. 用这个训练好的模型,对图片进行分离,即利用模型预测。

需要使用的库函数和功能说明

# 标签处理
from sklearn.preprocessing import LabelEncoder# 随机森林分类器模型
from sklearn.ensemble import RandomForestClassifier# 对数据集进行有效划分的方法,划分成训练集和测试集
# from sklearn.cross_validation import train_test_split
# 在python新版本中,train_test_split被移动到model_selection中
from sklearn.model_selection import train_test_split# 分类器性能评估报告
from sklearn.metrics import classification_report# 基本矩阵运算库
import numpy as np# 文件操作模块,主要是进行文件搜索和通配符操作
import glob# opencv函数库
import cv2 

核心代码分析

数据预处理:文件处理和命名匹配

glob函数使用参考:python glob model - 漩涡鸣人 - 博客园

# 加载所有的图片和蒙版
imagePath = "dataset/images"
maskPath  = "dataset/masks"
# 利用sorted函数实现名字的一一对应,对每个图片进行蒙版的加载
imagePaths = sorted(glob.glob(imagePath + "/*.png"))
maskPaths  = sorted(glob.glob(maskPath + "/*.png"))

数据预处理:特征提取和标签提取

# 计算直方图,返回的是均一化之后的彩色直方图数据
features = desc.describe(image,mask)
# 构造测试数据集的特征信息集合
data.append(features)
# 注意图片的命名格式为"image_crocus_0001.png",我们需要提取的"crocus"是倒数第二个
target.append(imagePath.split("_")[-2])
# 初始化一个打标签的对象
le = LabelEncoder()
# 对target进行数字化标签index(因为字符串这种特征是不能直接拿来训练的,需要转换成唯一的数值)
target = le.fit_transform(target)

标签处理:unique()fit_transform()的用法

target = ["happy","birthday","happy","wedding","happy","ending"]

unique对这串字符串进行去重:

targetNames = np.unique(target)
print(targetNames)
['birthday' 'ending' 'happy' 'wedding']

fit_transform最后算出每个字符串label对应的标签序号,此时brithdayendinghappywedding按照字母表顺序,分别对应0~3。

le = LabelEncoder()
target = le.fit_transform(target)
print(target)
[2 0 2 3 2 1]

学习模型:数据划分和模型训练

# 对数据进行训练集和测试集的划分,划分比例是7:3
(trainData,testData,trainTarget,testTarget) = \train_test_split(data,target,test_size=0.3,random_state=42)# 初始化一个随机森林分类器模型
model = RandomForestClassifier(n_estimators=25,random_state=84)
# 用训练集训练这个分类器模型
model.fit(trainData,trainTarget)# 用测试集合评估分类器性能,并打印出来
print(classification_report(testTarget, model.predict(testData),\target_names=targetNames))

预测输出:利用训练好的模型进行图片分类

# 生成图片的特征(彩色直方图)
features = desc.describe(image,mask)
# 预测输出,从数字index转换成对应的字符串标签
flower = le.inverse_transform(model.predict([features]))[0]

完整代码附录和运行结果

from sklearn.preprocessing import LabelEncoder
from sklearn.ensemble import RandomForestClassifier
# from sklearn.cross_validation import train_test_split
# 在python新版本中,train_test_split被移动到model_selection中
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
import numpy as np
import glob
import cv2 # 定义一个RGB直方图的类和方法
class RGBHistogram:def __init__(self,bins):self.bins = bins# 定义对图片特征的描述为彩色直方图def describe(self,image,mask=None):# 计算三个通道的直方图hist=cv2.calcHist([image],[0,1,2],mask,self.bins,[0,256,0,256,0,256])# 直方图均一化,减少图片亮度和对比度信息的干扰cv2.normalize(hist,hist)return hist.flatten()# 加载所有的图片和蒙版
imagePath = "dataset/images"
maskPath  = "dataset/masks"
# 利用sorted函数实现名字的一一对应,对每个图片进行蒙版的加载
imagePaths = sorted(glob.glob(imagePath + "/*.png"))
maskPaths  = sorted(glob.glob(maskPath + "/*.png"))# data保存彩色直方图信息,保存测试数据集的feature
data = []
# target保存图片名称的字符串信息,相当于测试数据的label
target = []# 实例化一个计算RGB直方图的对象,类似于一个操作句柄
desc = RGBHistogram([8,8,8])# 数据预处理,把照片信息转换成可训练的数据
for (imagePath,maskPath) in zip(imagePaths,maskPaths):# 读取照片和蒙版image = cv2.imread(imagePath)mask  = cv2.imread(maskPath)# 虽然蒙版已经是黑白的了,但要确保图片格式也是灰度表示的mask  = cv2.cvtColor(mask,cv2.COLOR_BGR2GRAY)# 计算直方图,返回的是均一化之后的彩色直方图数据features = desc.describe(image,mask)# 构造测试数据集的特征信息集合data.append(features)# 注意图片的命名格式为"image_crocus_0001.png",我们需要提取的"crocus"是倒数第二个target.append(imagePath.split("_")[-2])# 这时候的target里面保存的是字符串,并不是具体的数值,还不能进行学习
# 对名字进行去重处理,注意target本身没变,targetNames是去重之后的标签名
targetNames = np.unique(target)
# 初始化一个打标签的对象
le = LabelEncoder()
# 对target进行数字化标签index(因为字符串这种特征是不能直接拿来训练的,需要转换成唯一的数值)
target = le.fit_transform(target)######################### 至此,数据预处理已经全部完成 ############################### 对数据进行训练集和测试集的划分,划分比例是7:3
(trainData,testData,trainTarget,testTarget) = \train_test_split(data,target,test_size=0.3,random_state=42)# 初始化一个随机森林分类器模型
model = RandomForestClassifier(n_estimators=25,random_state=84)
# 用训练集训练这个分类器模型
model.fit(trainData,trainTarget)# 用测试集合评估分类器性能,并打印出来
print(classification_report(testTarget, model.predict(testData),\target_names=targetNames))######################### 至此,训练已经全部完成 ############################### 随机抽取10个案例进行测试
for i in np.random.choice(np.arange(0,len(imagePaths)),10):imagePath = imagePaths[i]maskPath  = maskPaths[i]image = cv2.imread(imagePath)mask  = cv2.imread(maskPath)mask  = cv2.cvtColor(mask,cv2.COLOR_BGR2GRAY)# 生成特征(彩色直方图)features = desc.describe(image,mask)# 预测输出,从数字index转换成对应的字符串标签flower = le.inverse_transform(model.predict([features]))[0]print(imagePath)print("According to RFT, this flower is {}".format(flower))cv2.imshow("predicted to be {}".format(flower.upper()),image)cv2.waitKey(0)cv2.destroyAllWindows()
cv2.destroyAllWindows()

学习器的性能如下

 				precision    recall  f1-score   supportcrocus       0.92      1.00      0.96        12daisy       0.88      0.93      0.90        15pansy       1.00      0.85      0.92        20sunflower       0.96      1.00      0.98        24accuracy                           0.94        71macro avg       0.94      0.95      0.94        71
weighted avg       0.95      0.94      0.94        71

预测输出效果:

在这里插入图片描述

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

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

相关文章

学习记录:Unity点击屏幕生成随机UI花朵

1 效果展示 点击屏幕的位置生成花朵&#xff0c;生成的花朵等5秒后自动销毁。 2 代码展示 1 生成花朵的代码 using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> /// 鼠标点击生成花朵 /// </summary> public clas…

利用Python制造出七彩花朵

文章目录 前言小海龟花朵类移动函数画花朵 前言 来啦来啦来啦&#xff0c;小伙伴们快快来领取七彩花瓣雨吧&#xff01;&#xff01; 小海龟 老生常谈啦&#xff0c;在用python画樱花树前&#xff0c;我们先来了解一下turtle吧&#xff01; 小海龟(Turtle)是Python中画图的…

深度学习花朵识别系统的设计与实现

摘要&#xff1a;该项目是基于Keras的VGG16模型微调实现的深度学习花朵识别检测系统&#xff0c;使用Python语言中的cv2和numpy库对图像进行预处理&#xff0c;使用keras的ImageDataGenerator进行数据增强&#xff0c;采用Pyqt5实现功能的可视化&#xff0c;方便用户对图片进行…

使用Pytorch实现图像花朵分类

基于pytorch-classifier这个源码进行实现的图像分类 代码的介绍在这个链接里面&#xff0c;这篇博客主要是为了带着大家通过实践的方式熟悉一下代码的使用&#xff0c;并且了解相关功能。 1. 下载相关资料 这里我提供了一个花朵数据集&#xff0c;里面总共有十个类别的花朵作…

“花朵分类“ 手把手搭建【卷积神经网络】

前言 本文介绍卷积神经网络的入门案例,通过搭建和训练一个模型,来对几种常见的花朵进行识别分类; 使用到TF的花朵数据集,它包含5类,即:“雏菊”,“蒲公英”,“玫瑰”,“向日葵”,“郁金香”;共 3670 张彩色图片;通过搭建和训练卷积神经网络模型,对图像进行分类,…

(笔记一)利用open_cv在图像上进行点标记,文字注记,画圆、多边形、椭圆

&#xff08;1&#xff09;CV2中的绘图函数&#xff1a; cv2.line() 绘制线条cv2.circle() 绘制圆cv2.rectangle() 绘制矩形cv2.ellipse() 绘制椭圆cv2.putText() 添加注记 &#xff08;2&#xff09;注释 img表示需要绘制的图像color表示线条的颜色&#xff0c;采用颜色矩阵…

桌面图标不显示

问题 桌面图标不显示 解决办法 鼠标 右击->选择-查看->显示桌面图标

今天去看看俺姐(老婆)新开的超市

首发博客地址 https://blog.zysicyj.top/ 1 昨晚写博客到12点多&#xff0c;今天困死了&#xff0c;比较意外的是&#xff0c;早上老爸没有叫我&#xff0c;今天早上是老爸和小舅送的葡萄。 所以呢&#xff0c;今早睡得很晚&#xff0c;然后6点多才醒&#xff0c;睡得真舒服&am…

java恶魔之怒太平洋_熊猫人之怒恶魔降临手游辅助下载_熊猫人之怒恶魔降临修改器安卓版V3.1下载(暂未上线)_预约_飞翔下载...

熊猫人之怒恶魔降临修改器是一款简单好用的安卓游戏修改神器。通过修改正在运行的游戏的内存数据&#xff0c;达到修改游戏中的金钱、血量、得分、道具数量、攻击、防御、魔法等参数值。既简单又实用&#xff0c;让你想怎么改&#xff0c;就怎么改&#xff0c;你的游戏你做主。…

LeetCode-738-单调递增的数字

题目描述&#xff1a; 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 解题思路&#xff1a; 先将int变成char[]&#xff0c;获取…

UG+PRESSCAD五金连续模 成型模 复合模具设计视频教程

UGPRESSCAD五金连续模 成型模 复合模具设计视频教程 链接&#xff1a;https://pan.baidu.com/s/1MEQdf3DkmHAEHYOrP1USBQ 提取码&#xff1a;r9f0

教程 参数设置_UG教程之非切削参数设置

转移/快速 转移/快速指定如何从一个切削刀路移动到另一个切削刀路。通常情况下,刀具需要进行以下3个动作: (1)从其当前位置移动到指定的平面。 (2)移动到指定平面内高于进刀运动起点的位置。 (3)最后,刀具将从指定平面移动到进刀的起始处。 1.安全设置 功能:安全设置用于指…

在 WSL2 中使用 NVIDIA Docker 进行全栈开发和深度学习 TensorFlow pytorch GPU 加速

WSL2使用NVIDIA Docker进行全栈开发和深度学习 1. 前置条件 1.1. 安装系统 Windows 10 版本 2004 及更高版本&#xff08;内部版本 19041 及更高版本&#xff09;或 Windows 11 跳过 1.2. 处理好网络环境 安装过程中需要访问国际网络&#xff0c;自行处理好。建议开启 tu…

UML四大关系

文章目录 引言UML的定义和作用UML四大关系的重要性和应用场景关联关系继承关系聚合关系组合关系 UML四大关系的进一步讨论UML四大关系的实际应用软件开发中的应用其他领域的应用 总结 引言 在软件开发中&#xff0c;统一建模语言&#xff08;Unified Modeling Language&#x…

python+协同过滤算法实现简单的图书推荐系统

背景介绍 当我们做一些推荐系统网站时&#xff0c;通常需要合适的推荐算法&#xff0c;下面给大家介绍推荐系统中经典的推荐算法——协同过滤算法。在本文中通过Python语言&#xff0c;以一个图书推荐系统为案例&#xff0c;最终实现一个基于用户对图书的评分而对指定的用户个…

如何使用腾讯云服务器搭建网站?新手建站教程

使用腾讯云服务器搭建网站全流程&#xff0c;包括轻量应用服务器和云服务器CVM建站教程&#xff0c;轻量可以使用应用镜像一键建站&#xff0c;云服务器CVM可以通过安装宝塔面板的方式来搭建网站&#xff0c;腾讯云服务器网分享使用腾讯云服务器建站教程&#xff0c;新手站长搭…

代码随想录算法训练营第四十八天|LeetCode 583,72,编辑距离总结篇

目录 LeetCode 583.两个字符串的删除操作 动态规划五步曲&#xff1a; 1.确定dp[i][j]的含义 2.找出递推公式 3.初始化dp数组 4.确定遍历方向 5.打印dp数组 LeetCode 72.编辑距离 动态规划五步曲&#xff1a; 1.确定dp[i][j]的含义 2.找出递推公式 3.初始化dp数组 4.确定遍历方…

JAVA rs232

JAVA rs232 全套资源提供 全套项目资源环境都在我发布的资源里环境 MAVEN 依赖代码贴出 全套项目资源环境都在我发布的资源里 环境 Configure Virtual Serial Port Driver 模拟串口 友善串口工具调试 MAVEN 依赖 <dependency><groupId>org.bidib.jbidib.org.qba…

java输出hello world_java输出Hello World

一、输出“Hello World!” 1、新建一个java项目,点击File->New->Java Project,创建java项目的界面之后,输入项目名称wly,点击finish。 2、创建好java项目之后,鼠标右键项目,选择New->Class,创建一个类,mypackage为包名,Name类名Hello,首字母大写,点击fini…