Python—OpenCV創建級聯文件(Windows7/10環境)
目錄
搭建環境
準備數據集
訓練級聯文件
之前使用Python+OpenCV實現交通路標識別,具體實現步驟及心得如下:
OpenCV訓練屬于自己的xml文件,需以下幾個步驟:
1、首先下載OpenCV(Windows版);
2、準備數據集,分為正樣本集和負樣本集;
3、生成路徑,將正樣本集的路徑要存成 *.vec格式;負樣本集的路徑不做要求,*.txt就可以;
4、訓練xml文件。
搭建環境
OpenCV創建級聯文件需要先下載OpenCV(Windows版)。
接下來傻瓜式安裝操作,安裝到指定路徑。
安裝成功后開始配置環境變量(配置環境變量比較簡單,此處省略),稍后會用到OpenCV中的opencv_createsamples.exe和opencv_traincascade.exe文件訓練級聯文件,我的安裝路徑在D盤,所以設置環境變量的路徑是D:\opencv\opencv\build\x64\vc15\bin。 注意:若直接在D:\opencv\opencv\build\x64\vc15\bin路徑下訓練模型,可以不用配置環境變量。
準備數據集
需要準備正樣本數據集(所要識別的物體)和負樣本數據集(背景圖片、干擾圖片),數據集數量越多種類越復雜越好。
通常正樣本數據裁剪為20*20或40*40大小的像素即可(這里我使用40*40像素訓練模型,9小時+可以訓練完成),注意:像素過大訓練速度相當慢,圖片像素最好是正方形圖片,長寬相等。
通常負樣本數據集是識別物體的背景環境照片,圖片越多越復雜抗干擾能力越強,負樣本圖片可以不用裁剪為固定大小,但是為了提升訓練速度建議進行合理裁剪。
正樣本圖片如下:
負樣本圖片如下:
為了操作方便,我寫了Python程序實現批量調整圖片數據大小和圖片命名,具體如下:
# -*- coding:utf8 -*-
import os
from PIL import Image
'''
批量重命名文件夾中的圖片文件
'''
class BatchRename():
def __init__(self):
self.path = r'C:\Users\Administrator\Desktop\opencv-haar-classifier-training-master\positive_images'
def rename(self):
filelist = os.listdir(self.path)
total_num = len(filelist)
i = 0
for item in filelist:
if item.endswith('.jpg'):
src = os.path.join(os.path.abspath(self.path), item)
print(src)
dst = os.path.join(os.path.abspath(self.path), str(i) + '.jpg')
try:
os.rename(src, dst)
print ('converting %s to %s ...' % (src, dst))
i = i + 1
except :
continue
print ('total %d to rename & converted %d jpgs' % (total_num, i))
if __name__ == '__main__':
demo = BatchRename()
demo.rename()
'''
批量修改圖片尺寸
'''
#提取目錄下所有圖片,更改尺寸后保存到另一目錄
import os.path
import glob
def convertjpg(jpgfile,outdir,width=40,height=40):
img=Image.open(jpgfile)
try:
new_img=img.resize((width,height),Image.BILINEAR)
new_img.save(os.path.join(outdir,os.path.basename(jpgfile)))
except Exception as e:
print(e)
for jpgfile in glob.glob(r"C:\Users\Administrator\Desktop\opencv-haar-classifier-training-master\positive_images\*.jpg"):
#像素修改后存入images文件
convertjpg(jpgfile,r"C:\Users\Administrator\Desktop\opencv-haar-classifier-training-master\images")
訓練級聯文件
1、首先按照要求創建訓練文件夾
negative_images文件夾存放負樣本圖片。
positive_images文件夾存放正樣本圖片。
xml文件夾存放稍后生成的xml級聯文件。
opencv_createsamples.exe負責生成*.vec文件。
opencv_traincascade.exe負責訓練級聯文件模型。
另外我還寫了兩個Python文件負責批量處理圖片命名、尺寸縮小和生成對應的txt文件。
2、生成指定的txt文件路徑
執行這一步之前保證文件已經命名規范,尺寸縮小到合適大小。
運行生成txt文件.py文件,生成對應的正樣本路徑和負樣本路徑文件,效果如下:
文件夾結構如下:
正樣本路徑文件(pos.txt)格式如下:
正樣本路徑文件(neg.txt)格式如下:
生成對應的txt文件Python代碼如下:
import os
'''
正樣本數據生成txt文件
'''
file_dir=os.getcwd()
file_dir=r'C:\Users\Administrator\Desktop\opencv-haar-classifier-training-master\positive_images'
L=[]
i=0
with open("pos.txt","w+") as f:
for root, dirs, files in os.walk(file_dir):
for file in files:
if os.path.splitext(file)[1] == '.jpg':
L.append(os.path.join(root, file))
f.write(L[i]+' 1'+' 0'+' 0'+' 40'+' 40'+'\n')
i+=1
'''
負樣本數據生成txt文件
'''
file_dir=r'C:\Users\Administrator\Desktop\opencv-haar-classifier-training-master\negative_images'
L=[]
i=0
with open("neg.txt","w+") as f:
for root, dirs, files in os.walk(file_dir):
for file in files:
if os.path.splitext(file)[1] == '.jpg':
L.append(os.path.join(root, file))
f.write(L[i]+'\n')
i+=1
3、獲取正樣本矢量集vec文件
在文件夾下新建createsamples.bat,批處理文件,內容如下:
opencv_createsamples.exe -vec pos.vec -info pos.txt -num 1100 -w 40 -h 40
pause
其中,-vec后面是將生成的正樣本矢量集vec文件,-info后面是正樣本路徑文件,-num后面的數字是正樣本個數,-w后面的數字是正樣本圖片的長,-h后面的數字是正樣本圖片的高。
雙擊createsamples.bat后出現pos.vec即為運行成功。
此時文件夾結構如下:
4、訓練級聯文件模型
在文件夾下新建train.dat文件,內容如下:
opencv_traincascade.exe -data xml -vec pos.vec -bg neg.txt -numPos 1100 -numNeg 3205 -numStages 15 -w 40 -h 40 -minHitRate 0.999 -maxFalseAlarmRate 0.5 -mode ALL
pause
其中,-data 是存放訓練好的分類器的路徑 ,-vec 就是存放.vec的路徑, -bg 負樣本描述文件, -numPos 每一階段訓練的正樣本數量 , -numNeg 每一階段訓練的負樣本數量 (網上說-numPos的參數要比實際正樣本數量小,-numNeg 的參數要比實際負樣本數量大 ), -numStages 訓練階段數 (這個參數不能太大也不能太小 ,太大訓練時間過長,如果太小的話 生成的xml文檔分類效果可能就不太好?), -featureType 選擇LBP還是HAAR 在此選用LBP ,-w -h 訓練樣本尺寸 和vec生成的尺寸大小相同 不然會宕機, -minHitRate? 最小命中率 ,-maxFalseAlarmRate 最大虛警率 ,最后需要在加上 -mode ALL。
此時文件夾結構如下:
雙擊train.bat后進入訓練模式,進入漫長等待,效果如下:
最后訓練完成之后級聯文件保存在xml文件夾中。
其中,只有第一個cascade.xml文件是我們所需要的文件,其余文件是訓練過程中生成的檢查的文件,防止訓練過程中出現意外程序重頭訓練。
下面使用Python代碼進行模型測試,效果如下:
驗證Python代碼如下:
import numpy as np
import cv2
face_cascade = cv2.CascadeClassifier('cascade.xml')
cap = cv2.VideoCapture(0)
while True:
ret,img = cap.read()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
cv2.imshow('img',img)
if cv2.waitKey(1) &0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
最后我將模型搭建在樹莓派上,發現識別效果,處理速度還是蠻不錯的。
OpenCV Python Windows 機器學習
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。