segunda-feira, 19 de maio de 2025

Como detectar em tempo real de rostos, olhos e sorrisos usando a webcam com OpenCV

 


Como detectar em tempo real de rostos, olhos e sorrisos usando a webcam com OpenCV e os famosos classificadores Haar Cascade, que são modelos pré-treinados para detecção de padrões visuais.

import cv2

print(cv2.__version__)


video_capture = cv2.VideoCapture(0)

faceCascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

eyeCascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')

smileCascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_smile.xml')


while True:

    ret, frame = video_capture.read()


    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)


    faces = faceCascade.detectMultiScale(

        gray,

        scaleFactor=1.1,

        minNeighbors=5,

        minSize=(30, 30)

    )


    for (x, y, w, h) in faces:

        cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)


    eyes = eyeCascade.detectMultiScale(gray, 1.2, 18)

    for (x, y, w, h) in eyes:

        cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)


    smiles = smileCascade.detectMultiScale(gray, 1.7, 20)

    for (x, y, w, h) in smiles:

        cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 0, 255), 2)


    cv2.imshow('video', frame)


    if cv2.waitKey(1) & 0xFF == ord('q'):

        break


video_capture.release()

cv2.destroyAllWindows()


Criação / Construção de uma Rede Neural em Python usando as bibliotecas TensorFlow e Keras com WebCam

 




Criação de Redes Neurais em Python usando as bibliotecas TensorFlow e Keras com WebCam

Explicando o código passo a passo para que você compreenda como ele utiliza Python, OpenCV e TensorFlow para criar um sistema de classificação de imagens em tempo real com captura de webcam.


🧠 Objetivo do Código

Criar um modelo de rede neural densa (fully connected) para classificar imagens capturadas da webcam em duas classes (ex: logos diferentes), treinado de forma interativa com os dados fornecidos pelo próprio usuário, em tempo real.


📦 1. Importação de Bibliotecas

import cv2

import numpy as np

import tensorflow as tf

from tensorflow.keras.preprocessing.image import ImageDataGenerator

  • cv2: OpenCV para captura e exibição de vídeo.
  • numpy: manipulação de arrays.
  • tensorflow: criação e treino do modelo de IA.
  • ImageDataGenerator: aumento de dados (data augmentation).

🎥 2. Captura de Vídeo da Webcam

cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)

  • 0: índice da câmera (mude para 1 ou 2 se necessário).
  • cv2.CAP_DSHOW: backend do Windows (pode ser omitido em Linux/macOS).

width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))

height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

print("Resolução da câmera:", width, height)

  • Define width e height da imagem para usar como entrada do modelo.

🧠 3. Definição do Modelo

model = tf.keras.Sequential([

    tf.keras.layers.Input(shape=(height, width, 3)),       # Entrada: imagem da webcam

    tf.keras.layers.Rescaling(1./255),                     # Normalização (0–1)

    tf.keras.layers.Flatten(),                             # "Achata" a imagem em vetor 1D

    tf.keras.layers.Dense(100, activation="sigmoid", name="perceptron_1"),

    tf.keras.layers.Dense(100, activation="sigmoid", name="perceptron_2"),

    tf.keras.layers.Dense(100, activation="sigmoid", name="perceptron_3"),

    tf.keras.layers.Dense(100, activation="sigmoid", name="perceptron_4"),

    tf.keras.layers.Dense(100, activation="sigmoid", name="perceptron_5"),

    tf.keras.layers.Dense(2, activation="softmax", name="output")  # Saída com 2 classes

])

📌 A camada Rescaling evita que os valores de pixel (0 a 255) prejudiquem o aprendizado.


⚙️ 4. Compilação do Modelo

model.compile(

    optimizer=tf.optimizers.Adam(learning_rate=0.001),

    loss='categorical_crossentropy',

    metrics=['accuracy']

)

  • categorical_crossentropy: usada para classificação multiclasse com vetores one-hot (ex: [1, 0], [0, 1]).
  • Adam: otimizador eficaz para esse tipo de rede.

🧪 5. Variáveis e Gerador de Dados

initial_class = [1.0, 0.0]

images = []

y = []

 

aug = ImageDataGenerator(...)  # definido mas não usado ativamente

  • images: onde são salvas as imagens capturadas.
  • y: onde são salvos os rótulos (labels) correspondentes.
  • ImageDataGenerator: preparado para aumento de dados, mas com loop desativado.

🔁 6. Loop Principal (Interação com o Usuário)

Captura e Treinamento

if k == ord('1'):

    initial_class = [1.0, 0.0]

    grab_image = True

elif k == ord('2'):

    initial_class = [0.0, 1.0]

    grab_image = True

  • Pressione 1 ou 2 para capturar imagens para a classe correspondente.

elif k == ord('t'):

    model.fit(...)  # Inicia o treinamento com as imagens coletadas

  • Pressione t para treinar o modelo com as imagens já coletadas.

Previsão

elif k == ord("p"):

    prediction = model.predict(np.array([frame]))

    ...

    print("Previsão:", labels[max_index])

  • Pressione p para prever qual classe corresponde ao frame atual.
  • Exibe o rótulo mais provável com base no output do modelo.

📸 7. Coleta e Aumento de Dados

if grab_image:

    images.append(frame)

    y.append(initial_class)

  • Salva o frame atual e o rótulo definido para uso futuro no treinamento.

for i in range(0):  # loop desativado

    img = aug.flow(...)  # criaria imagens artificiais aumentadas


🚪 8. Liberação de Recursos

cap.release()

cv2.destroyAllWindows()


📌 Observações Importantes

  • Não há salvamento em disco. Tudo é feito em tempo real.
  • Rede neural simples (sem convoluções), o que pode afetar a acurácia.
  • Você pode adicionar Conv2D para melhorar o desempenho.
  • Ideal para testes, aprendizado e prototipagem.

Se quiser, posso:

  • Adicionar salvamento de modelo (.h5 ou .keras).
  • Substituir o Flatten por CNNs reais (Conv2D).
  • Criar um sistema de testes interativo com botões ou interface GUI.

 


quarta-feira, 14 de maio de 2025

UFCD 9196 - Quais são os principais componentes de um laudo forense bem-sucedido?


 



Quais são os principais componentes de um laudo forense bem-sucedido?

Alimentado por IA e pela comunidade do LinkedIn