栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Opencv级联分类器训练自己的.xml文件

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Opencv级联分类器训练自己的.xml文件

文章目录
    • 1.首先了解一点opencv前置知识点
    • 2.相关文件的准备
    • 3.图片和图片路径的处理程序(python)
    • 4.训练
    • 5.训练结果
    • 6.对训练的.xml文件测试

1.首先了解一点opencv前置知识点

(1)Opencv下载和导入Visual studio 2022
https://mydreamambitious.blog.csdn.net/article/details/124902276
(2)visual studo 2022中使用Opencv人脸检测
https://mydreamambitious.blog.csdn.net/article/details/124903134
(3)HAAR与LBP的人脸检测时间效率比较
https://mydreamambitious.blog.csdn.net/article/details/124912506


2.相关文件的准备


对上面的文件打开细看:
(1)negative文件(这里的图片是经过一定处理之后的,下面会给出程序):

positive文件中也是和negative一样是图片(positive的图片也是经过一定处理之后的,下面会给出程序):

(2)neg.txt文件(通过程序处理的,下面给出程序)

(3)两个工具的准备
下载opencv:https://www.raoyunsoft.com/opencv/opencv-3.4.2/

下载完之后安装会的一个opencv文件,进入:E:opencvbuildx64vc14bin
这里面,看到两个文件,将这两个文件拷贝到要训练的地方

(4)pos.txt文件(里面是正样本的图片路径和相关信息)

这里关于图片正负样本的说明:
(1)正样本:包含要检测的物体,如果是人脸的话,最好只包含人脸(这样效果更好);
(2)负样本:不包含要检测的物体(只要不包含要检测的物体就行)


3.图片和图片路径的处理程序(python)

对正样本的处理

import os
import glob
import traceback
from PIL import Image

# 首先将图片转换为规定的格式
def convertPic(pic, saveDir, width=300, height=300):
    try:
        #读取图片
        img = Image.open(pic)
        #缩放图片
        new_img = img.resize((width, height), Image.ANTIALIAS)
        #保存图片
        new_img.save(os.path.join(saveDir, os.path.basename(pic)))
    except:
        print('open image fail!')
        traceback.print_exception(BaseException)

# 修改图片的名字
def Resname(pic):
    num = 1
    for filename in os.listdir(pic):
        os.rename(os.path.join(pic, filename), os.path.join(pic, str(num) + ".jpg"))
        num += 1

#将图片相关信息保存到.txt文件中
def convertDat(picDir,saveDir):
    for pic in glob.glob(picDir+'*.png'):
        text=("%s %d %d %d %d %d")%(pic,1,0,0,30,30)
        with open(saveDir,'a') as fp:
            fp.write(text+'n')

if __name__ == '__main__':
    print('Pycharm')
    #正样本的所有图片路径
    picDir="E:\conda_3\PyCharm\OpenCV\FaceDetect\opencv.xml\OpencvTrain\positive\img\Total\"
    #正样本图片经过处理之后保存的位置
    saveDir="E:\conda_3\PyCharm\OpenCV\FaceDetect\opencv.xml\OpencvTrain\positive\Convert_img\"
    #将图片相关信息保存的文件路径,这里的pos.dat改为.txt文件也可以
    saveDat="E:\conda_3\PyCharm\OpenCV\FaceDetect\opencv.xml\OpencvTrainCreate\pos.dat"

    for pic in glob.glob(picDir+"*.png"):
        convertPic(pic,saveDir)
     Resname(saveDir)

    convertDat(picDir,saveDat)

负样本处理的过程也是一样的,只是因为我这里使用的图片格式不一样,所以将正负样本的处理程序写成了两个文件。

import os
import glob
import traceback
from PIL import Image

#首先将图片转换为规定的格式
def convertPic(pic,saveDir,width=300,height=300):
    try:
        #读取图片
        img=Image.open(pic)
        #缩放图片
        new_img=img.resize((width,height),Image.ANTIALIAS)
        #保存图片
        new_img.save(os.path.join(saveDir,os.path.basename(pic)))
    except:
        print('open image fail!')
        traceback.print_exception(BaseException)

#修改图片的名字
def Resname(pic):
    num=1
    for filename in os.listdir(pic):
        os.rename(os.path.join(pic,filename),os.path.join(pic,str(num)+".jpg"))
        num+=1

#将处理的图片路径存入文件saveDir
def convertDat(picDir,saveDir):
    for pic in glob.glob(picDir+'*.jpg'):
        text=("%s")%(pic)
        with open(saveDir,'a') as fp:
            fp.write(text+'n')

if __name__ == '__main__':
    print('PyCharm')
    picDir="E:\conda_3\PyCharm\OpenCV\FaceDetect\opencv.xml\OpencvTrainCreate\negative\"
    saveDir="E:\conda_3\PyCharm\OpenCV\FaceDetect\opencv.xml\OpencvTrain\negative\convert_img\"
    saveTxt=r"E:conda_3PyCharmOpenCVFaceDetectopencv.xmlOpencvTrainCreateneg.txt"

    for pic in glob.glob(picDir+"*.jpg"):
        convertPic(pic,saveDir)
    Resname(saveDir)
    convertDat(picDir,saveTxt)


