def get_overfeat_features(imgs, weights_path, typ, layer=None, cache=None): """Returns features at layer for given image(s) from OverFeat model. Small (fast) network: 22 layers Large (accurate) network: 25 layers Args: imgs: Iterable of images each of shape (h,w,c) weights_path: Path to the OverFeat weights typ: 0 for small, 1 for large version of OverFeat layer: The layer to extract features from cache: Dict containing descs/other cached values """ if cache is None: cache = {} if 'overfeat_descs' not in cache: # Initialize network print('Loading OverFeat ({}) model...'.format(typ)) overfeat.init(weights_path, typ) # Determine feature layer if none specified if layer is None: if overfeat.get_n_layers() == 22: # small layer = 19 # 16 also recommended else: # large # Layer used by Zhang et al. layer = 22 # Determine resize dim if typ == 0: resize = 231 # small network else: resize = 221 # large network # Allocate for feature descriptors descs = [] # Run images through network print('Running images through OverFeat, extracting features ' 'at layer {}.'.format(layer)) for idx, img in enumerate(imgs): if (idx + 1) % 100 == 0: print('Processing image {}...'.format(idx + 1)) # Preprocess image img = overfeat_preprocess(img, resize) # Run through model _ = overfeat.fprop(img) # Retrieve feature output desc = overfeat.get_output(layer) descs.append(desc) # Free network overfeat.free() # NumPy-ify descs = np.asarray(descs) cache.update(overfeat_descs=descs) else: descs = cache['overfeat_descs'] return descs, cache
def run_overfeat(image, layer=None): ''' runs an image through overfeat. returns the 1,000-length likelihoods vector and N-length layer in the net as copied and formatted numpy arrays. layer None: means return 4,096-length feature vector just prior to the output layer. int: return that layer instead. ''' if not layer: # get layer just before output layer feature_layer = overfeat.get_n_layers() - 2 overfeat_likelihoods = overfeat.fprop(image) overfeat_features = overfeat.get_output(feature_layer) # flatten and copy. NOTE: copy() is intentional, don't delete. formatted_features = copy(overfeat_features.flatten()) formatted_likelihoods = copy(overfeat_likelihoods.flatten()) return formatted_likelihoods, formatted_features
def process_through_net(photo, feature_layer=None): if not feature_layer: feature_layer = overfeat.get_n_layers() - 2 likelihoods = copy(overfeat.fprop(photo).flatten()) features = copy(overfeat.get_output(feature_layer).flatten()) return likelihoods, features