-
Notifications
You must be signed in to change notification settings - Fork 3.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
28dbe28
commit d42ae4f
Showing
2 changed files
with
122 additions
and
88 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
# pylint: disable=invalid-name, unused-variable, unused-argument, no-init | ||
""" | ||
Compile Tensorflow Models | ||
========================= | ||
Some helper definitions for tensorflow models. | ||
""" | ||
import re | ||
|
||
# Tensorflow imports | ||
import tensorflow as tf | ||
|
||
###################################################################### | ||
# Some helper functions | ||
# --------------------- | ||
|
||
class NodeLookup(object): | ||
"""Converts integer node ID's to human readable labels.""" | ||
|
||
def __init__(self, | ||
label_lookup_path=None, | ||
uid_lookup_path=None): | ||
self.node_lookup = self.load(label_lookup_path, uid_lookup_path) | ||
|
||
def load(self, label_lookup_path, uid_lookup_path): | ||
"""Loads a human readable English name for each softmax node. | ||
Parameters | ||
---------- | ||
label_lookup_path: String | ||
File containing String UID to integer node ID mapping . | ||
uid_lookup_path: String | ||
File containing String UID to human-readable string mapping. | ||
Returns | ||
------- | ||
node_id_to_name : dict | ||
dict from integer node ID to human-readable string. | ||
""" | ||
if not tf.gfile.Exists(uid_lookup_path): | ||
tf.logging.fatal('File does not exist %s', uid_lookup_path) | ||
if not tf.gfile.Exists(label_lookup_path): | ||
tf.logging.fatal('File does not exist %s', label_lookup_path) | ||
|
||
# Loads mapping from string UID to human-readable string | ||
proto_as_ascii_lines = tf.gfile.GFile(uid_lookup_path).readlines() | ||
uid_to_human = {} | ||
p = re.compile(r'[n\d]*[ \S,]*') | ||
for line in proto_as_ascii_lines: | ||
parsed_items = p.findall(line) | ||
uid = parsed_items[0] | ||
human_string = parsed_items[2] | ||
uid_to_human[uid] = human_string | ||
|
||
# Loads mapping from string UID to integer node ID. | ||
node_id_to_uid = {} | ||
proto_as_ascii = tf.gfile.GFile(label_lookup_path).readlines() | ||
for line in proto_as_ascii: | ||
if line.startswith(' target_class:'): | ||
target_class = int(line.split(': ')[1]) | ||
if line.startswith(' target_class_string:'): | ||
target_class_string = line.split(': ')[1] | ||
node_id_to_uid[target_class] = target_class_string[1:-2] | ||
|
||
# Loads the final mapping of integer node ID to human-readable string | ||
node_id_to_name = {} | ||
for key, val in node_id_to_uid.items(): | ||
if val not in uid_to_human: | ||
tf.logging.fatal('Failed to locate: %s', val) | ||
name = uid_to_human[val] | ||
node_id_to_name[key] = name | ||
|
||
return node_id_to_name | ||
|
||
def id_to_string(self, node_id): | ||
if node_id not in self.node_lookup: | ||
return '' | ||
return self.node_lookup[node_id] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters