前言

效果如下,将下图喂到test程序内可得img1所示输出。

大作业要求

报告的主题是video based smoke detection,四人一组,一组交一份报告。

预先提供train、test两个数据集,内部有smoke和non两个文件夹,文件夹内有若干100*100大小的图片。

报告内容包括四部分:1、特征表示;2、降维及聚类;3、分类;4、模型评价及选择。

图片预处理

拿到图片集后,发现图片的是这样的(部分图片)。图片大小的统一的,都是100*100,但是图片的名字命名规则缺没有规律(也可能是有我没发现的规律), 图片读取十分不方便。

全选图片后,对任一个图片重命名,图片集实现了批量图片重命名,得到如下图所示的图片集:

可以看出所有图片的名字得到统一化,接下来通过程序读取图片集就变得简单啦。

以下是代码分析

训练集内所有烟雾图片和无烟雾图片分别读取到pos_list和neg_list列表内

PosNum = 688
NegNum = 817
pos_path = 'train\\smoke_mqa\\'
neg_path = 'train\\non_mqa\\'#导入正、负图片集
for i in range(0,PosNum):fileName = pos_path+'yw ('+str(i+1)+').jpg'img  = cv2.imread(fileName)pos_list.append(img) for i in range(0,NegNum):fileName =neg_path+'no_yw ('+str(i+1)+').jpg'img = cv2.imread(fileName)neg_list.append(img)

将pos_list和neg_list列表内的图片通过computeHOGs函数HOG特征提取、整合、存储到gradient_list列表内,然后根据正负图片集生产图片集标签,标签信息存储到labels列表内。

#添加图片集标签
computeHOGs(pos_list,gradient_list,wsize=(100,100))
for _ in range(len(pos_list)):labels.append(+1)computeHOGs(neg_list,gradient_list,wsize=(100,100))
for _ in range(len(neg_list)):labels.append(-1)

HOG特征提取

HOG算法提取的图像形状特征:

1)灰度化处理图片;

2)采用Gamma校正法对输入图像进行颜色空间的标准化;

3)计算图像每个像素的梯度,将像素的梯度方向在0-360°平均划分为n个bins;

4)将图像换分为小的细胞单元(cell),每个cell有唯一的梯度特征向量,每个cell大小为(x,x);

5)统计每个cell的梯度特征向量,形成梯度直方图;

6)将y*y个cell组成一个正方形的块(block),一个block内所有cell的特征向量串联得到该block的HOG特征向量;

7)将所有block内所有的HOG特征向量串联得到此图片的HOG特征向量。

对于HOG算法的实现编程能力强的同学可以自己编写算法函数,显然本博主不是,所以我使用是opencv库内嵌的hog算法函数compute。依据此函数输入一张待处理的灰度图img,可以输出该图片hog特征序列。

使用compute函数前,需要预先初始化hog算法,依据训练集的图片和期望特征提取的复杂程度设定HOGDescriptor函数的入口参数。其中,winSize为感兴趣区域ROI大小,即训练集图片图片的大小;blockSize为块大小;blockStride为块移动步增量;cellSize为胞元大小;nBin为梯度方向数。

def computeHOGs(img_list,gradient_list,wsize=(100,100)): #计算roi的hog特征hog = cv2.HOGDescriptor((100,100),(10,10),(5,5),(5,5),nBin)# 窗口大小  块大小 快滑动增量 胞元大小 梯度方向数for i in range(len(img_list)):img  = img_list[i]gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)    #灰度化gray = cv2.equalizeHist(gray)       #直方图均衡化,防止有些图片过亮或过暗gray = gamma_trans(gray,gram)        #伽马变换gradient_list.append(hog.compute(gray))    return gradient_list

HOG算法提取图片的HOG特征向量实现步骤为:

1)将图片分割为若干cellSize大小的cell;

2)从图片的左上角开始,提取blockSize大小block的梯度值;

3)block以blockStride为移动距离从左到右,再到下一行遍历整张图片;

4)根据nBins分割梯度值,得到hog特征向量

SVM生成模型

支持向量机(SVM)是一种监督机器学习算法,可用于分类或回归挑战。通过SVM算法可以找到离分隔超平面最近的点,确保它们离分割面的距离尽可能远。 核函数kernel利用低维的输入空间,将其转换为高维空间;即将不可分离问题转换为可分离问题。

创建svm分类器,设置svm内核、伽马变换系数和惩罚系数,如下图所示。生成模型,并保存为svm1.xml。

#训练svm
svm1 = cv2.ml.SVM_create()
svm1.setType(cv2.ml.SVM_C_SVC)
svm1.setGamma(0.5)
svm1.setC(3)
svm1.setKernel(cv2.ml.SVM_LINEAR) #线性
svm1.train(np.array(gradient_list), cv2.ml.ROW_SAMPLE, np.array(labels))
svm1.save("svm1.xml") 

