• 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 为方便开心洋葱网用户,开心洋葱官网已经开启复制功能!
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!
  • 由于近期流量激增,小站的ECS没能经的起亲们的访问,本站依然没有盈利,如果各位看如果觉着文字不错,还请看官给小站打个赏~~~~~~~~~~~~~!

(Python)从零开始,简单快速学机器仿人视觉Opencv—运用二:物体检测

人工智能 Eragonl 1670次浏览 0个评论

 

主题

本章我们要学习的是目标物体检测,这里我们需要使用到SIFT特征提取,BOW词袋建立以及SVM支持向量机的知识(这些讲起来有点费劲(所以还是咕咕咕吧)),使用的数据集为UIUC数据集,可以去百度云盘免费下载,提取码为:wdzr。 这里我们要进行的是车辆的检测:检测图像中是否存在车辆,具体实现的我们可以将程序分为以下几步: 第1步:生成sift检测和提取器(注意:由于SIFT和SURF在3.4.3版本的时候注册了专利,所以在3.4.3及之后的版本中都无法再使用SIFT和SURF类了,所以需要将OpenCV的版本调整到3.4.2.16或者更早的版本)  

import cv2
import numpy as np

#生成sift检测和提取器
detect=cv2.xfeatures2d.SIFT_create()
extract=cv2.xfeatures2d.SIFT_create()

  第2步:生成flann特征匹配器  

#生成flann匹配器
flann_params=dict(algorithm=1,trees=5)
flann=cv2.FlannBasedMatcher(flann_params,{})

  第3步:生成bow_kmeans_trainer,BOW训练器  

#生成bow_kmeans_trainer,BOW训练器,设置40个簇
bow_kmeans_trainer=cv2.BOWKMeansTrainer(40)

  第4步:使用SIFT或者SURF提取图片描述符,并加入到BOW训练器中。(这里只选用了正、负匹配各40张,如果匹配不准确的话可以提高训练的数量)  

#使用SIFT或者SURF提取图片描述符,并加入到BOW训练器中
for i in range(40):
    #正匹配需要的图片的路径
    pos_pic='%s%s%d.pgm'%('carData/TrainImages/','pos-',i)
    #加载图片
    pos_img=cv2.imread(pos_pic,0)
    #计算这个正匹配图像的图像描述符
    pos_des=extract.compute(pos_img,detect.detect(pos_img))[1]
    #将图像描述符放入BOW训练器
    bow_kmeans_trainer.add(pos_des)

    # 负匹配需要的图片的路径
    neg_pic = '%s%s%d.pgm' % ('carData/TrainImages/', 'neg-', i)
    # 加载图片
    neg_img = cv2.imread(neg_pic, 0)
    # 计算这个负匹配图像的图像描述符
    neg_des = extract.compute(neg_img, detect.detect(neg_img))[1]
    # 将图像描述符放入BOW训练器
    bow_kmeans_trainer.add(neg_des)

    第5步:使用SIFT特征提取和flann生成bow特征提取器,extract_bow  

#使用SIFT特征提取和flann生成bow特征提取器,extract_bow
extract_bow=cv2.BOWImgDescriptorExtractor(extract,flann)

  第6步:将BOW训练器中的图像描述符进行k-means聚类,得到词汇,对BOW特征提取器进行词汇的设置  

#将BOW训练器中的图像描述符进行k-means聚类,得到词汇,对BOW特征提取器进行词汇的设置
voc=bow_kmeans_trainer.cluster()
extract_bow.setVocabulary(voc)

    第7步:用BOW特征提取器提取对应图像的数据加入到traindata中,对应标号1与-1加入到trainlabels中  

