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多线程抓取天涯帖子内容示例
Apr 03 Python
在Python中编写数据库模块的教程
Apr 29 Python
利用Python开发微信支付的注意事项
Aug 19 Python
Windows下python3.6.4安装教程
Jul 31 Python
python3 打开外部程序及关闭的示例
Nov 06 Python
Pyqt清空某一个QTreeewidgetItem下的所有分支方法
Jun 17 Python
获取Pytorch中间某一层权重或者特征的例子
Aug 17 Python
pytorch 加载(.pth)格式的模型实例
Aug 20 Python
Win10里python3创建虚拟环境的步骤
Jan 31 Python
python如何删除列为空的行
Jul 17 Python
Python实现手势识别
Oct 21 Python
Python基础之Socket通信原理
Apr 22 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支持页面回退的两种方法[转]
2007/02/14 PHP
PHP中预定义的6种接口介绍
2015/05/12 PHP
用PHP代码在网页上生成图片
2015/07/01 PHP
php操作mongodb封装类与用法实例
2018/09/01 PHP
对于this和$(this)的个人理解
2013/09/08 Javascript
JavaScript中的运算符种类及其规则介绍
2013/09/26 Javascript
JS获取当前日期和时间的简单实例
2013/11/19 Javascript
JavaScript中创建对象和继承示例解读
2014/02/12 Javascript
教你如何使用node.js制作代理服务器
2014/11/26 Javascript
在JavaScript中使用开平方根的sqrt()方法
2015/06/15 Javascript
JavaScript中的Function函数
2015/08/27 Javascript
Angular在一个页面中使用两个ng-app的方法
2017/02/20 Javascript
解决JS外部文件中文注释出现乱码问题
2017/07/09 Javascript
vue.js数据绑定的方法(单向、双向和一次性绑定)
2017/07/13 Javascript
vue项目中引入noVNC远程桌面的方法
2018/03/05 Javascript
解决layui的使用以及针对select、radio等表单组件不显示的问题
2019/09/05 Javascript
VScode格式化ESlint方法(最全最好用方法)
2019/09/10 Javascript
javascript实现拖拽碰撞检测
2020/03/12 Javascript
Javascript摸拟自由落体与上抛运动原理与实现方法详解
2020/04/08 Javascript
vue 实现click同时传入事件对象和自定义参数
2021/01/29 Vue.js
python 默认参数问题的陷阱
2016/02/29 Python
解决.ui文件生成的.py文件运行不出现界面的方法
2019/06/19 Python
Python Django基础二之URL路由系统
2019/07/18 Python
django formset实现数据表的批量操作的示例代码
2019/12/06 Python
python 实现批量图片识别并翻译
2020/11/02 Python
Pycharm Plugins加载失败问题解决方案
2020/11/28 Python
房屋改造计划书
2014/01/10 职场文书
运动会通讯稿100字
2014/01/31 职场文书
宣传保护环境的公益广告词
2014/03/13 职场文书
房展策划方案
2014/06/07 职场文书
销售简历自我评价怎么写
2014/09/26 职场文书
教师党员个人自我剖析材料
2014/09/29 职场文书
2014年销售工作总结与计划
2014/12/01 职场文书
环卫处个人工作总结
2015/03/04 职场文书
仙境之桥观后感
2015/06/16 职场文书
MySQL 数据恢复的多种方法汇总
2021/06/21 MySQL