Plot FiftyOne visualisations with Seaborn

Why

I wanted more customisation options to draw figures for my thesis paper. It took me a while to figure this out, so I thought I’d share.

How

I’m assuming you already have a FiftyOne dataset with computed embeddings and visualization. If not, you’ll need to create a dataset and compute the embeddings and visualization before proceeding.

I already have everything saved, so I load my dataset and the compute_visualization results before plotting:

<span>import</span> <span>fiftyone</span> <span>as</span> <span>fo</span>
<span># load dataset </span><span>dataset</span> <span>=</span> <span>fo</span><span>.</span><span>load_dataset</span><span>(</span><span>"dataset_name"</span><span>)</span>
<span># load computed visualisation </span><span>results</span> <span>=</span> <span>dataset</span><span>.</span><span>load_brain_results</span><span>(</span><span>"vis_name"</span><span>)</span>
<span>import</span> <span>fiftyone</span> <span>as</span> <span>fo</span>

<span># load dataset </span><span>dataset</span> <span>=</span> <span>fo</span><span>.</span><span>load_dataset</span><span>(</span><span>"dataset_name"</span><span>)</span>

<span># load computed visualisation </span><span>results</span> <span>=</span> <span>dataset</span><span>.</span><span>load_brain_results</span><span>(</span><span>"vis_name"</span><span>)</span>
import fiftyone as fo # load dataset dataset = fo.load_dataset("dataset_name") # load computed visualisation results = dataset.load_brain_results("vis_name")

Enter fullscreen mode Exit fullscreen mode

I have a sample field called “vehicle_type” that I want to use as the hue in my seaborn plot. To obtain this information for each sample, I wrote a simple function:

<span>def</span> <span>get_vehicle_type</span><span>(</span><span>sample_id</span><span>):</span>
<span>return</span> <span>dataset</span><span>[</span><span>sample_id</span><span>][</span><span>"vehicle_type"</span><span>]</span>
<span>def</span> <span>get_vehicle_type</span><span>(</span><span>sample_id</span><span>):</span>
    <span>return</span> <span>dataset</span><span>[</span><span>sample_id</span><span>][</span><span>"vehicle_type"</span><span>]</span>
def get_vehicle_type(sample_id): return dataset[sample_id]["vehicle_type"]

Enter fullscreen mode Exit fullscreen mode

Next, I convert results.points into a pandas DataFrame and fetch the “vehicle_type” information from the FiftyOne dataset.

<span>import</span> <span>pandas</span> <span>as</span> <span>pd</span>
<span>import</span> <span>seaborn</span> <span>as</span> <span>sns</span>
<span>import</span> <span>matplotlib.pyplot</span> <span>as</span> <span>plt</span>
<span># turn results.points into dataframe </span><span>df_viz</span> <span>=</span> <span>pd</span><span>.</span><span>DataFrame</span><span>(</span><span>results</span><span>.</span><span>points</span><span>,</span> <span>columns</span><span>=</span><span>[</span><span>"x"</span><span>,</span> <span>"y"</span><span>])</span>
<span># get sample ids for each sample </span><span>df_viz</span><span>[</span><span>"sample_id"</span><span>]</span> <span>=</span> <span>results</span><span>.</span><span>sample_ids</span>
<span># use sample id to get the sample field info I need </span><span>df_viz</span><span>[</span><span>"vehicle_type"</span><span>]</span> <span>=</span> <span>df_viz</span><span>[</span><span>"sample_id"</span><span>].</span><span>apply</span><span>(</span><span>get_vehicle_type</span><span>)</span>
<span>import</span> <span>pandas</span> <span>as</span> <span>pd</span>
<span>import</span> <span>seaborn</span> <span>as</span> <span>sns</span>
<span>import</span> <span>matplotlib.pyplot</span> <span>as</span> <span>plt</span>

<span># turn results.points into dataframe </span><span>df_viz</span> <span>=</span> <span>pd</span><span>.</span><span>DataFrame</span><span>(</span><span>results</span><span>.</span><span>points</span><span>,</span> <span>columns</span><span>=</span><span>[</span><span>"x"</span><span>,</span> <span>"y"</span><span>])</span>
<span># get sample ids for each sample </span><span>df_viz</span><span>[</span><span>"sample_id"</span><span>]</span> <span>=</span> <span>results</span><span>.</span><span>sample_ids</span>

<span># use sample id to get the sample field info I need </span><span>df_viz</span><span>[</span><span>"vehicle_type"</span><span>]</span> <span>=</span> <span>df_viz</span><span>[</span><span>"sample_id"</span><span>].</span><span>apply</span><span>(</span><span>get_vehicle_type</span><span>)</span>
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # turn results.points into dataframe df_viz = pd.DataFrame(results.points, columns=["x", "y"]) # get sample ids for each sample df_viz["sample_id"] = results.sample_ids # use sample id to get the sample field info I need df_viz["vehicle_type"] = df_viz["sample_id"].apply(get_vehicle_type)

Enter fullscreen mode Exit fullscreen mode

Finally, I plot the results using seaborn:

