2
respostas

Biblioteca Keras

Estou tentando utilizar o Keras para criar um projeto utilizando o DenseNet161. Contudo umas das bibliotecas mais utilizadas para redimensionar as imagens não está mais funcionando, como poderia fazer nesse caso?

import cv2
import numpy as np

from keras import backend 
from keras.optimizers import SGD
from keras import backend as K
from keras.applications.densenet import DenseNet121

im = cv2.resize(cv2.imread('/content/cat.jpg'), (224, 224)).astype(np.float32)
#im = cv2.resize(cv2.imread('shark.jpg'), (224, 224)).astype(np.float32)
im[:,:,0] = (im[:,:,0] - 103.94) * 0.017
im[:,:,1] = (im[:,:,1] - 116.78) * 0.017
im[:,:,2] = (im[:,:,2] - 123.68) * 0.017

if K.image_dim_ordering() == 'th':
    im = im.transpose((2,0,1))`

O erro que está dando é o

AttributeError                            Traceback (most recent call last)
<ipython-input-26-52b62c4008aa> in <cell line: 22>()
     20 im[:,:,2] = (im[:,:,2] - 123.68) * 0.017
     21 
---> 22 if K.image_dim_ordering() == 'th':
     23   im = im.transpose((2,0,1))

AttributeError: module 'keras.backend' has no attribute 'image_dim_ordering'

Alguém poderia me ajudar a usar a biblioteca correta para corrigir esse erro?

2 respostas

Olá, Maurício! Tudo bem com você?

O erro que você está enfrentando é devido a uma atualização na biblioteca Keras. Na versão 2.2.5 do Keras, o método image_dim_ordering foi substituído pelo método image_data_format Github.

Então, no seu caso, você pode substituir a linha:

if K.image_dim_ordering() == 'th':

pela seguinte linha:

if K.image_data_format() == 'channels_first':

Como mencionado na discussão do GitHub, a função image_data_format retorna a convenção de formatação atual, que pode ser 'channels_first' ou 'channels_last', dependendo de como você configurou seu ambiente.

No caso de 'channels_first', a dimensão dos canais vem antes da altura e largura da imagem, e no caso de 'channels_last', a dimensão dos canais vem depois da altura e largura.

Portanto, o código corrigido ficaria da seguinte forma:

import cv2
import numpy as np

from keras import backend 
from keras.optimizers import SGD
from keras.applications.densenet import DenseNet121

im = cv2.resize(cv2.imread('/content/cat.jpg'), (224, 224)).astype(np.float32)
im[:,:,0] = (im[:,:,0] - 103.94) * 0.017
im[:,:,1] = (im[:,:,1] - 116.78) * 0.017
im[:,:,2] = (im[:,:,2] - 123.68) * 0.017

if K.image_data_format() == 'channels_first':
    im = im.transpose((2,0,1))

Verifique se isso resolve o seu problema.

Bons estudos.

Olá, Mauricio, tudo bem?

Acho que este método agora é chamado image_data_format

Nesse link do github tem uma thread apontando esse erro: https://github.com/keras-team/keras/issues/12649

Espero ter ajudado!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.Bons Estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software