一、人脸图像特征提取的方法

1.HOG 特征

方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图 像处理中用来进行物体检测的特征描述子。它通过计算和统计图像局部区域的梯度方向 直方图来构成特征。Hog 特征结合 SVM 分类器已经被广泛应用于图像识别中,尤其在 行人检测中获得了极大的成功。需要提醒的是,HOG+SVM 进行行人检测的方法是法国 研究人员 Dalal 在 2005 的 CVPR 上提出的,而如今虽然有很多行人检测算法不断提出, 但基本都是以 HOG+SVM 的思路为主。
(1)主要思想: 在一副图像中,局部目标的表象和形状(appearance and shape)能够被梯度或边缘的 方向密度分布很好地描述。(本质:梯度的统计信息,而梯度主要存在于边缘的地方)。
(2)具体的实现方法是: 首先将图像分成小的连通区域,我们把它叫细胞单元。然后采集细胞单元中各像素点的 梯度的或边缘的方向直方图。最后把这些直方图组合起来就可以构成特征描述器。
(3)提高性能: 把这些局部直方图在图像的更大的范围内(我们把它叫区间或 block)进行对比度归一 化(contrast-normalized),所采用的方法是:先计算各直方图在这个区间(block)中 的密度,然后根据这个密度对区间中的各个细胞单元做归一化。通过这个归一化后,能 对光照变化和阴影获得更好的效果。
(4)优点: 与其他的特征描述方法相比,HOG 有很多优点。首先,由于 HOG 是在图像的局部方格 单元上操作,所以它对图像几何的和光学的形变都能保持很好的不变性,这两种形变只 会出现在更大的空间领域上。其次,在粗的空域抽样、精细的方向抽样以及较强的局部 光学归一化等条件下,只要行人大体上能够保持直立的姿势,可以容许行人有一些细微 的肢体动作,这些细微的动作可以被忽略而不影响检测效果。因此 HOG 特征是特别适 合于做图像中的人体检测的。
HOG 特征提取方法就是将一个 image(你要检测的目标或者扫描窗口):
1)灰度化(将图像看做一个 x,y,z(灰度)的三维图像);
2)采用 Gamma 校正法对输入图像进行颜色空间的标准化(归一化);目的是调节图 像的对比度,降低图像局部的阴影和光照变化所造成的影响,同时可以抑制噪音的干扰;
3)计算图像每个像素的梯度(包括大小和方向);主要是为了捕获轮廓信息,同时进 一步弱化光照的干扰。
4)将图像划分成小 cells(例如 66 像素/cell);
5)统计每个 cell 的梯度直方图(不同梯度的个数),即可形成每个 cell 的 descriptor;
6)将每几个 cell 组成一个 block(例如 3
3 个 cell/block),一个 block 内所有 cell 的 特征 descriptor 串联起来便得到该 block 的 HOG 特征 descriptor。 7)将图像 image 内的所有 block 的 HOG 特征 descriptor 串联起来就可以得到该 image (你要检测的目标)的 HOG 特征 descriptor 了。这个就是最终的可供分类使用的特征 向量了。

2.Dlib

Dlib 是一个包含机器学习算法的 C++开源工具包。Dlib 可以帮助您创建很多复杂的机器 学习方面的软件来帮助解决实际问题。目前 Dlib 已经被广泛的用在行业和学术领域,包 括机器人,嵌入式设备,移动电话和大型高性能计算环境。 Dlib 的主要特点:

  1. 文档齐全 不像很多其他的开源库一样,Dlib 为每一个类和函数提供了完整的文档说明。同时,还提供了 debug 模式;打开 debug 模式后,用户可以调试代码,查看变量和对象的值,快速定位错误点。 另外,Dlib 还提供了大量的实例。
  2. 高质量的可移植代码 Dlib 不依赖第三方库,无须安装和配置,这部分可参照(官网左侧树形目录的 how to compile 的介绍)。Dlib 可用在 window、Mac OS、Linux 系统上。
  3. 提供大量的机器学习 / 图像处理算法
  4. 深度学习
    基于 SVM 的分类和递归算法 针对大规模分类和递归的降维方法 相关向量机(relevance vector machine);是与支持向量机相同的函数形式稀疏概率模型,对未知函数进行 预测或分类。其训练是在贝叶斯框架下进行的,与 SVM 相比,不需要估计正则化参数,其核函数也不需 要满足 Mercer 条件,需要更少的相关向量,训练时间长,测试时间短。
    聚类: linear or kernel k-means, Chinese Whispers, and Newman clustering. Radial Basis Function Networks 多层感知机

3.卷积神经网络

卷积神经网络(Convolutional Neural Networks)是一种深度学习模型或类似于人工神 经网络的多层感知器,常用来分析视觉图像。卷积神经网络的创始人是着名的计算机科 学家 Yann LeCun,目前在 Facebook 工作,他是第一个通过卷积神经网络在 MNIST 数 据集上解决手写数字问题的人。 卷积神经网络 CNN 主要用来识别位移、缩放及其他形式扭曲不变性的二维图形。由于 CNN 的特征检测层通过训练数据进行学习,所以在使用 CNN 时,避免了显式的特征抽 取,而隐式地从训练数据中进行学习;再者由于同一特征映射面上的神经元权值相同, 所以网络可以并行学习,这也是卷积网络相对于神经元彼此相连网络的一大优势。卷积 神经网络以其局部权值共享的特殊结构在语音识别和图像处理方面有着独特的优越性, 其布局更接近于实际的生物神经网络,权值共享降低了网络的复杂性,特别是多维输入 向量的图像可以直接输入网络这一特点避免了特征提取和分类过程中数据重建的复杂 度。卷积神经网络中,第一步一般用卷积核去提取特征,这些初始化的卷积核会在反向传播 的过程中,在迭代中被一次又一次的更新,无限地逼近我们的真实解。其实本质没有对 图像矩阵求解,而是初始化了一个符合某种分布的特征向量集,然后在反向传播中无限 更新这个特征集,让它能无限逼近数学中的那个概念上的特征向量,以致于我们能用特 征向量的数学方法对矩阵进行特征提取。

Dlib笑脸检测

利用dilb提取嘴部特征并写入data.csv

筛选数据

