[OpenCV-Python] - 機械学習 kNN アルゴリズム & SVM アルゴリズム & K-means クラスタリング アルゴリズム & 深層学習画像認識 & 物体検出

目次

 

序文:

1. 機械学習

1.1 kNN アルゴリズム

1.2 SVMアルゴリズム(サポートベクターマシン)

 1.3 K 平均法クラスタリング アルゴリズム

2. ディープラーニング

2.1 深層学習による画像認識

2.2 深層学習に基づく物体検出

要約:


序文:

機械学習 (ML) は人工知能の中核であり、コンピューターに人間の行動をシミュレートして学習させる方法の研究です。ディープラーニング (DL) は、機械学習の人気のある研究方向であり、コンピューターが人間と同じように分析および学習し、テキスト、画像、音声などのデータを認識できるように、主にサンプル データの内部法則と表現レベルを研究します。

1. 機械学習

Opencv の機械学習モジュール (ml) は、機械学習に関連するクラスと関連機能を実装します。この研究では、k 最近傍アルゴリズム(k-Nearest Neighbors、kNN)、サポート ベクター マシン(サポート ベクター マシン、SVM)、およびk 平均法クラスタリング(k-Means Clustering) およびその他のアルゴリズムを使用します。

1.1 kNN アルゴリズム

kNN アルゴリズムは、k 個の最近傍をターゲットの同じカテゴリとして見つけます。

① グラフィカルkNNアルゴリズム

手順: 最初に cv2.ml.KNearest_create() 関数を呼び出して kNN 分類器を作成し、次にトレーニング データとフラグを入力として使用し、kNN 分類子の train() メソッドを呼び出してモデルをトレーニングし、分類されるデータを使用します。入力として、kNN 分類子の呼び出します。 findNearest() メソッドは、k 個の最近傍を見つけて、分類結果に関する情報を返します。

コード例: 画像内の 30 個のポイントをランダムに選択し、各ポイントにランダムにフラグ (0 または 1) を割り当てます。画像内のフラグ 0 を表すには長方形を使用し、フラグ 1 を表すには三角形を使用します。その後、ランダムなポイントを追加します。 (ドット)、kNN アルゴリズムを使用して近傍を見つけ、その符号を決定します (完全な分類)

import cv2
import numpy as np
import matplotlib.pyplot as plt
points=np.random.randint(0,100,(30,2)) #随机选择30个点
labels=np.random.randint(0,2,(30,1)) #为随机点随机分配标签(参数2表示两种标签,矩形0,三角形1)
label0s=points[labels.ravel()==0]  #分出标志为0的点
plt.scatter(label0s[:,0],label0s[:,1],80,'b','s') #将标志为0的点绘制成蓝色矩形
label1s=points[labels.ravel()==1]  #分出标志为1的点
plt.scatter(label1s[:,0],label1s[:,1],80,'r','^') #将标志为1的点绘制成红色三角形
newpoint=np.random.randint(0,100,(1,2))  #随机选择一个点,下面确定其分类
plt.scatter(newpoint[:,0],newpoint[:,1],80,'g','o') #将待分类的新点绘制成绿色圆点
plt.show()

#进一步使用kNN算法确认待分类新点的类别、3个最近邻居的距离
knn=cv2.ml.KNearest_create()   #创建kNN分类器
knn.train(points.astype(np.float32),cv2.ml.ROW_SAMPLE,
          labels.astype(np.float32))   #训练模型
ret,results,neighbours,dist=knn.findNearest(newpoint.astype(np.float32),3) #找出3个最近邻居
print("新点标志:%s"%results)
print("邻居:%s"%neighbours)
print("距离:%s"%dist)

 選択された 3 つの最近傍は、2 つの長方形と 1 つの三角形です。新しい点はその長方形に最も近いため、ラベル 0 として分類します。

②kNNアルゴリズムにより手書き数字認識を実現

