In [1]:
import cv2
figsize(12,8)

Detecção de pele com Naïve Bayes

Neste exemplo, um classificador Naïve Bayes é empregado para identificar pixels em uma imagem correspondendo a cor de pele humana. A classificação toma como base apenas a cor do pixel.

Treinamento

  • Uma matriz A $M \times N \times 3$, uma imagem colorida no espaço de cor CIE Lab
  • Uma máscara binária $M \times N$ representando a classificação pele/não-pele
    • Classificação supervisionada
  • O canal L é descartado, o que evita que a luminância influencie a classificação

In [2]:
training_bgr = cv2.imread('./data/skin-training.jpg')
training_rgb = cv2.cvtColor(training_bgr, cv2.COLOR_BGR2RGB)
training = cv2.cvtColor(training_bgr, cv2.COLOR_BGR2LAB)
M, N, _ = training.shape
  • As imagens de treinamento exibem amostras de pele em um fundo escuro
  • Thresholding utilizado para produzir uma máscara binária

In [11]:
mask = zeros((M,N))
mask[training[:,:,0] > 160] = 1

In [12]:
subplot(1,2,1)
imshow(training_rgb)
subplot(1,2,2)
imshow(mask, cmap=cm.binary_r)


Out[12]:
<matplotlib.image.AxesImage at 0x7fa427405910>
  • Reshaping: os pixels são representados como uma sequência de $MN$ vetores
  • Cada vetor é bidimensional, contendo os valores dos canais a e b
  • Slicing empregado para remover o canal L

In [13]:
data = training.reshape(M*N, -1)[:,1:]
data


Out[13]:
array([[128, 129],
       [128, 129],
       [128, 129],
       ..., 
       [127, 129],
       [125, 134],
       [123, 136]], dtype=uint8)

In [14]:
target = mask.reshape(M*N)
target


Out[14]:
array([ 0.,  0.,  0., ...,  0.,  0.,  0.])

Treinamento

  • Gaussian Naïve Bayes

In [15]:
from sklearn.naive_bayes import GaussianNB
gnb = GaussianNB()
gnb.fit(data, target)


Out[15]:
GaussianNB()

Classificação

  • Imagem de entrada convertida para CIE Lab
  • Dados formatados como na imagem de treinamento

In [16]:
test_bgr = cv2.imread('./data/thiago.jpg')
test_rgb = cv2.cvtColor(test_bgr, cv2.COLOR_BGR2RGB)
test = cv2.cvtColor(test_bgr, cv2.COLOR_BGR2LAB)
M_tst, N_tst, _ = test.shape

In [17]:
data = test.reshape(M_tst * N_tst, -1)[:,1:]
skin_pred = gnb.predict(data)
S = skin_pred.reshape(M_tst, N_tst)

In [18]:
subplot(1,3,1)
imshow(test_rgb)
subplot(1,3,2)
imshow(S, cmap=cm.binary_r)
subplot(1,3,3)
imshow(test_rgb, alpha=0.6)
imshow(S, cmap=cm.binary_r, alpha=0.4)


Out[18]:
<matplotlib.image.AxesImage at 0x7fa4271d0850>