# 筛选数据将无法提取特征点的图片提取出来
def select():for i in imgs_smiles:img_rd = path_images_with_smiles + i# read img fileimg = cv2.imread(img_rd)# 取灰度img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)faces = detector(img_gray, 0)try:np.matrix([[p.x, p.y] for p in predictor(img, faces[0]).parts()])except:shutil.move(img_rd,select_smiles)for i in imgs_no_smiles:img_rd = path_images_no_smiles + i# read img fileimg = cv2.imread(img_rd)# 取灰度img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)faces = detector(img_gray, 0)try:np.matrix([[p.x, p.y] for p in predictor(img, faces[0]).parts()])except:shutil.move(img_rd,select_no_smiles)

提取特征点

# 输入图像文件所在路径,返回一个41维数组(包含提取到的40维特征和1维输出标记)
def get_features(img_rd):# 输入:  img_rd:      图像文件# 输出:  positions_lip_arr:  feature point 49 to feature point 68, 20 feature points / 40D in all# read img fileimg = cv2.imread(img_rd)# 取灰度img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 计算68点坐标positions_68_arr = []faces = detector(img_gray, 0)landmarks = np.matrix([[p.x, p.y] for p in predictor(img, faces[0]).parts()])# except:for point in enumerate(landmarks):# 68点的坐标pos = (point[0, 0], point[0, 1])positions_68_arr.append(pos)positions_lip_arr = []# 将点 49-68 写入 CSV# 即 positions_68_arr[48]-positions_68_arr[67]for i in range(48, 68):positions_lip_arr.append(positions_68_arr[i][0])positions_lip_arr.append(positions_68_arr[i][1])return positions_lip_arr

完整代码

import dlib         # 人脸处理的库 Dlib
import numpy as np  # 数据处理的库 numpy
from cv2 import cv2          # 图像处理的库 OpenCv
import os           # 读取文件
import csv          # CSV 操作
import shutildetector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('D:\\Desktop\\Face_recognition\\shape_predictor_68_face_landmarks.dat')# 输入图像文件所在路径,返回一个41维数组(包含提取到的40维特征和1维输出标记)
def get_features(img_rd):# 输入:  img_rd:      图像文件# 输出:  positions_lip_arr:  feature point 49 to feature point 68, 20 feature points / 40D in all# read img fileimg = cv2.imread(img_rd)# 取灰度img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 计算68点坐标positions_68_arr = []faces = detector(img_gray, 0)landmarks = np.matrix([[p.x, p.y] for p in predictor(img, faces[0]).parts()])# except:for idx, point in enumerate(landmarks):# 68点的坐标pos = (point[0, 0], point[0, 1])positions_68_arr.append(pos)positions_lip_arr = []# 将点 49-68 写入 CSV# 即 positions_68_arr[48]-positions_68_arr[67]for i in range(48, 68):positions_lip_arr.append(positions_68_arr[i][0])positions_lip_arr.append(positions_68_arr[i][1])return positions_lip_arr# 读取图像所在的路径
path_images_with_smiles = "D:\\Desktop\\Face_recognition\\data\\data_imgs\\database\\smiles\\"
path_images_no_smiles = "D:\\Desktop\\Face_recognition\\data\\data_imgs\\database\\no_smiles\\"# 获取路径下的图像文件
imgs_smiles = os.listdir(path_images_with_smiles)
imgs_no_smiles = os.listdir(path_images_no_smiles)
select_smiles = "D:\\Desktop\\Face_recognition\\data\\data_imgs\\database\\select\\1\\"
select_no_smiles = "D:\\Desktop\\Face_recognition\\data\\data_imgs\\database\\select\\2\\"
# 存储提取特征数据的 CSV 的路径
path_csv = "data\\data_csvs\\"# 筛选数据将无法提取特征点的图片提取出来
def select():for i in imgs_smiles:img_rd = path_images_with_smiles + i# read img fileimg = cv2.imread(img_rd)# 取灰度img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)faces = detector(img_gray, 0)try:np.matrix([[p.x, p.y] for p in predictor(img, faces[0]).parts()])except:shutil.move(img_rd,select_smiles)for i in imgs_no_smiles:img_rd = path_images_no_smiles + i# read img fileimg = cv2.imread(img_rd)# 取灰度img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)faces = detector(img_gray, 0)try:np.matrix([[p.x, p.y] for p in predictor(img, faces[0]).parts()])except:shutil.move(img_rd,select_no_smiles)# write the features into CSV
def write_into_CSV():with open(path_csv+"data.csv", "w", newline="") as csvfile:writer = csv.writer(csvfile)# 处理带笑脸的图像print("######## with smiles #########")for i in imgs_smiles:print(path_images_with_smiles + i)features_csv_smiles = get_features(path_images_with_smiles+ i)features_csv_smiles.append(1)print("positions of lips:", features_csv_smiles, "\n")# 写入CSVwriter.writerow(features_csv_smiles)# 处理不带笑脸的图像print("######## no smiles #########")for i in imgs_no_smiles:print(path_images_no_smiles + i)features_csv_no_smiles = get_features(path_images_no_smiles + i)features_csv_no_smiles.append(0)print("positions of lips:", features_csv_no_smiles, "\n")# 写入CSVwriter.writerow(features_csv_no_smiles)# 数据筛选
# select()# 写入CSV
# write_into_CSV()

利用sklearn提取训练集X_train和测试集X_test

完整代码

