opencv深入淺出了解機(jī)器學(xué)習(xí)和深度學(xué)習(xí)
機(jī)器學(xué)習(xí)
kNN算法
kNN算法將找出k個(gè)距離最近的鄰居作為目標(biāo)的 同一類別
圖解kNN算法
使用OpenCV的ml模塊中的kNN算法的基本步驟如下。
(1)調(diào)用cv2.mL.KNearest_ create()函數(shù)創(chuàng)建kNN分類器。
(2)將訓(xùn)練數(shù)據(jù)和標(biāo)志作為輸入,調(diào)用kNN分類器的train()方法訓(xùn)練模型。
(3)將待分類數(shù)據(jù)作為輸入,調(diào)用kNN分類器的findNearest()方法找出K個(gè)最近鄰居,返回 分類結(jié)果的相關(guān)信息。
下面的代碼在圖像中隨機(jī)選擇20個(gè)點(diǎn),為每個(gè)點(diǎn)隨機(jī)分配標(biāo)志( 0或1 );圖像中用矩形表示 標(biāo)志0,用三角形表示標(biāo)志1;再隨機(jī)新增一個(gè)點(diǎn),用kNN算法找出其鄰居,并確定其標(biāo)志(即完 成分類)。
import cv2 import numpy as np import matplotlib.pyplot as plt points = np. random. randint(0,100, (20,2)) #隨機(jī)選擇20個(gè)點(diǎn) labels = np. random. randint(0,2,(20,1)) #為隨機(jī)點(diǎn)隨機(jī)分配標(biāo)志 label0s = points[labels.ravel()==0] #分出標(biāo)志為0的點(diǎn) plt. scatter(label0s[:,0],label0s[:,1],80,'b','s') #將標(biāo)志為0的點(diǎn)繪制為藍(lán)色矩形 label1s = points[labels.ravel()==1] #分出標(biāo)志為1的點(diǎn) plt. scatter(label1s[:,0],label1s[:,1],80,'r','^') #將標(biāo)志為1的點(diǎn)繪制為紅色三角形 newpoint = np.random.randint(0,100,(1,2)) #隨機(jī)選擇一個(gè)點(diǎn),下面確定其分類 plt.scatter(newpoint[:,0],newpoint[:,1],80,'g','o') #將待分類新點(diǎn)繪制為綠色圓點(diǎn) plt.show() #進(jìn)一步使用kNN算法確認(rèn)待分類新點(diǎn)的類別、3個(gè)最近鄰居和距離 knn = cv2.ml.KNearest_create() #創(chuàng)建kNN分類器 knn.train(points.astype(np.float32).cv2.ml.ROW_SAMPLE,labels.astype(np. float32)) #訓(xùn)練模型 ret,results,neighbours,dist = knn.findNearest(newpoint.astype(np.float32), 3) #找出3個(gè)最近鄰居 print("新點(diǎn)標(biāo)志: %s" % results) print("鄰居: %s" % neighbours) print("距離: %s" % dist)
新點(diǎn)標(biāo)志: [[1.]]
鄰居: [[0. 1. 1.]]
距離: [[ 80. 296. 424.]]
因?yàn)槿齻€(gè)最近鄰居有兩個(gè)是紅色三角,所以他的標(biāo)志為一
用kNN算法實(shí)現(xiàn)手寫數(shù)字識(shí)別
用下列圖片用來(lái)訓(xùn)練。
先把下面分割為每個(gè)數(shù)字大小都是20*20的圖像,用于訓(xùn)練模型。
然后將手寫的數(shù)字進(jìn)行反二值化閾值處理轉(zhuǎn)換成黑白圖像,用像素值作為特征向量進(jìn)行測(cè)試
import cv2 import numpy as np import matplotlib.pyplot as plt gray = cv2. imread('img/a.png',0) #讀入手寫數(shù)字的灰度圖像 digits = [np.hsplit(r,100) for r in np.vsplit(gray,50)] #分解數(shù)字: 50行、100 列 np_digits = np.array(digits ) #轉(zhuǎn)換為NumPy數(shù)組 #準(zhǔn)備訓(xùn)練數(shù)據(jù),轉(zhuǎn)換為二維數(shù)組,每個(gè)圖像400個(gè)像素 train_data = np_digits.reshape(-1, 400). astype(np. float32) train_labels = np.repeat(np. arange(10),500)[:,np.newaxis] #定義標(biāo)志 knn = cv2.ml.KNearest_create() #創(chuàng)建kNN分類器 knn.train(train_data, cv2.ml.ROW_SAMPLE,train_labels) #訓(xùn)練模型 #用繪圖工具創(chuàng)建的手寫數(shù)字5圖像(大小為20x 20 )進(jìn)行測(cè)試 test= cv2.imread('img/a5.png',0) #打開圖像 test_data=test.reshape(1,400).astype(np.float32) #轉(zhuǎn)換為測(cè)試數(shù)據(jù) ret,result,neighbours,dist = knn. findNearest(test_data,k=3) #執(zhí)行測(cè)試 print(result.ravel()) #輸出測(cè)試結(jié)果 print(neighbours.ravel()) #將對(duì)手寫數(shù)字9拍攝所得圖像的大小轉(zhuǎn)換為20 x 20進(jìn)行測(cè)試 img2=cv2. imread('img/d3.png',0) ret,img2=cv2. threshold(img2,150, 255, cv2. THRESH_BINARY_INV) #反二值化閾值處理 test_data=img2.reshape(1,400).astype(np. float32) #轉(zhuǎn)換為測(cè)試數(shù)據(jù) ret,result,neighbours,dist = knn. findNearest(test_data,k=3) #執(zhí)行測(cè)試 print(result.ravel()) #輸出測(cè)試結(jié)果 print(neighbours .ravel())
用一張繪圖圖片和手寫圖片用來(lái)測(cè)試
輸出結(jié)果:
[5.]
[5. 5. 5.]
[3.]
[3. 5. 3.]
SVM算法
可使用一條直線將線性可分離的數(shù)據(jù)分為兩組,這條直線在SVM算法中稱為“決策邊界”; 非線性可分離的數(shù)據(jù)轉(zhuǎn)換為高維數(shù)據(jù)后可稱為線性可分離數(shù)據(jù)。這是SVM算法的理論基礎(chǔ)。
圖解SVM算法
下面的代碼在圖像中選擇了五個(gè)點(diǎn),分為兩類,類別標(biāo)志分別為0和1。將五個(gè)點(diǎn)和標(biāo)志作為已知分類數(shù)據(jù)訓(xùn)練SVM模型;然后用模型對(duì)圖像中的所有點(diǎn)進(jìn)行分類,根據(jù)分類結(jié)果設(shè)置圖像顏色,從而直觀顯示圖像像素的分類結(jié)果。
import cv2 import numpy as np import matplotlib.pyplot as plt#準(zhǔn)備訓(xùn)練數(shù)據(jù),假設(shè)圖像高240,寬320,在其中選擇5個(gè)點(diǎn) traindata=np.matrix([[140,60],[80, 120],[16,10],[166,190],[248, 180]],dtype = np.float32) #5個(gè)點(diǎn),前3個(gè)點(diǎn)為一類,標(biāo)志為8;后2個(gè)點(diǎn)為一類,標(biāo)志為1 labels = np.array([0,0,0,1,1]) svm = cv2.ml.SVM_create() #創(chuàng)建SVM分類器 svm. setGamma(0.50625) #設(shè)置相關(guān)參數(shù) svm. setC(12.5) svm. setKernel(cv2.ml.SVM_LINEAR) svm.setType(cv2.ml.SVM_C_SVC) svm. setTermCriteria((cv2. TERM_CRITERIA_MAX_ITER, 100, 1e-6)) svm.train(traindata, cv2.ml. ROW_SAMPLE, labels) #訓(xùn)練模型 img = np.zeros((240,320,3),dtype="uint8" ) #創(chuàng)建圖像 colors = {0:(102,255,204),1:(204,204,102)} #用SVM分類器對(duì)圖像像素進(jìn)行分類,根據(jù)分類結(jié)果設(shè)置像素顏色 for i in range(240): for j in range(320): point = np.matrix([[j,i]], dtype=np.float32) #將像素坐標(biāo)轉(zhuǎn)換為測(cè)試數(shù)據(jù) label = svm.predict(point)[1].ravel() #執(zhí)行預(yù)測(cè),返回結(jié)果 img[i,j] = colors[label[0]] #根據(jù)預(yù)測(cè)結(jié)果設(shè)置像素顏色 svm_vectors = svm. getUncompressedSupportVectors() #獲得SVM向量 for i in range(svm_vectors.shape[0]): #在圖像中繪制SVM向量(紅色圓) cv2.circle(img,(int(svm_vectors[i,0]),int(svm_vectors[i,1])),8,(0,0,255),2) #在圖像中繪制訓(xùn)練數(shù)據(jù)點(diǎn),類別標(biāo)志0使用藍(lán)色,類別標(biāo)志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) img = cv2. cvtColor(img, cv2.COLOR_BGR2RGB) #轉(zhuǎn)換為RGB格式 plt. imshow(img) plt. show() #顯示結(jié)果
如圖中三個(gè)藍(lán)點(diǎn)為一類,下面兩個(gè)訓(xùn)練點(diǎn)為一類,兩顏色交界位置為決策邊界
使用SVM算法識(shí)別手寫數(shù)據(jù)
kMM算法使用了像素值作為特征向量。 svm算法可使用圖像的定向梯度直方圖作為特征向量來(lái)對(duì)圖像進(jìn)行分類 梯度直方圖
用svm識(shí)別數(shù)字和knn的區(qū)別在于他會(huì)使用圖像的定向梯度直方圖作為特征向量來(lái)對(duì)圖像進(jìn)行分類。
下面代碼步驟:
1.定義了HOG描述符的計(jì)算函數(shù),用于將單個(gè)數(shù)字圖像計(jì)算HOG描述符,再轉(zhuǎn)換成一維數(shù)組(特征描述符就是通過(guò)提取圖像的有用信息,并且丟棄無(wú)關(guān)信息來(lái)簡(jiǎn)化圖像的表示)
2.分解圖片,計(jì)算每張圖片對(duì)應(yīng)的HOG描述符
3.創(chuàng)建svm分類器,用這些圖片進(jìn)行訓(xùn)練模型
4.用繪制的圖像測(cè)試
import cv2 import numpy as np def hog(img): #定義HOG描述符的計(jì)算函數(shù) hog = cv2.HOGDescriptor((20,20),(8,8),(4,4),(8,8),9,1,-1,0,0.2,1,64,True) #定義HOGDescriptor對(duì)象 hog_descriptor=hog.compute(img) #計(jì)算HOG描述符 hog_descriptor=np.squeeze(hog_descriptor) #轉(zhuǎn)換為一維數(shù)組 return hog_descriptor #返回HOG描述符,144 位 img = cv2.imread('img/a.png',0) digits=[np.hsplit(row,100) for row in np.vsplit(img, 50)] #分解圖像,50行、100列 labels = np.repeat(np. arange(10),500)[:,np.newaxis] #定義對(duì)應(yīng)的標(biāo)記 hogdata = [list(map(hog,row)) for row in digits] #計(jì)算圖像的HOG描述符 trainData = np. float32(hogdata) . reshape(-1, 144) #轉(zhuǎn)換為測(cè)試數(shù)據(jù) svm = cv2.ml.SVM_create( ) #創(chuàng)建SVM分類器 #設(shè)置相關(guān)參數(shù) svm. setKernel(cv2.ml. SVM_LINEAR) svm. setType(cv2.ml.SVM_C_SVC) svm. setC(2.67) svm. setGamma(5.383) svm. train(trainData, cv2.ml. ROW_SAMPLE, labels) #訓(xùn)練模型 #用繪圖工具創(chuàng)建的手寫數(shù)字5圖像(大小為20 x 20 )進(jìn)行測(cè)試 test= cv2.imread('img/d5.jpg',0) #打開圖像 test_data=hog(test) test_data=test_data.reshape(1, 144) . astype(np. float32) #轉(zhuǎn)換為測(cè)試數(shù)據(jù) result = svm. predict(test_data)[1] print( '識(shí)別結(jié)果: ',np. squeeze(result)) #用繪圖工具創(chuàng)建的手寫數(shù)字8圖像(大小為20 x20 )進(jìn)行測(cè)試 test= cv2. imread('img/d7.jpg' ,0) test_data=hog(test) test_data=test_data.reshape(1,144).astype(np .float32) #轉(zhuǎn)換為測(cè)試數(shù)據(jù) result = svm. predict(test_data)[1] print('識(shí)別結(jié)果:',np.squeeze(result))
k均值聚類算法
k均值聚類算法的基本原理是根據(jù)數(shù)據(jù)的密集程度尋找相對(duì)密集數(shù)據(jù)的質(zhì)心,再根據(jù)質(zhì)心完成數(shù)據(jù)分類
圖解k均值聚類算法
下面代碼在大小為240*320的圖像中選擇3組數(shù)據(jù)點(diǎn),不同顏色顯示分類數(shù)據(jù)和質(zhì)心
import cv2 import numpy as np from matplotlib import pyplot as plt #創(chuàng)建聚類數(shù)據(jù),3個(gè)類別,每個(gè)類別包含20個(gè)點(diǎn) data = np.vstack((np.random. randint(10,90, (20,2)),np. random. randint(80,170, (20, 2)),np.random.randint(160,250, (20, 2)))) data=data.astype(np.float32) #定義算法終止條件 criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 20, 1.0) #使用k均值聚類算法執(zhí)行分類操作,k=3,返回結(jié)果中l(wèi)abel用于保存標(biāo)志,center 用于保存質(zhì)心 ret,label,center=cv2. kmeans(data,3,None, criteria,10,cv2.KMEANS_RANDOM_CENTERS) #根據(jù)運(yùn)算結(jié)果返回的標(biāo)志將數(shù)據(jù)分為3組,便于繪制圖像 data1 = data[label.ravel() == 0] data2 = data[label.ravel() == 1] data3 = data[label.ravel() == 2] plt. scatter(data1[:,0], data1[:,1], c='r') #繪制第1類數(shù)據(jù)點(diǎn),紅色 #繪制第2類數(shù)據(jù)點(diǎn),綠色 plt.scatter(data2[:,0],data2[:,1],c='g') #繪制第3類數(shù)據(jù)點(diǎn),藍(lán)色 plt.scatter(data3[:,0], data3[:,1], c='b') plt.scatter(center[:,0],center[:,1],100,['#CC3399'],'s') #繪制質(zhì)心,顏色為#CC3399 #顯示結(jié)果 plt. show()
使用k均值聚類算法量化圖像顏色
使用k均值聚類算法量化圖像顏色,即將質(zhì)心作為圖像新的像素,從而減少圖像中的顏色值 K均值聚類步驟:
第一步:確定K值,聚類成K個(gè)類簇。
第二步:從數(shù)據(jù)中隨機(jī)選擇(或按照某種方式)K個(gè)數(shù)據(jù)點(diǎn)作為初始分類的中心。
第三步:分別計(jì)算數(shù)據(jù)中每個(gè)點(diǎn)到每個(gè)中心的距離,將每個(gè)點(diǎn)劃分到離中心最近的類中
第四步:當(dāng)每個(gè)中心都劃分了一些點(diǎn)后,去每個(gè)類的均值,選出新的中心。
第五步:比較新的中心和之前的中心,如果新的中心和之前的中心之間的距離小于某閾值,或迭代次數(shù)超過(guò)某閾值,認(rèn)為聚類已經(jīng)收斂,終止。
第六步:否則繼續(xù)迭代執(zhí)行第三到五步,直到第五步滿足。
import cv2 import numpy as np img = cv2.imread('img/qwe.jpg') #打開圖像 #顯示原圖 img2 = img.reshape((-1,3)). astype(np. float32) #轉(zhuǎn)換為nx 3的浮點(diǎn)類型數(shù)組,n=圖像像素的總數(shù)一3 #定義算法終止條件 criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0) K=8 ret,label,center=cv2.kmeans(img2,K,None, criteria,10,cv2.KMEANS_RANDOM_CENTERS) center = np.uint8(center) #將質(zhì)心轉(zhuǎn)換為整型 img3 = center[label.ravel()] #轉(zhuǎn)換為一維數(shù)組 img3 = img3.reshape((img.shape)) #恢復(fù)為原圖像數(shù)組形狀 cv2.imshow('K=8',img3) K=12 ret,label,center=cv2. kmeans(img2,K,None, criteria,10,cv2.KMEANS_RANDOM_CENTERS) center = np.uint8(center) #將質(zhì)心轉(zhuǎn)換為整型 img3 = center[label.ravel()] #轉(zhuǎn)換為一維數(shù)組 img3 = img3.reshape((img.shape)) #恢復(fù)為原圖像數(shù)組形狀 cv2.imshow('K=12',img3) cv2.waitKey(0)
- 將原圖的二維(寬,高)三通道的圖片轉(zhuǎn)換成了一維(一列)三通道的數(shù)組
- 根據(jù)誤差和迭代次數(shù)定義算法終止的條件
- 將一維三通道的值根據(jù)K分成的類別替換為質(zhì)心的值
- 將這個(gè)數(shù)組再轉(zhuǎn)換為原圖像的數(shù)組形狀
下圖分別是原圖、k=4、k=8、k=12的圖
深度學(xué)習(xí)
機(jī)器學(xué)習(xí)通常包含輸入、特征提取、分類和輸出四個(gè)步驟
深度學(xué)習(xí)通常分為輸入、特征提取與分類和輸出3個(gè)步驟,它將機(jī)器學(xué)習(xí)中的特征提取和分類和并在同一個(gè)步驟中完成
基于深度學(xué)習(xí)的圖像識(shí)別
圖像識(shí)別是將圖像內(nèi)容作為一個(gè)對(duì)象來(lái)識(shí)別其類型。使用OpenCV中的深度學(xué)習(xí)預(yù)訓(xùn)練模型進(jìn)行圖像識(shí)別的基本步驟如下。
- 從配置文件和預(yù)訓(xùn)練模型文件中加載模型。
- 將圖像文件處理為塊數(shù)據(jù)( blob )。
- 將圖像文件的塊數(shù)據(jù)設(shè)置為模型的輸入。
- 執(zhí)行預(yù)測(cè)。
- 處理預(yù)測(cè)結(jié)果。
基于AlexNet和Caffe模型進(jìn)行圖像識(shí)別
1.從文本中獲取每個(gè)類別的名稱
2.載入Caffe模型
3.打開用于識(shí)別分類的圖像
4.創(chuàng)建圖像塊數(shù)據(jù),將圖像塊數(shù)據(jù)作為神經(jīng)網(wǎng)絡(luò)輸入
5.執(zhí)行預(yù)測(cè),返回的是一個(gè)1*1000的數(shù)組,是按照順序?qū)?yīng)1000種類別的可信度
6.輸出排名第一的預(yù)測(cè)結(jié)果
import cv2 import numpy as np from matplotlib import pyplot as plt from PIL import ImageFont,ImageDraw, Image #讀入文本文件中的類別名稱,共0種類到每行為一個(gè)類到,從第11個(gè)字符開始為名稱 #基本格式如下 # n01440764 tench, Tinca tinca # n01443537 goldfish, Carassius auratus file=open('classes.txt' ) names=[r.strip() for r in file.readlines()] file.close() classes = [r[10:] for r in names] #獲取每個(gè)類別的名稱 #從文件中載入Caffe模型 net = cv2.dnn.readNetFromCaffe("AlexNet_deploy.txt", "AlexNet_CaffeModel.dat") image = cv2. imread("img/qwe.jpg") #打開圖像,用于識(shí)別分類 #創(chuàng)建圖像塊數(shù)據(jù),大小為(224,224),顏色通道的均值縮減比例因子為(104, 117, 123) blob = cv2.dnn. blobFromImage(image, 1, (224,224), (104, 117, 123)) net. setInput(blob) #將圖像塊數(shù)據(jù)作為神經(jīng)網(wǎng)絡(luò)輸入 #執(zhí)行預(yù)測(cè),返回結(jié)果是一個(gè) 1x 1000的數(shù)組,按順序?qū)?yīng)1000種類別的可信度 result = net. forward() ptime, x = net. getPerfProfile() #獲得完成預(yù)測(cè)時(shí)間 print('完成預(yù)測(cè)時(shí)間: %.2f ms' % (ptime * 1000.0 / cv2.getTickFrequency(0))) sorted_ret = np. argsort(result[0]) #將預(yù)測(cè)結(jié)果按可信度由高到低排序 top5 = sorted. ret[::-1][:5] #獲得排名前5的預(yù)測(cè)結(jié)果 ctext = "類別: "+classes[top5[0]] ptext = "可信度: {:.2%}" . format(result[0][top5[0]]) #輸出排名前5的預(yù)測(cè)結(jié)果 for (index, idx) in enumerate(top5): print("t).類別: {},可信度: (:2%)" .format(index + 1, classes[idx], result[0][idx])) #在圖像中輸出排名第1的預(yù)測(cè)結(jié)果 fontpath = "STSONG. TTF" font = ImageFont . truetype( fontpath, 80) #載入中文字體,設(shè)置字號(hào) img_pil = Image. fromarray(image) draw = ImageDraw.Draw(img_pil) draw.text((10, 10),ctext, font = font,fill=(0,0,255)) #繪制文字 draw.text((10,100),ptext, font = font, fill=(0,0,255)) img = np.array(img_pil) img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB) plt.imshow(img) plt.axis('off') plt.show()
基于深度學(xué)習(xí)的對(duì)象檢測(cè)
對(duì)象檢測(cè)是指檢測(cè)出圖像中的所有對(duì)象。并識(shí)別對(duì)象的類型。使用OpenCV中的深度學(xué)習(xí)預(yù)訓(xùn)練模型進(jìn)行對(duì)象檢測(cè)的基本步驟如下。
- 從配置文件和預(yù)訓(xùn)練模型文件中加載模型。
- 創(chuàng)建圖像文件的塊數(shù)據(jù)( blob )。
- 將圖像文件的塊數(shù)據(jù)設(shè)置為模型的輸入。
- 執(zhí)行預(yù)測(cè)。
- 處理預(yù)測(cè)結(jié)果。
基于YOLO和Darknet預(yù)訓(xùn)練模型的對(duì)象檢測(cè)
1.從文本中獲取每個(gè)類別的名稱
2.載入預(yù)訓(xùn)練的Darknet模型
3.打開用于對(duì)象檢測(cè)的圖像
4.創(chuàng)建圖像塊數(shù)據(jù),將圖像塊數(shù)據(jù)作為神經(jīng)網(wǎng)絡(luò)輸入
5.執(zhí)行預(yù)測(cè),返回每層的預(yù)測(cè)結(jié)果
6.遍歷所有的輸出層,遍歷層的所有輸出預(yù)測(cè)結(jié)果,每個(gè)結(jié)果為一個(gè)邊框
7.篩選出概率大于50%的類別,獲取他們的坐標(biāo)
8.用非最大值抑制獲得要繪制的box(為最大值一直是為了消除重復(fù)邊框)
9.繪制邊框
import cv2 import numpy as np from matplotlib import pyplot as plt import matplotlib from PIL import InageFont, Inagoraw, Image #加載字體,以便顯示漢字 fontpath = "STSONG.TTF” font = ImageFont.truetype(fontpath,20) #載入字體,設(shè)置字號(hào) font2 = {'family': 'STSONG', "size": 22} matplotlib.rc('font', **font2) #設(shè)置plt字體 #從文件中加載已知的對(duì)象名稱,文件保存了80個(gè)類別的對(duì)象名稱,每行個(gè) f=open(" object_names .txt",encoding=' utf-8') object. names = [r.strip() for r in f.readlines()] f.close() #從文件中加載預(yù)訓(xùn)練的Darknet模型 mode = cv2. dnn. readNetFromDarknet("yolov3.cfg", "yolov3.weights") image = cv2. imread(" objects. jpg") #打開圖像文件 imgH, imgW = image . shape[ :2] ut_layers = mode. getLayerNames() #獲得輸出層 out_layers = [out_layers[i[0] - 1] for i in mode.getUnconnectedOutLayers()] blob = cv2.dnn. blobFromImage(image, 1/255.0, (416,416),swapRB=True, crop=False) #創(chuàng)建圖像塊數(shù)據(jù) mode . setInput(blob) #將圖像塊數(shù)據(jù)設(shè)置為模型輸入 layer_results = mode . forward(out_layers) #執(zhí)行預(yù)測(cè),返回每層的預(yù)測(cè)結(jié)果 ptime,_ = mode. getPerfProfile() tilte_text='完成預(yù)測(cè)時(shí)間: %.2f ms' % (ptime* 1000/cv2. getTickFrequency()) result_boxes = [] result_scores = [] result_name_id = [] for layer in layer_results: #遍歷所有輸出層 for box in layer: #遍歷層的所有輸出預(yù)測(cè)結(jié)果,每個(gè)結(jié)果為一個(gè)邊框 #預(yù)測(cè)結(jié)果結(jié)構(gòu): x, y, w, h, confidence, 80 個(gè)類別的概率 probs = box[5:] class_id = np.argmax(probs) #找到概率最大的類別名稱 prob = probs[class_id] #找到最大的概率 if prob > 0.5: #篩選出概率大于50%的類別 #計(jì)算每個(gè)box在原圖像中的絕對(duì)坐標(biāo) box = box[0:4]* np.array[imgW, imgH, imgW, imgH]) (centerx, centery, width, heignt) = box.astype("int") x = int(centerX - (width / 2)) y = int(centerY - (height / 2)) result_boxes.append([x, y, int(width),int(height)]) result_scores . append(float(prob)) result_name_id. append(class_id) #應(yīng)用非最大值抑制消除重復(fù)邊框,獲得要繪制的box draw_boxes = cv2.dnn. NMSBoxes(result_boxes, result_scores, 0.6, 0.3) if len(draw_boxes) > 0: for i in draw_boxes.ravel(): #獲得邊框坐標(biāo) (x, y) = (result_boxes[i][0], result_boxes[i][1]) (w, h) = (result_boxes[i][2], result_boxes[i][3]) #繪制邊框 cv2.rectangle(image,(x,y), (x+w,y+h),(0,255,0),1) #輸出類別名稱和可信度 text=object_names[result_name_id[i]] +"\n{: .1%}". format(result_scores[i]) img_pil = Image.fromarray(image) draw = ImageDraw.Draw(img_pil) draw.text((x+5,y), text, font = font,fill=(0,0,255)) #繪制文字 image = np.array(img_pil) img = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) plt. title(tilte_text) plt. imshow(img) plt.axis('off') plt. show()
到此這篇關(guān)于opencv深入淺出了解機(jī)器學(xué)習(xí)和深度學(xué)習(xí)的文章就介紹到這了,更多相關(guān)opencv 機(jī)器學(xué)習(xí) 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
opencv-python 讀取圖像并轉(zhuǎn)換顏色空間實(shí)例
今天小編就為大家分享一篇opencv-python 讀取圖像并轉(zhuǎn)換顏色空間實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12python實(shí)現(xiàn)樹形打印目錄結(jié)構(gòu)
這篇文章主要為大家詳細(xì)介紹了python樹形打印目錄結(jié)構(gòu)的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03Python實(shí)現(xiàn)字符串格式化的方法小結(jié)
本篇文章主要介紹了Python實(shí)現(xiàn)字符串格式化的方法小結(jié),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02時(shí)間序列重采樣和pandas的resample方法示例解析
這篇文章主要為大家介紹了時(shí)間序列重采樣和pandas的resample方法示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09使用Python實(shí)現(xiàn) 學(xué)生學(xué)籍管理系統(tǒng)
這篇文章主要介紹了使用Python實(shí)現(xiàn) 學(xué)生學(xué)籍管理系統(tǒng),代碼大致分為五個(gè)函數(shù)組成,具體內(nèi)容詳情本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2019-11-11基于Python的PIL庫(kù)學(xué)習(xí)詳解
這篇文章主要介紹了基于Python的PIL庫(kù)學(xué)習(xí)詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-05-05Pycharm學(xué)生免費(fèi)專業(yè)版安裝教程的方法步驟
這篇文章主要介紹了Pycharm學(xué)生免費(fèi)專業(yè)版安裝教程的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09