Como fazer reconhecimento facial em uma Aplicação Ruby on Rails com AWS Rekognition - PT-BR 🚀👨‍💻
Tags: rails, ruby, aws, ai
Published: 2024-05-28 18:11:23

Olá, pessoal! Hoje vou mostrar como integrar o serviço AWS Rekognition em uma aplicação Ruby on Rails. O [AWS Rekognition](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/Rekognition/Client.html) é uma ferramenta poderosa para análise de imagens e vídeos. Vamos usar essa tecnologia para adicionar reconhecimento facial em nossa aplicação Rails. Vamos lá?

## Passo 1: Configurando o Ambiente

Antes de começarmos, precisamos configurar o ambiente para usar o AWS Rekognition. Siga os passos abaixo:

1. **Crie uma conta na AWS**: Se você ainda não tem uma conta, crie uma em [aws.amazon.com](https://aws.amazon.com/).
2. **Crie um usuário IAM**: No console da AWS, vá para o IAM e crie um usuário com permissões para usar o Rekognition. Anote as chaves de acesso e segredo.
3. **Instale a gem `aws-sdk-rekognition`**: No seu Gemfile, adicione a gem e execute `bundle install`.

```ruby
# Gemfile
gem 'aws-sdk-rekognition'
```

## Passo 2: Configurando Credenciais

Para que nossa aplicação Rails possa se comunicar com o AWS Rekognition, precisamos configurar as credenciais da AWS. Você pode fazer isso de duas maneiras: usando variáveis de ambiente ou criando um arquivo de configuração.

**Usando Variáveis de Ambiente:**

Adicione as seguintes variáveis ao seu arquivo `.env` (não esqueça de instalar a gem `dotenv-rails` e configurar o Rails para usar esse arquivo):

```plaintext
AWS_ACCESS_KEY_ID=your_access_key_id
AWS_SECRET_ACCESS_KEY=your_secret_access_key
AWS_REGION=your_aws_region
```

## Passo 3: Criando o Serviço Rekognition

Vamos criar um serviço para encapsular a lógica do AWS Rekognition. Primeiro, vamos configurar a inicialização do serviço. Crie um arquivo em `app/services/rekognition_service.rb` e adicione o seguinte código:

### 1. Inicializando o Serviço Rekognition

```ruby
# app/services/rekognition_service.rb
require 'aws-sdk-rekognition'

class RekognitionService
  def initialize
    Aws.config.update(
      {
        region: ENV['AWS_REGION'],
        credentials: Aws::Credentials.new(ENV['AWS_ACCESS_KEY_ID'], ENV['AWS_SECRET_ACCESS_KEY'])
      }
    )

    begin
      @client = Aws::Rekognition::Client.new
    rescue Aws::Errors::MissingCredentialsError => e
      puts "Rekognition erro: #{e.message}"
    end
  end
```

### 2. Criando uma Coleção

Para usar o recurso de busca por rostos, precisamos criar uma coleção no AWS Rekognition para armazenar os dados dos rostos detectados. Adicione o método para criar a coleção no serviço:

```ruby
# app/services/rekognition_service.rb
class RekognitionService
  # código de inicialização aqui...

  def create_collection(collection_id)
    @client.create_collection({ collection_id: collection_id })
  rescue Aws::Rekognition::Errors::ServiceError => e
    puts "Rekognition erro: #{e.message}"
  end
end
```

Agora, crie a coleção diretamente no console Rails:

```ruby
# No console Rails
rekognition_service = RekognitionService.new
rekognition_service.create_collection('my_faces_collection')
```

### 3. Adicionando Rostos à Coleção

Agora, vamos adicionar o método para adicionar rostos à coleção e obter o face_id no modelo `User`:

```ruby
# app/services/rekognition_service.rb
class RekognitionService
  # código de inicialização aqui...

  def add_faces_to_collection(collection_id, image_path)
    image = File.read(image_path)
    response = @client.index_faces({
      collection_id: collection_id(type),
      max_faces: 1,
      image: {
        bytes: image_bytes
      }
    })
    response.face_records
  rescue Aws::Rekognition::Errors::ServiceError => e
    puts "Rekognition erro: #{e.message}"
  end
end
```

No modelo `User`, adicione um callback para adicionar a imagem à coleção quando o usuário for criado e salvar o `face_id`:

```ruby
# app/models/user.rb
class User < ApplicationRecord
  mount_uploader :photo, PhotoUploader

  after_create :add_face_to_collection

  private

  def add_face_to_collection
    rekognition_service = RekognitionService.new
    face_records = rekognition_service.add_faces_to_collection('my_faces_collection', self.photo.path)
    face_id = face_records.first.face.face_id
    self.update(face_id: face_id)
  end
end
```

## Buscando Usuários por Imagem

Agora, vamos adicionar o método para buscar usuários por imagem:

```ruby
# app/services/rekognition_service.rb
class RekognitionService
  # código de inicialização aqui...

  def search_faces_by_image(collection_id, image_path)
    image = File.read(image_path)
    response = @client.search_faces_by_image({
      collection_id: collection_id,
      image: { bytes: image },
      max_faces: 1,
      face_match_threshold: 99
    })
    response.face_matches
  rescue Aws::Rekognition::Errors::ServiceError => e
    puts "Rekognition erro: #{e.message}"
  end
end
```

Para buscar um usuário pelo rosto, você pode usar o seguinte exemplo no console Rails:

```ruby
# No console Rails
rekognition_service = RekognitionService.new
face_matches = rekognition_service.search_faces_by_image('my_faces_collection', 'path_to_image')
face_id = face_matches.first.face.face_id
user = User.find_by(face_id: face_id)
puts user.inspect
```

## Conclusão

Integrar o AWS Rekognition em uma aplicação Ruby on Rails é uma maneira excelente de adicionar funcionalidades avançadas de análise de imagem à sua aplicação. Com este guia, você pode configurar o Rekognition, adicionar rostos a uma coleção e buscar usuários por imagem. Espero que este guia tenha sido útil. Se tiver alguma dúvida, deixe um comentário!

Para mais detalhes sobre os endpoints do AWS Rekognition, consulte a documentação do [SDK para Ruby](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/Rekognition/Client.html).

Até a próxima!