# pandas 读取 CSV
import pandas as pd# 分割数据
from sklearn.model_selection import train_test_split# 用于数据预加工标准化
from sklearn.preprocessing import StandardScalerfrom sklearn.linear_model import LogisticRegression     # 线性模型中的 Logistic 回归模型
from sklearn.neural_network import MLPClassifier        # 神经网络模型中的多层网络模型
from sklearn.svm import LinearSVC                       # SVM 模型中的线性 SVC 模型
from sklearn.linear_model import SGDClassifier          # 线性模型中的随机梯度下降模型import joblib# 从 csv 读取数据
def pre_data():# 41 维表头column_names = []for i in range(0, 40):column_names.append("feature_" + str(i + 1))column_names.append("output")# read csvrd_csv = pd.read_csv("data/data_csvs/data.csv", names=column_names)# 输出 csv 文件的维度# print("shape:", rd_csv.shape)X_train, X_test, y_train, y_test = train_test_split(# input 0-40# output 41rd_csv[column_names[0:40]],rd_csv[column_names[40]],# 25% for testing, 75% for trainingtest_size=0.25,random_state=33)return X_train, X_test, y_train, y_testpath_models = "data/data_models/"# LR, logistic regression, 逻辑斯特回归分类(线性模型)
def model_LR():# get dataX_train_LR, X_test_LR, y_train_LR, y_test_LR = pre_data()# 数据预加工# 标准化数据,保证每个维度的特征数据方差为1,均值为0。使得预测结果不会被某些维度过大的特征值而主导ss_LR = StandardScaler()X_train_LR = ss_LR.fit_transform(X_train_LR)X_test_LR = ss_LR.transform(X_test_LR)# 初始化 LogisticRegressionLR = LogisticRegression()# 调用 LogisticRegression 中的 fit() 来训练模型参数LR.fit(X_train_LR, y_train_LR)# save LR modeljoblib.dump(LR, path_models + "model_LR.m")# 评分函数score_LR = LR.score(X_test_LR, y_test_LR)print("The accurary of LR:", score_LR)# print(type(ss_LR))return (ss_LR)# model_LR()# MLPC, Multi-layer Perceptron Classifier, 多层感知机分类(神经网络)
def model_MLPC():# get dataX_train_MLPC, X_test_MLPC, y_train_MLPC, y_test_MLPC = pre_data()# 数据预加工ss_MLPC = StandardScaler()X_train_MLPC = ss_MLPC.fit_transform(X_train_MLPC)X_test_MLPC = ss_MLPC.transform(X_test_MLPC)# 初始化 MLPCMLPC = MLPClassifier(hidden_layer_sizes=(13, 13, 13), max_iter=500)# 调用 MLPC 中的 fit() 来训练模型参数MLPC.fit(X_train_MLPC, y_train_MLPC)# save MLPC modeljoblib.dump(MLPC, path_models + "model_MLPC.m")# 评分函数score_MLPC = MLPC.score(X_test_MLPC, y_test_MLPC)print("The accurary of MLPC:", score_MLPC)return (ss_MLPC)# model_MLPC()# Linear SVC, Linear Supported Vector Classifier, 线性支持向量分类(SVM支持向量机)
def model_LSVC():# get dataX_train_LSVC, X_test_LSVC, y_train_LSVC, y_test_LSVC = pre_data()# 数据预加工ss_LSVC = StandardScaler()X_train_LSVC = ss_LSVC.fit_transform(X_train_LSVC)X_test_LSVC = ss_LSVC.transform(X_test_LSVC)# 初始化 LSVCLSVC = LinearSVC()# 调用 LSVC 中的 fit() 来训练模型参数LSVC.fit(X_train_LSVC, y_train_LSVC)# save LSVC modeljoblib.dump(LSVC, path_models + "model_LSVC.m")# 评分函数score_LSVC = LSVC.score(X_test_LSVC, y_test_LSVC)print("The accurary of LSVC:", score_LSVC)return ss_LSVC# model_LSVC()# SGDC, Stochastic Gradient Decent Classifier, 随机梯度下降法求解(线性模型)
def model_SGDC():# get dataX_train_SGDC, X_test_SGDC, y_train_SGDC, y_test_SGDC = pre_data()# 数据预加工ss_SGDC = StandardScaler()X_train_SGDC = ss_SGDC.fit_transform(X_train_SGDC)X_test_SGDC = ss_SGDC.transform(X_test_SGDC)# 初始化 SGDCSGDC = SGDClassifier(max_iter=5)# 调用 SGDC 中的 fit() 来训练模型参数SGDC.fit(X_train_SGDC, y_train_SGDC)# save SGDC modeljoblib.dump(SGDC, path_models + "model_SGDC.m")# 评分函数score_SGDC = SGDC.score(X_test_SGDC, y_test_SGDC)print("The accurary of SGDC:", score_SGDC)return ss_SGDC# model_SGDC()

模型测试

完整代码

# use the saved model
from sklearn.externals import joblibfrom get_features import get_features
import ML_ways_sklearnfrom cv2 import cv2# path of test img
path_test_img = "data/data_imgs/test_imgs/sunxiaoc.jpg"# 提取单张40维度特征
positions_lip_test = get_features(path_test_img)# path of models
path_models = "data/data_models/"print("The result of"+path_test_img+":")
print('\n')# #########  LR  ###########
LR = joblib.load(path_models+"model_LR.m")
ss_LR = ML_ways_sklearn.model_LR()
X_test_LR = ss_LR.transform([positions_lip_test])
y_predict_LR = str(LR.predict(X_test_LR)[0]).replace('0', "no smile").replace('1', "with smile")
print("LR:", y_predict_LR)# #########  LSVC  ###########
LSVC = joblib.load(path_models+"model_LSVC.m")
ss_LSVC = ML_ways_sklearn.model_LSVC()
X_test_LSVC = ss_LSVC.transform([positions_lip_test])
y_predict_LSVC = str(LSVC.predict(X_test_LSVC)[0]).replace('0', "no smile").replace('1', "with smile")
print("LSVC:", y_predict_LSVC)# #########  MLPC  ###########
MLPC = joblib.load(path_models+"model_MLPC.m")
ss_MLPC = ML_ways_sklearn.model_MLPC()
X_test_MLPC = ss_MLPC.transform([positions_lip_test])
y_predict_MLPC = str(MLPC.predict(X_test_MLPC)[0]).replace('0', "no smile").replace('1', "with smile")
print("MLPC:", y_predict_MLPC)# #########  SGDC  ###########
SGDC = joblib.load(path_models+"model_SGDC.m")
ss_SGDC = ML_ways_sklearn.model_SGDC()
X_test_SGDC = ss_SGDC.transform([positions_lip_test])
y_predict_SGDC = str(SGDC.predict(X_test_SGDC)[0]).replace('0', "no smile").replace('1', "with smile")
print("SGDC:", y_predict_SGDC)img_test = cv2.imread(path_test_img)img_height = int(img_test.shape[0])
img_width = int(img_test.shape[1])# show the results on the image
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img_test, "LR:    "+y_predict_LR,   (int(img_height/10), int(img_width/10)), font, 0.5, (84, 255, 159), 1, cv2.LINE_AA)
cv2.putText(img_test, "LSVC:  "+y_predict_LSVC, (int(img_height/10), int(img_width/10*2)), font, 0.5, (84, 255, 159), 1, cv2.LINE_AA)
cv2.putText(img_test, "MLPC:  "+y_predict_MLPC, (int(img_height/10), int(img_width/10)*3), font, 0.5, (84, 255, 159), 1, cv2.LINE_AA)
cv2.putText(img_test, "SGDC:  "+y_predict_SGDC, (int(img_height/10), int(img_width/10)*4), font, 0.5, (84, 255, 159), 1, cv2.LINE_AA)cv2.namedWindow("img", 2)
cv2.imshow("img", img_test)
cv2.waitKey(0)

显示嘴部特征点

完整代码

