硬盘作为我们电脑硬件中必不可少的一员,你了解它吗?它的工作原理是什么? 哪些会影响它的性能?如果感兴趣就来随我一探究竟吧?
固态硬盘越来越常见,且入门门槛很低,各种山寨小品牌的SSD大量上市,也开始到了维修的时候了。SSD故障比较多的就是掉固件,不认盘,掉速度等;一般不能量产的话也就只能换主控了,毕竟闪存可以利用起来吧。
Iris数据集的平行坐标展示
这一仅有装上了才可以测出去。品质差的仿货装上就无法开机或是立即蓝了的也很普遍。
(1)摄像头对着正在播放我的人脸视频的手机屏幕所拍下的伪造图像。
解释什么是“误报”(false positive)和“漏报”(false negative)。区分这两者的重要性是什么?分别对以下场景举例:(1)误报比漏报更重要 (2)漏报比误报更重要(3)两者同样重要。
我们还要确定采用何种实验形式,可以是参与者组内、参与者组间或者混合方式。例如:有两个版本的网页,一个在左边有购买按钮(点击购买)另一个网页这个按钮在右边。
# pass the blob through the network and obtain the detections and
Epoch 48/50
在本教程的第一部分,我们将对活体检测进行讨论,包括「活体检测是什么?」以及「为什么我们需要活体检测来改进人脸识别系统?」
1. 构建图像数据集
2. 实现一个能够进行活体检测的卷积神经网络(我们称之为「LivenessNet」)
3. 训练活体检测网络
4. 创建一个能够使用我们训练好的活体检测模型并将其应用于实时视频的 Python+OpenCV 的脚本
在 Chakraborty 和 Das 于 2014 年发表的论文「An Overview of Face liveness Detection」(论文阅读地址:
https://arxiv.org/pdf/1405.2227.pdf)中,对活体检测算法进行了全面的回顾。1. 使用我的 iPhone,把它调成人像 / 自拍模式。
2. 录制一段大约 25 秒的我自己在办公室内走来走去的视频。
3. 将我的 iPhone 朝向我的桌面重放这个 25 秒的视频,我从桌面的角度录制了这段重放的视频;
4. 这会产生两个示例视频。一个被用作「真实」人脸,另一个被用作「伪造/欺骗性」人脸。
5. 最终,我将人脸检测技术同时应用在了这两组视频上,以提取两类人脸各自的 ROI。
现在,我们将仔细回顾三个 Python 脚本。在本文的最后,你可以在自己的数据和输入视频上运行这些脚本。按照在本教程中出现的顺序,这三个脚本依次是:
1. 「gather_examples.py」:该脚本从输入的视频文件中抓取人脸的 ROI,并帮助我们创建一个深度学习人脸活体检测数据集。
2.「train_liveness.py」: 如文件名所示,该脚本将训练我们的 LivenessNet 分类器。 我们将使用 Keras 和 TensorFlow 来训练模型。训练的过程会产生以下几个文件:
3.「liveness_demo.py」:我们的演示脚本将启动你的网络摄像头拍下视频帧,来进行实时人脸活体检测。
1. 「dataset/fake/」:包含「fake.mp4」文件中的人脸 ROI 区域。
2. 「dataset/real/」:包含「real.mov」文件中的人脸 ROI 区域。
ap.add_argument("-c", "--confidence", type=float, default=0.5,
ap.add_argument("-s", "--skip", type=int, default=16,
net = cv2.dnn.readNetFromCaffe(protoPath, modelPath)
vs = cv2.VideoCapture(args["input"])
blob = cv2.dnn.blobFromImage(cv2.resize(frame, (300, 300)), 1.0,
(300, 300), (104.0, 177.0, 123.0))
cv2.imwrite(p, face)
cv2.destroyAllWindows
[INFO] saved datasets/fake/1.png to disk
[INFO] saved datasets/fake/2.png to disk
[INFO] saved datasets/fake/3.png to disk
[INFO] saved datasets/fake/4.png to disk
[INFO] saved datasets/fake/5.png to disk
[INFO] saved datasets/fake/145.png to disk
[INFO] saved datasets/fake/146.png to disk
[INFO] saved datasets/fake/147.png to disk
[INFO] saved datasets/fake/148.png to disk
[INFO] saved datasets/fake/149.png to disk
[INFO] saved datasets/real/1.png to disk
[INFO] saved datasets/real/2.png to disk
[INFO] saved datasets/real/3.png to disk
[INFO] saved datasets/real/4.png to disk
[INFO] saved datasets/real/156.png to disk
[INFO] saved datasets/real/157.png to disk
[INFO] saved datasets/real/158.png to disk
[INFO] saved datasets/real/159.png to disk
1. 为了降低在我们的小型数据集上发生过拟合现象的可能性。
2. 为了确保我们的活体检测器能够快速、实时运行(即使在诸如树莓派等计算资源受限的设备上)。
model.add(Conv2D(16, (3, 3), padding="same",
model.add(Conv2D(16, (3, 3), padding="same"))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(32, (3, 3), padding="same"))
model.add(Conv2D(32, (3, 3), padding="same"))
model.add(MaxPooling2D(pool_size=(2, 2)))
第 28-36 行指定了第一个「CONV => RELU => CONV => RELU => POOL」(卷积层=> RELU 激活函数层=>卷积层=>RELU 激活函数层=>池化层)网络层集合,其中也加入了批量归一化层和 dropout 层。
image = cv2.imread(imagePath)
image = cv2.resize(image, (32, 32))
data = np.array(data, dtype="float") / 255.0
test_size=0.25, random_state=42)
aug = ImageDataGenerator(rotation_range=20, zoom_range=0.15,
width_shift_range=0.2, height_shift_range=0.2, shear_range=0.15,
model = LivenessNet.build(width=32, height=32, depth=3,
29/29 [==============================] - 2s 58ms/step - loss: 1.0113 - acc: 0.5862 - val_loss: 0.4749 - val_acc: 0.7436
29/29 [==============================] - 1s 21ms/step - loss: 0.2796 - acc: 0.9094 - val_loss: 0.0299 - val_acc: 1.0000
fake 0.97 1.00 0.99 35
real 1.00 0.98 0.99 43
最后,我们需要做的是将以上内容整合起来:
1. 连接到我们的网络摄像头/视频流
2. 将人脸检测应用到每一帧上
3. 对每一个检测到的人脸应用我们的活体检测模型
ap.add_argument("-c", "--confidence", type=float, default=0.5,
net = cv2.dnn.readNetFromCaffe(protoPath, modelPath)
time.sleep(2.0)
blob = cv2.dnn.blobFromImage(cv2.resize(frame, (300, 300)), 1.0,
(300, 300), (104.0, 177.0, 123.0))
for i in range(0, detections.shape[2]):
face = cv2.resize(face, (32, 32))
face = face.astype("float") / 255.0
cv2.putText(frame, label, (startX, startY - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
cv2.rectangle(frame, (startX, startY), (endX, endY),
cv2.imshow("Frame", frame)
key = cv2.waitKey(1) & 0xFF
cv2.destroyAllWindows
我们的活体检测器只在屏幕上具有欺骗性攻击的人脸进行训练,而没有对打印出来的图像或照片进行训练。因此,我的第三个建议是,除了简单的屏幕录制回放之外,还要收集其它种类的图像/人脸资源。
最后,我想说:想实现活体检测并没有什么捷径。
首先,我们需要收集自己的「真实 vs 伪造」人脸数据集。为了完成该任务,我们要做到:
1. 用智能手机录制一段我们自己的视频(即「真实」人脸)。
2. 将我们的智能手机屏幕展示给笔记本电脑/桌面电脑的摄像头,重放在上一步中录制的同一个视频,然后使用你的网络摄像头录下视频回放(即「伪造」人脸)。
3. 将人脸检测技术同时应用到上面两个视频集合中,以构建最终的活体检测数据集。
1. 在我们的小型数据集上减少过拟合现象。
2. 模型能够实时运行(包括在树莓派等硬件上)。