Opencv造出属于自己的xml训练器

一、基本步骤

1.利用python爬虫爬取(也可以手动收集)图片集,分为pos(正相关,要识别的)和neg(负相关,里面没有pos,一般是背景之类的无关图)一般1:3即可,笔主这里准备500:1500.

爬虫随便搜一个就行,忘了从哪个大佬那里copy的了(仅供参考侵删) 里面 地面 是搜索词,替换即可,倒数第三行改一下路径即可。

import time
import requests
import urllib

page = input("请输入要爬取多少页:")
page = int(page) + 1  # 确保其至少是一页,因为 输入值可以是 0
header = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
}
n = 0  # 图片的前缀 如 0.png
pn = 1  # pn是从第几张图片获取 百度图片下滑时默认一次性显示30张
for m in range(1, page):
    url = 'https://image.baidu.com/search/acjson?'
    param = {
        'tn': 'resultjson_com',
        'logid': '8846269338939606587',
        'ipn': 'rj',
        'ct': '201326592',
        'is': '',
        'fp': 'result',
        'queryWord': '地面',
        'cl': '2',
        'lm': '-1',
        'ie': 'utf-8',
        'oe': 'utf-8',
        'adpicid': '',
        'st': '-1',
        'z': '',
        'ic': '',
        'hd': '',
        'latest': '',
        'copyright': '',
        'word': '地面',
        's': '',
        'se': '',
        'tab': '',
        'width': '',
        'height': '',
        'face': '0',
        'istype': '2',
        'qc': '',
        'nc': '1',
        'fr': '',
        'expermode': '',
        'force': '',
        'cg': 'girl',
        'pn': pn,
        'rn': '30',
        'gsm': '1e',
    }
    page_info = requests.get(url=url, headers=header, params=param)
    page_info.encoding = 'utf-8'  # 确保解析的格式是utf-8的
    page_info = page_info.json()  # 转化为json格式在后面可以遍历字典获取其值
    info_list = page_info['data']  # 观察发现data中存在 需要用到的url地址
    del info_list[-1]  # 每一页的图片30张,下标是从 0 开始 29结束 ,那么请求的数据要删除第30个即 29为下标结束点
    img_path_list = []
    for i in info_list:
        img_path_list.append(i['thumbURL'])
        for index in range(len(img_path_list)):
            print(img_path_list[index])  # 所有的图片的访问地址
            time.sleep(1)
            urllib.request.urlretrieve(img_path_list[index], "D:/Awangyefu/" + str(n) + '.jpg')
        n = n + 1

    pn += 29

有改动的话,改名

import os

files = os.listdir("D:/python_work/mongfang_xml/pos/")#原来文件夹的路径
i = 0

for file in files:
    original = "D:/python_work/mongfang_xml/pos/" + os.sep + files[i]
    #修改后放置图片的路径 F:/ns,也可将 img_ 换成其他标注
    new = "D:/python_work/mongfang_xml/pos1/" + os.sep  + str(i + 1) + ".jpg"
    os.rename(original, new)
    i += 1

灰度处理

#处理正样本
import cv2
path = "C:/pos/"          #pos文件所在地址
for i in range(1, 27):    #pos文件中图片数量
    print(path+str(i)+'.jpg')
    img = cv2.imread(path+str(i)+'.jpg', cv2.IMREAD_GRAYSCALE)
    img5050=cv2.resize(img,(50,50))        #将pos文件中图片压缩为50*50
    cv2.imshow("img", img5050)
    cv2.waitKey(20)
    cv2.imwrite('C:/pos1/'+str(i)+'.jpg', img5050)

#处理负样本
import cv2
path = "C:/neg/"
for i in range(1, 30):
    print(path+str(i)+'.jpg')
    img = cv2.imread(path+str(i)+'.jpg', cv2.IMREAD_GRAYSCALE)
    cv2.imwrite('C:/neg1/'+str(i)+'.jpg', img)

2.创建正负样本txt,将正样本图片压缩,和将正负样本灰度处理后,在文件夹中生成它们的路径图txt(不知道叫啥)

点击目录,输入cmd进入命令行控制器,输入

dir /b >pos.txt

3.修改正负样本txt,通过python写个程序(3,4合并)或者sublime给txt文件添加路径和正样本添加调整大小。

import os
def create_pos_n_neg():
    for file_type in ['pos']:       #运行一次之后修改pos为neg
        for img in os.listdir(file_type):
            if (file_type == 'neg'):
                line = file_type + '/' + img + '\n'
                with open('neg.txt', 'a') as f:
                    f.write(line)
            elif (file_type == 'pos'):
                line = file_type + '/' + img + ' 1 0 0 50 50\n'
                with open('pos.txt', 'a') as f:
                    f.write(line)

if __name__ == '__main__':
    create_pos_n_neg()

4.创建vec文件

点击根目录,输入构造

opencv_createsamples -vec pos.vec -info pos.txt -bg neg.txt -w 50 -h 50

注意:如果报错如读取不到图片pos\pos.txt,把pos.txt文件中最后一行带txt的删掉即可 

