OpenCV:使用traincascade训练分类器完成图像识别任务

图像识别:猫

一.样本准备

选取网站:

  • 首先自网络上选取网站爬取或批量下载图片文件素材 将其保存在文件夹中
  • 选取网站时候需要稍稍注意下 可以随意搜索个关键字看看搜索结果中图片的质量怎么样
  • 有些网站可能搜索“猫” 它会把动漫形象的猫或者是其他动物一并返回在结果中
  • 这样的情况下爬取的效果就较为糟糕 对爬取的图片还需要做很多人工筛选的工作。

保存方式:

  • 其中正例与负例需要分开放置 同时我利用代码分别完成了正负例图片的重命名

  • 对图片文件进行批量重命名的python代码:

import os
path = "cat\\"
n = 0
for file in os.listdir(path):
    os.rename(path+file, path+""+str(n+1) + '.jpg')
    n += 1

正负例样本:

  • 正例与负例样本数量比例最好为1:3
  • 正例要求严格 一定要清晰地包含识别的主体
  • 负例选取的范围很广 但仍需要与正例拥有一定相关性 不应该天马行空。

样本初步完成收集后 如下所示:

在这里插入图片描述

图一:正类图片样本

在这里插入图片描述

图二:负类图片样本

二.图像处理
  • 将正例图像处理为统一尺寸 ,图片尺寸可以自己选择
  • 但过大的尺寸会导致难以训练(特别是个人笔记本电脑配置不佳)
  • 同时图片转化为灰度图 ,利用灰度图能够加快模型训练速度
  • 负例图片尺寸可以不进行处理 但仍需要转化为灰度图
weight = 40
height = 40
path = "cat\\"
outpath = "positive\\"
for file in os.listdir(path):
    img = cv.imread(path+file)
    img = cv.resize(img, (weight, height))
    gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
    cv.imwrite(outpath+file,gray)

完成处理后,图像如下:

在这里插入图片描述

图三:正类样本灰度图

三.样本描述

对正例输出样本描述的文本文件

workpath = os.getcwd()+"\\"
path = "positive\\"
f = "positive.txt"
for file in os.listdir(path):
    with open(f,"a") as f1:  
        f1.write(str(workpath+path+file)+" 1 0 0 "+str(weight)+" "+str(height)+" \n")

文本内容如下:

<图片绝对地址 识别对象 图像起始坐标 图像宽高>

在这里插入图片描述

图四:正类样本描述文本

对于负例同样需要进行处理 但是只需要保存图片地址即可

不必如正例一般添加详细信息

在这里插入图片描述

图五:负类样本描述文本

四.训练分类器

OpenCV库训练采用的是Viola-Jones框架,选择了一种类Haar矩形特征,采用Ada-Boost这种自适应上升的算法来选择用于分类的特征并进行分类,最后使用弱分类器级联的架构来实现快速运算。

在项目文件夹目录下 进入cmd环境

在这里插入图片描述

图六:进入cmd环境

输入如下语句生成vec文件

opencv_createsamples.exe -info 正例样本描述.txt -vec cat.vec -bg negative.txt -num 2037 -w 40 -h 40

如下:

在这里插入图片描述

图七:vec文件

而后利用该vec文件 生成属于自身的分类器:

opencv_traincascade.exe -data xml -vec cat.vec -bg negative.txt -numPos 1800 -numNeg 5015 -numStages 10 -featureType HAAR -w 40 -h 40 -maxDepth 3

如下 该cascade.xml文件便是我们使用的分类器:

在这里插入图片描述

图八:级联分类器

五.识别效果及调整
5.1 少量样本模型
  • 正例 40×30 灰度图 数量25

  • 负例 40×30 灰度图 数量25

  • 模型参数 stage=2 type=harr maxDepth=1

  • 训练用时:0s

  • 效果如下:

  • 在这里插入图片描述

  • 评价

  • 将非生物的物品如窗帘地板均当作特征进行了抓取

  • 较为混乱 基本没能抓住重要特征。

5.2 模型调整:补充样本集合
  • 正例 40×30 灰度图 数量772

  • 负例 120×90 灰度图 数量2599

  • 模型参数 stage=10 type=LBP maxDepth=1

  • 训练用时:3mins

  • 效果如下:

  • 在这里插入图片描述

  • 评价:

  • 能够抓住一定的猫的特征了 比如独特的猫耳朵 猫爪子

  • 但是还是效果不佳 如无环境干扰下将狗的毛发认作了猫的特征

  • 在这里插入图片描述

