python+opencv3.4.0 实现HOG+SVM行人检测的示例代码


Posted in Python onJanuary 28, 2021

参照opencv官网例程写了一个基于python的行人检测程序,实现了和自带检测器基本一致的检测效果。

网址 :https://docs.opencv.org/3.4.0/d5/d77/train_HOG_8cpp-example.html

opencv版本:3.4.0

训练集和opencv官方用了同一个,可以从http://pascal.inrialpes.fr/data/human/下载,在网页的最下方“here(970MB处)”,用迅雷下载比较快(500kB/s)。训练集文件比较乱,需要仔细阅读下载首页的文字介绍。注意pos文件夹下的png图片属性,它们用opencv无法直接打开,linux系统下也无法显示,需要用matlab读取图片->保存才行,很奇怪的操作。

代码如下,尽可能与opencv官方例程保持一致,但省略了很多不是很关键的东西。训练一次大概需要十几分钟

import cv2
import numpy as np
import random
 
 
def load_images(dirname, amout = 9999):
 img_list = []
 file = open(dirname)
 img_name = file.readline()
 while img_name != '': # 文件尾
  img_name = dirname.rsplit(r'/', 1)[0] + r'/' + img_name.split('/', 1)[1].strip('\n')
  img_list.append(cv2.imread(img_name))
  img_name = file.readline()
  amout -= 1
  if amout <= 0: # 控制读取图片的数量
   break
 return img_list
 
 
# 从每一张没有人的原始图片中随机裁出10张64*128的图片作为负样本
def sample_neg(full_neg_lst, neg_list, size):
 random.seed(1)
 width, height = size[1], size[0]
 for i in range(len(full_neg_lst)):
  for j in range(10):
   y = int(random.random() * (len(full_neg_lst[i]) - height))
   x = int(random.random() * (len(full_neg_lst[i][0]) - width))
   neg_list.append(full_neg_lst[i][y:y + height, x:x + width])
 return neg_list
 
 
# wsize: 处理图片大小,通常64*128; 输入图片尺寸>= wsize
def computeHOGs(img_lst, gradient_lst, wsize=(128, 64)):
 hog = cv2.HOGDescriptor()
 # hog.winSize = wsize
 for i in range(len(img_lst)):
  if img_lst[i].shape[1] >= wsize[1] and img_lst[i].shape[0] >= wsize[0]:
   roi = img_lst[i][(img_lst[i].shape[0] - wsize[0]) // 2: (img_lst[i].shape[0] - wsize[0]) // 2 + wsize[0], \
     (img_lst[i].shape[1] - wsize[1]) // 2: (img_lst[i].shape[1] - wsize[1]) // 2 + wsize[1]]
   gray = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)
   gradient_lst.append(hog.compute(gray))
 # return gradient_lst
 
 
def get_svm_detector(svm):
 sv = svm.getSupportVectors()
 rho, _, _ = svm.getDecisionFunction(0)
 sv = np.transpose(sv)
 return np.append(sv, [[-rho]], 0)
 
 
# 主程序
# 第一步:计算HOG特征
neg_list = []
pos_list = []
gradient_lst = []
labels = []
hard_neg_list = []
svm = cv2.ml.SVM_create()
pos_list = load_images(r'G:/python_project/INRIAPerson/96X160H96/Train/pos.lst')
full_neg_lst = load_images(r'G:/python_project/INRIAPerson/train_64x128_H96/neg.lst')
sample_neg(full_neg_lst, neg_list, [128, 64])
print(len(neg_list))
computeHOGs(pos_list, gradient_lst)
[labels.append(+1) for _ in range(len(pos_list))]
computeHOGs(neg_list, gradient_lst)
[labels.append(-1) for _ in range(len(neg_list))]
 
# 第二步:训练SVM
svm.setCoef0(0)
svm.setCoef0(0.0)
svm.setDegree(3)
criteria = (cv2.TERM_CRITERIA_MAX_ITER + cv2.TERM_CRITERIA_EPS, 1000, 1e-3)
svm.setTermCriteria(criteria)
svm.setGamma(0)
svm.setKernel(cv2.ml.SVM_LINEAR)
svm.setNu(0.5)
svm.setP(0.1) # for EPSILON_SVR, epsilon in loss function?
svm.setC(0.01) # From paper, soft classifier
svm.setType(cv2.ml.SVM_EPS_SVR) # C_SVC # EPSILON_SVR # may be also NU_SVR # do regression task
svm.train(np.array(gradient_lst), cv2.ml.ROW_SAMPLE, np.array(labels))
 
# 第三步:加入识别错误的样本,进行第二轮训练
# 参考 http://masikkk.com/article/SVM-HOG-HardExample/
hog = cv2.HOGDescriptor()
hard_neg_list.clear()
hog.setSVMDetector(get_svm_detector(svm))
for i in range(len(full_neg_lst)):
 rects, wei = hog.detectMultiScale(full_neg_lst[i], winStride=(4, 4),padding=(8, 8), scale=1.05)
 for (x,y,w,h) in rects:
  hardExample = full_neg_lst[i][y:y+h, x:x+w]
  hard_neg_list.append(cv2.resize(hardExample,(64,128)))