如果警告无法启动此程序,因为计算机丢失opencv_..balabala,就搜这个,添加到环境配置PATH中即可。

 5.文件夹中创建data文件夹,点击根目录,输入构造

opencv_traincascade -data data -vec pos.vec -bg neg.txt -numPos 500 -numNeg 1500 -numStages 15 -featureType LBP -w 50 -h 50 -minHitRate 0.9999 -maxFalseAlarmRate 0.5

 6.得到xml文件

python中运行即可

import cv2
def detect():
    print("识别项目")
    cascade_xpider=cv2.CascadeClassifier("./data/cascade.xml")
    cap=cv2.VideoCapture(0)
    # cv2.nameWindow("camera")
    while True:
        ret,frame=cap.read()
        # frame=cv2.resize(frame,(320,240))
        gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
        xpiders=cascade_xpider.detectMultiScale(gray, 1.1, 20, cv2.CASCADE_SCALE_IMAGE, (100, 100),
                                                       (150, 150))
        for (x,y,w,h) in xpiders:
            cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)

        cv2.imshow("camera",frame)
        if cv2.waitKey(10)& 0xFF == ord("q"):
            break
    cap.release()
    cv2.desstoryAllWindows()

detect()

效果

 

### 回答1: Python对于OpenCV级联分类器的训练非常方便,可以通过几个简单的步骤,轻松地完成自己的XML文件训练。 第一步是准备训练数据集。训练集应该包括正面和负面的例子,正面的例子是要识别的目标,负面的例子则是不包含目标的图像。 第二步是进行数据预处理。这包括将图像转换为灰度图像,以及对其进行缩小和正规化。这样有助于提高分类器的准确性和效率。 第三步是使用OpenCV提供的Cascade Trainer GUI工具进行分类器的训练。这个工具可以通过交互式界面来设置训练参数,例如正负样本的路径、级联深度、检测窗口大小等等。训练完成后,级联分类器就会在指定的.xml文件中保存。 第四步是使用训练好的分类器进行目标检测。可以使用OpenCV提供的Cascade Classifier类来加载分类器文件,并应用于图像或视频数据。这个类可以方便地进行级联分类器的检测和识别。 总的来说,Python对于OpenCV级联分类器的训练和应用非常方便和灵活,可以应用于许多实际场景中,如人脸识别、车辆检测等。需要注意的是,训练过程需要耗费大量的计算资源和时间,因此应该选择适当的硬件设备和训练数据集,以获得更好的效果。 ### 回答2: Python对OpenCV的级联分类器训练可以实现自己的XML文件。级联分类器是一种基于机器学习的图像识别技术,主要用于目标分类、物体检测等。OpenCV是一个开源的计算机视觉库,提供了丰富的图像和视频处理功能。Python是一种高级编程语言,通常用于数据分析和人工智能领域。 Python对OpenCV的级联分类器训练可以通过以下步骤实现: 1. 收集样本数据:首先需要收集足够多的正负样本数据,正样本用于训练模型,负样本用于补充训练,提高模型准确率。 2. 特征提取:使用OpenCV中的Haar特征进行图像特征提取,以此确定图像中是否存在目标物体。Haar特征是基于图像亮度和对比度变化的一种特征表示方法。 3. 训练模型:使用Python对OpenCV中的级联分类器进行训练,根据样本数据和特征提取结果,训练模型,并反复迭代优化。 4. 测试模型:完成模型训练后,需要对模型进行测试,验证其在测试数据集中的准确率。 5. 生成XML文件:当训练好了模型后,需要将其保存为XML文件。XML文件包含了训练好的模型参数,可以通过OpenCV的CascadeClassifier类进行加载和应用。 总的来说,Python对OpenCV的级联分类器训练可以帮助用户创建自己的图像识别模型,并将其保存为XML文件,以便后续应用。该技术具有广泛的应用场景,例如人脸识别、车牌识别、物体检测等。 ### 回答3: Python对OpenCV的级联分类器训练,可以通过利用分类器训练工具Cascade Trainer GUI和HaarTraining.exe,在windows或者Linux/Mac OS系统下进行相关操作,实现自己的级联分类器训练,生成属于自己的xml文件。 通过一系列的步骤操作,可以在OpenCV中准确地训练一个线性分类器。首先,需要进行正样本的收集,这些正样本应该是需要被检测的目标,比如人脸等等。其次,需要进行负样本的收集,这些负样本应该是和目标无关的固定的图像。然后,需要根据正负样本进行训练,选择合适的参数和特征,应用级联分类器,并进行训练,最终训练出一个能够准确判断图像中是否包含目标的级联分类器。最后,生成与自己训练的级联分类器相匹配的XML文件,该XML文件中包含了训练好的特征和参数,可以被导入到其他项目中进行相似的目标检测。 利用级联分类器进行图像检测,可以帮助我们提高检测的准确度和效率。它在训练时,能够自动选择极具区分性的特征来提高处置速度,达到更好的检测效果。 总之,Python对OpenCV的级联分类器训练,可以根据需要的检测目标,利用相应的工具和步骤,进行训练和生成相应的XML文件。这种方法能够有效地解决图像目标检测的问题,提高识别的准确度和效率,并具有广泛的应用价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牛大了202X

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值