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 相关文章推荐
可用于监控 mysql Master Slave 状态的python代码
Feb 10 Python
Python中shutil模块的常用文件操作函数用法示例
Jul 05 Python
详解Python实现按任意键继续/退出的功能
Aug 19 Python
Python利用Beautiful Soup模块搜索内容详解
Mar 29 Python
Python安装模块的常见问题及解决方法
Feb 05 Python
Python数据处理numpy.median的实例讲解
Apr 02 Python
详谈Python3 操作系统与路径 模块(os / os.path / pathlib)
Apr 26 Python
python微信撤回监测代码
Apr 29 Python
python字典改变value值方法总结
Jun 21 Python
Python实现Selenium自动化Page模式
Jul 14 Python
用openCV和Python 实现图片对比,并标识出不同点的方式
Dec 19 Python
对python中 math模块下 atan 和 atan2的区别详解
Jan 17 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
深入解析php模板技术原理【一】
2008/01/10 PHP
php实现文件下载(支持中文文名)
2013/12/04 PHP
优化WordPress的Google字体以加速国内服务器上的运行
2015/11/24 PHP
功能强大的PHP POST提交数据类
2016/07/15 PHP
php面试实现反射注入的详细方法
2019/09/30 PHP
JavaScript 选中文字并响应获取的实现代码
2011/08/28 Javascript
Js实现滚动变色的文字效果
2014/06/16 Javascript
jQuery中使用each处理json数据
2015/04/23 Javascript
通过隐藏iframe实现无刷新上传文件操作
2016/03/16 Javascript
解决bootstrap下拉菜单点击立即隐藏bug的方法
2017/06/13 Javascript
基于百度地图api清除指定覆盖物(Overlay)的方法
2018/01/26 Javascript
js中document.write和document.writeln的区别
2018/03/11 Javascript
d3绘制基本的柱形图的实现代码
2018/12/12 Javascript
微信小程序 导入图标实现过程详解
2019/10/11 Javascript
vue cli4下环境变量和模式示例详解
2020/04/09 Javascript
vue图片裁剪插件vue-cropper使用方法详解
2020/12/16 Vue.js
编程语言Python的发展史
2014/09/26 Python
python实现对一个完整url进行分割的方法
2015/04/29 Python
关于numpy中np.nonzero()函数用法的详解
2017/02/07 Python
Python实现求笛卡尔乘积的方法
2017/09/16 Python
学习python可以干什么
2019/02/26 Python
解决Python图形界面中设置尺寸的问题
2020/03/05 Python
python继承threading.Thread实现有返回值的子类实例
2020/05/02 Python
Python简单实现词云图代码及步骤解析
2020/06/04 Python
解决Keras自带数据集与预训练model下载太慢问题
2020/06/12 Python
python 制作磁力搜索工具
2021/03/04 Python
用纯css3和html制作泡沫对话框实现代码
2013/03/21 HTML / CSS
html5适合移动应用开发的12大特性
2014/03/19 HTML / CSS
使用HTML5 Canvas绘制圆角矩形及相关的一些应用举例
2016/03/22 HTML / CSS
怎样让char类型的东西转换成int类型
2013/12/09 面试题
IMPORT的选项IGNORE有什么作用?缺省是什么设置?
2015/09/17 面试题
工地安全质量标语
2014/06/07 职场文书
世界遗产的导游词
2015/02/13 职场文书
学雷锋献爱心倡议书
2015/04/27 职场文书
社区文明倡议书
2015/04/28 职场文书
篮球赛闭幕式主持词
2015/07/03 职场文书