Eu gerei dois arquivos graph-tiny-yolo-voc.pb e graph-yolo.pb.
o arquivo "graph-tiny-yolo-voc.pb" está ok, mas erro graph-yolo.pb
I/native: tensorflow_inference_jni.cc:139 Criando o gráfico do TensorFlow a partir do GraphDef.
E/nativo: tensorflow_inference_jni.cc:146 Não foi possível criar o gráfico do TensorFlow: Argumento inválido: Nenhum OpKernel foi registrado para suportar Op 'ExtractImagePatches' com esses attrs. Dispositivos registrados: [CPU], Kernels registrados:
[[Node: ExtractImagePatches = ExtractImagePatches T=DT_FLOAT, ksizes=[1, 2, 2, 1], padding="VALID", rates=[1, 1, 1, 1], strides=[1, 2, 2, 1] ]]
E/tensorflow: TensorFlowYoloDetector: TF init status: 3
Sem Opkernel significa que não há implementação para o hardware executando este .pb
.
Para resolver isso, veja a classe reorg
de ./net/ops/convolution.py
. Tem dois métodos _forward
e forward
. A opção padrão atual está usando forward
, que tem extract_image_patches
- um método interno de tensorflow.
Troque os nomes dos dois métodos e você estará usando minha implementação manual, que não deve ter problemas com a implementação do Opkernel.
eu alterei o código, mas não consigo gerar .pb
/usr/bin/python3 ./flow.py --model /home/qkj/projects/dark_flow/darkflow/cfg/yolo-voc.cfg --load /home/qkj/projects/dark_flow/darkflow/bin/yolo- voc.weights --savepb
Traceback (última chamada mais recente):
Arquivo "./flow.py", linha 42, em
tfnet = TFNet(BANDEIRAS)
Arquivo "/home/qkj/projects/dark_flow/darkflow/net/build.py", linha 50, em __init__
self.build_forward()
Arquivo "/home/qkj/projects/dark_flow/darkflow/net/build.py", linha 70, em build_forward
estado = op_create(*args)
Arquivo "/home/qkj/projects/dark_flow/darkflow/net/ops/__init__.py", linha 27, em op_create
retornar op_types layer_type
Arquivo "/home/qkj/projects/dark_flow/darkflow/net/ops/baseop.py", linha 42, em __init__
self.forward()
Arquivo "/home/qkj/projects/dark_flow/darkflow/net/ops/convolution.py", linha 13, em frente
para i no intervalo (h/s):
TypeError: o objeto 'float' não pode ser interpretado como um inteiro
reorganização de classe(BaseOp):
def para frente (auto):
inp = self.inp.out
forma = inp.get_shape().as_list()
_, h, w, c = forma
s = self.lay.stride
fora = lista()
para i no intervalo (h/s):
linha_i = lista()
para j no intervalo (w/s):
si, sj = s * i, s * j
boxij = inp[:, si: si+s, sj: sj+s,:]
flatij = tf.reshape(boxij, [-1,1,1,c s s])
linha_i += [flatij]
out += [tf.concat(2, row_i)]
self.out = tf.concat(1, out)
def _forward(self):
inp = self.inp.out
s = self.lay.stride
self.out = tf.extract_image_patches(
inp, [1,s,s,1], [1,s,s,1], [1,1,1,1], 'VALID')
Ei, isso é um bug ao traduzir de Python2 para Python3. Obrigado por apontar, atualizei o código.
Eu tenho o mesmo problema e troquei os nomes de 2 funções, mas o arquivo yolo.pb ainda causa erro no Android. Por favor me ajude a corrigir isso!!!
[[Node: ExtractImagePatches = ExtractImagePatches[T=DT_FLOAT, ksizes=[1, 2, 2, 1], padding="VALID", rates=[1, 1, 1, 1], strides=[1, 2, 2] , 1]] (47-vazamentos)]]
Obrigado
Comentários muito úteis
Sem Opkernel significa que não há implementação para o hardware executando este
.pb
.Para resolver isso, veja a classe
reorg
de./net/ops/convolution.py
. Tem dois métodos_forward
eforward
. A opção padrão atual está usandoforward
, que temextract_image_patches
- um método interno de tensorflow.Troque os nomes dos dois métodos e você estará usando minha implementação manual, que não deve ter problemas com a implementação do Opkernel.