web-dev-qa-db-fra.com

Comment créer un jeu de données dans le même format que le jeu de données FSNS?

Je travaille sur ce projet basé sur TensorFlow.

Je veux juste former un modèle OCR avec 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.

Est-ce que quelqu'un travaille également sur ce projet ou sait comment résoudre ce problème?

4
Jianbo Wang

Le format de données pour stocker la formation/le 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 un bon tutoriel , un réponse existant sur le stackoverflow et un short Gist .

Supposons que vous avez un numpy ndarray img qui contient des images num_of_views côte à côte (voir la figure 3 dans le papier ): enter image description here et un texte correspondant dans une variable text. Vous devrez définir une fonction pour convertir une chaîne unicode en une liste d'identificateurs de caractère complétée à une longueur fixe et non complétée. 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 les fonctions _int64_feature et _bytes_feature définies dans le Gist , vous pouvez créer un proto compatible FSNS avec exemple avec le fragment 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)
  }
))
12
Alexander Gorban

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

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

Dans mon code, j'ai écrit ceci:

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