# 显示嘴部特征点
# Draw the positions of someone's lipimport dlib         # 人脸识别的库 Dlib
from cv2 import cv2          # 图像处理的库 OpenCv
from get_features import get_features   # return the positions of feature pointspath_test_img = "data/data_imgs/test_imgs/test1.jpg"detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')# Get lip's positions of features points
positions_lip = get_features(path_test_img)img_rd = cv2.imread(path_test_img)# Draw on the lip points
for i in range(0, len(positions_lip), 2):print(positions_lip[i], positions_lip[i+1])cv2.circle(img_rd, tuple([positions_lip[i], positions_lip[i+1]]), radius=1, color=(0, 255, 0))cv2.namedWindow("img_read", 2)
cv2.imshow("img_read", img_rd)
cv2.waitKey(0)

视频检测

完整代码

# use the saved model
from sklearn.externals import joblibimport ML_ways_sklearnimport dlib         # 人脸处理的库 Dlib
import numpy as np  # 数据处理的库 numpy
from cv2 import cv2          # 图像处理的库 OpenCvdetector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')# OpenCv 调用摄像头
cap = cv2.VideoCapture(0)# 设置视频参数
cap.set(3, 480)def get_features(img_rd):# 输入:  img_rd:      图像文件# 输出:  positions_lip_arr:  feature point 49 to feature point 68, 20 feature points / 40D in all# 取灰度img_gray = cv2.cvtColor(img_rd, cv2.COLOR_RGB2GRAY)# 计算68点坐标positions_68_arr = []faces = detector(img_gray, 0)landmarks = np.matrix([[p.x, p.y] for p in predictor(img_rd, faces[0]).parts()])for idx, point in enumerate(landmarks):# 68点的坐标pos = (point[0, 0], point[0, 1])positions_68_arr.append(pos)positions_lip_arr = []# 将点 49-68 写入 CSV# 即 positions_68_arr[48]-positions_68_arr[67]for i in range(48, 68):positions_lip_arr.append(positions_68_arr[i][0])positions_lip_arr.append(positions_68_arr[i][1])return positions_lip_arrwhile cap.isOpened():# 480 height * 640 widthflag, img_rd = cap.read()kk = cv2.waitKey(1)img_gray = cv2.cvtColor(img_rd, cv2.COLOR_RGB2GRAY)# 人脸数 facesfaces = detector(img_gray, 0)# 检测到人脸if len(faces) != 0:# 提取单张40维度特征positions_lip_test = get_features(img_rd)# path of modelspath_models = "data/data_models/"# #########  LR  ###########LR = joblib.load(path_models+"model_LR.m")ss_LR = ML_ways_sklearn.model_LR()X_test_LR = ss_LR.transform([positions_lip_test])y_predict_LR = str(LR.predict(X_test_LR)[0]).replace('0', "no smile").replace('1', "with smile")print("LR:", y_predict_LR)# #########  LSVC  ###########LSVC = joblib.load(path_models+"model_LSVC.m")ss_LSVC = ML_ways_sklearn.model_LSVC()X_test_LSVC = ss_LSVC.transform([positions_lip_test])y_predict_LSVC = str(LSVC.predict(X_test_LSVC)[0]).replace('0', "no smile").replace('1', "with smile")print("LSVC:", y_predict_LSVC)# #########  MLPC  ###########MLPC = joblib.load(path_models+"model_MLPC.m")ss_MLPC = ML_ways_sklearn.model_MLPC()X_test_MLPC = ss_MLPC.transform([positions_lip_test])y_predict_MLPC = str(MLPC.predict(X_test_MLPC)[0]).replace('0', "no smile").replace('1', "with smile")print("MLPC:", y_predict_MLPC)# #########  SGDC  ###########SGDC = joblib.load(path_models+"model_SGDC.m")ss_SGDC = ML_ways_sklearn.model_SGDC()X_test_SGDC = ss_SGDC.transform([positions_lip_test])y_predict_SGDC = str(SGDC.predict(X_test_SGDC)[0]).replace('0', "no smile").replace('1', "with smile")print("SGDC:", y_predict_SGDC)print('\n')# 按下 'q' 键退出if kk == ord('q'):break# 窗口显示# cv2.namedWindow("camera", 0) # 如果需要摄像头窗口大小可调cv2.imshow("camera", img_rd)# 释放摄像头
cap.release()# 删除建立的窗口
cv2.destroyAllWindows()


安装TensorFlow(python3.7)

## 创建Anaconda虚拟环境Python3.6

conda create -n `你的命名` python=3.6


进入虚拟环境

python3.7安装TensorFlow

安装Keras

pip install keras

划分数据集

mkdir.py

import tensorflow as tf
import os,shutil
# The path to the directory where the original
# dataset was uncompressed
original_dataset_dir = 'D:\\Desktop\\Face_recognition\\tensorflow\\genki4k '# The directory where we will
# store our smaller dataset
base_dir = 'D:\\Desktop\\Face_recognition\\tensorflow\\smile_data'
os.mkdir(base_dir)# Directories for our training,
# validation and test splits
train_dir = os.path.join(base_dir, 'train')
os.mkdir(train_dir)
validation_dir = os.path.join(base_dir, 'validation')
os.mkdir(validation_dir)
test_dir = os.path.join(base_dir, 'test')
os.mkdir(test_dir)# Directory with our training smile pictures
train_smile_dir = os.path.join(train_dir, 'smile')
os.mkdir(train_smile_dir)# Directory with our training unsmile pictures
train_unsmile_dir = os.path.join(train_dir, 'unsmile')
os.mkdir(train_unsmile_dir)# Directory with our validation smile pictures
validation_smile_dir = os.path.join(validation_dir, 'smile')
os.mkdir(validation_smile_dir)# Directory with our validation unsmile pictures
validation_unsmile_dir = os.path.join(validation_dir, 'unsmile')
os.mkdir(validation_unsmile_dir)# Directory with our validation smile pictures
test_smile_dir = os.path.join(test_dir, 'smile')
os.mkdir(test_smile_dir)# Directory with our validation unsmile pictures
test_unsmile_dir = os.path.join(test_dir, 'unsmile')
os.mkdir(test_unsmile_dir)

运行结果:

将笑脸和非笑脸放入相应的文件夹
查看一下图片数量:
lenpic.py

