2017-06-08 1 views
2

Je travaille sur ce project basé sur tensorflow. Je veux juste former un modèle OCR par attention_ocr basé sur mes propres jeux de données, mais je ne sais pas comment stocker mes images et ma vérité au sol dans le même format que les jeux de données FSNS.Comment créer ensemble de données dans le même format que le jeu de données FSNS?

Est-ce qu'il ya quelqu'un aussi travailler sur ce projet ou de savoir comment résoudre ce problème: - D

+0

que vous avez pu obtenir ce travail pour vous? Pouvez-vous partager le script que vous avez utilisé pour préparer vos propres données? – Roger

+0

Désolé, je reproduit pas le processus de préparation des ensembles de données à partir de mes propres images. Je suis coincé dans ce problème. https://stackoverflow.com/questions/45093932/invalidargumenterror-when-traing-attention-ocr-assign-requires-shapes-of-both –

Répondre

7

Le format de données pour stocker la formation/test est défini dans le document FSNS https://arxiv.org/pdf/1702.03970.pdf (tableau 4).

Pour stocker des fichiers tfrecord avec tf.Example Protos vous pouvez utiliser tf.python_io.TFRecordWriter. Il y a a nice tutorial, un answer on the stackoverflow existant et un short gist.

Supposons que vous avez un numpy ndarray img qui a num_of_views images côte-à-côte stockées (voir la figure 3 dans le paper.): enter image description here et un texte correspondant à une text variable. Vous devez définir une fonction pour convertir une chaîne de caractères Unicode dans une liste de caractères ids rembourré à une longueur fixe et unpadded ainsi. Par exemple:

char_ids_padded, char_ids_unpadded = encode_utf8_string(
    text='abc', 
    charset={'a':0, 'b':1, 'c':2}, 
    length=5, 
    null_char_id=3) 

le résultat devrait être:

char_ids_padded = [0,1,2,3,3] 
char_ids_unpadded = [0,1,2] 

Si vous utilisez des fonctions _int64_feature et _bytes_feature définies dans le gist vous pouvez créer un tf.Example compatible FSNS proto en utilisant un bout de code suivant:

char_ids_padded, char_ids_unpadded = encode_utf8_string(
    text, charset, length, null_char_id) 
example = tf.train.Example(features=tf.train.Features(
    feature={ 
    'image/format': _bytes_feature("PNG"), 
    'image/encoded': _bytes_feature(img.tostring()), 
    'image/class': _int64_feature(char_ids_padded), 
    'image/unpadded_class': _int64_feature(char_ids_unpadded), 
    'height': _int64_feature(img.shape[0]), 
    'width': _int64_feature(img.shape[1]), 
    'orig_width': _int64_feature(img.shape[1]/num_of_views), 
    'image/text': _bytes_feature(text) 
    } 
)) 
+0

Salut, Gorban, merci beaucoup pour votre réponse. Il y a deux autres questions: 1.Est-ce que cela fonctionne sur les ensembles de données chinois? 2.Dans dans une image, il y a plusieurs groundtruths (plus de segments de texte), ça marche aussi? –

+0

1. Il fonctionne avec n'importe quelle langue 2. Il ne fonctionne pas pour plusieurs régions de texte sans rapport –

+0

Merci beaucoup pour votre réponse! –

0

Vous ne devriez pas utiliser directement le code ci-dessous:

"'image/encoded': _bytes_feature(img.tostring())," 

dans mon code, je writed comme suit:

_,jpegVector = cv2.imencode('.jpeg',img) 
    imgStr = jpegVector.tostring() 
    'image/encoded': _bytes_feature(imgStr)