5.3 模型调整:增大图片尺寸
  • 正例 60×45 灰度图 数量772

  • 负例 180×135 灰度图 数量2599

  • 模型参数 stage=10 type=LBP maxDepth=1

  • 训练用时:1h30mins

  • 效果如下:

  • 在这里插入图片描述

  • 在这里插入图片描述

  • 在这里插入图片描述

5.4 模型调整:补充样本集合
  • 正例 20×20 灰度图 数量2037

  • 负例 60×60 灰度图 数量5015

  • 模型参数 stage=10 type=HAAR maxDepth=3

  • 训练用时: 5h 30mins

  • 效果如下:

  • 当干扰较少时 能够较好地抓取到猫猫的独特特征

  • 在这里插入图片描述

  • 在这里插入图片描述

  • 但如果环境较为复杂 则极容易出错

  • 在这里插入图片描述

  • 将地毯的绒毛看作了猫猫的特征:

  • 在这里插入图片描述

5.5 模型调整:增大图片尺寸
  • 正例 30×30 灰度图 数量2037
  • 负例 90×90 灰度图 数量5015
  • 模型参数 stage=10 type=HAAR maxDepth=3
  • 训练用时: 47h01mins

在这里插入图片描述

在这里插入图片描述

  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 使用OpenCV-Python可以训练分类器分类器是一种机器学习模型,可以将输入数据分为不同的类别。在OpenCV-Python中,可以使用Haar特征分类器或LBP特征分类器训练分类器训练分类器需要准备好训练数据集和测试数据集,然后使用机器学习算法进行训练训练完成后,可以使用分类器对新的数据进行分类。 ### 回答2: OpenCV-Python 是一个强大的计算机视觉库,它提供了许多用于图像处理和分析的功能。其中一个重要的功能就是训练分类器训练分类器是一个机器学习的过程,通过给定的训练数据集,模型可以学习到不同的特征,并根据这些特征对新的未知数据进行分类。在 OpenCV-Python 中,我们可以使用支持向量机(SVM)来进行分类器训练。 在训练分类器之前,我们首先需要准备好训练数据集。数据集应包含我们希望训练的对象的图像,并且每个图像都应标记为所属的类别。 使用 OpenCV-Python 进行分类器训练的步骤如下: 1. 加载训练数据集:使用 OpenCV 的函数加载训练图像和对应的类别标签。 2. 特征提取:将加载的图像转换为特征向量,以便机器学习模型可以学习到图像的特征。 3. 数据预处理:对特征向量进行预处理,例如标准化、降维等。 4. 训练分类器使用 SVM 算法对预处理后的特征向量进行训练,得到分类器模型。 5. 保存分类器模型:将训练得到的分类器模型保存到文件中,以便之后可以加载和使用。 通过训练分类器,我们可以将新的图像数据进行分类,从而实现图像识别和目标检测等任务。在实际应用中,我们可以使用 OpenCV-Python 提供的分类器识别人脸、车辆、物体等。 总的来说,使用 OpenCV-Python 训练分类器是一个相对复杂的过程,需要准备好训练数据集并按照一定的步骤进行训练。但通过合理的训练和调整参数,我们可以得到一个高效准确的分类器模型,从而应用于各种计算机视觉任务中。 ### 回答3: OpenCV是一个功能强大的计算机视觉库,提供各种图像处理和分析工具。通过使用OpenCV中的机器学习模块,我们可以训练自己的分类器训练分类器的第一步是准备数据集。我们需要收集足够数量的图像,每个图像都标有相应的标签。例如,如果我们要训练一个垃圾分类器,我们需要收集带有"可回收"和"不可回收"标签的图像。 接下来,我们需要将图像转化为适当的特征向量。OpenCV提供了一些用于提取特征的函数,例如计算色彩直方图或提取图像纹理特征。这些特征将用于训练分类器。 然后,我们使用收集到的图像和标签来训练分类器OpenCV提供了一些常见的机器学习算法,例如支持向量机(SVM)或k最近邻算法(KNN)。我们可以根据需要选择合适的算法,并用训练数据进行训练训练完成后,我们可以使用分类器来进行预测。对于新的未标记图像,我们将提取相同的特征并使用分类器来预测其标签。 需要注意的是,训练分类器是一个复杂的过程,需要考虑到数据集的大小和质量,以及特征选择和算法调优等方面。在实践中,我们通常需要进行多次实验和调整来获得最佳的分类器性能。 总之,使用OpenCV的机器学习模块,我们可以训练自己的分类器并用于解决各种计算机视觉问题。这是一个令人兴奋且具有挑战性的领域,可以在图像分析、目标检测和图像识别等应用中发挥重要作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值