OpenCV(12)-OpenCV的机器学习

news/2025/1/8 21:20:15/

OpenCV的机器学习

  • 基本概念
    在这里插入图片描述

  • 计算机视觉是机器学习的一种应用,而且是最有价的应用

  • 人脸识别

    • 哈尔(Haar)级联方法
    • 深度学习方法(DNN)

Haar人脸识别方法

  • 哈尔(Haar)级联方法是专门为解决人脸识别而推出的,在深度学习还不流行时,哈尔已可以商用
  • Haar人脸识别步骤:
    • 创建Haar级联器
    • 导入图片并将其灰度化
    • 调用detectMultiScale方法进行人脸识别
  • detectMultiScale(img, double scaleFactor = 1.1, int minNeighbors = 3)
    • scaleFactor缩放比例
    • minNeighbors最小像素值
#创建Haar级联器
facer = cv2.CascadeClassifier('训练文件')
#导入图片并将其灰度化
img = cv2.imread('p.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#调用detetMultiScale方法进行人脸识别
#返回值faces是[[x,y,h,w]]数组
faces = facer.detectMultiScale(gray, 1.1, 3)for(x,y,w,h) in faces:cv2.rectangle(img,(x,y),(x+w, y+h),(0,0,255),2)
  • Haar其他脸部特征的检测

  • 眼鼻口等

  • 在检测出的人脸上再检测眼睛,能提高准确度

Haar+Tesseract车牌识别

车牌识别具体步骤

  • 通过Haar定位车牌的大体位置
  • 对车牌进行预处理
    • 对车牌进行二值化处理
    • 进行形态学处理
    • 滤波去除噪点
    • 缩放
  • 调用Tesseract进行文字识别
#引入Tesseract库
import pytesseract
#创建Haar级联器
flate = cv2.CascadeClassifier('训练文件')
#导入图片并将其灰度化
img = cv2.imread('p.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#车牌定位
flates = plate.detectMultiScale(gray, 1.1, 3)for(x,y,w,h) in flates:cv2.rectangle(img,(x,y),(x+w, y+h),(0,0,255),2)#对获取的车牌进行预处理
#1.提取ROil
roi = gray[y:y+h, x:x+w]
#2.进行二值化
ret, roi_bin = cv2.threshold(roi, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)#lang指定语言,多个语言用+号连接
#config参数配置 分段形式常选8 11  引擎模式 常选3默认 
pytesseract.image_to_string(roi, lang = 'chi_sim+eng', config = '--psm 8 --oem 3')

深度学习基础知识

  • 深度学习是计算机视觉最为重要的方法
  • 深度学习简史
    • 深度学习很早就被提出,但一直停滞不前
    • 2011,微软在语音识别上使用,取得了突破
    • 2012,DNN在图像识别领域取得惊人的效果,在ImageNet评测的错误率从26%降低到15%
    • 2016,AlphaGo击败人类,引起世界震惊

深度学习网络

  • DNN (Deep Neural Netword) 深度神经网络
  • RNN (Recurrent Neural Netword) 循环神经网络
  • CNN (Convolutional Neural Netword) 卷积神经网络

在这里插入图片描述
在这里插入图片描述

  • RNN主要用途
    • 语音识别
    • 机器翻译
    • 生成图像描述

在这里插入图片描述

  • CNN主要用途

    • 图片分类、检索
    • 目标定位检测
    • 目标分割
    • 人类识别
  • 几种CNN网络实现

    • LetNet,1998,第一代CNN,28*28手写字
    • AlexNet,2012,ImageNet比赛的冠军
    • VGG、GoogleLeNet、ResNet
  • 几种CNN目标检测网络实现

    • RCNN、Fast RCNN、Fast RCNN
    • SSD(Single Shot Detectors)
    • YOLO、YOLOv2…YOLOv5

模型训练

  • 深度学习库

    • TensorFlow,Google
    • caffe->caffe2->torch(pytorch) 贾扬清
    • MXNet,Apache
  • 训练数据集

    • MNIST、Fashion-MNIST 手写字母
    • VOC 举办挑战赛时的数据集,2012年后不再举办
    • COCO,用于目标检测的大型数据集
    • ImageNet
  • 训练模型

    • Tf训练出的模型是.pb文件
    • Pytorch训练出的模型是.pth文件
    • Caffe训练出的模型是.caffe文件
    • ONNX开放性神经交换格式训练出的模型是.onnx文件
  • OpenCV对DNN的支持

    • OpenCV 3.3 将DNN转正
    • OpenCV只能使用DNN,不能训练DNN模型
  • OpenCV支持的模型

    • Tensor
    • Flowtorch(pytorch)
    • Caffe
    • DarkNet

OpenCV使用DNN

  • DNN使用步骤
    • 读取模型,并得到深度神经网络
    • 读取图片/视频
    • 将图片转成张量,送入深度神经网络
    • 进行分析,并得到结果

导入模型

  • readNetFromTensorflow(model, config)
    • model 训练出的模型文件
    • config 对网络模型的描述,如输入规格,尺寸,宽高,网络的每一层级及其作用
  • readNetFromCaffe(config, model)
  • readNetDarknet(config, model), YOLO
  • readNet(model, [config, [framework]])

blobFromImage函数读取图像并将图像转成张量

  • 将图像转成张量
  • blobFromImage(image,scalefactor = 1.0, size = Size(), mean = Scalar(), swapRB = false, crop = false…)
  • scalefactor 缩放因子
  • size 指定图像尺寸
  • mean 平均差值 RGB三元组 消除输入图像中光照的变化 (103, 116, 123)
  • swapRB RB是否进行交换 根据不同模型要求设置
  • crop 是否以图像的中心点为中心,对图像进行裁剪

将张量送入网络并执行

  • net.setInput(blob) 将张量塞进网络
  • net.forward() 让网络自动对图片进行分析

[实战]物体分类

#导入模型,并得到深度神经网络
net = cv2.readNetFromCaffe(config, model)
#读取图片,并将将图片转成张量
blob = dnn.blobFromImage(img, 1.0, (224,224), (104, 117, 123))
#将张量送入深度神经网络中,并进行预测
net.setInput(blob)
r = net.forward()
#得到结果,显示
with open(path, 'rt') as f:classes = [x [x.find("") + 1:] for x in f]order = sorted(r[0], reverse = True)
z = list(range(3))
for i in range(0, 3):z[i] = np.where(r[0] == order[i])[0][0]print('第', i+1 '项,匹配:', classes[z[i]], end = '')print('类所在行', z[i] + 1, '', '可能性:', order[i])

http://www.ppmy.cn/news/12688.html

相关文章

35岁高龄程序员的 4 条出路,提早布局,避免出局!

目录 一、40岁回首往事:自己竟没有任何核心优势二、公司遇到危机时40岁大龄程序员会怎么样三、适合大龄程序员的几条职业发展路线四、最后的寄语 这篇文章,给大家聊聊Java工程师的职业发展规划的一些思考,同时也给不少20多岁、30多岁&#…

CodeForces 438D The Child and Sequence(线段树区间取模)

CodeForces 438D The Child and Sequence 洛谷 The Child and Sequence 题目大意 给出一个长度为nnn的非负整数序列aaa,需要支持以下操作: 给出l,rl,rl,r,求l,rl,rl,r之间的数的和给出l,r,xl,r,xl,r,x,将l,rl,rl,r之间的每个a…

【JavaEE】基于TCP的客户端服务器程序

✨哈喽,进来的小伙伴们,你们好耶!✨ 🛰️🛰️系列专栏:【JavaEE】 ✈️✈️本篇内容:基于TCP的客户端服务器程序。 🚀🚀代码存放仓库gitee:JavaEE初阶代码存放! ⛵⛵作者…

《Buildozer打包实战指南》第二节 安装Kivy和Buildozer

目录 2.1 安装Kivy 2.2 安装Buildozer 2.3 验证安装 2.4 一点建议 Python是Ubuntu系统中自带的,我们在桌面上右键打开终端,然后输入python3 --version就可以看到Ubuntu系统中的Python版本了。 可以看到,Python的版本是3.10.6。虽然Python…

python中split()函数的用法详解

一、split()函数的简单应用 1.split()函数 split() 通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num1 个子字符串。它是按指定的分隔符,把一个字符串分隔成指定数目的子字符串,然后把它们放入一个列表中&…

基础数学(二)两数之和 三数之和

目录 两数之和_牛客题霸_牛客网 三数之和_牛客题霸_牛客网 两数之和_牛客题霸_牛客网 给出一个整型数组 numbers 和一个目标值 target,请在数组中找出两个加起来等于目标值的数的下标,返回的下标按升序排列。 (注:返回的数组下标从…

一行代码加速Pytorch推理速度6倍

一行代码加速Pytorch推理速度6倍 Torch-TensorRT 是 PyTorch 的集成,它利用 NVIDIA GPU 上的 TensorRT 推理优化。 只需一行代码,它就提供了一个简单的 API,可在 NVIDIA GPU 上提供高达 6 倍的性能加速。 话不多说, 线上代码, 再解释原理!!…

LeetCode 334. 递增的三元子序列(C++)

思路&#xff1a; 1.对于任何位置&#xff0c;只需要满足i < j < k &#xff0c;使得 nums[i] < nums[j] < nums[k]&#xff1b;所以只需要记录每个元素的左边最小值leftMin[i]和右边最大值rightMax[i]&#xff0c;满足条件leftMin[i-1]<nums[i]<rightMax[i1…