目前我正在研究一个涉及人脸分类的计算机视觉问题。这通常意味着需要应用深度学习,因此在将图像注入到我们的神经网络之前需要一个特殊的预处理阶段。为了提高我们的模型精度,这是一项非常重要的任务,通过以下几个简单的步骤可以很好地完成。对于本文,我们使用OpenCV:一个高度优化的计算机视觉开源库,在C++、java和Python中都可用。这是一篇简短的文章,包含了一些基本的指导原则、示例和代码,你可以根据需求将它们应用到人脸分类或识别问题上。注意:本文中使用的所有静态图像都来自 图片载入我们将使用imread()函数加载图像,指定文件的路径和mode,第二个参数对于动态运行通道和像素转换非常重要。mode:https://docs.opencv.org/4.1.0/d4/da8/group__imgcodecs.html#ga61d9b0126a3e57d9277ac48327799c80img = cv2.imread('path/image.jpg', cv2.IMREAD_COLOR)要查看图像,我们有imshow()函数:cv2.imshow(img)
如果你写的是类型(img),你会看到尺寸是(height, weight, channels)。我们的彩色图像有3个通道:蓝色,绿色和红色(在OpenCV中按这个顺序)。
我们可以轻松查看单个通道:# Example for green channelimg[:, :, 0]; img[:, :, 2]; cv2.imshow(img)灰度版本为了避免在人脸图像分类中的干扰项,使用黑白图片是个好主意(也可能不是!)你可以两者都试试)。为了得到灰度版本,我们只需要在图像加载函数中指定,将适当的值作为第二个参数传递:img = cv2.imread('path/image.jpg', cv2.IMREAD_GRAYSCALE)
现在我们的图像有了一个单独的通道!人脸和眼睛检测当处理人脸分类问题时,我们可能想要做人脸检测,来做人脸验证任务(是否有脸?)。我们可以使用OpenCV中包含的基于Haar特性的级联分类器进行人脸检测。(https://docs.opencv.org/2.4/modules/objdetect/doc/cascade_classification.html)首先,我们选择预先训练的人脸和眼睛检测分类器。有一个可用的XML文件列表,我们可以使用此列表:https://github.com/opencv/opencv/tree/master/data/haarcascades1)对于人脸检测,OpenCV提供以下(从最宽松的先验到最严格的先验):haarcascade_frontalface_default.xmlhaarcascade_frontalface_alt.xmlhaarcascade_frontalface_alt2.xmlhaarcascade_frontalface_alt_tree.xml2) 对于眼睛检测,我们可以选择两种方法:haarcascade_eye.xmlhaarcascade_eye_tree_eyegasses.xml我们以这种方式加载预先训练的分类器:face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + ‘haarcascade_frontalface_default.xml’)eyes_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + ‘haarcascade_eye.xml’)你可以测试几种组合。记住,在所有情况下,它们中没有一个是最优的(如果第一个分类器失败,你可以尝试第二个分类器,或者甚至尝试所有分类器)。对于人脸检测,我们使用以下代码:faces_detected = face_cascade.detectMultiScale(img, scaleFactor=1.1, minNeighbors=5)结果是一个数组,包含所有检测到的人脸。我们可以很容易地画出矩形:(x, y, w, h) = faces_detected[0]cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 1);cv2.imshow(img)