欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

opencv深入淺出了解機(jī)器學(xué)習(xí)和深度學(xué)習(xí)

 更新時(shí)間:2022年03月17日 10:41:46   作者:大吖么大白菜  
機(jī)器學(xué)習(xí)是人工智能的核心,專門研究如何讓計(jì)算機(jī)模擬和學(xué)習(xí)人類的行為。?深度學(xué)習(xí)是機(jī)器學(xué)習(xí)中的一個(gè)熱門研究方向,它主要研究樣本數(shù)據(jù)的內(nèi)在規(guī)律和表示層次,讓計(jì)算機(jī)能夠讓人一樣具有分析與學(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í)例

    今天小編就為大家分享一篇opencv-python 讀取圖像并轉(zhuǎn)換顏色空間實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • python實(shí)現(xiàn)樹形打印目錄結(jié)構(gòu)

    python實(shí)現(xiàn)樹形打印目錄結(jié)構(gòu)

    這篇文章主要為大家詳細(xì)介紹了python樹形打印目錄結(jié)構(gòu)的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • 基于Python編寫詞云軟件并顯示分詞結(jié)果

    基于Python編寫詞云軟件并顯示分詞結(jié)果

    這篇文章主要為大家詳細(xì)介紹了如何基于Python編寫一個(gè)簡(jiǎn)單的詞云制作軟件并顯示分詞結(jié)果,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下
    2023-10-10
  • 解決pyinstaller打包pyqt5的問(wèn)題

    解決pyinstaller打包pyqt5的問(wèn)題

    今天小編就為大家分享一篇解決pyinstaller打包pyqt5的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • Python實(shí)現(xiàn)字符串格式化的方法小結(jié)

    Python實(shí)現(xiàn)字符串格式化的方法小結(jié)

    本篇文章主要介紹了Python實(shí)現(xiàn)字符串格式化的方法小結(jié),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-02-02
  • 基于Python實(shí)現(xiàn)股票收益率分析

    基于Python實(shí)現(xiàn)股票收益率分析

    這篇文章主要為大家詳細(xì)介紹如何通過(guò)Python分析股票的收益率,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-04-04
  • 時(shí)間序列重采樣和pandas的resample方法示例解析

    時(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)

    這篇文章主要介紹了使用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í)詳解

    這篇文章主要介紹了基于Python的PIL庫(kù)學(xué)習(xí)詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-05-05
  • Pycharm學(xué)生免費(fèi)專業(yè)版安裝教程的方法步驟

    Pycharm學(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

最新評(píng)論