至此,模型训练完成。

测试集测试

def gamma_trans(img,gamma): #伽马变换gamma_table = [np.power(x/255.0,gamma)*255.0 for x in range(256)]gamma_table = np.round(np.array(gamma_table)).astype(np.uint8)return cv2.LUT(img,gamma_table)def computeHOGs(img_list,gradient_list,wsize=(100,100)): #计算roi的hog特征hog = cv2.HOGDescriptor((100,100),(10,10),(5,5),(5,5),nBin)# 窗口大小  块大小 快滑动增量 胞元大小 梯度方向数for i in range(len(img_list)):img  = img_list[i]gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)    #灰度化gray = cv2.equalizeHist(gray)       #直方图均衡化,防止有些图片过亮或过暗gray = gamma_trans(gray,gram)        #伽马变换gradient_list.append(hog.compute(gray))    return gradient_listdef sliding_window(image, stepSize, windowSize):#滑动窗口for y in range(0, image.shape[0], stepSize):for x in range(0, image.shape[1], stepSize):yield (x, y, image[y:y + windowSize[1], x:x + windowSize[0]])#哪个维度超纲,哪个维度就显示原图def mqa_hog_predict(mqa_img,i,z):scale = 1w,h = 100,100x,y = 0,0rectangles = []font = cv2.FONT_HERSHEY_PLAINcs_num = 0for (x, y, roi) in sliding_window(mqa_img, 10, (100, 100)):#对得到的图进行滑动窗口,(100, 40)为窗口大小,本文应取(64, 64)if roi.shape[1] != w or roi.shape[0] != h:         #判断是否超纲continuegray = cv2.cvtColor(roi,cv2.COLOR_BGR2GRAY)gray = cv2.equalizeHist(gray)gray = gamma_trans(gray,gram)test_gradient = myHog.compute(gray)a, res = svm1.predict(np.array([test_gradient]), flags=cv2.ml.STAT_MODEL_RAW_OUTPUT)_, result = svm1.predict(np.array([test_gradient]))score = res[0][0]#if result[0][0] == 1 :#and score > my_res :if score < my_res :# cs_num+=1#z+=1rx, ry, rx2, ry2 = int(x * scale), int(y * scale), int((x+w) * scale), int((y+h) * scale)rectangles.append([rx, ry, rx2, ry2, score])windows = np.array(rectangles)boxes = nms(windows,0.5)# print(len(boxes))# print(z,len(boxes))if z == 1:if len(boxes) > 8 :for (x, y, x2, y2, score) in boxes:  #cv2.rectangle(mqa_img, (int(x),int(y)),(int(x2), int(y2)),(0, 255, 0), 1)cv2.putText(mqa_img, "%f" % score, (int(x),int(y)), font, 1, (0, 255, 0))cv2.imshow("img"+str(i), mqa_img)    #显示图像,常与下一函数连用,否则图片一闪而过return  score
PosTestNum = 552
NegTestNum = 831
m1,m2=0,0
for i in range(0,NegTestNum):fileName = 'test\\non_mqa\\csw ('+str(i+1)+').jpg'# 导入正样本图片img  = cv2.imread(fileName)m1=mqa_hog_predict(img,i,0)mysj.append(m1)
#画图
plt.hist(mysj,bins=(100))
plt.title("label1")
plt.show()
for i in range(0,PosTestNum):fileName = 'test\\smoke_mqa\\csy ('+str(i+1)+').jpg'# 导入负样本图片img  = cv2.imread(fileName)m2=mqa_hog_predict(img,1000+i,0) mysj1.append(m2)   plt.hist(mysj1,bins=(100))
plt.title("label2")
plt.show() 

由train.py生成的模型,利用test.py对测试集的图片进行测试,生成以下两张柱状图。label1为使用无烟雾图片得到的相似度分布图,小于0部分为二分类混淆矩阵的FP(假正例)部分,大于0为TN(正反例)部分。label3为使用烟雾图片得到的相似度分布图,小于0部分为二分类混淆矩阵的TP(真正例)部分,大于0为FN(假反例)部分。

由两图可知检测程序的实现效果不太理想,主要原因为训练集内图片太少、hog算法理解浅薄、hog算法自身的局限。

=========================================================================

本篇借鉴了以下博客内容,如有侵权,立删。

HOG算法的实现 - tangjunjun - 博客园 (cnblogs.com)

​​​​​​(6条消息) opencv-python 入门实战:传统方法Hog+svm实现目标检测_weixin_44689486的博客-CSDN博客

