毕业设计之---目标检测-行人车辆检测流量计数

毕业设计之---⽬标检测-⾏⼈车辆检测流量计数
⽂章⽬录
前⾔
⽬标检测在图像识别领域应⽤的⾮常⼴泛,⽐如⾏⼈识别,可以⽤来做店铺或者车站的⼈流量统计,车辆识别同理。 是个⾮常好的毕业设计课题。
1. ⽬标检测概况
1.1 什么是⽬标检测?
⽬标检测,粗略来说就是:输⼊图⽚/视频,经过处理,得到:⽬标的位置信息(⽐如左上⾓和右下⾓的坐标)、⽬标的预测类别、⽬标的预测置信度(confidence)。
1.2 发展阶段
1. ⼿⼯特征提取算法,如VJ、HOG、DPM
电子煎药壶
2. R-CNN算法(2014),最早的基于深度学习的⽬标检测器之⼀,其结构是两级⽹络:
1)⾸先需要诸如选择性搜索之类的算法来提出可能包含对象的候选边界框;
2)然后将这些区域传递到CNN算法进⾏分类;
3. R-CNN算法存在的问题是其仿真很慢,并且不是完整的端到端的⽬标检测器。
4. Fast R-CNN算法(2014末),对原始R-CNN进⾏了相当⼤的改进:提⾼准确度,并减少执⾏正向传递所花费的时间。
是,该模型仍然依赖于外部区域搜索算法。
5. faster R-CNN算法(2015),真正的端到端深度学习⽬标检测器。删除了选择性搜索的要求,⽽是依赖于
(1)完全卷积的区域提议⽹络(RPN, Region Purpose Network),可以预测对象边界框和“对象”分数(量化它是⼀个区域的可能性的分数)。
(2)然后将RPN的输出传递到R-CNN组件以进⾏最终分类和标记。
6. R-CNN系列算法,都采取了two-stage策略。特点是:虽然检测结果⼀般都⾮常准确,但仿真速度⾮常慢,即使是在GPU上也仅获得
5 FPS。
7. one-stage⽅法有:yolo(2015)、SSD(2015末),以及在这两个算法基础上改进的各论⽂提出的算法。这些算法的基本思路
是:均匀地在图⽚的不同位置进⾏密集抽样,抽样时可以采⽤不同尺度和长宽⽐,然后利⽤CNN提取特征后直接进⾏分类与回归。
整个过程只需要⼀步,所以其优势是速度快,但是训练⽐较困难。
8. yolov3(2018)是yolo作者提出的第三个版本(之前还提过yolov2和它们的tinny版本,tinny版本经过压缩更快但是也降低了准确
率)。
2. ⾏⼈检测
这⾥学长以⾏⼈检测作为例⼦来讲解⽬标检测。
2.1 ⾏⼈检测简介
⾏⼈检测( Pedestrian Detection)⼀直是计算机视觉研究中的热点和难点。⾏⼈检测要解决的问题是:出图像或视频帧中所有的⾏⼈,包括位置和⼤⼩,⼀般⽤矩形框表⽰,和⼈脸检测类似,这也是典型的⽬标检测问题。
⾏⼈检测技术有很强的使⽤价值,它可以与⾏⼈跟踪,⾏⼈重识别等技术结合,应⽤于汽车⽆⼈驾驶系统(ADAS),智能机器⼈,智能视频监控,⼈体⾏为分析,客流统计系统,智能交通等领域。
2.2 ⾏⼈检测技术难点
smartthreads由于⼈体具有相当的柔性,因此会有各种姿态和形状,其外观受穿着,姿态,视⾓等影响⾮常⼤,另外还⾯临着遮挡 、光照等因素的影响,这使得⾏⼈检测成为计算机视觉领域中⼀个极具挑战性的课题。⾏⼈检测要解决的主要难题是:
外观差异⼤:包括视⾓,姿态,服饰和附着物,光照,成像距离等。从不同的⾓度看过去,⾏⼈的外观是很不⼀样的。处于不同姿态的⾏⼈,外观差异也很⼤。由于⼈穿的⾐服不同,以及打伞、戴帽⼦、戴围⼱、提⾏李等附着物的影响,外观差异也⾮常⼤。光照的差异也导致了⼀些困难。远距离的⼈体和近距离的⼈体,在外观上差别也⾮常⼤。
遮挡问题: 在很多应⽤场景中,⾏⼈⾮常密集,存在严重的遮挡,我们只能看到⼈体的⼀部分,这对检测算法带来了严重的挑战。
背景复杂:⽆论是室内还是室外,⾏⼈检测⼀般⾯临的背景都⾮常复杂,有些物体的外观和形状、颜⾊、纹理很像⼈体,导致算法⽆法准确的区分。
检测速度:⾏⼈检测⼀般采⽤了复杂的模型,运算量相当⼤,要达到实时⾮常困难,⼀般需要⼤量的优化。
2.3 ⾏⼈检测实现效果
检测到⾏⼈后还可以做流量分析:
2.4 关键代码-训练过程
import cv2
import numpy as np
import random
def load_images(dirname, amout =9999):
img_list =[]
file=open(dirname)
img_name =adline()
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 =adline()
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)):
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(hogpute(gray))
# return gradient_lst
def get_svm_detector(svm):
圆钢矫直机sv = SupportVectors()
rho, _, _ = DecisionFunction(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 ain(np.array(gradient_lst), cv2.ml.ROW_SAMPLE, np.array(labels))
# 第三步:加⼊识别错误的样本,进⾏第⼆轮训练
# 参考 masikkk/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.size(hardExample,(64,128)))
computeHOGs(hard_neg_list, gradient_lst)
[labels.append(-1)for _ in range(len(hard_neg_list))]
# 第四步:保存训练结果
hog.setSVMDetector(get_svm_detector(svm))
hog.save('myHogDector.bin')
最后
学长亲⾃接毕业设计,有需要的同同学:(q扣)
746876041

本文发布于:2024-09-21 01:18:58,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/221064.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:检测   算法   区域   外观   智能
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议