0%

1. 概述

论文地址:arxiv
代码地址:ml-fastvit

FastViT 是苹果公司在 ICCV 2023上发表的网络结构设计的论文,在速度和精度上取得比较好的折衷,速度上既能和MobileOne这种轻量级网络匹敌,精度上也不输PoolFormer、ConvNeXt等比较新的大网络结构。

阅读全文 »

1. 背景

用Python跑有大量数据的任务的时候,启用多进程加速效果明显。但因为我之前在使用Python的多进程库时总遇到卡住的问题,后来对这块避而远之,总是用别的方法来加速。最近发现OpenMMLab的一些库提供了多进程并行的函数功能,简单好用。比如一个简单的toy例子,OpenCV读图像,resize然后保存,在8个CPU核的 Mac 上,加速比能达到3.4倍(45ms vs 13ms),也就是以前要跑3个多小时的任务,现在1个小时就能搞定,省了不少时间,更多实际例子也证明了这个函数的加速效果,还是挺实用的。这里写个教程,希望也能方便到别的有同样需要的人,当然同类型的库应该也有很多,这里只是取一瓢饮。

阅读全文 »

1. 引入

git clean 是用来删除 git 仓库中没有被跟踪的文件的命令,在想要快速清理 git 仓库(比如,删除仓库中所有没有跟踪的文件,清除编译生成的临时文件)时很有用。是相比别的git子命令, git clean的配置选项比较少,使用起来简单一些,这里写一个简要教程。
友情提示:git clean真的会删除文件,而且没法用git命令来恢复(因为没有被 git 跟踪),所以使用git clean前务必慎重,建议每次删除文件之前先加--dry-run 选项来验证会删除哪些文件,确保没有误删。

阅读全文 »

1. 概述

前些天 Meta 公司发布了 DINOv2 视觉预训练模型。DINOv2 能够高效地提出图像中的特征,提取的特征可以直接用于像分类等任务,而且只需要一个简单的线性层就能取得比较好的结果。

为了展示 DINOv2 强大的特征提取能力, Meta 提供了一个在线 Demo,上传一张图片,就能从一些艺术画作中检索出最相似的作品。

拿随手拍的照片体验后,DINOv2 特征提取能力确实强大,能够准确地理解图片中的语义信息。

由于 DINOv2 预训练模型是开源的,因为基于它来测试实际的效果是可行的。比如,我想找到相册中跟某张照片最相似的图片,就可以用 DINOv2 来测试照片和相册中所有照片的特征,然后计算相册中照片特征与测试照片最相近的那一张,就是我想要的。

整体思路是很简单直接的,经过一天的开发,终于完成了一个相对完善的Python工具 dinov2_retrieval,能够检索若干张图片在测试数据集中最相似的图。

写完后拿最近拍的一些随机照片跑了一下,检索结果还是挺不错的。最左边是测试图片,右边的5张图是在[Caltech 256](Caltech 256)数据集中检索得到的top5相似的图像:









通过和ResNet50预训练模型提取的特征做检索对比,发现 DINOv2 提取的特征还是更准确一些,检索结果也更好。

后面部分详细说说这个工具 dinov2_retrieval 的使用。

阅读全文 »

1. git diff 常规用法

git diff 可以用来比较在git仓库中的两次提交或两个文件的diff,常见用法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 显示当前代码与最新commit的代码之间的差别
git diff

# 显示暂存(也就是已经git add 但还没有git commit)的代码提交
git diff --staged

# 显示当前代码与<commit-id>时代码的区别
git diff <commit-id>

# 显示暂存代码与<commit-id>时代码的区别
git diff --staged <commit-id>

# 显示两次commit-id之间的代码区别
git diff <commit-id1> <commit-id2>

# 显示当前分支与 branch1 分支上的代码区别
git diff <branch1>

# 显示两个分支上的代码之间的区别
git diff <branch1> <branch2>

所有上述命令后面都可以加一个目录或文件路径来只显示这个目录或文件中的区别:

1
2
3
4
5
6
git diff /path/to/folder

git diff /path/to/file.py

# 也可用git的参数终止符号--,避免文件名和参数重名时将文件名解析为参数
git diff -- /path/to/file.py
阅读全文 »

1. std::optional 是什么

C++ 17 引入了std::optional,表示一个可能有值的对象(没有值时就是默认的std::nullopt),例如这个例子中,std::optional 对象 even_value,如果is_even 为真的话就是128,否则就是默认值std::nullopt:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <optiona>

bool is_even = true;

// 在 没有值的情况下 std::optional 对象的值为 std::nullopt
std::optional<int> even_value = is_even ? std::optional<int>(128) : std::nullopt;

// 可以用 std::optional 对象是否等于 std::nullopt 来判断 std::optional 对象是否有值
if (even_value != std::nullopt) {
// 采用.value 获取 std::optional 对象的值
std::cout << "has value, which is " << even_value.value() << std::endl;
} else {
std::cout << "no value" << std::endl;
}

其实std::optional的作用和Python里面的None比较像,例如上面的例子用Python来写就是这样:

1
2
3
4
5
6
is_even = True
even_value = 128 if is_even else None
if even_value is not None:
print("has value, which is", even_value)
else:
print("no value")
阅读全文 »

在这篇文章中,我们对如何使用Libtorch进行MNIST分类模型的训练和测试进行详细描述。首先会浏览官方MNIST示例,然后对其进行模块化重构,为后续别的模型的训练提供 codebase。

由于Libtorch中包含很多和Pytorch中没有的类型,所以看Libtorch代码的时候时常会遇到不了解的函数或者类,这时候可以在这里查找对应的类的实现,了解其作用。Libtorch C++ 代码中的注释虽然不多但基本够用了。

这里列举一些常见的类的代码路径,方便查询:

阅读全文 »

1. 概述

neoformat 是 (Neo)Vim 的代码格式化插件,支持多种语言的格式化。这篇文章覆盖 Neoformat 对 Python 和 C++ 进行格式化的配置,以及如何在保存代码时自动进行格式化,可以直接应用的配置代码段在文章最后。

阅读全文 »

Homebrew 是 macOS 下的默认的包管理器,不需要sudo权限就可以安装包,比较好用。

不过用brew install安装包时有个问题,它默认会先执行brew update来更新brew的版本。但由于brew 的源国内访问比较慢,常常brew update执行耗时比较久,影响每次安装包的体验。

解决办法是设置HOMEBREW_NO_AUTO_UPDATE环境变量为1,这样每次brew install时跳过更新brew的步骤,实际体验安装包速度提升明显。

可以添加下面的语句到你的.bashrc或.zshrc中,重启shell即生效:

1
export HOMEBREW_NO_AUTO_UPDATE=1

1. 概述

在使用Python 命令或者 Python的命令行工具的时候,一个痛点是没有补全。比如python -m后面输入包名字,就没有提示,每次想运行一个http server的时候,都需要搜索一下http服务的包名。另外,像pip,pipx等命令也没有提示,使用不太方便。

偶然看到argcomplete这个库,按tab键就可以给Python的命令行添加自动补全,简直是使用Python的一个神器。

具体来说,argcomplete有下面的特点

  • 官方支持支持bash和zsh两种shell,对tcsh和fish有第三方贡献者提供的支持(不好意思Windows用户这里又被当做二等公民了😂)
  • 可以对python命令和pip命令进行补全
  • 其他任何以argparse解析的第三方包的命令都可以用自动补全,添加argcomplete的几行代码就行

下面具体展开怎么对已有的工具启用自动补全,以及如何让自己的Python包支持argcomplete。

阅读全文 »