OpenCV深入浅出了解机器学习和深度学习
机器学习是人工智能的核心,专门研究如何让计算机模拟和学习人类的行为。深度学习是机器学习中的一个热门研究方向,它主要研究样本数据的内在规律和表示层次,让计算机能够像人一样具有分析与学习能力目录(关注博主,持续分享编程干货)机器学习kNN算法图解kNN算法用kNN算法实现手写数字识别SVM算法图解SVM算法使用SVM算法识别手写数据k均值聚类算法图解k均值聚类算法使用k均值聚类算法量化图像颜色深度学习基于深度学习的图像识别基于AlexNet和Caffe模型进行图像识别基于深度学习的对象检测基于YOLO和Darknet预训练模型的对象检测
机器学习kNN算法
kNN算法将找出k个距离最近的邻居作为目标的同一类别图解kNN算法
使用OpenCV的ml模块中的kNN算法的基本步骤如下。
(1)调用cv2。mL。KNearestcreate()函数创建kNN分类器。
(2)将训练数据和标志作为输入,调用kNN分类器的train()方法训练模型。
(3)将待分类数据作为输入,调用kNN分类器的findNearest()方法找出K个最近邻居,返回分类结果的相关信息。
下面的代码在图像中随机选择20个点,为每个点随机分配标志(0或1);图像中用矩形表示标志0,用三角形表示标志1;再随机新增一个点,用kNN算法找出其邻居,并确定其标志(即完成分类)。importcv2importnumpyasnpimportmatplotlib。pyplotaspltpointsnp。random。randint(0,100,(20,2))随机选择20个点labelsnp。random。randint(0,2,(20,1))为随机点随机分配标志label0spoints〔labels。ravel()0〕分出标志为0的点plt。scatter(label0s〔:,0〕,label0s〔:,1〕,80,b,s)将标志为0的点绘制为蓝色矩形label1spoints〔labels。ravel()1〕分出标志为1的点plt。scatter(label1s〔:,0〕,label1s〔:,1〕,80,r,)将标志为1的点绘制为红色三角形newpointnp。random。randint(0,100,(1,2))随机选择一个点,下面确定其分类plt。scatter(newpoint〔:,0〕,newpoint〔:,1〕,80,g,o)将待分类新点绘制为绿色圆点plt。show()进一步使用kNN算法确认待分类新点的类别、3个最近邻居和距离knncv2。ml。KNearestcreate()创建kNN分类器knn。train(points。astype(np。float32)。cv2。ml。ROWSAMPLE,labels。astype(np。float32))训练模型ret,results,neighbours,distknn。findNearest(newpoint。astype(np。float32),3)找出3个最近邻居print(新点标志:sresults)print(邻居:sneighbours)print(距离:sdist)
新点标志:〔〔1。〕〕
邻居:〔〔0。1。1。〕〕
距离:〔〔80。296。424。〕〕
因为三个最近邻居有两个是红色三角,所以他的标志为一
用kNN算法实现手写数字识别
用下列图片用来训练。
先把下面分割为每个数字大小都是2020的图像,用于训练模型。
然后将手写的数字进行反二值化阈值处理转换成黑白图像,用像素值作为特征向量进行测试
importcv2importnumpyasnpimportmatplotlib。pyplotaspltgraycv2。imread(imga。png,0)读入手写数字的灰度图像digits〔np。hsplit(r,100)forrinnp。vsplit(gray,50)〕分解数字:50行、100列npdigitsnp。array(digits)转换为NumPy数组准备训练数据,转换为二维数组,每个图像400个像素traindatanpdigits。reshape(1,400)。astype(np。float32)trainlabelsnp。repeat(np。arange(10),500)〔:,np。newaxis〕定义标志knncv2。ml。KNearestcreate()创建kNN分类器knn。train(traindata,cv2。ml。ROWSAMPLE,trainlabels)训练模型用绘图工具创建的手写数字5图像(大小为20x20)进行测试testcv2。imread(imga5。png,0)打开图像testdatatest。reshape(1,400)。astype(np。float32)转换为测试数据ret,result,neighbours,distknn。findNearest(testdata,k3)执行测试print(result。ravel())输出测试结果print(neighbours。ravel())将对手写数字9拍摄所得图像的大小转换为20x20进行测试img2cv2。imread(imgd3。png,0)ret,img2cv2。threshold(img2,150,255,cv2。THRESHBINARYINV)反二值化阈值处理testdataimg2。reshape(1,400)。astype(np。float32)转换为测试数据ret,result,neighbours,distknn。findNearest(testdata,k3)执行测试print(result。ravel())输出测试结果print(neighbours。ravel())
用一张绘图图片和手写图片用来测试
输出结果:
〔5。〕
〔5。5。5。〕
〔3。〕
〔3。5。3。〕
SVM算法
可使用一条直线将线性可分离的数据分为两组,这条直线在SVM算法中称为决策边界;非线性可分离的数据转换为高维数据后可称为线性可分离数据。这是SVM算法的理论基础。
图解SVM算法
下面的代码在图像中选择了五个点,分为两类,类别标志分别为0和1。将五个点和标志作为已知分类数据训练SVM模型;然后用模型对图像中的所有点进行分类,根据分类结果设置图像颜色,从而直观显示图像像素的分类结果。importcv2importnumpyasnpimportmatplotlib。pyplotasplt准备训练数据,假设图像高240,宽320,在其中选择5个点traindatanp。matrix(〔〔140,60〕,〔80,120〕,〔16,10〕,〔166,190〕,〔248,180〕〕,dtypenp。float32)5个点,前3个点为一类,标志为8;后2个点为一类,标志为1labelsnp。array(〔0,0,0,1,1〕)svmcv2。ml。SVMcreate()创建SVM分类器svm。setGamma(0。50625)设置相关参数svm。setC(12。5)svm。setKernel(cv2。ml。SVMLINEAR)svm。setType(cv2。ml。SVMCSVC)svm。setTermCriteria((cv2。TERMCRITERIAMAXITER,100,1e6))svm。train(traindata,cv2。ml。ROWSAMPLE,labels)训练模型imgnp。zeros((240,320,3),dtypeuint8)创建图像colors{0:(102,255,204),1:(204,204,102)}用SVM分类器对图像像素进行分类,根据分类结果设置像素颜色foriinrange(240):forjinrange(320):pointnp。matrix(〔〔j,i〕〕,dtypenp。float32)将像素坐标转换为测试数据labelsvm。predict(point)〔1〕。ravel()执行预测,返回结果img〔i,j〕colors〔label〔0〕〕根据预测结果设置像素颜色svmvectorssvm。getUncompressedSupportVectors()获得SVM向量foriinrange(svmvectors。shape〔0〕):在图像中绘制SVM向量(红色圆)cv2。circle(img,(int(svmvectors〔i,0〕),int(svmvectors〔i,1〕)),8,(0,0,255),2)在图像中绘制训练数据点,类别标志0使用蓝色,类别标志1使用绿色cv2。circle(img,(140,60),5,(255,0,0),1)cv2。circle(img,(80,120),5,(255,0,0),1)cv2。circle(img,(160,110),5,(255,0,0),1)cv2。circle(img,(160,190),5,(0,255,0),1)cv2。circle(img,(240,180),5,(0,255,0),1)imgcv2。cvtColor(img,cv2。COLORBGR2RGB)转换为RGB格式plt。imshow(img)plt。show()显示结果
如图中三个蓝点为一类,下面两个训练点为一类,两颜色交界位置为决策边界
使用SVM算法识别手写数据
kMM算法使用了像素值作为特征向量。svm算法可使用图像的定向梯度直方图作为特征向量来对图像进行分类梯度直方图
用svm识别数字和knn的区别在于他会使用图像的定向梯度直方图作为特征向量来对图像进行分类。
下面代码步骤:
1。定义了HOG描述符的计算函数,用于将单个数字图像计算HOG描述符,再转换成一维数组(特征描述符就是通过提取图像的有用信息,并且丢弃无关信息来简化图像的表示)
2。分解图片,计算每张图片对应的HOG描述符
3。创建svm分类器,用这些图片进行训练模型
4。用绘制的图像测试importcv2importnumpyasnpdefhog(img):定义HOG描述符的计算函数hogcv2。HOGDescriptor((20,20),(8,8),(4,4),(8,8),9,1,1,0,0。2,1,64,True)定义HOGDescriptor对象hogdescriptorhog。compute(img)计算HOG描述符hogdescriptornp。squeeze(hogdescriptor)转换为一维数组returnhogdescriptor返回HOG描述符,144位imgcv2。imread(imga。png,0)digits〔np。hsplit(row,100)forrowinnp。vsplit(img,50)〕分解图像,50行、100列labelsnp。repeat(np。arange(10),500)〔:,np。newaxis〕定义对应的标记hogdata〔list(map(hog,row))forrowindigits〕计算图像的HOG描述符trainDatanp。float32(hogdata)。reshape(1,144)转换为测试数据svmcv2。ml。SVMcreate()创建SVM分类器设置相关参数svm。setKernel(cv2。ml。SVMLINEAR)svm。setType(cv2。ml。SVMCSVC)svm。setC(2。67)svm。setGamma(5。383)svm。train(trainData,cv2。ml。ROWSAMPLE,labels)训练模型用绘图工具创建的手写数字5图像(大小为20x20)进行测试testcv2。imread(imgd5。jpg,0)打开图像testdatahog(test)testdatatestdata。reshape(1,144)。astype(np。float32)转换为测试数据resultsvm。predict(testdata)〔1〕print(识别结果:,np。squeeze(result))用绘图工具创建的手写数字8图像(大小为20x20)进行测试testcv2。imread(imgd7。jpg,0)testdatahog(test)testdatatestdata。reshape(1,144)。astype(np。float32)转换为测试数据resultsvm。predict(testdata)〔1〕print(识别结果:,np。squeeze(result))
k均值聚类算法
k均值聚类算法的基本原理是根据数据的密集程度寻找相对密集数据的质心,再根据质心完成数据分类
图解k均值聚类算法
下面代码在大小为240320的图像中选择3组数据点,不同颜色显示分类数据和质心importcv2importnumpyasnpfrommatplotlibimportpyplotasplt创建聚类数据,3个类别,每个类别包含20个点datanp。vstack((np。random。randint(10,90,(20,2)),np。random。randint(80,170,(20,2)),np。random。randint(160,250,(20,2))))datadata。astype(np。float32)定义算法终止条件criteria(cv2。TERMCRITERIAEPScv2。TERMCRITERIAMAXITER,20,1。0)使用k均值聚类算法执行分类操作,k3,返回结果中label用于保存标志,center用于保存质心ret,label,centercv2。kmeans(data,3,None,criteria,10,cv2。KMEANSRANDOMCENTERS)根据运算结果返回的标志将数据分为3组,便于绘制图像data1data〔label。ravel()0〕data2data〔label。ravel()1〕data3data〔label。ravel()2〕plt。scatter(data1〔:,0〕,data1〔:,1〕,cr)绘制第1类数据点,红色绘制第2类数据点,绿色plt。scatter(data2〔:,0〕,data2〔:,1〕,cg)绘制第3类数据点,蓝色plt。scatter(data3〔:,0〕,data3〔:,1〕,cb)plt。scatter(center〔:,0〕,center〔:,1〕,100,〔CC3399〕,s)绘制质心,颜色为CC3399显示结果plt。show()
使用k均值聚类算法量化图像颜色
使用k均值聚类算法量化图像颜色,即将质心作为图像新的像素,从而减少图像中的颜色值K均值聚类步骤:
第一步:确定K值,聚类成K个类簇。
第二步:从数据中随机选择(或按照某种方式)K个数据点作为初始分类的中心。
第三步:分别计算数据中每个点到每个中心的距离,将每个点划分到离中心最近的类中
第四步:当每个中心都划分了一些点后,去每个类的均值,选出新的中心。
第五步:比较新的中心和之前的中心,如果新的中心和之前的中心之间的距离小于某阈值,或迭代次数超过某阈值,认为聚类已经收敛,终止。
第六步:否则继续迭代执行第三到五步,直到第五步满足。importcv2importnumpyasnpimgcv2。imread(imgqwe。jpg)打开图像显示原图img2img。reshape((1,3))。astype(np。float32)转换为nx3的浮点类型数组,n图像像素的总数一3定义算法终止条件criteria(cv2。TERMCRITERIAEPScv2。TERMCRITERIAMAXITER,10,1。0)K8ret,label,centercv2。kmeans(img2,K,None,criteria,10,cv2。KMEANSRANDOMCENTERS)centernp。uint8(center)将质心转换为整型img3center〔label。ravel()〕转换为一维数组img3img3。reshape((img。shape))恢复为原图像数组形状cv2。imshow(K8,img3)K12ret,label,centercv2。kmeans(img2,K,None,criteria,10,cv2。KMEANSRANDOMCENTERS)centernp。uint8(center)将质心转换为整型img3center〔label。ravel()〕转换为一维数组img3img3。reshape((img。shape))恢复为原图像数组形状cv2。imshow(K12,img3)cv2。waitKey(0)
将原图的二维(宽,高)三通道的图片转换成了一维(一列)三通道的数组根据误差和迭代次数定义算法终止的条件将一维三通道的值根据K分成的类别替换为质心的值将这个数组再转换为原图像的数组形状
下图分别是原图、k4、k8、k12的图
深度学习
机器学习通常包含输入、特征提取、分类和输出四个步骤
深度学习通常分为输入、特征提取与分类和输出3个步骤,它将机器学习中的特征提取和分类合并在同一个步骤中完成
基于深度学习的图像识别
图像识别是将图像内容作为一个对象来识别其类型。使用OpenCV中的深度学习预训练模型进行图像识别的基本步骤如下。从配置文件和预训练模型文件中加载模型。将图像文件处理为块数据(blob)。将图像文件的块数据设置为模型的输入。执行预测。处理预测结果。
基于AlexNet和Caffe模型进行图像识别
1。从文本中获取每个类别的名称
2。载入Caffe模型
3。打开用于识别分类的图像
4。创建图像块数据,将图像块数据作为神经网络输入
5。执行预测,返回的是一个11000的数组,是按照顺序对应1000种类别的可信度
6。输出排名第一的预测结果importcv2importnumpyasnpfrommatplotlibimportpyplotaspltfromPILimportImageFont,ImageDraw,Image读入文本文件中的类别名称,共0种类到每行为一个类到,从第11个字符开始为名称基本格式如下n01440764tench,Tincatincan01443537goldfish,Carassiusauratusfileopen(classes。txt)names〔r。strip()forrinfile。readlines()〕file。close()classes〔r〔10:〕forrinnames〕获取每个类别的名称从文件中载入Caffe模型netcv2。dnn。readNetFromCaffe(AlexNetdeploy。txt,AlexNetCaffeModel。dat)imagecv2。imread(imgqwe。jpg)打开图像,用于识别分类创建图像块数据,大小为(224,224),颜色通道的均值缩减比例因子为(104,117,123)blobcv2。dnn。blobFromImage(image,1,(224,224),(104,117,123))net。setInput(blob)将图像块数据作为神经网络输入执行预测,返回结果是一个1x1000的数组,按顺序对应1000种类别的可信度resultnet。forward()ptime,xnet。getPerfProfile()获得完成预测时间print(完成预测时间:。2fms(ptime1000。0cv2。getTickFrequency(0)))sortedretnp。argsort(result〔0〕)将预测结果按可信度由高到低排序top5sorted。ret〔::1〕〔:5〕获得排名前5的预测结果ctext类别:classes〔top5〔0〕〕ptext可信度:{:。2}。format(result〔0〕〔top5〔0〕〕)输出排名前5的预测结果for(index,idx)inenumerate(top5):print(t)。类别:{},可信度:(:2)。format(index1,classes〔idx〕,result〔0〕〔idx〕))在图像中输出排名第1的预测结果fontpathSTSONG。TTFfontImageFont。truetype(fontpath,80)载入中文字体,设置字号imgpilImage。fromarray(image)drawImageDraw。Draw(imgpil)draw。text((10,10),ctext,fontfont,fill(0,0,255))绘制文字draw。text((10,100),ptext,fontfont,fill(0,0,255))imgnp。array(imgpil)imgcv2。cvtColor(img,cv2。COLORBGR2RGB)plt。imshow(img)plt。axis(off)plt。show()
基于深度学习的对象检测
对象检测是指检测出图像中的所有对象。并识别对象的类型。使用OpenCV中的深度学习预训练模型进行对象检测的基本步骤如下。从配置文件和预训练模型文件中加载模型。创建图像文件的块数据(blob)。将图像文件的块数据设置为模型的输入。执行预测。处理预测结果。
基于YOLO和Darknet预训练模型的对象检测
1。从文本中获取每个类别的名称
2。载入预训练的Darknet模型
3。打开用于对象检测的图像
4。创建图像块数据,将图像块数据作为神经网络输入
5。执行预测,返回每层的预测结果
6。遍历所有的输出层,遍历层的所有输出预测结果,每个结果为一个边框
7。筛选出概率大于50的类别,获取他们的坐标
8。用非最大值抑制获得要绘制的box(为最大值一直是为了消除重复边框)
9。绘制边框
importcv2importnumpyasnpfrommatplotlibimportpyplotaspltimportmatplotlibfromPILimportInageFont,Inagoraw,Image加载字体,以便显示汉字fontpathSTSONG。TTFfontImageFont。truetype(fontpath,20)载入字体,设置字号font2{family:STSONG,size:22}matplotlib。rc(font,font2)设置plt字体从文件中加载已知的对象名称,文件保存了80个类别的对象名称,每行个fopen(objectnames。txt,encodingutf8)object。names〔r。strip()forrinf。readlines()〕f。close()从文件中加载预训练的Darknet模型modecv2。dnn。readNetFromDarknet(yolov3。cfg,yolov3。weights)imagecv2。imread(objects。jpg)打开图像文件imgH,imgWimage。shape〔:2〕utlayersmode。getLayerNames()获得输出层outlayers〔outlayers〔i〔0〕1〕foriinmode。getUnconnectedOutLayers()〕blobcv2。dnn。blobFromImage(image,1255。0,(416,416),swapRBTrue,cropFalse)创建图像块数据mode。setInput(blob)将图像块数据设置为模型输入layerresultsmode。forward(outlayers)执行预测,返回每层的预测结果ptime,mode。getPerfProfile()tiltetext完成预测时间:。2fms(ptime1000cv2。getTickFrequency())resultboxes〔〕resultscores〔〕resultnameid〔〕forlayerinlayerresults:遍历所有输出层forboxinlayer:遍历层的所有输出预测结果,每个结果为一个边框预测结果结构:x,y,w,h,confidence,80个类别的概率probsbox〔5:〕classidnp。argmax(probs)找到概率最大的类别名称probprobs〔classid〕找到最大的概率ifprob0。5:筛选出概率大于50的类别计算每个box在原图像中的绝对坐标boxbox〔0:4〕np。array〔imgW,imgH,imgW,imgH〕)(centerx,centery,width,heignt)box。astype(int)xint(centerX(width2))yint(centerY(height2))resultboxes。append(〔x,y,int(width),int(height)〕)resultscores。append(float(prob))resultnameid。append(classid)应用非最大值抑制消除重复边框,获得要绘制的boxdrawboxescv2。dnn。NMSBoxes(resultboxes,resultscores,0。6,0。3)iflen(drawboxes)0:foriindrawboxes。ravel():获得边框坐标(x,y)(resultboxes〔i〕〔0〕,resultboxes〔i〕〔1〕)(w,h)(resultboxes〔i〕〔2〕,resultboxes〔i〕〔3〕)绘制边框cv2。rectangle(image,(x,y),(xw,yh),(0,255,0),1)输出类别名称和可信度textobjectnames〔resultnameid〔i〕〕{:。1}。format(resultscores〔i〕)imgpilImage。fromarray(image)drawImageDraw。Draw(imgpil)draw。text((x5,y),text,fontfont,fill(0,0,255))绘制文字imagenp。array(imgpil)imgcv2。cvtColor(image,cv2。COLORBGR2RGB)plt。title(tiltetext)plt。imshow(img)plt。axis(off)plt。show()
到此这篇关于opencv深入浅出了解机器学习和深度学习的文章就介绍到这了,更多相关opencv机器学习内容请关注博主以前的文章或继续浏览下面的相关文章,希望大家以后多多支持!
文学生产认知科学与信息技术我们分别用曹雪芹和刘三姐(也作刘三妹)作代表,从文学的两种生产者说起。曹雪芹是作家书面文学创作的代表,他有丰富的生活经验积累,有深厚的文学修养和高超的文字表达能力,有从事《红楼……
银行办卡(银行卡怎么办理?)银行办卡(银行卡怎么办理?)办个银行卡还要提供工作证明,银行故意刁难客户?原创2021040608:17毒舌财经随着移动支付的不断解决,现在很多人支付转账大多都是使用移动……
明代私牙逐步兴盛,那该如何区分官私牙?如何区分官、私牙?韩大成先生认为明代的官牙是附属于官府开设的官店、皇店和塌房之中,如服务于市舶司中的客纲、客纪,以及明代地方政府于一些市场上设定的官牙。而明代的私牙也是经过了官……
银行卡营销(榆社农商银行城关)银行卡营销(榆社农商银行城关)春天行动以来,德州农商银行紧抓线上客户营销不放松,脚踏实地增户扩面,将银行卡作为线上产品营销的核心。截止目前,我行推广一卡通智慧社区26个,……
眼部护理精油(正确的眼部护理手法你知道吗?)眼部护理精油(正确的眼部护理手法你知道吗?)大家好,欢迎来到美致时分美容护肤知识分享课堂。眼睛是心灵的窗口,一双明亮的双眼可是电死人不偿命的。但是当眼睛开始出现细纹……
橙花精油(面部肌肤分区护理精油配方)橙花精油(面部肌肤分区护理精油配方)用植物精油护理肌肤,已经渐渐被大多数人所了解并接受,今天我们就来聊聊有关面部肌肤护理的问题:01头发养护精油迷迭香精油在众……
眼部精油按摩手法(精油按摩眼部可以用吗)眼部精油按摩手法(精油按摩眼部可以用吗)眼部的皮肤也是需要我们经常保养的地方,否则容易长皱纹,黑眼圈等,那精油按摩眼部可以用吗?精油按摩眼部有什么效果?下面我们一起来看看吧!……
罗勒精油(哪些精油可以帮助缓解类风湿关节炎?)罗勒精油(哪些精油可以帮助缓解类风湿关节炎?)类风湿关节炎可引起关节慢性炎症和疼痛。许多人使用精油来缓解类风湿性关节炎的这些症状,但是精油真的有效吗?研究表明精油无……
拉萨布达拉宫八廓街1日游布达拉宫布达拉宫位于中国西藏自治区首府拉萨市区西北的玛布日山上,是一座宫堡式建筑群,一说为吐蕃王朝赞普干布为迎娶尺尊公主和公主而兴建〔17〕〔24〕;另一说为,作为干布迁……
历史上的今天1月30日1月30日不是日本偷袭珍珠港的日子,1月30日是美国历史上最伟大的总统之一的富兰克林罗斯福的诞辰。那么他与迪斯尼和日本偷袭珍珠港又有什么联系呢?日本偷袭珍珠港我们先……
注册新浪微博(新浪微博)注册新浪微博(新浪微博)谈起新浪微博,我想几乎没有人不知道的吧,它是一个非常强大的社交网站,在这个社交网站我们可以了解到世界上很多东西,但是如果自己想要关注自己喜欢的东西……
皇帝三宫六院七十二妃,何谓三宫六院,只有七十二个妃子吗?在民间,如果问一个人皇帝的老婆有多少,答案十有八九是三宫六院七十二妃。那么,三宫六院七十二妃是实指呢,还是泛指呢?民间所谓的三宫,一般指后妃居住的中宫和东西两宫,其实这是……