import keras
import os, shutil
train_smile_dir="D:\\Desktop\\Face_recognition\\tensorflow\\smile_data\\train\\smile\\"
train_umsmile_dir="D:\\Desktop\\Face_recognition\\tensorflow\\smile_data\\train\\unsmile\\"
test_smile_dir="D:\\Desktop\\Face_recognition\\tensorflow\\smile_data\\test\\smile\\"
test_umsmile_dir="D:\\Desktop\\Face_recognition\\tensorflow\\smile_data\\test/unsmile\\"
validation_smile_dir="D:\\Desktop\\Face_recognition\\tensorflow\\smile_data\\validation\\smile\\"
validation_unsmile_dir="D:\\Desktop\\Face_recognition\\tensorflow\\smile_data\\validation\\unsmile\\"
train_dir="D:\\Desktop\\Face_recognition\\tensorflow\\smile_data\\train\\"
test_dir="D:\\Desktop\\Face_recognition\\tensorflow\\smile_data\\test\\"
validation_dir="D:\\Desktop\\Face_recognition\\tensorflow\\smile_data\\validation\\"
print('total training smile images:', len(os.listdir(train_smile_dir)))
print('total training unsmile images:', len(os.listdir(train_umsmile_dir)))
print('total testing smile images:', len(os.listdir(test_smile_dir)))
print('total testing unsmile images:', len(os.listdir(test_umsmile_dir)))
print('total validation smile images:', len(os.listdir(validation_smile_dir)))
print('total validation unsmile images:', len(os.listdir(validation_unsmile_dir)))


创建模型
Cmodle.py

'''
创建模型
'''
from keras import layers
from keras import models
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu',input_shape=(150, 150, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))
print(model.summary())


对图片归一化:
normalize.py