#用BOW特征提取器提取对应图像的数据加入到traindata中,对应标号1与-1加入到trainlabels中
traindata=[]
trainlabels=[]
for i in range(20):
    # 正匹配需要的图片的路径
    pos_pic = '%s%s%d.pgm' % ('carData/TrainImages/', 'pos-', i)
    # 加载图片
    pos_img = cv2.imread(pos_pic, 0)
    # 计算这个正匹配图像的BOW特征描述符
    pos_des = extract_bow.compute(pos_img, detect.detect(pos_img))
    # 将BOW特征描述符放入训练数据中
    traindata.extend(pos_des)
    #将正标签加入trainlabels中
    trainlabels.append(1)

    # 负匹配需要的图片的路径
    neg_pic = '%s%s%d.pgm' % ('carData/TrainImages/', 'neg-', i)
    # 加载图片
    neg_img = cv2.imread(neg_pic, 0)
    # 计算这个正匹配图像的BOW特征描述符
    neg_des = extract_bow.compute(neg_img, detect.detect(neg_img))
    # 将BOW特征描述符放入训练数据中
    traindata.extend(neg_des)
    # 将负标签加入trainlabels中
    trainlabels.append(-1)

    第8步:生成SVM  

#生成SVM
svm=cv2.ml.SVM_create()

  第9步:用traindata和trainlabels对SVM进行训练  

#用traindata和trainlabels对SVM进行训练
svm.train(np.array(traindata),cv2.ml.ROW_SAMPLE,np.array(trainlabels))

  第10步:对指定图像进行BOW特征提取后,使用SVM进行评分预判。这里我们使用下面两张图分别对应有车和没车的情况来做图像判断:  
(Python)从零开始,简单快速学机器仿人视觉Opencv---运用二:物体检测
(Python)从零开始,简单快速学机器仿人视觉Opencv---运用二:物体检测   本块代码如下所示:  

#对指定图像进行BOW特征提取后,使用SVM进行评分预判
#有车
car=cv2.imread('1.jpg')
car_gray=cv2.cvtColor(car,0)
#没车
no_car=cv2.imread('2.jpg')
no_car_gray=cv2.cvtColor(no_car,0)
#预判
car_bow_des=extract_bow.compute(car_gray,detect.detect(car_gray))
no_car_bow_des=extract_bow.compute(no_car_gray,detect.detect(no_car_gray))
car_predict=svm.predict(car_bow_des)
no_car_predict=svm.predict(no_car_bow_des)
#图像显示
if car_predict[1][0][0]==1.0:
    cv2.putText(car,'Car Detected',(10,30),cv2.FONT_HERSHEY_SIMPLEX,1,(0,0,255),2,cv2.LINE_AA)
if no_car_predict[1][0][0]==-1.0:
    cv2.putText(no_car,'Nocar Detected',(10,30),cv2.FONT_HERSHEY_SIMPLEX,1,(0,0,255),2,cv2.LINE_AA)
cv2.imshow('car',car)
cv2.imshow('nocar',no_car)
cv2.waitKey(0)
cv2.destroyAllWindows()

  将上面十步完成后,运行代码,可以得到如下画面:  
(Python)从零开始,简单快速学机器仿人视觉Opencv---运用二:物体检测
(Python)从零开始,简单快速学机器仿人视觉Opencv---运用二:物体检测   全部代码如下所示:  

import cv2
import numpy as np

#生成sift检测和提取器
detect=cv2.xfeatures2d.SIFT_create()
extract=cv2.xfeatures2d.SIFT_create()

#生成flann匹配器
flann_params=dict(algorithm=1,trees=5)
flann=cv2.FlannBasedMatcher(flann_params,{})

#生成bow_kmeans_trainer,BOW训练器,设置40个簇
bow_kmeans_trainer=cv2.BOWKMeansTrainer(40)

