竞赛选题 目标检测-行人车辆检测流量计数-CSDN博客
阿里云国际,腾讯云国际,AWS 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov8 |
文章目录
前言
优质竞赛项目系列今天要分享的是
行人车辆目标检测计数系统
该项目较为新颖适合作为竞赛课题方向学长非常推荐
更多资料, 项目分享
https://gitee.com/dancheng-senior/postgraduate
1. 目标检测概况
1.1 什么是目标检测
目标检测粗略来说就是输入图片/视频经过处理得到目标的位置信息比如左上角和右下角的坐标、目标的预测类别、目标的预测置信度confidence。
1.2 发展阶段
-
手工特征提取算法如VJ、HOG、DPM
-
R-CNN算法2014最早的基于深度学习的目标检测器之一其结构是两级网络
- 1首先需要诸如选择性搜索之类的算法来提出可能包含对象的候选边界框
- 2然后将这些区域传递到CNN算法进行分类
-
R-CNN算法存在的问题是其仿真很慢并且不是完整的端到端的目标检测器。
-
Fast R-CNN算法2014末对原始R-CNN进行了相当大的改进提高准确度并减少执行正向传递所花费的时间。
是该模型仍然依赖于外部区域搜索算法。 -
faster R-CNN算法2015真正的端到端深度学习目标检测器。删除了选择性搜索的要求而是依赖于
- 1完全卷积的区域提议网络RPN, Region Purpose Network可以预测对象边界框和“对象”分数量化它是一个区域的可能性的分数。
- 2然后将RPN的输出传递到R-CNN组件以进行最终分类和标记。
-
R-CNN系列算法都采取了two-stage策略。特点是虽然检测结果一般都非常准确但仿真速度非常慢即使是在GPU上也仅获得5 FPS。
-
one-stage方法有yolo2015、SSD2015末以及在这两个算法基础上改进的各论文提出的算法。这些算法的基本思路是均匀地在图片的不同位置进行密集抽样抽样时可以采用不同尺度和长宽比然后利用CNN提取特征后直接进行分类与回归。
整个过程只需要一步所以其优势是速度快但是训练比较困难。 -
yolov32018是yolo作者提出的第三个版本之前还提过yolov2和它们的tinny版本tinny版本经过压缩更快但是也降低了准确率。
2. 行人检测
这里学长以行人检测作为例子来讲解目标检测。
2.1 行人检测简介
行人检测( Pedestrian Detection)一直是计算机视觉研究中的热点和难点。行人检测要解决的问题是找出图像或视频帧
行人检测技术有很强的使用价值它可以与行人跟踪行人重识别等技术结合应用于汽车无人驾驶系统(ADAS)智能机器人智能视频监控人体行为分析客流统计系统智能交通等领域。
2.2 行人检测技术难点
由于人体具有相当的柔性因此会有各种姿态和形状其外观受穿着姿态视角等影响非常大另外还面临着遮挡
、光照等因素的影响这使得行人检测成为计算机视觉领域中一个极具挑战性的课题。行人检测要解决的主要难题是:
-
外观差异大包括视角姿态服饰和附着物光照成像距离等。从不同的角度看过去行人的外观是很不一样的。处于不同姿态的行人外观差异也很大。由于人穿的衣服不同以及打伞、戴帽子、戴围巾、提行李等附着物的影响外观差异也非常大。光照的差异也导致了一些困难。远距离的人体和近距离的人体在外观上差别也非常大。
-
遮挡问题 在很多应用场景中行人非常密集存在严重的遮挡我们只能看到人体的一部分这对检测算法带来了严重的挑战。
-
背景复杂无论是室内还是室外行人检测一般面临的背景都非常复杂有些物体的外观和形状、颜色、纹理很像人体导致算法无法准确的区分。
-
检测速度行人检测一般采用了复杂的模型运算量相当大要达到实时非常困难一般需要大量的优化。
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 = 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')
最后
更多资料, 项目分享
https://gitee.com/dancheng-senior/postgraduate
阿里云国际,腾讯云国际,AWS 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov8 |