Darkflow: Adicionar treinamento e precisão de validação ao processo de treinamento

Criado em 30 mai. 2017  ·  37Comentários  ·  Fonte: thtrieu/darkflow

Durante o treinamento:
etapa 1 - perda 240,92623901367188 - perda média móvel 240,92623901367188
etapa 2 - perda 241,2866668701172 - perda média móvel 240,96228179931643
passo 3 - perda 239,79562377929688 - perda média móvel 240,84561599731447

Como adiciono precisão de treinamento e precisão de validação?

etapa 1 - perda 240,92623901367188 - perda média em movimento 240,92623901367188 - trem 0,221
etapa 2 - perda 241,2866668701172 - perda média móvel 240,96228179931643 - trem 0,222
etapa 3 - perda 239,79562377929688 - perda ave em movimento 240,84561599731447 - trem 0,223
Concluída 1 época, validação 0,210

Comentários muito úteis

Sim, sem problemas. Vou fazer o upload dos arquivos aqui. Se você tiver alguma dúvida, é só perguntar.

diff.zip

Todos 37 comentários

Existem 2 métodos de fazer isso. Você pode dividir o conjunto de dados no trem e validar os conjuntos dentro do código ou apenas enviar 2 conjuntos de dados separados, um para o trem e outro para a validação ao chamar o módulo de fluxo.

De qualquer forma, para fazer isso você deve adicionar alguns novos parâmetros no arquivo default.py, então modificar as funções _batch, parse e shuffle de data.py (ambas as pastas yolo e yolov2) e modificar o método train () em flow.py (aqui você só precisa executar outro lote (a cada iteração ou uma vez várias iterações) usando a mesma sessão de tensorflow, mas sem retornar o train_op para que você não modifique os pesos). Você também pode adicionar outro tf.summary.FileWriter para validação para que possa visualizar seu gráfico de perda de validação usando tensorboard.

Eu pessoalmente escolhi enviar 2 conjuntos de dados diferentes. Foi muito simples. Espero ter sido claro o suficiente.

@ Costyv95 Você pode compartilhar seu código com os parâmetros adicionados e as alterações que você sugeriu?

Sim, sem problemas. Vou fazer o upload dos arquivos aqui. Se você tiver alguma dúvida, é só perguntar.

diff.zip

@ Costyv95 O conjunto de validação contribui para a atualização do gradiente em sua implementação?

Entendi, as amostras de validação não contribuem para a atualização do gradiente.

Sim, a validação é apenas para uma visualização dos resultados do modelo fora do conjunto de treinamento.

Oi,
Desculpe. Eu não percebi o último e-mail. Sim, a validação é apenas para uma visualização dos resultados do modelo fora do conjunto de treinamento.

Na terça-feira, 4 de julho de 2017, 15:16:24 GMT + 3, yfliu [email protected] escreveu:

Entendi, as amostras de validação não contribuem para a atualização do gradiente.

-
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub ou ignore a conversa.

@ Costyv95 Eu só quero saber como executá-lo depois de modificar o código original? Muito obrigado!

@ Costyv95 eu o executo assim ./flow --model cfg / yolo.cfg --train --dataset "/ home / thinkjoy / lwl / modify-darkflow-master / data / VOCdevkit / VOC2007 / JPEGImages" --annotation " / home / thinkjoy / lwl / modify-darkflow-master / data / VOCdevkit / VOC2007 / Annotations "--gpu 1.0
aqui está o erro (modifique o código como você)
Arquivo "/home/thinkjoy/lwl/modify-darkflow-master/darkflow/net/flow.py", linha 82, em andamento
feed_dict [self.learning_rate] = lr
AttributeError: objeto 'TFNet' não tem atributo 'learning_rate'

Isso acontece porque o código que eu forneci a você tem algumas modificações para a taxa de aprendizagem adaptativa e há mais uma alteração que você precisa fazer. Você o encontra aqui: https://github.com/thtrieu/darkflow/pull/216/commits/124d55d32d17bdee111201fd6fe520db709a4f9c

E você deve adicionar --val_dataset e val_annotation aos argumentos para ter uma perda de validação.

@ Costyv95 Podemos controlar quantos passos validar uma vez, só acho que um passo um val é uma pequena perda de tempo com treinamento? Obrigado!

@ Costyv95 E você conseguiu adicionar a precisão quando val?

@ dream-will Para validação uma vez em N etapas, você pode adicionar facilmente um argumento (val_steps) em defaults.py e no método train em flow.py você apenas executa o código que está após o "# tempo de validação" dentro de uma instrução if como isso:

`# tempo de validação

if i % self.FLAGS.val_steps == 0:
    (x_batch, datum) = next(val_batches)
    feed_dict = {
        loss_ph[key]: datum[key] 
            for key in loss_ph }
    feed_dict[self.inp] = x_batch
    feed_dict.update(self.feed)
    feed_dict[self.learning_rate] = lr

    fetches = [loss_op, self.summary_op] 
    fetched = self.sess.run(fetches, feed_dict)
    loss = fetched[0]

    if loss_mva_valid is None: loss_mva_valid = loss
    loss_mva_valid = .9 * loss_mva_valid + .1 * loss

    self.val_writer.add_summary(fetched[1], step_now)

    form = 'VALIDATION step {} - loss {} - moving ave loss {}'
    self.say(form.format(step_now, loss, loss_mva_valid))`

