赞
踩
目录
3.2.1 HOG梯度方向直方图 Histogram of Oriented Gradients
2. 红外行人数据集:KAIST Multispectral Pedestrain Detection Benchmark
3. 南方科技大学的红外数据集:SCUT_FIR_Pedestrian_Dataset
Dataset 01: OSU Thermal Pedestrian Database
Dataset 03: OSU Color-Thermal Database
目标检测现在主要分为以下几个方向:
统计机器学习目前存在的难点:
目前的行人检测基本上都是基于法国研究人员Dalal在2005的CVPR发表的HOG+SVM的行人检测算法(Histograms of Oriented Gradients for Human Detection, Navneet Dalel,Bill Triggs, CVPR2005)。HOG+SVM作为经典算法也集成到opencv里面去了,可以直接调用实现行人检测。
为了解决速度问题可以采用背景差分法的统计学习行人检测,前提是背景建模的方法足够有效(即效果好速度快),目前获得比较好的检测效果的方法通常采用多特征融合的方法以及级联分类器。(常用的特征有Harry-like、Hog特征、LBP特征、Edgelet特征、CSS特征、COV特征、积分通道特征以及CENTRIST特征)。
https://blog.csdn.net/SIGAI_CSDN/article/details/80693322的内容提要如下:
人体有自身的外观特征,我们可以手工设计出特征,然后用这种特征来训练分类器用于区分行人和背景。这些特征包括颜色,边缘,纹理等机器学习中常用的特征,采用的分类器有神经网络,SVM,AdaBoost,随机森林等计算机视觉领域常用的算法。由于是检测问题,因此一般采用滑动窗口的技术,这在SIGAI之前的公众号文章“人脸检测算法综述”,“基于深度学习的目标检测算法综述”中已经介绍过了。
行人检测第一个有里程碑意义的成果是Navneet Dalal在2005的CVPR中提出的基于HOG + SVM的行人检测算法[5]。Navneet Dalal是行人检测中之前经常使用的INRIA数据集的缔造者。
梯度方向直方图(HOG)是一种边缘特征,它利用了边缘的朝向和强度信息,后来被广泛应用于车辆检测,车牌检测等视觉目标检测问题。HOG的做法是固定大小的图像先计算梯度,然后进行网格划分,计算每个点处的梯度朝向和强度,然后形成网格内的所有像素的梯度方向分布直方图,最后汇总起来,形成整个直方图特征。
这一特征很好的描述了行人的形状、外观信息,比Haar特征更为强大,另外,该特征对光照变化和小量的空间平移不敏感。下图为用HOG特征进行行人检测的流程:
得到候选区域的HOG特征后,需要利用分类器对该区域进行分类,确定是行人还是背景区域。在实现时,使用了线性支持向量机,这是因为采用非线性核的支持向量机在预测时的计算量太大,与支持向量的个数成正比。如果读者对这一问题感兴趣,可以阅读SIGAI之前关于SVM的文章。
目前OpenCV中的行人检测算法支持HOG+SVM以及HOG+Cascade两种,二者都采用了滑动窗口技术,用固定大小的窗口扫描整个图像,然后对每一个窗口进行前景和背景的二分类。为了检测不同大小的行人,还需要对图像进行缩放。
由于HOG + SVM的方案计算量太大,为了提高速度,后面有研究者参考了VJ[6]在人脸检测中的分类器设计思路,将AdaBoost分类器级联的策略应用到了人体检测中,只是将Haar特征替换成HOG特征,因为Haar特征过于简单,无法描述人体这种复杂形状的目标。下图为基于级联Cascade分类器的检测流程:
图中每一级中的分类器都是利用AdaBoost算法学习到的一个强分类器,处于前面的几个强分类器由于在分类器训练的时候会优先选择弱分类器,可以把最好的几个弱分类器进行集成,所有只需要很少的几个就可以达到预期效果,计算会非常简单,速度很快,大部分背景窗口很快会被排除掉,剩下很少一部分候选区域或通过后续的几级分类器进行判别,最终整体的检测速度有了很大的提升,相同条件下的预测时间只有基于SVM方法的十分之一。
HOG特征只关注了物体的边缘和形状信息,对目标的表观信息并没有有效记录,所以很难处理遮挡问题,而且由于梯度的性质,该特征对噪点敏感。针对这些问题后面有人提出了积分通道特征(ICF)[7],积分通道特征包括10个通道:
6 个方向的梯度直方图,3 个LUV 颜色通道和1 梯度幅值,见下图,这些通道可以高效计算并且捕获输入图像不同的信息。
在这篇文章里,AdaBoost分类器采用了soft cascade的级联方式。为了检测不同大小的行人,作者并没有进行图像缩放然后用固定大小的分类器扫描,而是训练了几个典型尺度大小的分类器,对于其他尺度大小的行人,采用这些典型尺度分类器的预测结果进行插值来逼近,这样就不用对图像进行缩放。因为近处的行人和远处的行人在外观上有很大的差异,因此这样做比直接对图像进行缩放精度更高。这一思想在后面的文章中还得到了借鉴。通过用GPU加速,这一算法达到了实时,并且有很高的精度,是当时的巅峰之作。
行人检测中的一大难题是遮挡问题,为了解决这一问题,出现了采用部件检测的方法,把人体分为头肩,躯干,四肢等部分,对这些部分分别进行检测,然后将结果组合起来,使用的典型特征依然是HOG,采用的分类器有SVM和AdaBoost。针对密集和遮挡场景下的行人检测算法可以阅读文献[15]。
DPM(Deformable Parts Models)算法在SIGAI在之前的文章“基于深度学习的目标检测算法综述”已经提到过。这是是一种基于组件的检测算法,DPM检测中使用的特征是HOG,针对目标物不同部位的组建进行独立建模。DPM中根模型和部分模型的作用,根模型(Root-Filter)主要是对物体潜在区域进行定位,获取可能存在物体的位置,但是是否真的存在我们期望的物体,还需要结合组件模型(Part-Filter)进行计算后进一步确认,DPM的算法流程如下:
DPM算法在人体检测中取得取得了很好的效果,主要得益于以下几个原因:
DPM算法同时存在明显的局限性,首先,DPM特征计算复杂,计算速度慢(论文[8]中针对DPM提出了多个加速的策略,有兴趣的读者可以参考);其次,人工特征对于旋转、拉伸、视角变化的物体检测效果差。这些弊端很大程度上限制了算法的应用场景,这一点也是基于人工特征+分类器的通病。
采用经典机器学习的算法虽然取得了不错的成绩,但依然存在下面的问题:
1.对于外观,视角,姿态各异的行人检测精度还是不高
2.提取的特征在特征空间中的分布不够紧凑
3.分类器的性能受训练样本的影响较大
4.离线训练时的负样本无法涵盖所有真实应用场景的情况
基于机器学习的更多方法以参考综述文章[10][18][19]。文献[10]对常见的16种行人检测算法进行了简单描述,并在6个公开测试库上进行测试,给出了各种方法的优缺点及适用情况。
文献[18]提出了Caltech数据集,相比之前的数据集,它的规模大了2个数量级。作者在这个数据集上比较了当时的主要算法,分析了一些失败的的原因,为后续的研究指出了方向。
文献[19]也比较了10年以来的行人检测算法,总结了各种改进措施,并支持了以后的研究方向。
来自HOG+SVM的论文,论文中使用的图片是归一化之后的。
训练和测试的时候有几种选择方式:
用normalized_images目录下的图片做训练,或者用original_images目录下的图片+annotations获取行人区域做训练;测试则都在original_images/test/pos上测试。
这个数据集来自于 github搜索关键字:HOG+SVM ,或者github搜索关键字:HOG+SVM行人检测,后者star最多的的 https://github.com/icsfy/Pedestrian_Detection,找不到原作者了。反正就是作者已经分好了如下的数据集:
资料:https://blog.csdn.net/hongbin_xu/article/details/79810544 HOG特征检测学习笔记,MATLAB code求HOG。
如何计算HOG梯度方向直方图呢?
梯度方向直方图Histogram of Oriented Gradients (HOG) 这篇文章详细描述了HOG特征是如何提取和计算的,超级棒!
关键的几张图示如下:
其他资料:
https://blog.csdn.net/carson2005/article/details/8316835 CSDN 266
https://blog.csdn.net/hongbin_xu/article/details/79845290 CSDN 3081 code
https://blog.csdn.net/qq_37753409/article/details/79047063 CSDN C++ code
https://www.cnblogs.com/heleifz/p/train-hog-svm-detector.html
https://blog.csdn.net/Young__Fan/article/details/85000200 HOG+SVM参考资料大合集
提取特征+分类器,提取了好的特征,那么用什么样的分类器都能得到不错的结果。
为什么使用线性SVM?
另外一个问题什么时候选择SVM或逻辑回归?如图:
1. 特征维度n很大:
使用逻辑回归和线性SVM.
2. 特征维度n小,样本数量m中等:
使用高斯核SVM。
3. 特征维度n小,且样本数量m巨大:
- 可以创建新的特征
- 然后使用逻辑回归和无核SVM
什么是线性SVM?
左图就是线性SVM,就是不使用核函数,将
核函数:为了得到非线性的拟合
假设函数hθ(x)=θ0+θ1f1+θ2f2+θ3f3+⋯(用f代替x的参数)这个函数为新的假设函数。
我们设置f函数,衡量标记点和原先样本点的相似性。 为
即设计一些landmarks li,这些landmarks对于得到非线性的边界十分重要,计算xi和li的相似度fi,并将fi作为特征输入:
hθ(x)=θ0+θ1f1+θ2f2+θ3f3+⋯,就可以得到非线性的分类边界!
如何得到参数θ呢?
输入X,y,C等参数,经过svmTrain后得到模型model,得到参数w和b,由于是线性的,所以
则:
- model = svmTrain(X, y, C, @linearKernel, 1e-3, 20);
-
- function visualizeBoundaryLinear(X, y, model)
- %VISUALIZEBOUNDARYLINEAR plots a linear decision boundary learned by the
- %SVM
- % VISUALIZEBOUNDARYLINEAR(X, y, model) plots a linear decision boundary
- % learned by the SVM and overlays the data on it
- w = model.w;
- b = model.b;
- xp = linspace(min(X(:,1)), max(X(:,1)), 100);
- yp = - (w(1)*xp + b)/w(2);
- plotData(X, y);
- hold on;
- plot(xp, yp, '-b');
- hold off
-
- end
资料:
参考 Matlab选择mingw编译器 进行安装。
寻找新办法
https://blog.csdn.net/SKY_yiyi_9/article/details/88140283 如何在Matlab2018a中配置MinGW-w64 C/C++ 编译器
无奈放弃,让别人跑的,生成.mex64给我,哎!
https://blog.csdn.net/haronchou/article/details/106120804 其他数据集
其他研究人员也采用多模态的方法,Also, another researches to employ multi-modality are presented.
得到的结果如下:
- import cv2
- import os
- import sys
- import glob
- from PIL import Image
-
- # VEDAI 图像存储位置
- src_img_dir = "F:\\pedestrain detection benchmark\\SCUT_FIR_Pedestrian_Dataset-master\\train02\\images\\"
- # VEDAI 图像的 ground truth 的 txt 文件存放位置
- src_txt_dir = "F:\\pedestrain detection benchmark\\SCUT_FIR_Pedestrian_Dataset-master\\train02\\annotations\\"
- # 所有的图像名称
- img_Lists = glob.glob(src_img_dir + '/*.jpg')
-
- img_basenames = [] # e.g. 100.jpg
- for item in img_Lists:
- img_basenames.append(os.path.basename(item))
-
- img_names = [] # e.g. 100
- for item in img_basenames:
- temp1, temp2 = os.path.splitext(item)
- img_names.append(temp1)
-
- for img in img_names:
- # open the crospronding txt file
- with open(src_txt_dir + '/' + img + '.txt',"r") as f:
- line_count = 0
- for line in f.readlines():
- if line_count == 0:
- line_count += 1
- continue
- line = line.strip('\n')
- spt = line.split(' ')
- cat_name = str(spt[0])
- x_min = int(spt[1])
- y_min = int(spt[2])
- bbox_wid = int(spt[3])
- bbox_hei = int(spt[4])
-
- if cat_name == "people" or cat_name == "walk person":
- if bbox_hei >= 10 and bbox_hei <= 30:
- bbox_hei_new = 2*bbox_wid
- if y_min+bbox_hei > 576:
- y_min = 576-bbox_hei_new
- else:
- y_min = y_min-(bbox_hei_new-bbox_hei)/2
-
- # 确保尺寸为1:2,扩充为原来的1.5倍
- '''
- bbox_wid_new = int(bbox_wid)
- bbox_hei_new = int(2 * bbox_wid_new)
- # 防止越界
- if y_min >= 0.25*bbox_hei and y_min + bbox_hei_new< 576:
- y_min = y_min - 0.25*bbox_hei
- elif y_min < 0.25*bbox_hei:
- y_min = 0
- else:
- y_min = 576 - bbox_hei_new
- if x_min >= 0.25 * bbox_wid and x_min + bbox_wid_new < 720:
- x_min = x_min - 0.25 * bbox_wid
- elif y_min < 0.25 * bbox_wid:
- x_min = 0
- else:
- x_min = 720 - bbox_wid_new
- '''
-
- # 读入图像
- img_data = cv2.imread((src_img_dir + '/' + img + '.jpg'), cv2.IMREAD_UNCHANGED)
- cropped = img_data[int(y_min):int(y_min+bbox_hei_new),int(x_min):int(x_min+bbox_wid)] # y为高度,x为宽度
- cv2.imwrite("G:\\scut_pedestrain_crop\\train\\" + "test_" + str(img) + ".jpg", cropped)
- # cv2.rectangle(img_data, (x_min, y_min), (x_min+bbox_wid, y_min+bbox_hei), (255, 0, 0), 2)
- # cv2.imshow('label', img_data)
- # cv2.waitKey(0)
-
-
- '''
- # gt = open(src_txt_dir + '/gt_' + img + '.txt').read().splitlines()
- # write the region of image on xml file
- for img_each_label in gt:
- spt = img_each_label.split(' ') # 这里如果txt里面是以逗号‘,’隔开的,那么就改为spt = img_each_label.split(',')。
- xml_file.write(' <name>' + str(spt[4]) + '</name>\n')
- xml_file.write(' <pose>Unspecified</pose>\n')
- xml_file.write(' <truncated>0</truncated>\n')
- xml_file.write(' <difficult>0</difficult>\n')
- xml_file.write(' <bndbox>\n')
- xml_file.write(' <xmin>' + str(spt[0]) + '</xmin>\n')
- xml_file.write(' <ymin>' + str(spt[1]) + '</ymin>\n')
- xml_file.write(' <xmax>' + str(spt[2]) + '</xmax>\n')
- xml_file.write(' <ymax>' + str(spt[3]) + '</ymax>\n')
- xml_file.write(' </bndbox>\n')
- xml_file.write(' </object>\n')
- # 获取路径下的所有txt格式的文件名
- def file_name(file_dir):
- File_Name=[]
- img_dir = "F:\\pedestrain detection benchmark\\SCUT_FIR_Pedestrian_Dataset-master\\train02\\images\\"
- for files in os.listdir(file_dir):
- if os.path.splitext(files)[1] == '.txt':
- img_dir += files[:-3]+"jpg"
- # File_Name.append(files)
- # 以原格式读入图像,原图像为灰度图
- img = cv2.imread(img_dir,cv2.IMREAD_UNCHANGED)
- # 需要读入标签信息
- return File_Name
- txt_file_name=file_name("F:\\pedestrain detection benchmark\\SCUT_FIR_Pedestrian_Dataset-master\\train02\\annotations\\")
- print("txt_file_name",txt_file_name)
- '''
背景:由于HOG+SVM行人检测在自己的数据集上出现了问题,如下:
后记:坑爹的原因是读图的路径设置的有问题,导致读入的仅仅是文件名,没有加入绝对路径,导致读的图是错误的,才出现了上述问题。我也是醉了!!!以后要避免这种低级错误。
当然,模型的分析和优化技能也是相当重要的,是后期最重要的技能。所以还是要掌握的!
2020/05/15 update:
《机器学习实战》中英文电子书+源码下载:https://redstonewill.com/1884/
资料:Python3《机器学习实战》学习笔记(八):支持向量机原理篇之手撕线性SVM,SVM原理详解,公式推导等
最优化过程的数学建模:
(1)目标函数——分类间隔最宽;希望什么东西的什么指标达到最好
对上述两个对象进行建模,“决策面方程”
目的是找出一个分类效果好的超平面作为分类器,分类间隔越大,这个超平面的分类效果越好。所以变成了求解分类间隔d最大的分类器。
针对问题1,假设决策面在间隔区域的中轴线上,且支持向量的样本点到决策面的距离为d,约束公式如下:
第三个公式同时处以了d,也就是说样本点到决策面的距离>d,才预测为1 or -1.
(1)(2)(3)
目的是使得d最大化(最大间隔的分类器),d的表达式如下。支持向量又满足如下式子:
我们只关心支持向量上的点,因此我们的目标函数简化为:
那么就有如下的目标函数和约束条件:分类间距最大,同时满足分类的约束条件:
上述带有不等式约束的优化式子常用的方法是KKT条件。把所有的等式、不等式约束与目标函数f(x)写成一个式子,即拉格朗日乘数法。通过KKT条件,可以求出最优值。KKT条件是可以取得最优值的必要条件。
随后,人们又发现,使用拉格朗日获得的函数,使用求导的方法求解依然困难。进而,需要对问题再进行一次转换,即使用一个数学技巧:拉格朗日对偶。
所以,显而易见的是,我们在拉格朗日优化我们的问题这个道路上,需要进行下面二个步骤:
将上面的有约束的目标函数转为如下的无约束的拉格朗日目标函数为:
其中αi是拉格朗日乘子,αi大于等于0,是我们构造新目标函数时引入的系数变量(我们自己设置)。现在我们令:
每一个样本都作为约束条件加上去!
这部分的内容要详细推到,一直到SMO怎么求解的,关于SVM的深入分析和理解。暂时放在这里。我当前需要了解如何优化模型,如何分析特征,如何评价和诊断模型。
机器学习——支持向量机SVM(Support Vector Machine)(下)
SVM训练的模型的复杂度由支持向量的个数决定的,而不是数据的维度决定。SVM不太容易过拟合。
SVM训练出的模型完全依赖于支持向量。
一个SVM如果训练得到的支持向量个数比较少,则泛化能力越强。
参考网址:http://www.jeepxie.net/article/646115.html
https://blog.csdn.net/hunnzi/article/details/103445059
(1)KAIST——用于行人检测任务
获取地址:https://blog.csdn.net/Lcd_2018_7_18/article/details/103064150
1. 红外数据集
http://vcipl-okstate.org/pbvs/bench/ OTCBVS数据集里面有用的部分
Topic of Interest:
Person detection in thermal imagery. 热成像行人检测 75mm镜头,8楼的房顶拍摄,10个序列共284张图,8-bit灰度图,360*240像素,有ground-truth的txt以及matlab程序可以画bounding box,不包含遮挡的行人,50%可见的行人才进入ground-truth中
Sensor Details:
Raytheon 300D thermal sensor core
75 mm lens
Camera mounted on rooftop of 8-story building
Gain/focus on manual control
Data Details:
Pedestrian intersection on the Ohio State University campus
Number of sequences = 10
Total number of images = 284
Format of images = 8-bit grayscale bitmap
Image size = 360 x 240 pixels
Sampling rate = non-uniform, less than 30Hz
Environmental information for each sequence provided in subdirectories
Ground truth provided in subdirectories as list of bounding boxes (with approximately same aspect ratio) around people.
For the ground truth data, we selected only those people that were at least 50% visible in the image (i.e., highly occluded people were not selected).
彩色和热成像的双光系统,双光融合的目标检测。红外23mm镜头。6个视频序列共17089张图像,8-bit灰度图,320*240pixe的红外图像。还有跟踪的result的文件。
Fusion of color and thermal imagery,
Fusion-based object detection in color and thermal imagery
Sensor Details:
Thermal Sensor: Raytheon PalmIR 250D, 25 mm lens
Color Sensor: Sony TRV87 Handycam
Cameras mounted adjacent to each other on tripod at two locations approximately 3 stories above ground
Gain/focus on manual control
Data Details:
Busy pathway intersections on the Ohio State University campus
Number of color/thermal sequences = 6 (3 at each location)
Total number of images = 17089
Format of images = Thermal: 8-bit grayscale bitmap, Color: 24-bit color bitmap
Image size = 320 x 240 pixels
Sampling rate = approx. 30Hz
Color/Thermal images registered using homography with manually-selected points
Files containing tracking results on the dataset are provided by Alex Leykin
为了明确图像指标上的对应,给出如下图示。
- % 行人高度、镜头、距离对应得到的Pixel
-
- height = 1.6;%m
- distance = 700;%m
-
- f = 55;%55mm镜头
- size_p = 12*0.001;%12um像元尺寸12um*10e-3=0.012mm
-
- pixel = f*height / (size_p * distance);
- fprintf("距离=%d m \t pixel_height=%f\n",distance,pixel);
理论计算距离与pixel的对应
分类问题中的正负样本问题,如人脸识别中的例子。负样本的选取与问题场景相关,具体而言,如果你要进行教室中学生的人脸识别,那么负样本就是教室的窗子、墙等等,也就是说,不能是与你要研究的问题毫不相关的乱七八糟的场景图片,这样的负样本并没有意义,还有一个比较好的网址是(http://www.doc.ic.ac.uk/~sgc/teaching/pre2012/v231/lecture10.html)
训练一个检测器时,每个stage应该要有几千张正负样本。通常一个检测器会有10~20个stage。每个stage会依次递减负样本的数量为上个stage的一半。所以你大概需要3k-10k的正样本,5,000,000~100million的负样本(500万-10亿)。
负样本与环境相关,如果你要进行教室中学生的人脸识别,那么负样本就是教室的窗子、墙等等,也就是说,不能是与你要研究的问题毫不相关的乱七八糟的场景图片,这样的负样本并没有意义。如果你不知道你对应用环境,那就尽量采取多种可能的不同的环境图像。
你可以把眼睛和鼻子作为负样本,但是只将这些作为负样本远远不够。一个探测器的real strength真正韧劲will come from negative images which represent the typical background of the faces。一个探测器的真正韧劲来源于负样本,这些负样本代表了人脸的典型背景。
你其实并不需要很多负样本,你可以采取1000张图像,然后从中产生10,000,000张负样本。假设你有一张汽车的图片,像素为1k×1k pixels。假设你的人脸识别检测器工作在20×20pixel进行检测,如OpenCV就是这样的。那么你可以将1k×1k的汽车图片剪切成20×20的切片。你也可以获得2500个切片(50×50)。
我必须提醒你注意,负样本之间不能有太多相关性,所以我不建议只从一张图片中截取和产生1百万个负样本。create a library of 1000 images 或从google随机下载数据,确定所有的负样本都不包含人脸。从每个图像中crop截取10,000个负样本,这样得到了大约10million的负样本。训练你的检测器。下一步你可以将每一张图像cut到~50,000张部分重叠的pieces,这样就将负样本扩大到50millions。这样你就会有很好的结果了。
当你最后已经有一个很好的探测器之后,那么在更多的图像上运行试一下。它会产生误识别。收集所有这些误识别的检测图像,然后将他们加到你的负样本中。然后将检测器再训练一遍。这样的迭代次数越多,你的检测器会更鲁棒。
今天最好的face detectors(如Facebooks)使用了hundreds of millions几百个million(1亿)的正样本,billions10亿负样本。正样本不仅仅是正面的脸,还有各个方向的脸,各种表情的脸,各种年龄的脸,各种性别的脸,各种种族的脸。带着眼镜/帽子/太阳镜/化妆的脸等。你不必要跟最好的比,所以miss掉一些faces时不要get angry。
<100m,200m,300m,400m下的负样本问题,不同距离的负样本的尺度也是不一样的,比如车?比如误检测?
如何从负样本的角度去提高模型的识别精度呢?解释如下:
可以通过下面两种方式收集负样本:
把使用正样本训练好的模型拿来进行测试,此时会得到一些被错误识别的图片。把这些图片收集起来作为负样本加入到正样本集(如果图片中同时包含误识别物体和目标,可以将图像裁剪,裁剪后的图像包含误识别物体而不包含目标并尽量覆盖原图大部分区域,然后再将其分辨率resize回原图大小),组成新的训练集,送入模型进行训练。
如果负样本的来源只有误识别的图片,那么由于误识别的图片往往占少数,可以利用图像增强(如高斯滤波、对比度增强、锐化、平滑等)的方法扩充负图像数量至和正样本数量相同,并组合在一起。将这样得到的训练集送入模型进行训练,经过若干个epoch,当Loss收敛到稳定值时,再次测试原来的出现误识别的图像你会发现误识别现象基本消失了,并且类似原来误识别的场景将会被正确识别。
虚警概率:false positive / (false positive + true positive),就是1-precision=false alarm。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。