computeHOGs(hard_neg_list, gradient_lst)
[labels.append(-1) for _ in range(len(hard_neg_list))]
svm.train(np.array(gradient_lst), cv2.ml.ROW_SAMPLE, np.array(labels))
 
 
# 第四步:保存训练结果
hog.setSVMDetector(get_svm_detector(svm))
hog.save('myHogDector.bin')

以下是测试代码:

import cv2
import numpy as np
 
hog = cv2.HOGDescriptor()
hog.load('myHogDector.bin')
cap = cv2.VideoCapture(0)
while True:
 ok, img = cap.read()
 rects, wei = hog.detectMultiScale(img, winStride=(4, 4),padding=(8, 8), scale=1.05)
 for (x, y, w, h) in rects:
  cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2)
 cv2.imshow('a', img)
 if cv2.waitKey(1)&0xff == 27: # esc键
  break
cv2.destroyAllWindows()

到此这篇关于python+opencv3.4.0 实现HOG+SVM行人检测的示例代码的文章就介绍到这了,更多相关opencv HOG+SVM行人检测内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python使用matplotlib和pandas实现的画图操作【经典示例】
Jun 13 Python
tensorflow使用神经网络实现mnist分类
Sep 08 Python
python单例模式获取IP代理的方法详解
Sep 13 Python
python3.4控制用户输入与输出的方法
Oct 17 Python
Python列表元素常见操作简单示例
Oct 25 Python
Python迭代器模块itertools使用原理解析
Dec 11 Python
python集合删除多种方法详解
Feb 10 Python
Python+PyQt5实现灭霸响指功能
May 25 Python
Python自省及反射原理实例详解
Jul 06 Python
Python字典dict常用方法函数实例
Nov 09 Python
python 实现网易邮箱邮件阅读和删除的辅助小脚本
Mar 01 Python
如何获取numpy array前N个最大值
May 14 Python
详解Python调用系统命令的六种方法
Jan 28 #Python
教你一分钟在win10终端成功安装Pytorch的方法步骤
Jan 28 #Python
详解win10下pytorch-gpu安装以及CUDA详细安装过程
Jan 28 #Python
Python中Pyspider爬虫框架的基本使用详解
Jan 27 #Python
Python3 + Appium + 安卓模拟器实现APP自动化测试并生成测试报告
Jan 27 #Python
一个入门级python爬虫教程详解
Jan 27 #Python
python+selenium爬取微博热搜存入Mysql的实现方法
Jan 27 #Python
You might like
关于时间计算的结总
2006/12/06 PHP
PHP中实现中文字符进制转换原理分析
2011/12/06 PHP
再推荐十款免费的php开发工具
2015/11/09 PHP
PHP实现支付宝即时到账功能
2016/12/21 PHP
PHP实现非阻塞模式的方法分析
2018/07/26 PHP
PHP使用DOM对XML解析处理操作示例
2019/07/04 PHP
node.js实现逐行读取文件内容的代码
2014/06/27 Javascript
js实现点击链接后窗口缩小并居中的方法
2015/03/02 Javascript
JS实现自动变化的导航菜单效果代码
2015/09/09 Javascript
JavaScript随机打乱数组顺序之随机洗牌算法
2016/08/02 Javascript
Angular2学习教程之组件中的DOM操作详解
2017/05/28 Javascript
详解vue跨组件通信的几种方法
2017/06/15 Javascript
js时间戳与日期格式之间相互转换
2017/12/11 Javascript
详解vue中axios的使用与封装
2019/03/20 Javascript
[01:35:13]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第一场 1月18日
2021/03/11 DOTA
python和ruby,我选谁?
2017/09/13 Python
python机器学习之贝叶斯分类
2018/03/26 Python
Python中的二维数组实例(list与numpy.array)
2018/04/13 Python
python调用tcpdump抓包过滤的方法
2018/07/18 Python
Python 转换文本编码实现解析
2019/08/27 Python
python通过opencv实现图片裁剪原理解析
2020/01/19 Python
matplotlib 生成的图像中无法显示中文字符的解决方法
2020/06/10 Python
Python 中如何写注释
2020/08/28 Python
HTML5 Canvas 起步(1) - 基本概念
2009/05/12 HTML / CSS
美国女孩服装购物网站:Justice
2017/03/04 全球购物
Ajxa常见问题都有哪些
2014/03/26 面试题
物业管理应届生求职信
2013/10/28 职场文书
数控技术应用个人求职信范文
2014/02/03 职场文书
信息工作经验交流材料
2014/05/28 职场文书
2014幼儿教师个人工作总结
2014/12/03 职场文书
教师年度考核个人总结
2015/02/12 职场文书
慰问信范文
2015/02/14 职场文书
2015年教学副校长工作总结
2015/07/22 职场文书
婚礼上证婚人致辞
2015/07/28 职场文书
2016年秋季运动会通讯稿
2015/11/25 职场文书
总结python多进程multiprocessing的相关知识
2021/06/29 Python