(6条消息) Python+OpenCV+HOG+SVM+行人检测_nsh119的博客-CSDN博客

烟雾检测(1)HOG+SVM 检测相关推荐

  1. CVPR2005【行人检测】HOG+SVM用于人体检测的梯度方向直方图

    目录 CVPR2005-用于人体检测的梯度方向直方图 Histograms of Oriented Gradients for Human Detection 使用的数据集 研究方法 数据 流程 双对 ...

  2. (二)目标检测之 HOG+SVM 算法

    文章目录 背景 HOG特征描述符 方法概述 HOG算法优缺点 实例讲解 参考资料 背景   梯度直方图HOG(Histogram of Oriented Gradients)是法国人Dalal在200 ...

  3. OpenCV实战4: HOG+SVM实现行人检测

    目前基于机器学习方法的行人检测的主流特征描述子之一是HOG(Histogram of Oriented Gradient, 方向梯度直方图)HOG 特征是用于目标检测的特征描述子,它通过计算和统计图像 ...

  4. HOG+SVM进行行人检测(github代码解读)

    HOG+SVM进行行人检测 代码参考+数据集来源:https://github.com/FrankMa123/- 注意使用的scikit-learn库的版本为0.22,高于该版本的scikit-lea ...

  5. HOG人体检测原理详解

    http://blog.csdn.net/masibuaa/article/details/12917961 1.HOG特征: 方向梯度直方图(Histogram of Oriented Gradie ...

  6. 基于python的HOG+SVM目标检测算法实现

    目录 一.场景需求解读 二.HOG算法简介 三.SVM算法简介 四.基于HOG的目标检测算法训练流程 五.目标检测代码实现 六.非极大值抑制(NMS)简介及代码实现 七.NMS效果展示与分析 八.思维 ...

  7. OpenCV实战【2】HOG+SVM实现行人检测

    目录 HOG是什么? HOG vs SIFT HOG步骤 HOG在检测行人中的方式 Opencv实现 HOGDescriptor的构造函数: 行人检测HOG+SVM步骤 简化版的HOG计算 HOG是什 ...

  8. python svm 实战_opencv-python 入门实战:传统方法Hog+svm实现目标检测

    写在前面 相信大家学过语言的朋友们都有这样经验:学习编程语言最快的方式就是直接看别人的源代码.别人代码看通了,基本上这门编程语言也就入门了. 文末将附上我自己写的代码,比较初级,适合入门学习.大佬看到 ...

  9. HOG+SVM实现行人检测

    一.概述 行人检测过去流行采用的方法是DPM方法,其主要采用hog特征+SVM分类实现行人检测: 其中梯度方向直方图( Histogram of Oriented Gradients,HOG)的概念是 ...

最新文章

  1. python软件是免费的吗-python属于软件吗
  2. 网络编程 UDP套接字
  3. CPU的制造过程及大致原理
  4. XML文件中的CDATA的使用.
  5. python实例方法、静态方法和类方法
  6. access 图片存储的格式_Ceph对象存储RGW架构及安装实战
  7. 高途发布2020年经德勤审计年报 CFO:16次做空已成谣言
  8. 铁道部2012年版全国72个铁路枢纽城市
  9. 对于已经加入版本控制的文件,我们可以强制忽略文件git update-index --assume-unchanged local.properties...
  10. JAVA编译器的作用
  11. 高效记忆/形象记忆(10)110数字编码表 41-50
  12. 语义表示——神经网络与深度学习
  13. mysql passwor authen_mysql5.7 的 user表的密码字段从 password 变成了 authentication_string
  14. html打砖块游戏制作,JavaScript实现打砖块游戏
  15. 快速入门 | 篇二十一:正运动技术运动控制器自定义通讯
  16. MTK项目case解决方法(经验)
  17. HC-SR501 人体红外感应模块 单片机
  18. 访问者模式(JAVA)
  19. Sun发布全球首款“统一存储系统”Storage7000
  20. IELTS Lexical Resources - Reading 1 social problem

热门文章

  1. 【C语言程序设计】纳税
  2. 20份七年级语文同步练习试卷
  3. unity 实现场景过度动画
  4. 早安!上学人!(连载)
  5. unity的学习,准备搞一款mmo小游戏,服务器和客户端从零学
  6. 新手入门大数据,大数据的入门!!!认识大数据
  7. 机器学习模型调优方法(过拟合、欠拟合、泛化误差、集成学习)
  8. 鸿蒙手机 跳票,不会跳票!华为官宣:鸿蒙手机系统马上就来,对标苹果安卓!...
  9. TeamViewer——可以实现在手机上随时远程控制你的电脑
  10. 【项目源码】- 【模仿知乎日报二】吐血高仿知乎日报