数字.png は、サイズ 2000x1000 の手書き数字イメージです。各数字のサイズは 20x20 で、各数字には 500 個のサンプル (5 行 x 100 列) があり、10 個の数字には合計 5000 個のデジタル サンプルがあります。これらのデジタル画像を使用して、kNN モデルをトレーニングし、テストを実行できます。

#kNN算法实现手写识别
import cv2
import numpy as np
import matplotlib.pyplot as plt
gray=cv2.imread('digits.png',0)
digits=[np.hsplit(r,100) for r in np.vsplit(gray,50)] #分解数字:50行,100列
np_digits=np.array(digits)  #转换为numpy数组

#准备训练数据,转换为二维数组,每个图像400个像素
train_data=np_digits.reshape(-1,400).astype(np.float32)
train_labels=np.repeat(np.arange(10),500)[:,np.newaxis]  #定义标志
knn=cv2.ml.KNearest_create()  #创建kNN分类器
knn.train(train_data,cv2.ml.ROW_SAMPLE,train_labels) #训练模型

#用绘图工具创建手写数字5图像(大小20x20)进行测试(黑白二值图像)
test=cv2.imread('d5.png',0)  #打开测试图像
test=cv2.resize(test,(20,20)) #转换为20x20大小
test_data=test.reshape(1, 400).astype(np.float32) #转换为测试数据
ret,result,neighbours,dist=knn.findNearest(test_data,k=3)  #执行测试
print(result.ravel())
print(neighbours.ravel())

#拍摄图像数字3,进行测试(非黑白二值图像)
img2=cv2.imread('d3.png',0)
img2=cv2.resize(img2, (20,20))
ret,img2=cv2.threshold(img2,150,255,cv2.THRESH_BINARY_INV)  #反二值化阈值处理
test_data=img2.reshape(1, 400).astype(np.float32) #转换为测试数据
ret,result,neighbours,dist=knn.findNearest(test_data,k=3)  #执行测试
print(result.ravel())
print(neighbours.ravel())

 

 描画ツールで作成された数字 5 は、ピクセルを失うことなくグレースケール画像をテスト データに直接変換でき、k=3 の場合の認識精度率は 10% ですが、写真の数字 3 は、変換する前にしきい値処理する必要があります。画素欠落が発生し、k=3 の場合認識精度は 2/3 となります。

1.2 SVMアルゴリズム(サポートベクターマシン)

線形分離可能なデータを直線で 2 つのグループに 分けることができます。この直線のグループをSVM アルゴリズムでは「決定境界」と呼び、非線形分離可能なデータを高次元データに変換した後、線形分離可能なデータと呼びます。これが SCV アルゴリズムの理論的基礎です。

 ①グラフィカルSVMアルゴリズム

 コード例: 画像内で 5 つのポイントが選択され、2 つのカテゴリに分割されます。カテゴリは 0 と 1 です。既知の分類データとして 5 つの点と記号を使用して SVM モデルをトレーニングし、そのモデルを使用して画像内のすべての点を分類し、分類結果に応じて画像の色を設定して、画像の分類結果を視覚的に表示します。画像のピクセル。

import cv2
import numpy as np
import matplotlib.pyplot as plt
#准备训练数据,假设图像高240,宽320,在其中选择5个点
traindata=np.matrix([[140,60],[80,120],[160,110],[160,190],[240,180]],dtype=np.float32)
labels=np.array([0,0,0,1,1])#5个点,前3个点为一类标志为0;后2个点为一类,标志为1
svm=cv2.ml.SVM_create()  #创建SVM分类器
svm.setGamma(0.50625)     #设置相关参数
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)  #训练模型
img=np.zeros((240,320,3),dtype="uint8")  #创建图像
colors={0:(102,255,204),1:(204,204,102)}

#用SVM分类器对图像像素进行分类,根据分类结果设置像素颜色
for i in range(240):
    for j in range(320):
        point=np.matrix([[j,i]],dtype=np.float32)  #将像素坐标转换为测试数据
        label=svm.predict(point)[1].ravel()  #执行预测,返回结果
        img[i,j]=colors[label[0]]  #根据预测结果设置像素颜色