<span>sns</span><span>.</span><span>scatterplot</span><span>(</span><span>data</span><span>=</span><span>df_viz</span><span>,</span> <span>x</span><span>=</span><span>'x'</span><span>,</span> <span>y</span><span>=</span><span>'y'</span><span>,</span>
<span>hue</span><span>=</span><span>'vehicle_type'</span><span>,</span> <span>palette</span><span>=</span><span>'mako_r'</span><span>,</span>
<span>alpha</span><span>=</span><span>.</span><span>9</span><span>,</span> <span>s</span><span>=</span><span>1</span><span>,</span> <span>edgecolor</span><span>=</span><span>'none'</span><span>)</span>
<span>plt</span><span>.</span><span>title</span><span>(</span><span>'Image Uniqueness'</span><span>)</span>
<span>plt</span><span>.</span><span>axis</span><span>(</span><span>'off'</span><span>)</span>
<span>plt</span><span>.</span><span>show</span><span>()</span>
<span>sns</span><span>.</span><span>scatterplot</span><span>(</span><span>data</span><span>=</span><span>df_viz</span><span>,</span> <span>x</span><span>=</span><span>'x'</span><span>,</span> <span>y</span><span>=</span><span>'y'</span><span>,</span> 
<span>hue</span><span>=</span><span>'vehicle_type'</span><span>,</span> <span>palette</span><span>=</span><span>'mako_r'</span><span>,</span> 
<span>alpha</span><span>=</span><span>.</span><span>9</span><span>,</span> <span>s</span><span>=</span><span>1</span><span>,</span> <span>edgecolor</span><span>=</span><span>'none'</span><span>)</span>
<span>plt</span><span>.</span><span>title</span><span>(</span><span>'Image Uniqueness'</span><span>)</span>
<span>plt</span><span>.</span><span>axis</span><span>(</span><span>'off'</span><span>)</span>
<span>plt</span><span>.</span><span>show</span><span>()</span>
sns.scatterplot(data=df_viz, x='x', y='y', hue='vehicle_type', palette='mako_r', alpha=.9, s=1, edgecolor='none') plt.title('Image Uniqueness') plt.axis('off') plt.show()

Enter fullscreen mode Exit fullscreen mode

Seaborn allows for greater control over the appearance of the plot. Since I don’t need the plot to be interactive, this is the perfect solution for creating uniform plots for my paper.

Final result

Extra: compute embeddings and visualisation

<span>import</span> <span>fiftyone.zoo</span> <span>as</span> <span>foz</span>
<span># compute embeddings </span><span>model</span> <span>=</span> <span>foz</span><span>.</span><span>load_zoo_model</span><span>(</span><span>"mobilenet-v2-imagenet-torch"</span><span>)</span>
<span>embeddings</span> <span>=</span> <span>dataset</span><span>.</span><span>compute_embeddings</span><span>(</span><span>model</span><span>)</span>
<span># pickle embeddings for later use, this the computation takes a while </span><span>with</span> <span>open</span><span>(</span><span>'embeddings.pkl'</span><span>,</span> <span>'wb'</span><span>)</span> <span>as</span> <span>file</span><span>:</span>
<span>pickle</span><span>.</span><span>dump</span><span>(</span><span>embeddings</span><span>,</span> <span>file</span><span>)</span>
<span># Compute visualization </span><span>results</span> <span>=</span> <span>fob</span><span>.</span><span>compute_visualization</span><span>(</span>
<span>dataset</span><span>,</span> <span>embeddings</span><span>=</span><span>embeddings</span><span>,</span> <span>seed</span><span>=</span><span>42</span><span>,</span> <span>brain_key</span><span>=</span><span>"vis_name"</span>
<span>)</span>
<span>import</span> <span>fiftyone.zoo</span> <span>as</span> <span>foz</span>

<span># compute embeddings </span><span>model</span> <span>=</span> <span>foz</span><span>.</span><span>load_zoo_model</span><span>(</span><span>"mobilenet-v2-imagenet-torch"</span><span>)</span>
<span>embeddings</span> <span>=</span> <span>dataset</span><span>.</span><span>compute_embeddings</span><span>(</span><span>model</span><span>)</span>

<span># pickle embeddings for later use, this the computation takes a while </span><span>with</span> <span>open</span><span>(</span><span>'embeddings.pkl'</span><span>,</span> <span>'wb'</span><span>)</span> <span>as</span> <span>file</span><span>:</span>
    <span>pickle</span><span>.</span><span>dump</span><span>(</span><span>embeddings</span><span>,</span> <span>file</span><span>)</span>

<span># Compute visualization </span><span>results</span> <span>=</span> <span>fob</span><span>.</span><span>compute_visualization</span><span>(</span>
    <span>dataset</span><span>,</span> <span>embeddings</span><span>=</span><span>embeddings</span><span>,</span> <span>seed</span><span>=</span><span>42</span><span>,</span> <span>brain_key</span><span>=</span><span>"vis_name"</span>
<span>)</span>
import fiftyone.zoo as foz # compute embeddings model = foz.load_zoo_model("mobilenet-v2-imagenet-torch") embeddings = dataset.compute_embeddings(model) # pickle embeddings for later use, this the computation takes a while with open('embeddings.pkl', 'wb') as file: pickle.dump(embeddings, file) # Compute visualization results = fob.compute_visualization( dataset, embeddings=embeddings, seed=42, brain_key="vis_name" )

Enter fullscreen mode Exit fullscreen mode

原文链接:Plot FiftyOne visualisations with Seaborn

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
Death comes to all, but great achievements raise a monument which shall endure until the sun grows old.
死亡无人能免,但非凡的成就会树起一座纪念碑,它将一直立到太阳冷却之时
评论 抢沙发

请登录后发表评论

    暂无评论内容