Python错误数据(图片)去除
在我们通过爬取网络图片,作为我们的深度学习样本数据集时,往往有许多我们不需要的错误数据,假如当我们进行人脸识别时,爬取到的图片会有许多这样的动画图片
这种类似的图片就是错误的样本数据,需要去除它们,在这里我们使用Opencv中的haarcascade_frontalface_alt.xml模型来去除掉样本中非人脸的数据,Opencv中的**CascadeClassifier.detectMultiScale()**函数可以返回检测到的一张图片中的人脸数量,如果返回的数值为0,说明没有识别到人脸,那么我们就删除此图片,继续识别下一张。
调用detectMultiScale()实现多尺度检测:
g_cascade.detectMultiScale(InputArray image, //输入图像
CV_OUT std::vector<Rect>& objects, //输出检测到的目标区域
double scaleFactor =1.1, //搜索前后两次窗口大小比例系数,默认1.1,即每次搜索窗口扩大10%
int minNeighbors = 3, //构成检测目标的相邻矩形的最小个数 如果组成检测目标的小矩形的个数和小于minneighbors - 1 都会被排除,如果minneighbors为0 则函数不做任何操作就返回所有被检候选矩形框
int flags = 0, //若设置为CV_HAAR_DO_CANNY_PRUNING 函数将会使用Canny边缘检测来排除边缘过多或过少的区域
Size minSize = Size(), //能检测的最小尺寸
Size maxSize = Size() //能检测的最大尺寸
);
注:detectMultiScale的检测过程是从最大的size逐步缩小,这里我们设置窗口的扩大系数是1.3,检测目标的相邻矩形的最小个数是5,其他的参数默认即可。
import os
import cv2.cv2
'''
这里主要用到了Opencv的人脸检测的分类器haarcascade_frontalface_alt.xml和CascadeClassifier函数
'''
cascade_path = 'haarcascade_frontalface_alt.xml'
cascade = cv2.CascadeClassifier(cascade_path)
images_dir = '../images/smile'
images = os.listdir(images_dir)
for image in images:
img = cv2.imread(os.path.join(images_dir,image),1)
# 得到检测到人脸的数量
rects = cascade.detectMultiScale(img, 1.3,5)
print('detected face', len(rects))
# 如果没有检测到人脸就删除本图片
if len(rects) == 0:
cv2.namedWindow('Result',0)
cv2.imshow('Result', img)
os.remove(os.path.join(images_dir, image))
k = cv2.waitKey(0)
if k == ord('q'):
break
最后要注意的一点就是,我们的模型筛选非人脸数据不是很理想,有许多人眼能看出来是人的图片,没有检测到,而一些具有人脸特征的动画反而被检测除了人脸,所以这个模型筛选后需要人工第二次筛选,虽然还是需要人工来筛选,但是大大减少了人工的工作量,还有就是被筛掉的样本数据是很多的,这里我爬取了1100多张的人脸图片,整个筛选完毕就剩下了大概600张左右,效果呢,是有点惨不忍睹,以后我会更新更好的模型筛选数据的教程。
如果想要了解CascadeClassifier的可以前往下面的链接:
关于opencv-CascadeClassifier(级联分类器)的初步认识