如何用opencv训练(opencv 训练)-尊龙官方网站
发布时间:2023-05-08 16:47 作者:人工智能研究所 点击: 【 字体:大 中 小 】
如何用opencv训练(opencv 训练)?如果你对这个不了解,来看看!
5步实现深度学习opencv对象检测:faster-rcnn图片识别,下面是人工智能研究所给大家的分享,一起来看看。
如何用opencv训练
faster-rcnn对象检测算法是r-cnn对象检测的第三个版本算法,其前面还有fast-rcnn与rcnn算法,由于r-cnn无法实现end-to-end训练,fast r-cnn selective search耗时比较长等原因,作者在此2版的基础上,更新到了faster-rcnn对象检测算法。
从下方结构图可以看出:faster-rcnn对象检测算法将特征提取、proposal提取、bounding box regression、classification整合到一个网络中,对象检测速度不仅有了提示还避免了前2个版本的缺点。
faster r-cnn对象检测流程:1、特征提取(convolutional layer):faster r-cnn使用卷积 relu pooling池化层提取被检测对象的特征。
2、区域预测网络(region proposal network):rpn通过softmax函数判断锚点(anchors)属于某个特征,再利用边界框回归(bounding box regression)修正anchors获得精确的对象检测值。
3、目标区池化(roi pooling):收集输入的特征数据和候选目标区域,利用此层信息提取目标区域特征数据,然后全连接层识别图片。
4、分类(classification):利用目标区域特征数据计算太识别图片,同时利用边界框回归获得对象检测的精确位置。
如何来实现faster r-cnn,以及faster r-cnn的具体工作是如何实现的,小编也参考了很多网友的源码,无奈代码量太大(少的也得几千行),我们前期分享了如何使用opencv与mobilenet ssd的图像识别以及视频实时识别
mobilenet ssd视频流实时识别
mobilenet ssd图像识别
同样使用opencv也可以来实现faster r-cnn的对象检测算法,很多代码都比较类似,小伙伴们也可以参考往期文章
使用opencv进行基于faster r-cnn深度学习的对象检测faster r-cnn prototxt 与faster r-cnn model模型已经共享:
回复:rcnn 即可领取
模型一共2种:
faster_rcnn_inception_v2与faster_rcnn_resnet50,2种模型是在不同的训练集上训练的数据,其中faster_rcnn_inception_v2模型较小,速度较快,本期按照此模型来搭建对象检测,其faster_rcnn_resnet50模型跟faster_rcnn_inception_v2模型的代码完全一致,只是修改一下模型的路径便可
在本节中,我们将使用 opencv中的深度神经网络( dnn)模块与faster r-cnn prototxt 与faster r-cnn model来构建我们的对象检测器
1、模型以及第三方库
首先导入模型以及模型参数,若使用faster_rcnn_resnet50模型, 12 、13行直接修改为faster_rcnn_resnet50模型的相对地址
2、定义模型识别类型
faster r-cnn模型相比ssd来说,能够识别的种类,丰富了很多,大概有100个种类,几乎包含了生活中所能涉及的种类,当然,若你有强大的数据支撑,也可以来训练自己的模型(后期分享如何来训练自己的模型)
3、opencv建立神经网络
对比51 、52行可以知道,ssd模型是在caffe上训练的模型,而faster r-cnn模型是tensorflow上训练的模型,但是强大的opencv库使用dnn函数就能很方便的加载预训练模型,且可以对比看出,其模型与参数文件前后有区别
4、计算blob,进行神经网络的预测
获取图片的长宽参数,重新调整图片长宽为300*300,来进行图片blob的计算,然后blob传入神经网络来进行计算,使用前向传播来预测图片
5、遍历预测值,提取设置阈值的对象
此部分跟ssd对象检测代码完全一致,小伙伴们可参考往期文章,此模型需要加载在opencv3.4.2版本以上。
关于此代码如何利用在视频检测上,如何通过多进程来加速神经网络,请参考往期文章
深度学习和opencv对象检测(mobilenet ssd多进程视频流实时识别)
opencv 训练
在进行人脸检测之前,我们需要知道haar-like特征和级联分类器是什么。传统上使用图像强度(使用rgb)使得特征计算的任务计算成本昂贵。然后人们开始谈论基于haar小波的特征计算,以降低计算成本。paul voila和michel jones在2001年使用了这个概念并开发了haar-like features。haar-like特征考虑在检测窗口中的特定位置处的相邻矩形区域,对每个区域中的像素强度求和并计算这些和之间的差异。该差异用于对图像的子部分进行分类。例如,在人脸图像中,眼睛的区域比脸颊更暗。
因此,当检测图像中的对象时,目标尺寸的窗口在输入图像上移动,并且对于图像的每个子部分,计算类haar特征。然后将该差异与将对象与非对象分开的学习阈值进行比较。
haar-liker特征是弱学习者或分类器,因此需要大量haar-like的特征来以更高的准确度对图像进行分类。这是因为一个简单的图像可以包含超过180,000个haar-liker的微小特征。这就是为什么在haar-liker特征中被组织成一个叫做分类器级联的东西来形成一个强大的学习者或分类器。由于整体图像的使用,可以以比传统方法更快的速度计算出haar-liker的特征。
现在让我们开始代码。我们需要的第一件事是在我们的计算机上安装opencv。如果取决于您的操作系统,安装可能非常具有挑战性,但让我们看一下更简单的方法。如果您已经安装了anaconda,只需执行以下命令即可安装opencv及其依赖项:
conda install -c menpo opencv3
测试是否正确安装:
$ python3
>> import cv2
如果python shell中的这个命令没有给出任何错误,那么祝贺一切都已设置好。opencv配有探测器和训练器。现在,为了检测眼睛和面部,我们需要两个具有预定义haar特征或分类器的xml文件。当然,您也可以构建自己的分类器来检测对象。但是我们在这里检测面部和眼睛,opencv已经带有分类器,所以为什么要重新发明轮子。它将为我们节省大量开发系统的时间。我们可以从opencv的github仓库下载以下两个文件:
haarcascade_frontalface_default.xml(https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml)haarcascade_eye.xml(https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_eye.xml)现在在与上述xml文件相同的目录中创建另一个名为facedetection.py的文件。然后在python文件中,我们首先导入opencv库并加载两个级联。
由于haar-like特征分类器或级联仅适用于灰度图像,因此我们需要将图像转换为灰度。
import cv2
# load the haar cascades
face_cascade = cv2.cascadeclassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.cascadeclassifier('haarcascade_eye.xml')
现在我们需要一个能够进行检测的函数。我们首先得到检测面部和眼睛的坐标。然后我们将迭代视频中检测到的面部,并为每个面部绘制指示面部的矩形。在每个面孔内,我们都会发现眼睛。
import cv2
# load the haar cascades
face_cascade = cv2.cascadeclassifier('haarcascade_frontalface_default.xml')
eyes_cascade = cv2.cascadeclassifier('haarcascade_eye.xml')
# define function that will do detection
def detect(gray, frame):
""" input = greyscale image or frame from video stream
output = image with rectangle box in the face
"""
# now get the tuples that detect the faces using above cascade
faces = face_cascade.detectmultiscale(gray, 1.3, 5)
# faces are the tuples of 4 numbers
# x,y => upperleft corner coordinates of face
# width(w) of rectangle in the face
# height(h) of rectangle in the face
# grey means the input image to the detector
# 1.3 is the kernel size or size of image reduced when applying the detection
# 5 is the number of neighbors after which we accept that is a face
# now iterate over the faces and detect eyes
for (x,y,w,h) in faces:
cv2.rectangle(frame, (x,y), (x w, y h), (255,0,0), 2)
# arguements => image, top-left coordinates, bottomright coordinates, color, rectangle border thickness
# we now need two region of interests(roi) grey and color for eyes one to detect and another to draw rectangle
roi_gray = gray[y:y h, x:x w]
roi_color = frame[y:y h, x:x w]
# detect eyes now
eyes = eyes_cascade.detectmultiscale(roi_gray, 1.1, 3)
# now draw rectangle over the eyes
for (ex, ey, ew, eh) in eyes:
cv2.rectangle(roi_color, (ex,ey), (ex ew, ey eh), (0, 255, 0), 2)
return frame
现在,您需要从网络摄像头捕获视频,然后从这些视频中选择一个帧。获得帧后,需要转换为灰度,然后将彩色和灰度图像帧传递给上述函数。
# capture video from webcam
video_capture = cv2.videocapture(0)
# run the infinite loop
while true:
# read each frame
_, frame = video_capture.read()
# convert frame to grey because cascading only works with greyscale image
gray = cv2.cvtcolor(frame, cv2.color_bgr2gray)
# call the detect function with grey image and colored frame
canvas = detect(gray, frame)
# show the image in the screen
cv2.imshow("video", canvas)
# put the condition which triggers the end of program
if cv2.waitkey(1) & 0xff == ord('q'):
break
video_capture.release()
cv2.destroyallwindows()
现在,如果您运行上述代码,您将看到您的眼睛和脸部被检测到。