提交 106685b5 编写于 作者: W wizardforcel

2021-01-06 14:26:31

上级 7784d98a
......@@ -8,7 +8,7 @@
* 使用 LBP 处理图像
* 将 LBP 应用于纹理识别
* 使色与基础色匹配-LBP 及其局限性
* 使面部颜色与基础色匹配-LBP 及其局限性
* 使用基础色匹配面部颜色-颜色匹配技术
# 使用 LBP 处理图像
......@@ -19,14 +19,14 @@ LBP 是一种灰度图像阈值操作,用于基于不同的模式对图像进
LBP 模式生成的主要步骤如下:
1. 将 RGB 图像 A 转换为灰度图像 G
2. 对于图像 G 中每个具有强度`I[c]`(x,y)的像素,选择`P`相邻点(`p[0], p[1], ..., p[P-1]`),其半径`[I[0], I[1], ..., I[P-1]`具有相应的强度。`R`。 半径以像素为单位定义为两个像素之间的差。 像素和相邻点代表图像 G 的滑动窗口 W。对于半径 R = 1,P 变为 8,如下所示。
1. 将 RGB 图像`A`转换为灰度图像`G`
2. 对于图像`G`中每个具有强度`I[c](x, y)`的像素,选择`P`相邻点(`p[0], p[1], ..., p[P-1]`),其半径`[I[0], I[1], ..., I[P-1]`具有相应的强度。`R`。 半径以像素为单位定义为两个像素之间的差。 像素和相邻点代表图像`G`的滑动窗口`W`。对于半径`R = 1``P`变为 8,如下所示。
滑动窗口`W[0]`用![](img/da8626a4-00d9-4c10-8f2c-bc2209a48071.png)表示为数组。 在这里,点 0 到 P-1 代表围绕中心像素 c 的 P 个点的强度:
滑动窗口`W[0]`用![](img/da8626a4-00d9-4c10-8f2c-bc2209a48071.png)表示为数组。 在这里,点 0 到`P-1`代表围绕中心像素`c``P`个点的强度:
![](img/3c396842-2d8a-4e8d-a972-a44ad6f954ae.png)
确定半径 R 和相邻点 P 之间的关系,以使附近的每个像元恰好具有一个像素。 如上图中的前三个圆圈所示,周长中的每个像元恰好具有一个像素,而最后一个像元在周长中填充了多个像素。 从前三个圆圈,我们可以表示,为了使每个单元格都有一个像素,点数 P 可以表示为`(8R + 16) / 3`。 下图显示了线性关系和离群值,离群值由左起第四个圆圈显示,在相邻单元格中有重叠点:
确定半径`R`和相邻点`P`之间的关系,以使附近的每个像元恰好具有一个像素。 如上图中的前三个圆圈所示,周长中的每个像元恰好具有一个像素,而最后一个像元在周长中填充了多个像素。 从前三个圆圈,我们可以表示,为了使每个单元格都有一个像素,点数`P`可以表示为`(8R + 16) / 3`。 下图显示了线性关系和离群值,离群值由左起第四个圆圈显示,在相邻单元格中有重叠点:
![](img/bbf866a8-6f29-4f2a-8481-b11009d49f3b.png)
......@@ -71,7 +71,7 @@ LBP 阵列`W[3]`以直方图形式表示如下:
`W4 = histogram(W3, bins=P, range=W3(min) to W3(max))`
对训练后的图像和测试图像重复上一节中的“步骤 1”至`5`,以创建图像(`W_train, W_test`)的 LBP 直方图,每个都包含 P 个箱子,然后使用直方图比较方法对其进行比较。
对训练后的图像和测试图像重复上一节中的“步骤 1”至 5,以创建图像(`W_train, W_test`)的 LBP 直方图,每个都包含`P`个箱子,然后使用直方图比较方法对其进行比较。
# 直方图比较方法
......@@ -139,7 +139,7 @@ intersection = np.true_divide(np.sum(minima),np.sum(train_hist))
与传统的神经网络方法相比,LBP 在计算上更便宜。 LBP 的计算成本由 Li Li,Paul Fieguth,Wang Xiaogang Wang,Matti Pietikäinen 和 Dewen Hu 在他们的论文《使用新的稳健性基准评估 LBP 和深纹理描述符》中提出。 [论文的详细信息可以在这里找到](https://www.ee.cuhk.edu.hk/~xgwang/papers/liuFWPHeccv16.pdf)
作者确定了在 2.9 GHz Intel Quad-Core CPU 和 16 GB RAM 上对 480 张图像进行特征提取所花费的平均时间,这些图像的大小为 128 x 128。 该时间不包括训练时间。 研究发现,与被认为中等的 AlexNet 和 VGG 相比,LBP 特征提取非常快。
作者确定了在 2.9 GHz Intel Quad-Core CPU 和 16 GB RAM 上对 480 张图像进行特征提取所花费的平均时间,这些图像的大小为`128 x 128`。 该时间不包括训练时间。 研究发现,与被认为中等的 AlexNet 和 VGG 相比,LBP 特征提取非常快。
# 将 LBP 应用于纹理识别
......@@ -202,20 +202,20 @@ LBP 直方图显示了类似的趋势–这是合理的,因为 LBP 是一种
比较顶部直方图和底部直方图,以可视化直方图如何比较测试图像和训练图像。 可以在[这个页面](https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter02/Chapter2_LBPmatching_texture.ipynb)中找到详细的 Python 代码。
# 使色与基础色匹配-LBP 及其局限性
# 使面部颜色与基础色匹配-LBP 及其局限性
由于我们在纹理识别方面使用 LBP 取得了相对良好的成功,因此让我们尝试另一个示例来了解 LBP 的局限性。 在此示例中,从浅色到深色(测试)的七种面部颜色将与 10 种基础色(训练)相匹配,这些基础色是`50 x 50`的图像。
与纹理识别示例类似,将应用“生成 LBP 模式”部分中的“步骤 1”至`5`,然后将每个面部彩色图像 LBP 直方图进行比较 与所有基础彩色图像 LBP 直方图一起找到最佳匹配。 尽管已使用不同的直方图比较方法,但对于此分析,将使用卡方检验作为确定匹配的主要方法。 下图显示了最终的摘要输出:
与纹理识别示例类似,将应用“生成 LBP 模式”部分中的“步骤 1”至 5,然后将每个面部彩色图像 LBP 直方图进行比较 与所有基础彩色图像 LBP 直方图一起找到最佳匹配。 尽管已使用不同的直方图比较方法,但对于此分析,将使用卡方检验作为确定匹配的主要方法。 下图显示了最终的摘要输出:
![](img/49a7ecd9-20d7-4442-8981-1ffc99ec56af.png)
如我们所见,LBP 的效果不佳,所有脸部颜色都导致底色为 4 或 8。 P12 和另一个 R5.5,P20)已绘制。 这是由两个因素引起的:
如我们所见,LBP 的效果不佳,所有脸部颜色都导致底色为 4 或 8。 为了理解这种情况,已绘制了 RGB,灰度和 LBP 图像的两个级别(一个带有`R2.5, P12`,另一个带有`R5.5, P20`。 这是由两个因素引起的:
* 面部颜色从 RGB 到灰度的转换会导致图像中不必要的亮度,这在比较过程中会产生误导。
* LBP 转换采用这些模式并生成无法正确解释的任意灰色阴影。
下图显示了两个图像-色 1 和 7-分别代表肤色和深色皮肤的颜色,以及 LBP 不同步骤的结果。 每个图像都会转换为灰度,这表明两个图像的中间都有一个亮点,而原始彩色图像无法看到该亮点。 然后,将两个 LBP 操作应用于图像:一个半径为 2.5,另一个半径为 5.5。 在这里,我们可以看到在应用 LBP 之后有很多相似之处,这是原始彩色图像所没有的。 让我们看一下下面的图片:
下图显示了两个图像-面部颜色 1 和 7-分别代表肤色和深色皮肤的颜色,以及 LBP 不同步骤的结果。 每个图像都会转换为灰度,这表明两个图像的中间都有一个亮点,而原始彩色图像无法看到该亮点。 然后,将两个 LBP 操作应用于图像:一个半径为 2.5,另一个半径为 5.5。 在这里,我们可以看到在应用 LBP 之后有很多相似之处,这是原始彩色图像所没有的。 让我们看一下下面的图片:
![](img/bc423047-2415-499b-af4d-f2def7195590.png)
......
......@@ -58,7 +58,7 @@ Haar 级联分类器算法基于这样的思想,即人脸的图像在脸部的
![](img/989047e5-28ae-410f-b867-1fa75a1718fc.png)
右侧的积分图像就是左侧像素值的总和-所以 113 = 62 + 51,依此类推。 黑色阴影区域像素值表示黑色 Haar 矩形,如前所述。 为了计算阴影区域的强度值,我们取整数强度值 1,063,然后从中减去 268。
右侧的积分图像就是左侧像素值的总和-所以`113 = 62 + 51`,依此类推。 黑色阴影区域像素值表示黑色 Haar 矩形,如前所述。 为了计算阴影区域的强度值,我们取整数强度值 1,063,然后从中减去 268。
# 进行 AdaBoost 训练
......@@ -107,13 +107,13 @@ Haar 级联分类器算法基于这样的思想,即人脸的图像在脸部的
![](img/e1e7549c-de36-4ac0-9b86-fb8ae827e652.png)
可在[中找到用于摄像头视频中的面部和眼睛检测的 OpenCV Python 代码 https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter03/Chapter3_opencv_face% 26eyedetection_video.ipynb](https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter03/Chapter3_opencv_face%26eyedetection_video.ipynb) 。 请注意,为了使代码起作用,您需要在文件夹中指定 Haar 级联检测器所在的路径。
可在[这个页面](https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter03/Chapter3_opencv_face%26eyedetection_video.ipynb)中找到用于摄像头视频中的面部和眼睛检测的 OpenCV Python 代码。 请注意,为了使代码起作用,您需要在文件夹中指定 Haar 级联检测器所在的路径。
到目前为止,我们已经了解了 Haar 级联分类器,以及如何使用内置的 OpenCV 代码将 Haar 级联分类器应用于面部和眼睛检测。 前述概念基于使用积分图像检测类似 Haar 的特征。 该方法非常适合面部,眼睛,嘴巴和鼻子的检测。 但是,可以将不同的面部表情和皮肤纹理用于情感(快乐与悲伤)或年龄确定等。 Viola-Jones 方法不适用于处理这些不同的面部表情,因此我们需要使用 Viola-Jones 方法进行面部检测,然后应用神经网络确定面部边界框内的面部关键点。 在下一节中,我们将详细学习此方法。
# 使用深度神经网络预测面部关键点
在本节中,我们将讨论面部关键点检测的端到端管道。 面部关键点检测对于计算机视觉来说是一个挑战,因为它要求系统检测面部并获取有意义的关键点数据,将这些数据绘制在面部上,并开发出神经网络来预测面部关键点。 与对象检测或图像分类相比,这是一个难题,因为它首先需要在边界框内进行面部检测,然后再进行关键点检测。 正常的对象检测仅涉及检测代表对象周围矩形边界框的四个角的四个点,但是关键点检测需要在不同方向上的多个点(超过 10 个)。 可以在[这个页面](https://www.kaggle.com/c/facial-keypoints-detection)上找到大量的关键点检测数据及其使用教程。 Kaggle 关键点检测挑战涉及一个 CSV 文件,该文件包含指向 7,049 个图像(96 x 96)的链接,每个图像包含 15 个关键点。
在本节中,我们将讨论面部关键点检测的端到端管道。 面部关键点检测对于计算机视觉来说是一个挑战,因为它要求系统检测面部并获取有意义的关键点数据,将这些数据绘制在面部上,并开发出神经网络来预测面部关键点。 与对象检测或图像分类相比,这是一个难题,因为它首先需要在边界框内进行面部检测,然后再进行关键点检测。 正常的对象检测仅涉及检测代表对象周围矩形边界框的四个角的四个点,但是关键点检测需要在不同方向上的多个点(超过 10 个)。 可以在[这个页面](https://www.kaggle.com/c/facial-keypoints-detection)上找到大量的关键点检测数据及其使用教程。 Kaggle 关键点检测挑战涉及一个 CSV 文件,该文件包含指向 7,049 个图像(`96 x 96`)的链接,每个图像包含 15 个关键点。
在本部分中,我们将不使用 Kaggle 数据,但将向您展示如何准备自己的数据以进行关键点检测。 有关该模型的详细信息,请参见[这里](https://github.com/PacktPublishing/Mastering-Computer-Vision-with-TensorFlow-2.0/blob/master/Chapter03/Chapter3_face%20keypoint_detection.ipynb)
......@@ -164,7 +164,7 @@ faceresize = cv2.resize(detected_face, (img_size,img_size))
# 处理关键点数据
VGG 注释器工具会生成一个输出 CSV 文件,该文件需要进行两次预处理才能为每个图像的 16 个关键点分别生成`x``y`坐标。 对于大数据处理来说,这是一个非常重要的概念,您可以将其用于其他计算机视觉任务,主要有以下三个原因:
VGG 注释器工具会生成一个输出 CSV 文件,该文件需要进行两次预处理才能为每个图像的 16 个关键点分别生成`(x, y)`坐标。 对于大数据处理来说,这是一个非常重要的概念,您可以将其用于其他计算机视觉任务,主要有以下三个原因:
* 我们的 Python 代码不会直接在目录中搜索大量图像文件,而是会在输入 CSV 中搜索数据路径。
* 对于每个 CSV 文件,有 16 个相应的关键点需要处理。
......@@ -205,7 +205,7 @@ coltrn = train_data['image']
print (coltrn.shape[0])
```
3. 接下来,我们初始化两个图像数组`imgs``Y_train`。 我们读取`train_data`数组以向 image 列添加路径,并在`for`循环中读取`coltrn.shape[0]`定义的 50 个图像文件中的每个图像文件,并将其附加到图像数组中。 使用`OpenCV BGR2GRAY`命令将读取的每个图像转换为灰度。 在同一`for`循环中,我们还使用`training.iloc[i,:]`命令读取 32 列中的每一列,并将其附加到`Y_train`的数组中:
3. 接下来,我们初始化两个图像数组`imgs``Y_train`。 我们读取`train_data`数组以向`image`列添加路径,并在`for`循环中读取`coltrn.shape[0]`定义的 50 个图像文件中的每个图像文件,并将其附加到图像数组中。 使用`OpenCV BGR2GRAY`命令将读取的每个图像转换为灰度。 在同一`for`循环中,我们还使用`training.iloc[i,:]`命令读取 32 列中的每一列,并将其附加到`Y_train`的数组中:
```py
imgs = []
......@@ -274,7 +274,7 @@ model.add(Dense(500, activation='relu'))
model.add(Dense(32))
```
该代码拍摄一张图像,并应用 32 个大小为(3,3)的卷积过滤器,然后激活和最大池化层。 它重复相同的过程多次,并增加过滤器的数量,然后是平坦且致密的层。 最终的密集层包含 32 个元素,分别代表我们要预测的关键点的`x``y`值。
该代码拍摄一张图像,并应用 32 个大小为`(3, 3)`的卷积过滤器,然后激活和最大池化层。 它重复相同的过程多次,并增加过滤器的数量,然后是平坦且致密的层。 最终的密集层包含 32 个元素,分别代表我们要预测的关键点的`x``y`值。
# 训练模型以进行关键点预测
......@@ -345,7 +345,7 @@ plt.show()
1. 导入功能-`Sequential``Conv2D``MaxPooling2D``AvgPooling2D``Dense``Activation``Dropout``Flatten`
2. 导入`ImageDataGenerator`-通过实时增强(定向)生成一批张量图像。
3. 确定分类的批次大小和时期。
4. 数据集-训练,测试和调整大小(48,48)
4. 数据集-训练,测试和调整大小`(48, 48)`
5. 建立 CNN 架构(如下图所示)。
6. 使用`fit-generator()`功能训练开发的模型。
7. 评估模型。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册