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的框架中为MySQL实现restful接口的教程
Apr 08 Python
python中sys.argv参数用法实例分析
May 20 Python
python实现输入数字的连续加减方法
Jun 22 Python
django与小程序实现登录验证功能的示例代码
Feb 19 Python
了解不常见但是实用的Python技巧
May 23 Python
Python 读取串口数据,动态绘图的示例
Jul 02 Python
python 使用pygame工具包实现贪吃蛇游戏(多彩版)
Oct 30 Python
pytorch中的上采样以及各种反操作,求逆操作详解
Jan 03 Python
什么是python的id函数
Jun 11 Python
matplotlib基础绘图命令之bar的使用方法
Aug 13 Python
python实现定时发送邮件到指定邮箱
Dec 23 Python
详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法
Apr 25 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 字符过滤类,用于过滤各类用户输入的数据
2009/05/27 PHP
基于Jquery实现的一个图片滚动切换
2012/06/21 Javascript
window.showModalDialog参数传递中含有特殊字符的处理方法
2013/06/06 Javascript
uploadify在Firefox下丢失session问题的解决方法
2013/08/07 Javascript
使用jQuery实现返回顶部
2015/01/26 Javascript
完美兼容多浏览器的js判断图片路径代码汇总
2015/04/17 Javascript
javascript实现网页背景烟花效果的方法
2015/08/06 Javascript
JS实现网页顶部向下滑出的全国城市切换导航效果
2015/08/22 Javascript
JS实现兼容性好,自动置顶的淘宝悬浮工具栏效果
2015/09/18 Javascript
js获取及判断键盘按键的方法
2015/12/01 Javascript
JS Ajax请求如何防止重复提交
2016/06/13 Javascript
javaScript嗅探执行神器-sniffer.js
2017/02/14 Javascript
js原生代码实现轮播图的实例讲解
2017/07/28 Javascript
JavaScript中import用法总结
2019/01/20 Javascript
[42:32]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第二局
2016/02/27 DOTA
bat和python批量重命名文件的实现代码
2016/05/19 Python
python 生成器协程运算实例
2017/09/04 Python
python实现在pandas.DataFrame添加一行
2018/04/04 Python
利用Python yagmail三行代码实现发送邮件
2018/05/11 Python
Django中间件基础用法详解
2019/07/18 Python
python+tkinter实现学生管理系统
2019/08/20 Python
Django 再谈一谈json序列化
2020/03/16 Python
使用HTML5里的classList操作CSS类
2016/06/28 HTML / CSS
导出HTML5 Canvas图片并上传服务器功能
2019/08/16 HTML / CSS
美国在线和移动免费会员制批发零售商:Boxed(移动端的Costco)
2020/01/02 全球购物
英国领先的独立酒精饮料零售商:DrinkSupermarket
2021/01/13 全球购物
北美最大的参茸药食商城:德成行
2020/12/06 全球购物
HSRP的含义以及如何工作
2014/09/10 面试题
行政助理求职自荐信
2013/10/26 职场文书
创业女性典型材料
2014/05/02 职场文书
四风问题对照检查材料
2014/09/22 职场文书
2015年试用期自我评价范文
2015/03/10 职场文书
2015年助残日活动总结
2015/03/27 职场文书
运动会通讯稿50字
2015/07/20 职场文书
如何使用flask将模型部署为服务
2021/05/13 Python
变长双向rnn的正确使用姿势教学
2021/05/31 Python