0
点赞
收藏
分享

微信扫一扫

模式识别与机器学习(1) 皮肤检测


基于贝叶斯判决皮肤检测的简单实现

数据集 提取码:y9an

导入数据

import cv2
import numpy as np
img = cv2.imread("./Pratheepan_Dataset/FacePhoto/03.jpg")

#显示图像
#cv2.imshow("06Apr03Face",img)
#cv2.waitKey(0)

print("YCbCr-RGB Skin Model")
rows,cols,channels = img.shape

# convert color space from rgb to ycbcr


imgYcc = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
#转换为YCBCR图像
imgCBCR = cv2.cvtColor(img,cv2.COLOR_BGR2YCR_CB)

YCbCr-RGB Skin Model

批量的读取图片

import os
picture  = []
for filename in os.listdir(r"./Pratheepan_Dataset/FacePhoto/"):              #listdir的参数是文件夹的路径
    filenames = './Pratheepan_Dataset/FacePhoto/'+filename
    #print(filenames)
    img = cv2.imread(filenames,1)
    imgCBCR = cv2.cvtColor(img,cv2.COLOR_BGR2YCR_CB)
    #print(imgCBCR.shape)
    picture.append(imgCBCR)
Y = np.array([])
CB = np.array([])
CR = np.array([])
for i in range(len(picture)):
    a = picture[i][:,:,0].flatten()
    b = picture[i][:,:,1].flatten()
    c = picture[i][:,:,2].flatten()
    Y = np.hstack((Y,a))
    CR = np.hstack((CR,b))
    CB = np.hstack((CB,c))
print(Y[:10],CB[:10],CR[:10])

[204. 188. 193. 192. 194. 198. 196. 194. 198. 198.] [113. 112. 112. 112. 112. 112. 113. 114. 114. 114.] [136. 136. 136. 136. 136. 136. 135. 135. 136. 136.]

import os
picture  = []
for filename in os.listdir(r"./Ground_Truth/GroundT_FacePhoto/"):              #listdir的参数是文件夹的路径
    filenames = './Ground_Truth/GroundT_FacePhoto/'+filename
    #print(filenames)
    img = cv2.imread(filenames,cv2.IMREAD_GRAYSCALE)
    #print(img.shape)
    picture.append(img)
lable = np.array([])
for i in range(len(picture)):
    a = picture[i][:,:].flatten()
    lable = np.hstack((lable,a))
print(lable.shape)

(5029741,)

在立体空间绘制散点分布

import matplotlib.pyplot as plt

import numpy as np
from mpl_toolkits.mplot3d import Axes3D
i = 10000
j = 200000
Y1 = Y[i:j]
CB1 = CB[i:j]
CR1 = CR[i:j]
fig = plt.figure(figsize=(9,9))
ax = fig.add_subplot(111, projection='3d')
ax.scatter(CR1[lable[i:j]==255.0],CB1[lable[i:j]==255.0],Y1[lable[i:j]==255.0], marker="o")
#ax.scatter(CB1[lable[i:j]==0.0],CR1[lable[i:j]==0.0],Y1[lable[i:j]==0.0], marker="o")
ax.set_xlabel('CR Label')
ax.set_ylabel('CB Label')
ax.set_zlabel('Y Label')
plt.show()

模式识别与机器学习(1) 皮肤检测_bc

将所有的数据拼成一个矩阵(n,3)

Y_1 = Y.reshape(len(Y),-1)
CB_1 = Y.reshape(len(CB),-1)
CR_1 = Y.reshape(len(CR),-1)
X = np.hstack((np.hstack((Y_1,CB_1)),CR_1))
y = lable

利用贝叶斯分类器进行决策

from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X,y/255., test_size=0.1, random_state=42)


#建立模型
clf = GaussianNB()
#使用训练集对模型进行训练
clf.fit(X_train,y_train)
#使用测试集数据检验模型准确率
print("tsst_data1的准确率",clf.score(X_test,y_test))

tsst_data1的准确率 0.7102877876634027

预测

import cv2
import numpy as np
img = cv2.imread("./11.jpg")
#显示
#cv2.imshow("06Apr03Face",img)
#cv2.waitKey(0)

#转化为imgCBCR
imgCBCR = cv2.cvtColor(img,cv2.COLOR_BGR2YCR_CB)
Y_pre = imgCBCR[:,:,0].flatten()
CR_pre = imgCBCR[:,:,1].flatten()
CB_pre = imgCBCR[:,:,2].flatten()

Y_2 = Y_pre.reshape(len(Y_pre),-1)
CB_2 =CB_pre.reshape(len(CB_pre),-1)
CR_2 =CR_pre.reshape(len(CR_pre),-1)
X_2 = np.hstack((np.hstack((Y_2,CB_2)),CR_2))

c = clf.predict(X_2)
img1 = c.reshape(img[:,:,0].shape)
cv2.imshow("06Apr03Face",img1)
cv2.waitKey(0)

这是简单的实现没有考虑背景色,导致查准率比较低,下一步作业朝向这方面更改,努力中

模式识别与机器学习(1) 皮肤检测_3d_02



举报

相关推荐

0 条评论