No defaults.py, basta adicionar esta linha:

self.define('val_steps', '1', 'evaluate validation loss every #val_steps iterations')

Não entendo bem a segunda pergunta sobre como adicionar precisão.

@ Costyv95 Obrigado pela sua resposta, a segunda pergunta significa apenas que ao validar, não só obtemos a perda de validação, mas também obtemos a precisão da validação?

@ dream-will Para isso, você deve implementar um método de precisão personalizado que compare os bboxes GT e os bboxes previstos (para obter os bboxes previstos, consulte o código usado na previsão), mas não vejo razão para isso, porque a perda é o suficiente. Esteja ciente de que a validação que você vê está apenas em um minilote aleatório do conjunto de validação, mas isso representa muito bem a perda de teste em um conjunto de dados de validação grande o suficiente.

@ Costyv95 ok, obrigado

Olá, @ Costyv95 . Estou tendo problemas para emitir valores de perda de val. Modifiquei todos os arquivos seguindo suas instruções e códigos. Estes são os seguintes erros
File "flow", line 6, in <module> cliHandler(sys.argv) File "/home/alxe/ML/darkflow/darkflow/cli.py", line 26, in cliHandler tfnet = TFNet(FLAGS) File "/home/alxe/ML/darkflow/darkflow/net/build.py", line 64, in __init__ self.framework = create_framework(*args) File "/home/alxe/ML/darkflow/darkflow/net/framework.py", line 59, in create_framework return this(meta, FLAGS) File "/home/alxe/ML/darkflow/darkflow/net/framework.py", line 15, in __init__ self.constructor(meta, FLAGS) File "/home/alxe/ML/darkflow/darkflow/net/yolo/__init__.py", line 20, in constructor misc.labels(meta, FLAGS) #We're not loading from a .pb so we do need to load the labels File "/home/alxe/ML/darkflow/darkflow/net/yolo/misc.py", line 36, in labels with open(file, 'r') as f: TypeError: coercing to Unicode: need string or buffer, NoneType found

Você pode imprimir o valor da variável do arquivo?

@ Costyv95 não, não posso. Isso é o que eu executo:
python flow --model cfg/tiny-yolo-voc-1c.cfg --train --dataset train/images --annotation train/annotations --load bin/yolo.weights --gpu 1.0 --epoch 300

O que quero dizer com "variável de arquivo" é a variável usada na linha 36 em misc.py, porque realmente não consigo entender o que há de errado com seu código.
Você não tem nenhum argumento --val_dataset? Como você implementou a mudança? Você dividiu o conjunto de dados dentro do código ou adicionou o argumento --val_dataset?

@ Costyv95 Oi, eu copiei e colei seus arquivos no diff.zip, então tentei treinar com o comando

"flow --train --model ./coke/yolo-coke-2c.cfg --annotation ./coke/train/annotations --dataset ./coke/train/images --gpu 1.0 --batch 8 --save 1000 --val_dataset ./coke/validation/images --val_annotation ./coke/validation/annotations

Mas ainda deu erro
`
[ nkhanh @ localhost khanh] $ ./run_coke.sh

Analisando ./coke/yolo-coke-2c.cfg
Carregando nenhum ...
Terminou em 0,0001392364501953125s
Traceback (última chamada mais recente):
Arquivo "/ usr / local / bin / flow", linha 6, em
cliHandler (sys.argv)
Arquivo "/usr/local/lib64/python3.6/site-packages/darkflow/cli.py", linha 26, em cliHandler
tfnet = TFNet (FLAGS)
Arquivo "/usr/local/lib64/python3.6/site-packages/darkflow/net/build.py", linha 64, em __init__
self.framework = create_framework (* args)
Arquivo "/usr/local/lib64/python3.6/site-packages/darkflow/net/framework.py", linha 59, em create_framework
retornar isto (meta, FLAGS)
Arquivo "/usr/local/lib64/python3.6/site-packages/darkflow/net/framework.py", linha 15, em __init__
self.constructor (meta, FLAGS)
Arquivo "/usr/local/lib64/python3.6/site-packages/darkflow/net/yolo/__init__.py", linha 20, no construtor
misc.labels (meta, FLAGS) # Não estamos carregando de um .pb, então precisamos carregar os rótulos
Arquivo "/usr/local/lib64/python3.6/site-packages/darkflow/net/yolo/misc.py", linha 36, ​​nos rótulos
com abrir (arquivo, 'r') como f:
TypeError: esperado str, bytes ou objeto os.PathLike, não NoneType
`

@ khanh1412
na linha misc.py 29
altere-o para o seu arquivo de etiquetas personalizadas.
arquivo = 'labels.txt'