svm_vectors=svm.getUncompressedSupportVectors()  #获得SVM向量
for i in range(svm_vectors.shape[0]):  #在图像中绘制SVM向量(红色圆)
    cv2.circle(img,(svm_vectors[i,0],svm_vectors[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)
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)  #转换为RGB格式
plt.imshow(img)
plt.show()

 この図から、画像上の 3 つのトレーニング ポイントが 1 つのクラスであり、下の 2 つのポイントが 1 つのクラスであることがわかります。画像の上部と下部の色の交点が決定境界です。

②SVMアルゴリズムを利用して手書きデータを認識

kNN アルゴリズムの例では、ピクセル値を特徴ベクトルとして使用します。SVM アルゴリズムは、画像の方向性勾配ヒストグラム (HOG) を特徴ベクトルとして使用して画像を分類できます。

import cv2
import numpy as np
def hog(img): #定义HOG描述符函数
    hog=cv2.HOGDescriptor((20,20),(8,8),#定义HOGDescriptor对象
                          (4,4),(8,8),9,1,-1,0,0.2,1,64,True)
    hog_descriptor=hog.compute(img)  #计算HOG描述符
    hog_descriptor=np.squeeze(hog_descriptor)  #转换为一维数组
    return hog_descriptor  #返回HOG描述符,144位
img=cv2.imread('digits.png',0)
digits=[np.hsplit(r,100) for r in np.vsplit(img,50)] #分解数字:50行,100列
labels=np.repeat(np.arange(10),500)[:,np.newaxis]  #定义对应标志
hogdata=[list(map(hog,row)) for row in digits]   #计算图像的HOG描述符
trainData=np.float32(hogdata).reshape(-1,144)  #转换为测试数据
svm=cv2.ml.SVM_create()   #创建SVM分类器
svm.setGamma(5.383)     #设置相关参数
svm.setC(2.67)
svm.setKernel(cv2.ml.SVM_LINEAR)
svm.setType(cv2.ml.SVM_C_SVC)
svm.train(trainData,cv2.ml.ROW_SAMPLE,labels)  #训练模型

#用绘图工具创建手写数字5图像(大小20x20)进行测试(黑白二值图像)
test=cv2.imread('d5.png',0)  #打开测试图像
test=cv2.resize(test,(20,20)) #转换为20x20大小
test_data=hog(test)
test_data=test_data.reshape(1,144).astype(np.float32) #转换为测试数据
result=svm.predict(test_data)[1]
print('识别结果:',np.squeeze(result))

#拍摄图像数字8,进行测试(非黑白二值图像)
test=cv2.imread('d8.png',0)  #打开测试图像
test=cv2.resize(test,(20,20)) #转换为20x20大小
test_data=hog(test)
test_data=test_data.reshape(1,144).astype(np.float32) #转换为测试数据
result=svm.predict(test_data)[1]
print('识别结果:',np.squeeze(result))

     

 1.3 K 平均法クラスタリング アルゴリズム

K 平均法クラスタリング アルゴリズムの基本原理: データの密度に従って比較的高密度のデータの重心を見つけ、その重心に従ってデータ分類を完了します。

① グラフィカルなk-meansクラスタリングアルゴリズム

コード例: サイズ 240x320 の画像内のデータ ポイントの 3 つのグループを選択します。アルゴリズムを説明する便宜上、データ ポイントを選択するときに座標のランダムな値の範囲が設定されます。すべてのポイントを分類データとして使用し、 cv2.kmeans() 関数を呼び出し、このアルゴリズムを使用して分類し、画像内で分類データと重心を異なる色で表示します。

import cv2
import numpy as np
import matplotlib.pyplot as plt
#创建聚类数据,3个类别,每个类别包含20个点
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均值聚类算法执行分类操作,k=3,返回结果中label用于保存标志,center用于保存质心
ret,label,center=cv2.kmeans(data,3,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)

#根据运算结果返回的标志将数据分成3组,便于绘制图像
data1=data[label.ravel()==0]
data2=data[label.ravel()==1]
data3=data[label.ravel()==2]
plt.scatter(data1[:,0],data1[:,1],color='r')  #绘制第1类数据点,红色
plt.scatter(data2[:,0],data2[:,1],color='g')  #绘制第2类数据点,绿色
plt.scatter(data3[:,0],data3[:,1],color='b')  #绘制第3类数据点,蓝色
plt.scatter(center[:,0],center[:,1],100,['#CC3399'],'s')  #绘制质点,颜色是#CC3399
plt.show()

 ② K-means クラスタリングアルゴリズムで画像の色を定量化する

コード例: 重心は画像の新しいピクセルとして使用され、それによって画像内のカラー値が減ります。

import cv2
import numpy as np
img=cv2.imread('flowers.png')
cv2.imshow('img',img)
img2=img.reshape((-1,3)).astype(np.float32) #转换为nx3的浮点类型数组,n=图像像素的总数/3

#定义算法终止条件
criteria=(cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER,10,1.0)
K=4
ret,label,center=cv2.kmeans(img2,K,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)
center=np.uint8(center)  #将质心转换为整型
img3=center[label.ravel()]  #转换为一维数组
img3=img3.reshape((img.shape)) #恢复为原图像数组形状
cv2.imshow('K=4',img3)
cv2.waitKey(0)
cv2.destroyAllWindows()


2. ディープラーニング

機械学習には通常、入力、特徴抽出、分類、出力の4 つのステップが含まれます。ディープラーニングは通常、入力、特徴抽出と分類、出力の3 つのステップに分かれており、機械学習における特徴抽出と分類を同じステップで組み合わせます。機械学習と比較して、ディープラーニングは、より多くの入力データとより多くの計算量を提供する必要があります. 「深さ」はニューラル ネットワーク レベルのスケールに反映されます. たとえば、ResNet とその亜種によって実装されるニューラル ネットワーク何百ものレイヤーがあります。

OpenCV は、Cafe、TensorFlow、Torch/Pytorch などの現在人気のある深層学習フレームワークをサポートしており、Open Neural Network Exchange (ONNX) に基づいています。アプリケーションでは、事前トレーニング済みモデルをインポートするだけで、準備されたデータを使用して予測演算を実行し、必要な処理結果を取得できます。

2.1 深層学習による画像認識

画像認識とは、画像の内容を対象としてその種類を識別することです。opencv の深層学習事前トレーニング モデルを使用した画像認識手順: まず、構成ファイルと事前トレーニング モデル ファイルからモデルを読み込みます; 画像ファイルをブロック データ (blob) として処理します; 画像ファイルのブロック データを次のように設定しますモデルの入力、予測の実行、予測結果の処理。(2.2 のターゲット検出ステップと一致)

①AlexNetとCaffeモデルに基づく画像認識

AlexNet ネットワークには、5 層の畳み込みニューラル ネットワーク (CNN)、3 層の完全接続ネットワークが含まれており、GPU (グラフィック カード、つまり画像プロセッサ) を使用して計算を高速化します。 224×224。

Caffe の正式名は、高速特徴埋め込みの畳み込み構造で、表現力、速度、思考のモジュール性を備えた深層学習フレームワークです。カーネルはC++で実装されており、PythonやMatlabなどのインターフェースが提供されています。

以下は、AlexNet モデルと Caffe モデルに基づく画像認識のコード例です。

import cv2
import numpy as np
import matplotlib.pyplot as plt
from PIL import ImageFont,ImageDraw,Image

#读取文本文件中的类别名称,共1000种类别,每行为一个类别,从第1个字符开始为名称
file=open('classes.txt')
names=[r.strip() for r in file.readlines()]
file.close()
classes=[r[0:] for r in names] #获取每个类别的名称

#从文件中载入Caffe模型
net=cv2.dnn.readNetFromCaffe("AlexNet_deploy.txt","AlexNet_CaffeModel.dat")  #缺少模型文件???
image=cv2.imread('ta.png')  #打开图像,用于识别分类

#创建图像块数据,大小是(224,224),颜色通道的均值缩减比例因子为(104,117,123)
blob=cv2.dnn.blobFromImage(image,1,(224,224),(104,117,123))
net.setInput(blob)  #将图像块数据作为神经网络输入

#执行预测,返回结果是一个1x1000的数组,按顺序对应1000种类别的可信度
result=net.forward()
ptime,x=net.getPerfProfile()  #获得完成预测时间
print('完成预测时间:%.2f ms'%(ptime*1000.0/cv2.getTickFrequency()))
sorted_ret=np.argsort(result[0])  #将预测结果按可信度由高到低排序
top5=sorted_ret[::-1][:5]  #获得排名前5的预测结果
ctext="类别:"+classes[top5[0]]
ptext="可信度:{:.2%}".format(result[0][top5[0]])

#输出排名前5的预测结果
for (index,idx) in enumerate(top5):
    print("{}.类别,可信度:{:.2%}".format(index+1,classes[idx],result[0][idx]))

#在图像中输出排名第1的预测结果
fontpath="STSONG.TTF"
font=ImageFont.truetype(fontpath,80)  #载入中文字体,设置字号
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()

モデル ファイルが見つからないため、当面は出力がありません。

②ResNetモデルとCaffeモデルに基づく画像認識

ResNet の正式名称は深層残差ネットワークであり、主な特徴はニューラル ネットワークに残差ユニットが追加され、残差学習によってネットワークの深さの増加によって引き起こされる劣化問題を解決し、予測精度を向上させることができます。

コードはロードされたモデル ファイルを変更するだけで済みます。

net=cv2.dnn.readNetFromCaffe("ResNet_50_deploy.prototxt","resnet-18.caffemodel")  #缺少模型文件???

2.2 深層学習に基づく物体検出

オブジェクト検出とは、画像内のすべてのオブジェクトを検出し、オブジェクトの種類を識別することを指します。この手順は画像認識と一致しています。

①MobilNet_SSDとCaffeの事前学習モデルに基づく物体検出

MobileNet は、深さ方向に分離可能な畳み込みを使用して軽量のディープ ニューラル ネットワークを構築する、モバイルおよび組み込みビジョンアプリケーション向けの効率的なモデルです

SSD の正式名称はシングルショット マルチボックスディテクタであり、物体検出アルゴリズムです。MobilNet_SSD は、MobilNet と SSD の特性を組み合わせたものです。

import cv2
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from PIL import ImageFont,ImageDraw,Image
fontpath="STSONG.TTF" #加载字体以便显示汉字
font=ImageFont.truetype(fontpath,20)
font2={'family':'STSONG',"size":22}
matplotlib.rc('font',**font2)  #设置plt字体

#准备对象名称类别
objects_names=('背景','飞机','自行车','鸟','船','瓶子','公共汽车','小汽车','猫','椅子',
               '牛','餐具','狗','马','摩托车','人','盆栽','羊','沙发','火车','监视器')
mode=cv2.dnn.readNetFromCaffe("MobileNetSSD_deploy.txt",#从文件中加载预训练的模型???
                              "MobileNetSSD_Caffemodel.dat")
image=cv2.imread("object1.png")
blob=cv2.dnn.blobFromImage(image,0.007843,(224,224),(120,120,127))  #创建图像的块数据
mode.setInput(blob)  #将图像块数据设置为模型输入
result=mode.forward()  #执行预测
ptime,x=mode.getPerfProfile()  #获得完成预测时间
title='完成预测时间:%.2f ms'%(ptime*1000.0/cv2.getTickFrequency())

for i in range(result.shape[2]):  #处理检测结果
    confidence=result[0,0,i,2]  #获得可信度
    if confidence > 0.3:   #输出可信度大于30%的检测结果
        a,id,a,x1,y1,x2,y2=result[0,0,i]
        name_id=int(id)  #获得类别名称
        blob_size=280
        heightScale = image.shape[0] / blob_size  #计算原图像和图像块的高度比例
        widthScale = image.shape[1] / blob_size  # 计算原图像和图像块的宽度比例
        #计算检测出对象的左下角和右上角坐标
        x1 = int(x1 * blob_size * widthScale)
        y1 = int(y1 * blob_size * heightScale)
        x2 = int(x2 * blob_size * widthScale)
        y2 = int(y2 * blob_size * heightScale)
        #在图像中输出对象名称和可信度
        if name_id in range(len(objects_names)):
            text=objects_names[name_id] + "\n{:.1%}".format(confidence)
            img_pil = Image.fromarray(image)
            draw = ImageDraw.Draw(img_pil)
            draw.text((x1+5, y1), text, font=font, fill=(0, 0, 255))  # 绘制文字
            img = np.array(img_pil)
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
plt.title(title)
plt.imshow(img)
plt.axis("off")
plt.show()

モデルファイルが不足しているため出力はなく、モデルのトレーニングは学習中です......

②YOLOとDarknetの事前学習モデルに基づく物体検出

YOLO は、画像をいくつかのネットワークに分割し、各グリッドの境界ボックスと信頼性を計算するオブジェクト検出アルゴリズムです。

Darknet は、C 言語と CUDA をベースとしたオープンソースの深層学習フレームワークであり、その主な特徴は、簡単なインストール、優れた移植性、CPU および GPU コンピューティングのサポートです。

cv2.dnn.readNetFromDarknet() 関数は、YOLO V3 と Darnet に基づく事前トレーニング済みモデルをファイルからロードするために使用されます。

import cv2
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from PIL import ImageFont,ImageDraw,Image
fontpath="STSONG.TTF" #加载字体以便显示汉字
font=ImageFont.truetype(fontpath,20)
font2={'family':'STSONG',"size":22}
matplotlib.rc('font',**font2)  #设置plt字体

#加载文本文件中的对象名称,共80种类别,每行为一个类别
file=open('objects_names.txt',encoding='utf-8')
objects_names=[r.strip() for r in file.readlines()]
file.close()

#从文件中加载预训练的Darknet模型
mode=cv2.dnn.readNetFromDarknet("yolo3-tiny.cfg","yolo3.weights")
image=cv2.imread("object1.png")
imgH,imgW=image.shape[:2]
out_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)
mode.setInput(blob)  #将图像快数据设置为模型输入
layer_results=mode.forward(out_layers)  #执行预测,返回每层的预测结果
ptime,_=mode.getPerfProfile()  #获得完成预测时间
title_text='完成预测时间:%.2f ms'%(ptime*1000.0/cv2.getTickFrequency())
result_boxes=[]
result_scores=[]
result_name_id=[]
for layer in layer_results: #遍历所有输出层
    for box in layer:    #遍历层的所有输出预测结果,每个结果为一个边框
        #预测结果结构:x,y,w,h,confidence,80个类别的概率
        probs=box[5:]
        class_id=np.argmax(probs)  #找到概率最大的类别名称
        prob=probs[class_id]  #找到最大概率
        if prob > 0.5: #筛选出概率大于50%的类别
            #计算每个box在原图像中的绝对坐标
            box=box[0:4]*np.array([imgW,imgH,imgW,imgH])
            (centerX,centerY,width,height)=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)
#应用非最大值抑制消除重复边框,获得要挥着的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():
        #获得边框坐标
        (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=objects_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))  # 绘制文字
        img = np.array(img_pil)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.title(title_text)
plt.imshow(img)
plt.axis("off")
plt.show()

モデルのトレーニングは学習中ですが、モデルファイルが不足しているため、しばらく出力はありません.... フォローアップは、PyTorch フレームワークで詳細に実践されます!

要約:

初心者のためまとめきれていないところや間違っているところも多いかもしれませんが、さらに深く勉強してからまた削除していきますので、お友達の方は修正大歓迎です!上記の数期間の学習を通じて、Opencv に関する一般的な知識構造が得られました。この知識ポイントをさらに深く学習するために、今後も詳細を追加していきます。

Guess you like

Origin blog.csdn.net/weixin_51658186/article/details/130440088