使用UIUC資料集進行汽車檢測

2021-09-25 18:41:00 字數 4508 閱讀 7990

第二步驟:編寫**,如下:

import cv2

import numpy as np

from os.path import join

datapath = "/home/utryjc/pictures/trainimages"

def path(cls, i):

return "%s/%s%d.pgm" % (datapath, cls, i+1)

pos, neg = "pos-", "neg-"

detect = cv2.xfeatures2d.sift_create()

extract = cv2.xfeatures2d.sift_create()

flann_params = dict(algorithm=1, tree=5)

flann = cv2.flannbasedmatcher(flann_params, {})

bow_kmeans_trainer = cv2.bowkmeanstrainer(40)

extract_bow = cv2.bowimgdescriptorextractor(extract, flann)

def extract_sift(fn):

im = cv2.imread(fn, 0)

return extract.compute(im, detect.detect(im))[1]

for i in range(8):

bow_kmeans_trainer.add(extract_sift(path(pos, i)))

bow_kmeans_trainer.add(extract_sift(path(neg, i)))

voc = bow_kmeans_trainer.cluster()

extract_bow.setvocabulary(voc)

def bow_feature(fn):

im = cv2.imread(fn, 0)

return extract_bow.compute(im, detect.detect(im))

traindata, trainlabels = ,

for i in range(20):

traindata.extend(bow_feature(path(pos, i)))

traindata.extend(bow_feature(path(neg, i)))

svm = cv2.ml.svm_create()

svm.train(np.array(traindata), cv2.ml.row_sample, np.array(trainlabels))

def predict(fn):

f = bow_feature(fn)

p = svm.predict(f)

print fn, "\t", p[1][0][0]

return p

car, notcar = "/home/utryjc/pictures/car5.jpeg", "/home/utryjc/pictures/person2.jpeg"

car_img = cv2.imread(car)

notcar_img = cv2.imread(notcar)

car_predict = predict(car)

not_car_predict = predict(notcar)

font = cv2.font_hershey_complex

if (car_predict[1][0][0] == 1.0):

cv2.puttext(car_img, 'car_detected', (10, 30), font, 1, (0, 255, 0), 2, cv2.line_aa)

if (not_car_predict[1][0][0] == -1.0):

cv2.puttext(notcar_img, 'car not detected', (10, 30), font, 1, (0, 0, 255), 2, cv2.line_aa)

cv2.imshow('bow + svm success', car_img)

cv2.imshow('bow + svm failture', notcar_img)

cv2.waitkey(0)

cv2.destroyallwindows()

其結果,僅僅是檢查出中是否有汽車。比較關鍵的部分

(1)建立兩個sift例項,乙個提取關鍵點,乙個提取特徵

detect = cv2.xfeatures2d.sift_create()

extract = cv2.xfeatures2d.sift_create()

(2)建立flann的匹配演算法,第乙個引數是選擇演算法,第二個引數為迭代次數

flann_params = dict(algorithm = 1, trees = 5)

flann = cv2.flannbasedmatcher(flann_params, {})

(3)建立詞帶訓練器,指定簇數為40

bow_kmeans_trainer = cv2.bowkmeanstrainer(40)

(4)視覺的詞彙將作為詞帶的類,呼叫bowimgdescriptorextractor方法返回描述符

extract_bow = cv2.bowimgdescriptorextractor(extract, flann)

(5)以灰度格式獲取影象並提取影象的特徵

def extract_sift(fn):

im = cv2.imread(fn, 0)

return extract.compute(im, detect.detect(im))[1]

(6)每個類從訓練集中讀取8張

for i in range(8):

bow_kmeans_trainer.add(extract_sift(path(pos, i)))

bow_kmeans_trainer.add(extract_sift(path(neg, i)))

(7)呼叫cluster函式並執行k-mean分類,主要是為了建立單詞詞彙

voc = bow_kmeans_trainer.cluster()

extract_bow.setvocabulary( voc )

(8)讀取,返回基於磁帶描述符提取器計算得到的描述符

def bow_feature(fn):

im = cv2.imread(fn, 0)

return extract_bow.compute(im, detect.detect(im))

(9)建立兩個陣列,分別對應訓練資料和標籤,並用分類器的標籤填充他們,並生成相應的正負樣本的標籤

traindata, trainlabels = ,

(10)建立支援向量機的例項,通過將訓練資料和表情按放到numpy陣列中進行訓練

svm = cv2.ml.svm_create()

svm.train(np.array(traindata), cv2.ml.row_sample, np.array(trainlabels))

(11)定義函式來顯示**的結果

def predict(fn):

f = bow_features(fn);  #提取描述符

p = svm.predict(f)   #根據描述符進行**

print(fn, "\t", p[1][0][0])

return p

(12)定義兩個樣本的路徑,並將路徑中的檔案讀取出來梵谷numpy陣列中,將這些傳給訓練好的svm,並**結果

car, notcar = "/home/utryjc/pictures/car5.jpeg", "/home/utryjc/pictures/person2.jpeg"

car_img = cv2.imread(car)

notcar_img = cv2.imread(notcar)

car_predict = predict(car)

not_car_predict = predict(notcar)

(13)最後在螢幕上顯示**的結果

使用sklearn進行mnist資料集分類

深度之眼 西瓜書課後 import time import matplotlib.pyplot as plt import numpy as np from sklearn.datasets import fetch openml from sklearn.linear model import l...

使用邏輯回歸進行MNIST資料集分類

mnist資料集是機器學習領域中非常經典的乙個資料集,由60000個訓練樣本和10000個測試樣本組成,每個樣本都是一張28 28畫素的灰度手寫數字。import time import numpy as np import matplotlib.pyplot as plt from sklearn...

使用K近鄰對iris資料集進行分類

聽了好幾年的k近鄰演算法 今天終於接觸到了 原理很簡單 講樣本對映為多維空間中的點 無標籤新樣本 由空間中與其最近的k個點中數量最多的標籤來定義 以下為暴力實現 高效演算法留坑 from sklearn import datasets def cmp elem return elem 0 iris ...