# See PyCharm help at https://www.jetbrains.com/help/pycharm/

通过上面的处理之后得到所需要训练的所有文件


4.训练

(1)开始可能会遇到这个问题

解决方案:

(2)打开cmd,进入到当前训练的文件位置:
输入生成正样本文件语句:opencv_createsamples.exe -info pos.txt -vec pos.vec -bg neg.txt -numPos 25 -numNeg 72 -w 30 -h 30
参数的解释:

-data   用于保存训练好的文件位置,如不存在训练程序会创建它,用于存放训练好的分类器;
-vec:输出文件,其中包含用于训练的正样本;
-img:输入图片文件名;
-bg:背景图片的描述,文件中包含一系列图片路径,其实也就是包含负样本图片的路径的文件;
-num:生成的正样本的数目;
-bgcolor:背景颜色(目前为灰度图);背景颜色表示透明颜色。因为图像压缩可造成颜色偏差,颜色的容差可以由 -bgthresh 指定;所有处于 bgcolor-bgthresh 和bgcolor+bgthresh 之间的像素都被设置为透明像素。
-inv:如果指定该标志的话,前景图片的颜色将翻转;
-randinv:表示颜色随机的翻转;
-maxidev:前景样本里像素的亮度梯度的最大值;
-maxxangle:X轴最大旋转角度,必须以弧度为单位;
-maxyangle:Y轴最大旋转角度,必须以弧度为单位;
-maxzangle:Z轴最大旋转角度,必须以弧度为单位;
-show:如果指定该选项,每个样本都将被显示。如果按下 Esc 键,程序将继续创建样本但不再显示。
-numPos 10 :正样本的数量;
-numNeg 50 :负样本的数量(neg文件夹下有50张负样本);
-numStages 15 :样本训练的层数;
-featureType<{HAAR(default), LBP}>      特征的类型: HAAR - 类Haar特征; LBP - 局部纹理模式特征;
-w:输出样本的宽度(以像素为单位);
-h:输出样本的高度(以像素为单位)。


(3)训练
可能会遇到这个问题
Can not get new positive sample. The most possible reason is insufficient count of samples in given vec-file.
解决方案:
设置的 numPos 过大,由于训练时POS count 会从你设置的numPos增大,每一级都按一定的次序增大,后来可能会超过样本库中正样本的个数,就会报这个错误。

输入训练语句:opencv_traincascade.exe -data xml -vec pos.vec -bg neg.txt -numPos 25 -numNeg 72 numStages 6 -featureType LBP -w 30 -h 30



5.训练结果


6.对训练的.xml文件测试

关于Opencv下载和导入Visual studio 2022
https://mydreamambitious.blog.csdn.net/article/details/124902276

#include
#include
using namespace cv;
using namespace std;
//haarcascade_frontalcatface.xml
//opencv_world455d.lib
//E:Visual studio 2019Opencvopencvbuildinclude
//E:Visual studio 2019Opencvopencvbuildx64vc15lib
String filename = "E:\conda_3\PyCharm\OpenCV\FaceDetect\CascadeClassifer\haarcascade_frontalface_alt.xml";
String filename_self = "E:\conda_3\PyCharm\OpenCV\FaceDetect\opencv.xml\OpencvTrainCreate\xml\cascade.xml";
String filename_ther = "E:\conda_3\PyCharm\OpenCV\FaceDetect\课程配套源代码\cascade.xml";

CascadeClassifier face_classifiler;

int main() {
	if (!face_classifiler.load(filename_self)) {
		printf("The CascadeClassifier load fail!");
		return 0;
	}
	//打开摄像头实时检测
	namedWindow("face", WINDOW_AUTOSIZE);
	VideoCapture capture(0);
	Mat frame;
	Mat gray;
	while (capture.read(frame)) {
		cvtColor(frame, gray, COLOR_BGR2GRAY);
		//equalizeHist直方图均衡化,,用于提高图像的质量
		equalizeHist(gray, gray);
		vectorfaces;
		//输入图像 vector& objects 缩放比例 检测次数 检测方法 图像大小
		face_classifiler.detectMultiScale(gray, faces, 1.2, 3, 0, Size(30, 30));
		for (size_t t = 0; t < faces.size(); t++) {

			rectangle(frame, faces[static_cast(t)], Scalar(255, 255, 0), 2, 8, 0);


			cv::Point locate;
			locate.x = (float)(faces[static_cast(t)].x + faces[static_cast(t)].width / 4);
			locate.y = (float)(faces[static_cast(t)].y - 10);
			putText(frame, "Person", locate, FONT_HERSHEY_SIMPLEX,
				1.2, (0, 0, 255), 2, 8);
		}
		imshow("face", frame);
		if (waitKey(10) == 27) {
			break;
		}
	}
	capture.release();
	destroyAllWindows();

	return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/931434.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号