PS É uma solução temporária.

@ Costyv95
como entender remover '[' e ']'?

Entrar no treinamento ...
Traceback (última chamada mais recente):
Arquivo "flow", linha 6, em
cliHandler (sys.argv)
Arquivo "/Users/sisyphus/darkflow/darkflow/cli.py", linha 33, em cliHandler
imprimir ('Entrar no treinamento ...'); tfnet.train ()
Arquivo "/Users/sisyphus/darkflow/darkflow/net/flow.py", linha 54, em andamento
arg_steps = self.FLAGS.steps [1: -1] # remove '[' e ']'
TypeError: o objeto 'NoneType' não é subscritível

oi @ Costyv95

onde devo adicionar tf.summary.FileWriter para validação para visualizar o gráfico de perda de validação usando tensorboard.

obrigado

@ Costyv95 Tentei seu arquivo zip, diff.zip. Mas o terminal me diz que --val_dataset é um argumento inválido. Eu preciso mudar outros arquivos?

@ Costyv95 Tentei seu arquivo zip, diff.zip. Mas o terminal me diz que --val_dataset é um argumento inválido. Eu preciso mudar outros arquivos?

Você deve substituir todos os arquivos, incluindo yolo-data e yolov2-data. você deve simplesmente copiar e colar respectivamente nas pastas relacionadas, alterando seus nomes apenas por "dados" para simplesmente alterar o arquivo nelas.

@khanhhh
adicione um código “self.define ('labels', 'labels.txt', 'path to labels file')” em "def setDefaults (self):" em "darkflow \ defaults.py", então você pode usar " --labels xxx.txt "como anterior.

Muito obrigado!!!!!!!!

Em 25 de maio de 2019, às 03h11, Jack [email protected] escreveu:

@KhanhHH https://github.com/KhanhHH
adicione um código “self.define ('labels', 'labels.txt', 'path to labels file')” em "def setDefaults (self):" em "darkflow \ defaults.py", então você pode usar " --labels xxx.txt "como anterior.

-
Você está recebendo isto porque comentou.
Responda a este e-mail diretamente, vê-lo no GitHub https://github.com/thtrieu/darkflow/issues/264?email_source=notifications&email_token=AEIP7DOZYIFBYZHV22RVIADPXD7ELA5CNFSM4DNH2ANKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGODWHLNQQ#issuecomment-495892162 , ou silenciar o fio https://github.com/notifications/ unsubscribe-auth / AEIP7DPOGFQ2EYSSZFPZSL3PXD7ELANCNFSM4DNH2ANA .

@ Costyv95
Olá, gostaria de saber como definir o caminho "gs: // bucket_hand_detection_2" em "darkflow \ defaults.py"? meu python (3.7) não consegue encontrar este caminho, ele lança um erro; e que dose o "balde" representa?

@ Costyv95
Olá, gostaria de saber como definir o caminho "gs: // bucket_hand_detection_2" em "darkflow \ defaults.py"? meu python (3.7) não consegue encontrar este caminho, ele lança um erro; e que dose o "balde" representa?

Mesmo erro, mas o ponto de verificação é salvo normalmente, então eu não sei o que é este erro @ Costyv95

obrigado @ Costyv95!

Olá, @ Costyv95 Yolo treina e produz perda de validação, mas depois de 1000 etapas, ele gera um erro. Arquivo FileNotFoundError: [Errno 2] Não existe esse arquivo ou diretório: 'gsutil': 'gsutil'.

Erro:
error

@akmeraki ola encontrei o mesmo problema, encontrou alguma solução para este erro?

@ zhe0503 @akmeraki Espero que não seja tarde demais, mas tudo que fiz foi digitar "pip install gsutil" e o problema foi resolvido !!

Ei pessoal.
O que eu preciso fazer se quiser obter a precisão de todo o modelo treinado?
Por exemplo, estou treinando meu modelo e paro o treinamento em algum momento. Agora eu tenho o último ponto de verificação salvo e quero calcular a precisão até o último ponto de verificação.
Os arquivos na pasta cpkt são nomeados como,

posto de controle
yolo-new-50.data-00000-of-00001
yolo-new-50.index
yolo-new-50.meta
yolo-new-50.profile

Eu apreciaria a ajuda pessoal.

@ Costyv95
Eu segui suas instruções cuidadosamente, mas parece que train.py não reconhece os argumentos --val _.... Você poderia me ajudar? O erro é o seguinte:
ERROR - Argumento inválido: --val_dataset

Isso acontece porque o código que eu forneci a você tem algumas modificações para a taxa de aprendizagem adaptativa e há mais uma alteração que você precisa fazer. Você o encontra aqui: 124d55d

E você deve adicionar --val_dataset e val_annotation aos argumentos para ter uma perda de validação.

Não funciona para mim. Recebo um erro como abaixo:
ERROR - Argumento inválido: --val_dataset

Esta página foi útil?
0 / 5 - 0 avaliações