'''
对图片进行归一化处理
'''
from keras import optimizers
from Cmodel import model
from lenpic import train_dir,validation_dir,test_dir
model.compile(loss='binary_crossentropy',optimizer=optimizers.RMSprop(lr=1e-4),metrics=['acc'])from keras.preprocessing.image import ImageDataGenerator
# All images will be rescaled by 1./255
train_datagen = ImageDataGenerator(rescale=1./255)
validation_datagen=ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)train_generator = train_datagen.flow_from_directory(# 目标文件目录train_dir,#所有图片的size必须是150x150target_size=(150, 150),batch_size=20,# Since we use binary_crossentropy loss, we need binary labelsclass_mode='binary')validation_generator = test_datagen.flow_from_directory(validation_dir,target_size=(150, 150),batch_size=20,class_mode='binary')
test_generator = test_datagen.flow_from_directory(test_dir,target_size=(150, 150),batch_size=20,class_mode='binary')
for data_batch, labels_batch in train_generator:print('data batch shape:', data_batch.shape)print('labels batch shape:', labels_batch)break
print(train_generator.class_indices)

模型训练

Tmodle.py

'''
模型训练
'''
from Cmodel import model
from normalize import train_generator,validation_generator
history = model.fit_generator(train_generator,steps_per_epoch=100,epochs=10,validation_data=validation_generator,validation_steps=50)
model.save('model.save('D:\\Desktop\\Face_recognition\\tensorflow\\smileAndUnsmile_1.h5')')'''
画出训练集与验证集的精确度与损失度的图形
'''
import matplotlib.pyplot as plt
acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(len(acc))
plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.legend()
plt.figure()
plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.legend()
plt.show()



数据增强

endata.py

'''
数据增强
'''
from keras.preprocessing.image import ImageDataGenerator
datagen = ImageDataGenerator(rotation_range=40,width_shift_range=0.2,height_shift_range=0.2,shear_range=0.2,zoom_range=0.2,horizontal_flip=True,fill_mode='nearest')
'''
查看数据增强后的图片变化
'''
import matplotlib.pyplot as plt
from lenpic import train_smile_dir
import os
# This is module with image preprocessing utilities
from keras.preprocessing import image
fnames = [os.path.join(train_smile_dir, fname) for fname in os.listdir(train_smile_dir)]
img_path = fnames[8]
img = image.load_img(img_path, target_size=(150, 150))
x = image.img_to_array(img)
x = x.reshape((1,) + x.shape)
i = 0
for batch in datagen.flow(x, batch_size=1):plt.figure(i)imgplot = plt.imshow(image.array_to_img(batch[0]))i += 1if i % 4 == 0:break
plt.show()

创建网络

Cnet.py

'''
创建网络
'''
from keras import models
from keras import layers 
from keras import optimizers
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu',input_shape=(150, 150, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dropout(0.5))
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy',optimizer=optimizers.RMSprop(lr=1e-4),metrics=['acc'])

再次进行训练模型

T2modle.py

'''
再次训练模型
'''
#归一化处理
from keras.preprocessing.image import ImageDataGenerator
from lenpic import train_dir, validation_dir
from Cnet import model
train_datagen = ImageDataGenerator(rescale=1./255,rotation_range=40,width_shift_range=0.2,height_shift_range=0.2,shear_range=0.2,zoom_range=0.2,horizontal_flip=True,)# Note that the validation data should not be augmented!
test_datagen = ImageDataGenerator(rescale=1./255)train_generator = train_datagen.flow_from_directory(# This is the target directorytrain_dir,# All images will be resized to 150x150target_size=(150, 150),batch_size=32,# Since we use binary_crossentropy loss, we need binary labelsclass_mode='binary')validation_generator = test_datagen.flow_from_directory(validation_dir,target_size=(150, 150),batch_size=32,class_mode='binary')history = model.fit_generator(train_generator,steps_per_epoch=100,epochs=100,  # 训练次数validation_data=validation_generator,validation_steps=50)# 保存训练模型
model.save('D:\\Desktop\\Face_recognition\\tensorflow\\smileAndUnsmile_2.h5')

训练50次:

训练100次:

使用模型进行视频实时检测

'''
检测视频或者摄像头中的人脸
'''
from cv2 import cv2
from keras.preprocessing import image
from keras.models import load_model
import numpy as np
import dlib
from PIL import Image
model = load_model('D:\\Desktop\\Face_recognition\\tensorflow\\smileAndUnsmile_2.h5')
detector = dlib.get_frontal_face_detector()
video=cv2.VideoCapture(0)
font = cv2.FONT_HERSHEY_SIMPLEX
def rec(img):gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)dets=detector(gray,1)if dets is not None:for face in dets:left=face.left()top=face.top()right=face.right()bottom=face.bottom()cv2.rectangle(img,(left,top),(right,bottom),(0,255,0),2)img1=cv2.resize(img[top:bottom,left:right],dsize=(150,150))img1=cv2.cvtColor(img1,cv2.COLOR_BGR2RGB)img1 = np.array(img1)/255.img_tensor = img1.reshape(-1,150,150,3)prediction =model.predict(img_tensor)    if prediction[0][0]>0.5:result='unsmile'else:result='smile'cv2.putText(img, result, (left,top), font, 2, (0, 255, 0), 2, cv2.LINE_AA)cv2.imshow('Video', img)
while video.isOpened():res, img_rd = video.read()if not res:breakrec(img_rd)if cv2.waitKey(1) & 0xFF == ord('q'):break
video.release()
cv2.destroyAllWindows()



口罩识别

划分数据集

mkdir.py

# The path to the directory where the original
# dataset was uncompressed# The directory where we will
# store our smaller dataset
base_dir = 'D:\\Desktop\\Face_recognition\\Mask\\mask_data'
os.mkdir(base_dir)# Directories for our training,
# validation and test splits
train_dir = os.path.join(base_dir, 'train')
os.mkdir(train_dir)
validation_dir = os.path.join(base_dir, 'validation')
os.mkdir(validation_dir)
test_dir = os.path.join(base_dir, 'test')
os.mkdir(test_dir)# Directory with our training mask pictures
train_mask_dir = os.path.join(train_dir, 'have_mask')
os.mkdir(train_mask_dir)# Directory with our training no_mask pictures
train_no_mask_dir = os.path.join(train_dir, 'no_mask')
os.mkdir(train_no_mask_dir)# Directory with our validation mask pictures
validation_mask_dir = os.path.join(validation_dir, 'have_mask')
os.mkdir(validation_mask_dir)# Directory with our validation no_mask pictures
validation_no_mask_dir = os.path.join(validation_dir, 'no_mask')
os.mkdir(validation_no_mask_dir)# Directory with our validation mask pictures
test_mask_dir = os.path.join(test_dir, 'have_mask')
os.mkdir(test_mask_dir)# Directory with our validation no_mask pictures
test_no_mask_dir = os.path.join(test_dir, 'no_mask')
os.mkdir(test_no_mask_dir)

添加口罩图片到相应文件夹

下载口罩数据集
下载地址
由于它是多个文件存储的,所以要将图片合并到一个文件夹
move.py

import os
outer_path = 'D:\\Desktop\\Face_recognition\\Mask\\have_mask\\RWMFD_part_1'
folderlist = os.listdir(outer_path)  
print(folderlist)        #列举文件夹
i = 0
for folder in folderlist:     inner_path = os.path.join(outer_path, folder)total_num_folder = len(folderlist)       #文件夹的总数print('total have %d folders' % (total_num_folder))    #打印文件夹的总数filelist = os.listdir(inner_path)        #列举图片for item in filelist:total_num_file = len(filelist)       #单个文件夹内图片的总数if item.endswith('.jpg'):src = os.path.join(os.path.abspath(inner_path), item)           #原图的地址dst = os.path.join(os.path.abspath(inner_path), str('D:\\Desktop\\Face_recognition\\Mask\\have_mask\\RWMFD_part_1\\MASK') + '_' + str(i) + '.jpg')        #新图的地址(这里可以把str(folder) + '_' + str(i) + '.jpg'改成你想改的名称)try:os.rename(src, dst)print('converting %s to %s ...' % (src, dst)) i += 1except:continueprint('total %d to rename & converted %d jpgs' % (total_num_file, i)) 

查看图片数量

lenpic.py

import keras
import os, shutil
train_mask_dir="D:\\Desktop\\Face_recognition\\Mask\\mask_data\\train\\have_mask\\"
train_ummask_dir="D:\\Desktop\\Face_recognition\\Mask\\mask_data\\train\\no_mask\\"
test_mask_dir="D:\\Desktop\\Face_recognition\\Mask\\mask_data\\test\\have_mask\\"
test_ummask_dir="D:\\Desktop\\Face_recognition\\Mask\\mask_data\\test\\no_mask\\"
validation_mask_dir="D:\\Desktop\\Face_recognition\\Mask\\mask_data\\validation\\have_mask\\"
validation_unmask_dir="D:\\Desktop\\Face_recognition\\Mask\\mask_data\\validation\\no_mask\\"
train_dir="D:\\Desktop\\Face_recognition\\Mask\\mask_data\\train\\"
test_dir="D:\\Desktop\\Face_recognition\\Mask\\mask_data\\test\\"
validation_dir="D:\\Desktop\\Face_recognition\\Mask\\mask_data\\validation\\"
print('total training mask images:', len(os.listdir(train_mask_dir)))
print('total training unmask images:', len(os.listdir(train_ummask_dir)))
print('total testing mask images:', len(os.listdir(test_mask_dir)))
print('total testing unmask images:', len(os.listdir(test_ummask_dir)))
print('total validation mask images:', len(os.listdir(validation_mask_dir)))
print('total validation unmask images:', len(os.listdir(validation_unmask_dir)))

数据增强

endata.py

from keras.preprocessing.image import ImageDataGenerator
datagen = ImageDataGenerator(rotation_range=40,width_shift_range=0.2,height_shift_range=0.2,shear_range=0.2,zoom_range=0.2,horizontal_flip=True,fill_mode='nearest')
'''
查看数据增强后的图片变化
'''
import matplotlib.pyplot as plt
from lenpic import train_mask_dir
import os
# This is module with image preprocessing utilities
from keras.preprocessing import image
fnames = [os.path.join(train_mask_dir, fname) for fname in os.listdir(train_mask_dir)]
img_path = fnames[8]
img = image.load_img(img_path, target_size=(150, 150))
x = image.img_to_array(img)
x = x.reshape((1,) + x.shape)
i = 0
for batch in datagen.flow(x, batch_size=1):plt.figure(i)imgplot = plt.imshow(image.array_to_img(batch[0]))i += 1if i % 4 == 0:break
plt.show()

创建网络

Cnet.py

'''
创建网络
'''
from keras import models
from keras import layers 
from keras import optimizers
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu',input_shape=(150, 150, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dropout(0.5))
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy',optimizer=optimizers.RMSprop(lr=1e-4),metrics=['acc'])

模型训练 并画出训练集与验证集的精确度与损失度的图形

Tmodle.py

#归一化处理
from keras.preprocessing.image import ImageDataGenerator
from lenpic import train_dir, validation_dir
from Cnet import model
train_datagen = ImageDataGenerator(rescale=1./255,rotation_range=40,width_shift_range=0.2,height_shift_range=0.2,shear_range=0.2,zoom_range=0.2,horizontal_flip=True,)# Note that the validation data should not be augmented!
test_datagen = ImageDataGenerator(rescale=1./255)train_generator = train_datagen.flow_from_directory(# This is the target directorytrain_dir,# All images will be resized to 150x150target_size=(150, 150),batch_size=32,# Since we use binary_crossentropy loss, we need binary labelsclass_mode='binary')validation_generator = test_datagen.flow_from_directory(validation_dir,target_size=(150, 150),batch_size=32,class_mode='binary')history = model.fit_generator(train_generator,steps_per_epoch=100,epochs=100,  # 训练次数validation_data=validation_generator,validation_steps=50)# 保存训练模型
model.save('D:\\Desktop\\Face_recognition\\Mask\\maskAndUnmask_1.h5')'''
画出训练集与验证集的精确度与损失度的图形
'''
import matplotlib.pyplot as plt
acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(len(acc))
plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.legend()
plt.figure()
plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.legend()
plt.show()


摄像头检测

camera.py

'''
检测视频或者摄像头中的人脸
'''
from cv2 import cv2from keras.preprocessing import image
from keras.models import load_model
import numpy as np
import dlib
from PIL import Image
model = load_model('D:\\Desktop\\Face_recognition\\Mask\\maskAndUnmask_1.h5')
detector = dlib.get_frontal_face_detector()
video=cv2.VideoCapture(0)
font = cv2.FONT_HERSHEY_SIMPLEX
def rec(img):gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)dets=detector(gray,1)if dets is not None:for face in dets:left=face.left()top=face.top()right=face.right()bottom=face.bottom()cv2.rectangle(img,(left,top),(right,bottom),(0,255,0),2)img1=cv2.resize(img[top:bottom,left:right],dsize=(150,150))img1=cv2.cvtColor(img1,cv2.COLOR_BGR2RGB)img1 = np.array(img1)/255.img_tensor = img1.reshape(-1,150,150,3)prediction =model.predict(img_tensor)if prediction[0][0]>0.5:result='unmask'else:result='mask'cv2.putText(img, result, (left,top), font, 2, (0, 255, 0), 2, cv2.LINE_AA)cv2.imshow('mask', img)
while video.isOpened():res, img_rd = video.read()if not res:breakrec(img_rd)if cv2.waitKey(5) & 0xFF == ord('q'):break
video.release()
cv2.destroyAllWindows()



参考文献

人工智能与机器学习
Dlib模型人脸特征检测原理及demo
cungudafa的博客

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. UI设计素材|字体的重要性

    字体在VI / CI的制定和品牌推广中发挥着极其重要的作用。向客户提案时,应该通过反复试验来展开创意,以达到目标式。设计字体时,大致分为① 最初,用手绘制作完全原创的文字② 通过处理现有字体的路径来制作原创文字字体设计是基本功,也是比较难突破的一个设计领域,看看这些…...

    2024/4/16 4:32:38
  2. 安卓电视机顶盒桌面源码设计分享教程

    最近在桌电视机开发,发现电视机开发与普通手机的开发差异还是蛮大:主要的差异就是: 机顶盒是遥控器操作。由于这个差异,那么对我们要求就比较高。第一点,要处理焦点,以前我们做手机开发只用处理点击事件。现在要响应按钮,并处理按钮被按下以及被选中的时候样子。第二点,…...

    2024/4/16 4:31:42
  3. 在八小时之外,你还有什么第二职业可以做?

    转自:http://www.360doc.com/content/15/0106/10/20625606_438556109.shtml第一个回答 “炒股&投资茶庄” by 绿苔缀玉我生活在广州,地道广州人,出来工作十年,存款为0元。每个月工资月光,因为要一个人养孩子,我又比较舍得给他买好的奶粉,所以……以前是负资产女神,…...

    2024/4/16 4:32:48
  4. Zookeeper分布式锁

    细致的看看其它博客:Zookeeper入门看这篇就够了 https://blog.csdn.net/java_66666/article/details/81015302【七张图】彻底讲清楚ZooKeeper分布式锁的实现原理 https://www.imooc.com/article/284956?block_id=tuijian_wzZookeeper实现分布式锁 https://www.jianshu.com/p/…...

    2024/5/6 0:09:08
  5. Python语言程序设计课程论文

    摘要《坦克大战-1990》是一款坦克为题材的平面射击小游戏,游戏目标是消灭敌对坦克,保护领地。游戏使用Python以及强大的第三方库Pygame, Pygame是跨平台Python模块,专为电子游戏设计,包含图像、声音,可以用Pygame绘制图形,执行动画以及使用定时器让游戏按照稳定的帧速率…...

    2024/5/5 23:55:34
  6. 01.Zabbix监控快速入门

    1.监控知识基本概述 1.为什么要使用监控 1.对系统不间断实时监控 2.实时反馈系统当前状态 3.保证服务可靠性安全性 4.保证业务持续稳定运行 2.如何进行监控,比如我们需要监控磁盘的使用率 1.如何查看磁盘使用率df -h 2.监控磁盘的那些指标block、inode 3.如何获取具体的信息df…...

    2024/5/6 0:23:35
  7. JAVA学期总结

    JAVA学期总结 计应3班 彭卉 java基础课程已经上完,实训也进行了一部分了,在写实训代码的时候也会思考总结自己在基础课程教学时的知识点。从第一讲开始到二十四讲结束都是满满当当的,有那么一点点点点的成就感,但是依然是个小白…从数组到循环,从构造方法到接口,从封装到…...

    2024/4/16 4:32:48
  8. 数据库课程设计:医院信息管理系统(pycharm+MySQL)

    医院信息管理系统(pycharm+MySQL) 1. 利用sql语句创建数据库表 科室表:包括科室编号、科室名称、科室地址、科室电话 医生资料表:包括医生编号、医生姓名、职务、性别、年龄、所属科室 病房资料表:包括房间号、房间地址、所属科室 患者资料表:包括患者编号、患者名、性别、…...

    2024/4/16 21:34:25
  9. Centos7部署Cacti监控平台及应用

    简介Cacti是用php语言实现的一个软件,它的主要功能是通过snmp服务获取数据,然后用rrdtool储存和更新数据,当用户需要查看数据的时候用rrdtool生成图表呈现给用户。因此cacti的关键在于snmp和rrdtool工具,snmp关系着数据的收集,而rrdtool关系着数据存储和图表的生成 snmp抓…...

    2024/4/16 4:33:03
  10. 宝塔面板 php putenv 明明已经解除禁用 仍然报禁用

    原因:是宝塔面板 安装多个php版本解决:需要把其他版本的putenv禁用函数删除...

    2024/4/16 4:31:47
  11. 宝塔面板 php putenv 明明已经解除禁用 仍然报禁用

    原因:是宝塔面板 安装多个php版本解决:需要把其他版本的putenv禁用函数删除...

    2024/4/20 13:59:22
  12. 一文明白docker是什么

    文章目录预备知识1 Docker是什么?2 Docker引擎3 Docker的架构4 Docker能做什么?5 Docker的优点6 docker的安装7 Doker 镜像加速(改镜像源)7.1 修改源7.2 第二步、服务重启7.3 验证是否配置成功8 卸载docker9 解决每次执行命令都需要sudo的问题 运维工程师及后端开发人员是肯…...

    2024/4/16 4:32:33
  13. 一文明白docker是什么

    文章目录预备知识1 Docker是什么?2 Docker引擎3 Docker的架构4 Docker能做什么?5 Docker的优点6 docker的安装7 Doker 镜像加速(改镜像源)7.1 修改源7.2 第二步、服务重启7.3 验证是否配置成功8 卸载docker9 解决每次执行命令都需要sudo的问题 运维工程师及后端开发人员是肯…...

    2024/4/20 7:59:02
  14. 大伙现在做外贸都用哪些收款方式哪?

    很多做外贸朋友都知道,外贸收款、结汇是外贸交易中非常重要的一个环节。一个好的外贸收款渠道,可以快速地帮助企业资金回笼,支付货款、退税等等,能省去很多不必要的麻烦。所以,对于外贸从业者来说,选择一个合适的收款结汇工具成了重中之重。XTransfer作为新晋的网红外贸收…...

    2024/4/16 4:31:42
  15. 大伙现在做外贸都用哪些收款方式哪?

    很多做外贸朋友都知道,外贸收款、结汇是外贸交易中非常重要的一个环节。一个好的外贸收款渠道,可以快速地帮助企业资金回笼,支付货款、退税等等,能省去很多不必要的麻烦。所以,对于外贸从业者来说,选择一个合适的收款结汇工具成了重中之重。XTransfer作为新晋的网红外贸收…...

    2024/4/18 11:53:38
  16. kafka学习一:环境准备

    @kafka学习一:环境准备 1.学习kafka需要准备的环境备宿主机 使用xshell工具连接至宿主机 准备域名1.1宿主机要求CentOS7 阿里云或者其它云厂 本地虚拟机+内网穿透1.1.1云端构建步骤选择云厂并购买ECS服务器域名购买1.按照步骤进行购买,由于域名购买需要创建信息模板进行验证,…...

    2024/4/18 7:55:37
  17. kafka学习一:环境准备

    @kafka学习一:环境准备 1.学习kafka需要准备的环境备宿主机 使用xshell工具连接至宿主机 准备域名1.1宿主机要求CentOS7 阿里云或者其它云厂 本地虚拟机+内网穿透1.1.1云端构建步骤选择云厂并购买ECS服务器域名购买1.按照步骤进行购买,由于域名购买需要创建信息模板进行验证,…...

    2024/4/16 4:33:39
  18. 节约服务器成本50%以上,独角兽完美日记电商系统容器化改造历程

    完美日记创立于2017年,这家公司上线不到两年即成为天猫彩妆销冠,2019年成为11年来第一个登上天猫双十一彩妆榜首的国货品牌,包揽天猫2019全年彩妆销冠;2020年4月成为首个亮相天猫超级品牌日的国货彩妆品牌,同时勇破彩妆品牌销售纪录。另外,完美日记已在全国各地开设了100…...

    2024/4/16 4:33:34
  19. 节约服务器成本50%以上,独角兽完美日记电商系统容器化改造历程

    完美日记创立于2017年,这家公司上线不到两年即成为天猫彩妆销冠,2019年成为11年来第一个登上天猫双十一彩妆榜首的国货品牌,包揽天猫2019全年彩妆销冠;2020年4月成为首个亮相天猫超级品牌日的国货彩妆品牌,同时勇破彩妆品牌销售纪录。另外,完美日记已在全国各地开设了100…...

    2024/4/16 4:33:39
  20. 搜索软件推荐—Listary一款高效搜索工具

    如果你平常工作经常处理文件,或者你平时文件路径藏的很深,那么这款Listary绝对可以减少你的搜索时间。大家都知道,我们使用的Window本身自带的 文件浏览对话框查询慢不说,还只能查询的路径下面的,比如我打开的是E盘,那我搜索的话就只能搜索E盘下面的内容,查询体验很差。…...

    2024/5/3 20:59:01

最新文章

  1. 力扣每日一题113:路径总和||

    题目 中等 给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1: 输入:root [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSu…...

    2024/5/6 2:20:53
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. C# Solidworks二次开发:六种配合方式以及注意事项API详解

    今天要写的文章是关于配合的一些API介绍。 如果大家还不知道创建配合的API用的是哪个,可以看一下我之前写的文章:C# Solidworks二次开发:创建距离配合以及移动组件API详解_solidworks transform2-CSDN博客 (1)今天要…...

    2024/5/5 1:29:37
  4. __dirname 在ES模块中的使用

    前言 ECMAScript模块是 JavaScript 的新标准格式。在Node.js中越来越多的库逐渐从从CommonJS转移到ES模块 注:这里是指“真”ES 模块并不是指代码中 Node.js 中使用 import 写法但是实际被 tsc 转成 commonJS 的形式 但是Node.js ES 开发中此前有一个棘手的问题是获…...

    2024/5/5 8:47:05
  5. CTK插件框架学习-事件监听(04)

    CTK插件框架学习-插件注册调用(03)https://mp.csdn.net/mp_blog/creation/editor/136989802 一、主要流程 发送者注册消息事件接收者订阅消息事件接收者相应消息事件 事件监听比插件接口调用耦合性更弱,事件由框架维护,不需要指定发送方和接收方 二、…...

    2024/5/5 8:31:59
  6. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/4 23:54:56
  7. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/4 23:54:56
  8. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/5/4 23:54:56
  9. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/4 23:55:17
  10. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/5/4 23:54:56
  11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/5/4 23:55:05
  12. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/5/4 23:54:56
  13. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/5/4 23:55:16
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/5/4 23:54:56
  15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/6 1:40:42
  16. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/5/4 23:54:56
  17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/5/4 23:55:17
  18. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/5/4 23:55:06
  19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/5/4 23:54:56
  20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/4 23:55:06
  21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/5/5 8:13:33
  22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/5/4 23:55:16
  23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/5/4 23:54:58
  24. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/4 23:55:01
  25. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/5/4 23:54:56
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57