opencv+python图像识别——训练自己的分类器
opencv支持训练自己的分类器,闲话少说
训练步骤:
- 准备样本图像数据
- 样本数据预处理
- 正反样本数据生成正反txt、vec文件
- 训练
- 测试结果
注意以下几点:
- 首先应该注意样本数据量
- 预处理时也要注意原始样本数据的保留
- 无论什么操作系统,需要首先明确操作步骤
准备图像数据(推荐两种方式)
- 采取爬虫方式爬取一定量图像数据
- 下载网上的样本集
下面是我自己的爬虫(从百度爬取数据,可能需要自己调试一下参数,即控制图片下载数量),获取正样本——狗的图像数据建议3000张,负样本——猫或其他建议5000张。
import urllib.request
import urllib.parse
import re
import os
import tkinter
#获得保存下载图片文件夹的路径
def Imgpath(word):
file_path = os.getcwd()[:-4] + word #获得当前的文件路径后创建带有关键词的路径
if not os.path.exists(file_path): #判断新建路径是否已经存在
os.makedirs(file_path) #不存在,创建文件夹
else:
file_path = file_path + '1' #存在,给文件夹重新命名
os.makedirs(file_path ) #创建文件夹
return file_path
def Imgurl(word):
rep_list = []
#模拟浏览器,需要用到浏览器的信息和目标url
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
"referer": "https://image.baidu.com"
}
#将中文关键字加密成浏览器能识别的乱码
content= urllib.parse.quote(word,encoding='utf-8')
#依据pn的规律从30到121循环4次,间隔为30
for num in range(30,151,30):
gsm = hex(num)[2:] #将十进制数num转换成16进制数并取后两位
url = 'https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord='+content+'&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=&z=&ic=&word='+content+'&s=&se=&tab=&width=&height=&face=&istype=&qc=&nc=&fr=&pn='+str(num)+'&rn=30&gsm='+ gsm +'&1521707235798=' #根据规律每次循环生成正确的请求地址
req = urllib.request.Request(url=url,headers=header) #获得请求对象
page = urllib.request.urlopen(req