#使用SIFT或者SURF提取图片描述符,并加入到BOW训练器中
for i in range(40):
    #正匹配需要的图片的路径
    pos_pic='%s%s%d.pgm'%('carData/TrainImages/','pos-',i)
    #加载图片
    pos_img=cv2.imread(pos_pic,0)
    #计算这个正匹配图像的图像描述符
    pos_des=extract.compute(pos_img,detect.detect(pos_img))[1]
    #将图像描述符放入BOW训练器
    bow_kmeans_trainer.add(pos_des)

    # 负匹配需要的图片的路径
    neg_pic = '%s%s%d.pgm' % ('carData/TrainImages/', 'neg-', i)
    # 加载图片
    neg_img = cv2.imread(neg_pic, 0)
    # 计算这个负匹配图像的图像描述符
    neg_des = extract.compute(neg_img, detect.detect(neg_img))[1]
    # 将图像描述符放入BOW训练器
    bow_kmeans_trainer.add(neg_des)

#使用SIFT特征提取和flann生成bow特征提取器,extract_bow
extract_bow=cv2.BOWImgDescriptorExtractor(extract,flann)

#将BOW训练器中的图像描述符进行k-means聚类,得到词汇,对BOW特征提取器进行词汇的设置
voc=bow_kmeans_trainer.cluster()
extract_bow.setVocabulary(voc)

#用BOW特征提取器提取对应图像的数据加入到traindata中,对应标号1与-1加入到trainlabels中
traindata=[]
trainlabels=[]
for i in range(20):
    # 正匹配需要的图片的路径
    pos_pic = '%s%s%d.pgm' % ('carData/TrainImages/', 'pos-', i)
    # 加载图片
    pos_img = cv2.imread(pos_pic, 0)
    # 计算这个正匹配图像的BOW特征描述符
    pos_des = extract_bow.compute(pos_img, detect.detect(pos_img))
    # 将BOW特征描述符放入训练数据中
    traindata.extend(pos_des)
    #将正标签加入trainlabels中
    trainlabels.append(1)

    # 负匹配需要的图片的路径
    neg_pic = '%s%s%d.pgm' % ('carData/TrainImages/', 'neg-', i)
    # 加载图片
    neg_img = cv2.imread(neg_pic, 0)
    # 计算这个正匹配图像的BOW特征描述符
    neg_des = extract_bow.compute(neg_img, detect.detect(neg_img))
    # 将BOW特征描述符放入训练数据中
    traindata.extend(neg_des)
    # 将负标签加入trainlabels中
    trainlabels.append(-1)

#生成SVM
svm=cv2.ml.SVM_create()

#用traindata和trainlabels对SVM进行训练
svm.train(np.array(traindata),cv2.ml.ROW_SAMPLE,np.array(trainlabels))

#对指定图像进行BOW特征提取后,使用SVM进行评分预判
#有车
car=cv2.imread('1.jpg')
car_gray=cv2.cvtColor(car,0)
#没车
no_car=cv2.imread('2.jpg')
no_car_gray=cv2.cvtColor(no_car,0)
#预判
car_bow_des=extract_bow.compute(car_gray,detect.detect(car_gray))
no_car_bow_des=extract_bow.compute(no_car_gray,detect.detect(no_car_gray))
car_predict=svm.predict(car_bow_des)
no_car_predict=svm.predict(no_car_bow_des)
#图像显示
if car_predict[1][0][0]==1.0:
    cv2.putText(car,'Car Detected',(10,30),cv2.FONT_HERSHEY_SIMPLEX,1,(0,0,255),2,cv2.LINE_AA)
if no_car_predict[1][0][0]==-1.0:
    cv2.putText(no_car,'Nocar Detected',(10,30),cv2.FONT_HERSHEY_SIMPLEX,1,(0,0,255),2,cv2.LINE_AA)
cv2.imshow('car',car)
cv2.imshow('nocar',no_car)
cv2.waitKey(0)
cv2.destroyAllWindows()

   

总结

(前一段日子在赶着写书,被催稿(吐)导致的本系列咕咕咕了,之后可能还会咕,但是还是会尽量快的更新,谢谢大家支持啦!)


开心洋葱 , 版权所有丨如未注明 , 均为原创丨未经授权请勿修改 , 转载请注明(Python)从零开始,简单快速学机器仿人视觉Opencv—运用二:物体检测
喜欢 (0)

您必须 登录 才能发表评论!

加载中……