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多继承顺序实例分析
May 26 Python
python检测IP地址变化并触发事件
Dec 26 Python
TensorFlow实现简单的CNN的方法
Jul 18 Python
基于pygame实现童年掌机打砖块游戏
Feb 25 Python
python对文件的操作方法汇总
Feb 28 Python
在python里创建一个任务(Task)实例
Apr 25 Python
python中什么是面向对象
Jun 11 Python
pycharm激活码免费分享适用最新pycharm2020.2.3永久激活
Nov 25 Python
Python自动化测试基础必备知识点总结
Feb 07 Python
python 三边测量定位的实现代码
Apr 22 Python
python自动化之如何利用allure生成测试报告
May 02 Python
Pandas实现DataFrame的简单运算、统计与排序
Mar 31 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
PHP4中实现动态代理
2006/10/09 PHP
解密ThinkPHP3.1.2版本之模板继承
2014/06/19 PHP
浅谈php7的重大新特性
2015/10/23 PHP
使用Zookeeper分布式部署PHP应用程序
2019/03/15 PHP
用prototype实现的简单小巧的多级联动菜单
2007/03/24 Javascript
解决使用attachEvent函数时,this指向被绑定的元素的问题的方法
2007/08/13 Javascript
为JavaScript添加重载函数的辅助方法
2010/07/04 Javascript
基于jQuery的message插件实现右下角弹出消息框
2011/01/11 Javascript
E3 tree 1.6在Firefox下显示问题的修复方法
2013/01/30 Javascript
javascript的事件触发器介绍的实现
2014/06/05 Javascript
JavaScript实现控制打开文件另存为对话框的方法
2015/04/17 Javascript
jQuery实现html表格动态添加新行的方法
2015/05/28 Javascript
js window对象属性和方法相关资料整理
2015/11/11 Javascript
JavaScript全屏和退出全屏事件总结(附代码)
2017/08/17 Javascript
jQuery简单判断值是否存在于数组中的方法示例
2018/04/17 jQuery
vue使用ajax获取后台数据进行显示的示例
2018/08/09 Javascript
JavaScript惰性载入函数实例分析
2019/03/27 Javascript
小程序实现可拖动的悬浮按钮
2020/09/07 Javascript
跟老齐学Python之集成开发环境(IDE)
2014/09/12 Python
Python实现的检测网站挂马程序
2014/11/30 Python
Python编程之string相关操作实例详解
2017/07/22 Python
python基于opencv检测程序运行效率
2019/12/28 Python
通过Turtle库在Python中绘制一个鼠年福鼠
2020/02/03 Python
Python解释器以及PyCharm的安装教程图文详解
2020/02/26 Python
基于PyInstaller各参数的含义说明
2021/03/04 Python
LivingSocial英国:英国本地优惠
2019/02/22 全球购物
翻译学院毕业生自荐书
2014/02/02 职场文书
大学生素质拓展活动方案
2014/02/11 职场文书
领导班子三严三实对照检查材料
2014/09/25 职场文书
合法的离婚协议书范本
2014/10/23 职场文书
新员工考核评语
2014/12/31 职场文书
唱歌比赛拉拉队口号
2015/12/25 职场文书
Python 实现定积分与二重定积分的操作
2021/05/26 Python
Python实现拼音转换
2021/06/07 Python
详细聊聊vue中组件的props属性
2021/11/02 Vue.js
JavaScript实现两个数组的交集
2022/03/25 Javascript