计算机视觉提示和技巧(一)
2023年06月27日 由 Alex 发表
746934
0
在之前文章中,也讲到过计算机视觉这一部分,今天来讲一讲计算机视觉提示和技巧。
FiftyOne是什么?
FiftyOne是一个开源机器学习工具集,它使数据科学团队能够通过帮助他们管理高质量的数据集、评估模型、发现错误、可视化嵌入并更快地投入生产,从而提高计算机视觉模型的性能。
上图显示已经使它启动和运行。
接下来,让我们深入了解下计算机视觉提示和技巧。
预填充面板在FiftyOne应用程序
问:“在启动FiftyOne应用程序时是否有自动打开面板的方法?”
在这里指的是FiftyOne应用程序中的Spaces和Panels。从 FiftyOne 0.19 版本开始,可以通过Spaces在FiftyOne应用程序中进行全面自定义。可以通过应用程序中的图形界面或通过SDK进行设置。互动绘图模块(如直方图和嵌入图)现在被表示为面板,样本网格本身也是面板的一部分。此外,你还可以通过创建自己的面板使用FiftyOne插件来进一步自定义应用程序的外观!
要配置FiftyOne应用程序,使其在启动时显示一个面板,你可以在Python中设置fiftyone.Space和fiftyone.Panel类的属性。无论你使用的是内置面板还是插件,都是如此。
如果你希望FiftyOne应用程序在启动时显示样本并在下方显示标签的直方图,你可以通过创建具有垂直排列的类型为Samples和Histograms的fo.Panel对象的fo.Space对象来指定:
samples_panel = fo.Panel(type="Samples", pinned=True)
histograms_panel = fo.Panel(
type="Histograms",
state=dict(plot="Labels"),
)
spaces = fo.Space(
children=[samples_panel, histograms_panel],
orientation="vertical",
)
然后通过spaces参数将这个配置传递给for .launch_app():
session = fo.launch_app(dataset, spaces = spaces)
对于Quickstart数据集,FiftyOne应用程序的显示如下所示:
从新的Python进程访问FiftyOne会话
问:“有没有一个函数可以返回FiftyOne中的活动会话?例如,我想从终端启动一个会话,然后从Jupyter笔记本中访问该会话。这可行吗?”
是的,这是完全可能的。如果你从一个终端或笔记本在session = fo.launch_app(dataset, port=5151)中启动一个应用程序会话,然后在另一个终端或笔记本中指向相同的端口,那么会话将是相同的;具体来说,session = fo.launch_app(port=5151)将使你能够访问同一个会话。
你可以通过在Python解释器或笔记本单元中打印会话对象来进行测试。你应该可以获得完全相同的信息,包括标识符。
尝试的几个简单方法是在应用程序中选择一个样本,然后打印session.selected,或者在应用程序中打开直方图面板,并打印session.spaces。
通过嵌入补丁进行样本过滤
问:“大家好!我正在为对象补丁计算嵌入,然后使用fob.compute_visualization(dataset, patches_field='predictions', model=model, brain_key='prediction_viz')在FiftyOne应用程序中可视化这些对象补丁嵌入,但是该方法会导致一个填充有完整图像样本的样本面板。在通过lasso工具在嵌入面板中选择对象补丁之后,是否可以在样本面板中显示对象补丁的图像?”
问得好,在样本面板中显示的图像取决于FiftyOne应用程序会话设置的DatasetView。如果你将会话设置为PatchesView,那么网格将填充对象补丁。另一方面,当你使用session = fo.launch_app(dataset)简单地启动一个应用程序会话时,DatasetView会根据数据集隐式设置,并且网格将填充图像。
下面是如何在FiftyOne应用程序中实现你要查看的视图的示例:
import fiftyone as fo
import fiftyone.brain as fob
import fiftyone.zoo as foz
dataset = foz.load_zoo_dataset("quickstart")
model = foz.load_zoo_model("resnet50-imagenet-torch")
patch_view = dataset.to_patches("ground_truth")
patch_view.compute_patch_embeddings(
model,
'ground_truth',
embeddings_field="resnet"
)
fob.compute_visualization(
dataset,
patches_field='ground_truth',
embeddings=resnet,
brain_key='umap',
num_dims=2,
method='umap'
)
session = fo.launch_app(patch_view)
在FiftyOne中使用正则表达式筛选字符串
问:“大家好!我正在尝试获取文件路径包含特定字符串的样本。在我特定的情况下,我想找到文件路径中包含字符串 'TnFoV_record_08_07_2022_07_40_22/TnFoV_record_08_07_2022_07_40_22-frame0004878.png' 的样本。我是否可以在不显式循环遍历数据集中的所有样本的情况下实现这一点?”
这是一个很好的问题。在你的特定情况下,看起来你想检查文件路径是否以给定字符串结尾,因此可以使用在FiftyOne表达式上操作的ends_with()方法来检查所需的条件。
以下是在你的示例中实现此功能的代码:
from fiftyone import ViewField as F
query_str = TnFoV_record_08_07_2022_07_40_22/TnFoV_record_08_07_2022_07_40_22-frame0004878.png
sample = dataset.match(F("filepath").ends_with(query_str)).first()
如果你目标样本的文件路径不以查询字符串结尾,但仍然包含字符串,你可以使用contains_str()方法检查此条件。例如:
import fiftyone as fo
import fiftyone.zoo as foz
from fiftyone import ViewField as F
dataset = foz.load_zoo_dataset("quickstart")
## 检索文件路径中包含字符串“84”的样本样本
samples84 = dataset.match(F("filepath").contains_str("84"))
更一般地说,FiftyOne通过re_match()方法支持StringField对象上的类似正则表达式模式匹配的功能。
在FiftyOne中更新文件扩展名
问:“我想将数据集中的样本的filepath字段的扩展名从PNG更新为JPG。我希望能够在不逐个迭代遍历所有样本的情况下实现。这可行吗?”
是的,绝对可以!大多数情况下,当你想在数据集中的所有样本上更新字段时,通常有一种更高效的方法,而不是迭代所有样本。通常,这涉及到set_field()或set_values()方法。
这种情况下,你可以使用Values Aggregation来获取所有样本的文件路径列表,更改列表中的这些文件路径,然后使用set_values()将更新后的值设置为filepath字段:
import fiftyone as fo
import fiftyone.zoo as foz
dataset = foz.load_zoo_dataset("quickstart")
## 获取文件路径列表
fps = dataset.values("filepath")
## 更改列表中的文件扩展
fps = list(map(lambda x: x.replace("png", "jpg"), fps))
## 使用新值设置文件路径字段
dataset.set_values('filepath',fps)
来源:https://medium.com/voxel51/fiftyone-computer-vision-tips-and-tricks-mar-24-2023-be238cd7da5b