def make_conv_weight_image(all_weights, limit=144): """ just makes the image ndarray of the weights """ import vtool as vt # Try to infer if use_color should be shown num, channels, height, width = all_weights.shape # Try to infer if use_color should be shown use_color = (channels == 3) # non-use_color features need to be flattened if not use_color: all_weights_ = all_weights.reshape(num * channels, height, width, 1) else: # convert from theano to cv2 BGR all_weights_ = utils.convert_theano_images_to_cv2_images(all_weights) # convert from BGR to RGB all_weights_ = all_weights_[..., ::-1] #cv2.cvtColor(all_weights_[-1], cv2.COLOR_BGR2RGB) # Limit all_weights_ #num = all_weights_.shape[0] num, height, width, channels = all_weights_.shape if limit is not None and num > limit: all_weights_ = all_weights_[:limit] num = all_weights_.shape[0] # Convert weight values to image values normalize_individually = False if normalize_individually: # Normalize each feature individually all_max = vt.multiaxis_reduce(np.amax, all_weights_, startaxis=1) all_min = vt.multiaxis_reduce(np.amin, all_weights_, startaxis=1) all_domain = all_max - all_min extra_dims = (None,) * (len(all_weights_.shape) - 1) broadcaster = (slice(None),) + extra_dims all_features = ((all_weights_ - all_min[broadcaster]) * (255.0 / all_domain[broadcaster])).astype(np.uint8) else: # Normalize jointly across all filters _max = all_weights_.max() _min = all_weights_.min() _domain = _max - _min all_features = ((all_weights_ - _min) * (255.0 / _domain)).astype(np.uint8) #import scipy.misc # resize feature, give them a border, and stack them together new_height, new_width = max(32, height), max(32, width) nbp_ = 1 # num border pixels _resized_features = np.array([ cv2.resize(img, (new_width, new_height), interpolation=cv2.INTER_NEAREST) for img in all_features ]) resized_features = _resized_features.reshape( num, new_height, new_width, channels) border_shape = (num, new_height + (nbp_ * 2), new_width + (nbp_ * 2), channels) bordered_features = np.zeros(border_shape, dtype=resized_features.dtype) bordered_features[:, nbp_:-nbp_, nbp_:-nbp_, :] = resized_features #img_list = bordered_features stacked_img = vt.stack_square_images(bordered_features) return stacked_img
def render_vocab(vocab): """ Renders the average patch of each word. This is a quick visualization of the entire vocabulary. CommandLine: python -m wbia.algo.smk.vocab_indexer render_vocab --show Example: >>> # DISABLE_DOCTEST >>> from wbia.algo.smk.vocab_indexer import * # NOQA >>> vocab = testdata_vocab('PZ_MTEST', num_words=64) >>> all_words = vocab.render_vocab() >>> ut.quit_if_noshow() >>> import wbia.plottool as pt >>> pt.qt4ensure() >>> pt.imshow(all_words) >>> ut.show_if_requested() """ import wbia.plottool as pt wx_list = list(range(len(vocab))) # wx_list = ut.strided_sample(wx_list, 64) wx_list = ut.strided_sample(wx_list, 64) word_patch_list = [] for wx in ut.ProgIter(wx_list, bs=True, lbl='building patches'): word = vocab.wx_to_word[wx] word_patch = vt.inverted_sift_patch(word, 64) word_patch = pt.render_sift_on_patch(word_patch, word) word_patch_list.append(word_patch) all_words = vt.stack_square_images(word_patch_list) return all_words
def visualize_vocab_word(ibs, invassign, wx, fnum=None): """ Example: >>> from ibeis.new_annots import * # NOQA >>> import plottool as pt >>> pt.qt4ensure() >>> ibs, aid_list, vocab = testdata_vocab() >>> #aid_list = aid_list[0:1] >>> fstack = StackedFeatures(ibs, aid_list) >>> nAssign = 2 >>> invassign = fstack.inverted_assignment(vocab, nAssign) >>> sortx = ut.argsort(invassign.num_list)[::-1] >>> wx_list = ut.take(invassign.wx_list, sortx) >>> wx = wx_list[0] """ import plottool as pt pt.qt4ensure() vecs = invassign.get_vecs(wx) word = invassign.vocab.wx2_word[wx] word_patches = invassign.get_patches(wx) average_patch = np.mean(word_patches, axis=0) average_vec = vecs.mean(axis=0) average_vec = word word with_sift = True fnum = 2 fnum = pt.ensure_fnum(fnum) if with_sift: patch_img = pt.render_sift_on_patch(average_patch, average_vec) #sift_word_patches = [pt.render_sift_on_patch(patch, vec) for patch, vec in ut.ProgIter(list(zip(word_patches, vecs)))] #stacked_patches = vt.stack_square_images(word_patches) #stacked_patches = vt.stack_square_images(sift_word_patches) else: patch_img = average_patch stacked_patches = vt.stack_square_images(word_patches) solidbar = np.zeros((patch_img.shape[0], int(patch_img.shape[1] * .1), 3), dtype=patch_img.dtype) border_color = (100, 10, 10) # bgr, darkblue if ut.is_float(solidbar): solidbar[:, :, :] = (np.array(border_color) / 255)[None, None] else: solidbar[:, :, :] = np.array(border_color)[None, None] word_img = vt.stack_image_list([patch_img, solidbar, stacked_patches], vert=False, modifysize=True) pt.imshow(word_img, fnum=fnum) #pt.imshow(patch_img, pnum=(1, 2, 1), fnum=fnum) #patch_size = 64 #half_size = patch_size / 2 #pt.imshow(stacked_patches, pnum=(1, 2, 2), fnum=fnum) pt.iup()
def render_inverted_vocab(inva, ibs, use_data=False): """ Renders the average patch of each word. This is a visualization of the entire vocabulary. CommandLine: python -m wbia.algo.smk.inverted_index render_inverted_vocab --show python -m wbia.algo.smk.inverted_index render_inverted_vocab --show --use-data python -m wbia.algo.smk.inverted_index render_inverted_vocab --show --debug-depc Example: >>> # DISABLE_DOCTEST >>> from wbia.algo.smk.inverted_index import * # NOQA >>> qreq_, inva = testdata_inva() >>> ibs = qreq_.ibs >>> all_words = inva.render_inverted_vocab(ibs) >>> ut.quit_if_noshow() >>> import wbia.plottool as pt >>> pt.qt4ensure() >>> pt.imshow(all_words) >>> ut.show_if_requested() """ import wbia.plottool as pt # Get words with the most assignments vocab = ibs.depc['vocab'].get_row_data([inva.vocab_rowid], 'words')[0] wx_list = ut.strided_sample(inva.wx_list, 64) word_patch_list = [] for wx in ut.ProgIter(wx_list, bs=True, lbl='building patches'): word = vocab.wx_to_word[wx] word_patch = inva.get_word_patch(wx, ibs) word_patch = pt.render_sift_on_patch(word_patch, word) word_patch_list.append(word_patch) all_words = vt.stack_square_images(word_patch_list) return all_words
def make_wordfigures(ibs, metrics, invindex, figdir, wx_sample, wx2_dpath): """ Builds mosaics of patches assigned to words in sample ouptuts them to disk """ from plottool import draw_func2 as df2 import vtool as vt import parse vocabdir = join(figdir, 'vocab_patches2') ut.ensuredir(vocabdir) dump_word_patches(ibs, vocabdir, invindex, wx_sample, metrics) # COLLECTING PART --- collects patches in word folders #vocabdir seldpath = vocabdir + '_selected' ut.ensurepath(seldpath) # stack for show for wx, dpath in ut.progiter(six.iteritems(wx2_dpath), lbl='Dumping Word Images:', num=len(wx2_dpath), freq=1, backspace=False): #df2.rrr() fpath_list = ut.ls(dpath) fname_list = [basename(fpath_) for fpath_ in fpath_list] patch_list = [vt.imread(fpath_) for fpath_ in fpath_list] # color each patch by nid nid_list = [ int(parse.parse('{}_nid={nid}_{}', fname)['nid']) for fname in fname_list ] nid_set = set(nid_list) nid_list = np.array(nid_list) if len(nid_list) == len(nid_set): # no duplicate names newpatch_list = patch_list else: # duplicate names. do coloring sortx = nid_list.argsort() patch_list = np.array(patch_list, dtype=object)[sortx] fname_list = np.array(fname_list, dtype=object)[sortx] nid_list = nid_list[sortx] colors = (255 * np.array(df2.distinct_colors(len(nid_set)))).astype( np.int32) color_dict = dict(zip(nid_set, colors)) wpad, hpad = 3, 3 newshape_list = [ tuple( (np.array(patch.shape) + (wpad * 2, hpad * 2, 0)).tolist()) for patch in patch_list ] color_list = [color_dict[nid_] for nid_ in nid_list] newpatch_list = [ np.zeros(shape) + color[None, None] for shape, color in zip(newshape_list, color_list) ] for patch, newpatch in zip(patch_list, newpatch_list): newpatch[wpad:-wpad, hpad:-hpad, :] = patch #img_list = patch_list #bigpatch = vt.stack_image_recurse(patch_list) #bigpatch = vt.stack_image_list(patch_list, vert=False) bigpatch = vt.stack_square_images(newpatch_list) bigpatch_fpath = join(seldpath, basename(dpath) + '_patches.png') # def _dictstr(dict_): str_ = ut.dict_str(dict_, newlines=False) str_ = str_.replace('\'', '').replace(': ', '=').strip('{},') return str_ figtitle = '\n'.join([ 'wx=%r' % wx, 'stat(pdist): %s' % _dictstr(metrics.wx2_pdist_stats[wx]), 'stat(wdist): %s' % _dictstr(metrics.wx2_wdist_stats[wx]), ]) metrics.wx2_nMembers[wx] df2.figure(fnum=1, doclf=True, docla=True) fig, ax = df2.imshow(bigpatch, figtitle=figtitle) #fig.show() df2.set_figtitle(figtitle) df2.adjust_subplots(top=.878, bottom=0) df2.save_figure(1, bigpatch_fpath)
def make_wordfigures(ibs, metrics, invindex, figdir, wx_sample, wx2_dpath): """ Builds mosaics of patches assigned to words in sample ouptuts them to disk """ from plottool import draw_func2 as df2 import vtool as vt import parse vocabdir = join(figdir, 'vocab_patches2') ut.ensuredir(vocabdir) dump_word_patches(ibs, vocabdir, invindex, wx_sample, metrics) # COLLECTING PART --- collects patches in word folders #vocabdir seldpath = vocabdir + '_selected' ut.ensurepath(seldpath) # stack for show for wx, dpath in ut.progiter(six.iteritems(wx2_dpath), lbl='Dumping Word Images:', num=len(wx2_dpath), freq=1, backspace=False): #df2.rrr() fpath_list = ut.ls(dpath) fname_list = [basename(fpath_) for fpath_ in fpath_list] patch_list = [gtool.imread(fpath_) for fpath_ in fpath_list] # color each patch by nid nid_list = [int(parse.parse('{}_nid={nid}_{}', fname)['nid']) for fname in fname_list] nid_set = set(nid_list) nid_list = np.array(nid_list) if len(nid_list) == len(nid_set): # no duplicate names newpatch_list = patch_list else: # duplicate names. do coloring sortx = nid_list.argsort() patch_list = np.array(patch_list, dtype=object)[sortx] fname_list = np.array(fname_list, dtype=object)[sortx] nid_list = nid_list[sortx] colors = (255 * np.array(df2.distinct_colors(len(nid_set)))).astype(np.int32) color_dict = dict(zip(nid_set, colors)) wpad, hpad = 3, 3 newshape_list = [tuple((np.array(patch.shape) + (wpad * 2, hpad * 2, 0)).tolist()) for patch in patch_list] color_list = [color_dict[nid_] for nid_ in nid_list] newpatch_list = [np.zeros(shape) + color[None, None] for shape, color in zip(newshape_list, color_list)] for patch, newpatch in zip(patch_list, newpatch_list): newpatch[wpad:-wpad, hpad:-hpad, :] = patch #img_list = patch_list #bigpatch = vt.stack_image_recurse(patch_list) #bigpatch = vt.stack_image_list(patch_list, vert=False) bigpatch = vt.stack_square_images(newpatch_list) bigpatch_fpath = join(seldpath, basename(dpath) + '_patches.png') # def _dictstr(dict_): str_ = ut.dict_str(dict_, newlines=False) str_ = str_.replace('\'', '').replace(': ', '=').strip('{},') return str_ figtitle = '\n'.join([ 'wx=%r' % wx, 'stat(pdist): %s' % _dictstr(metrics.wx2_pdist_stats[wx]), 'stat(wdist): %s' % _dictstr(metrics.wx2_wdist_stats[wx]), ]) metrics.wx2_nMembers[wx] df2.figure(fnum=1, doclf=True, docla=True) fig, ax = df2.imshow(bigpatch, figtitle=figtitle) #fig.show() df2.set_figtitle(figtitle) df2.adjust_subplots(top=.878, bottom=0) df2.save_figure(1, bigpatch_fpath)
def render_inverted_vocab_word(inva, wx, ibs, fnum=None): """ Creates a visualization of a visual word. This includes the average patch, the SIFT-like representation of the centroid, and some of the patches that were assigned to it. CommandLine: python -m wbia.algo.smk.inverted_index render_inverted_vocab_word --show Example: >>> # DISABLE_DOCTEST >>> from wbia.algo.smk.inverted_index import * # NOQA >>> import wbia.plottool as pt >>> qreq_, inva = testdata_inva() >>> ibs = qreq_.ibs >>> wx_list = list(inva.wx_to_aids.keys()) >>> wx = wx_list[0] >>> ut.qtensure() >>> fnum = 2 >>> fnum = pt.ensure_fnum(fnum) >>> # Interactive visualization of many words >>> for wx in ut.InteractiveIter(wx_list): >>> word_img = inva.render_inverted_vocab_word(wx, ibs, fnum) >>> pt.imshow(word_img, fnum=fnum, title='Word %r/%r' % (wx, '?')) >>> pt.update() """ import wbia.plottool as pt # Create the contributing patch image word_patches = inva.get_patches(wx, ibs) word_patches_ = ut.strided_sample(word_patches, 64) stacked_patches = vt.stack_square_images(word_patches_) # Create the average word image vocab = ibs.depc['vocab'].get_row_data([inva.vocab_rowid], 'words')[0] word = vocab.wx_to_word[wx] average_patch = np.mean(word_patches, axis=0) # vecs = inva.get_vecs(wx) # assert np.allclose(word, vecs.mean(axis=0)) with_sift = True if with_sift: patch_img = pt.render_sift_on_patch(average_patch, word) else: patch_img = average_patch # Stack them together solidbar = np.zeros( (patch_img.shape[0], int(patch_img.shape[1] * 0.1), 3), dtype=patch_img.dtype, ) border_color = (100, 10, 10) # bgr, darkblue if ut.is_float(solidbar): solidbar[:, :, :] = (np.array(border_color) / 255)[None, None] else: solidbar[:, :, :] = np.array(border_color)[None, None] patch_img2 = vt.inverted_sift_patch(word) # Fix types patch_img = vt.rectify_to_uint8(patch_img) patch_img2 = vt.rectify_to_uint8(patch_img2) solidbar = vt.rectify_to_uint8(solidbar) stacked_patches = vt.rectify_to_uint8(stacked_patches) # Stack everything together patch_img2, patch_img = vt.make_channels_comparable(patch_img2, patch_img) img_list = [patch_img, solidbar, patch_img2, solidbar, stacked_patches] word_img = vt.stack_image_list(img_list, vert=False, modifysize=True) return word_img