dinov2_retrieval:一个基于DINOv2 的图片检索应用
1. 概述
前些天 Meta 公司发布了 DINOv2 视觉预训练模型。DINOv2 能够高效地提出图像中的特征,提取的特征可以直接用于像分类等任务,而且只需要一个简单的线性层就能取得比较好的结果。
为了展示 DINOv2 强大的特征提取能力, Meta 提供了一个在线 Demo,上传一张图片,就能从一些艺术画作中检索出最相似的作品。
拿随手拍的照片体验后,DINOv2 特征提取能力确实强大,能够准确地理解图片中的语义信息。
由于 DINOv2 预训练模型是开源的,因为基于它来测试实际的效果是可行的。比如,我想找到相册中跟某张照片最相似的图片,就可以用 DINOv2 来测试照片和相册中所有照片的特征,然后计算相册中照片特征与测试照片最相近的那一张,就是我想要的。
整体思路是很简单直接的,经过一天的开发,终于完成了一个相对完善的Python工具 dinov2_retrieval,能够检索若干张图片在测试数据集中最相似的图。
写完后拿最近拍的一些随机照片跑了一下,检索结果还是挺不错的。最左边是测试图片,右边的5张图是在[Caltech 256](Caltech 256)数据集中检索得到的top5相似的图像:
通过和ResNet50预训练模型提取的特征做检索对比,发现 DINOv2 提取的特征还是更准确一些,检索结果也更好。
后面部分详细说说这个工具 dinov2_retrieval 的使用。
git diff 的一个妙用
1. git diff 常规用法
git diff 可以用来比较在git仓库中的两次提交或两个文件的diff,常见用法如下:
1 | # 显示当前代码与最新commit的代码之间的差别 |
所有上述命令后面都可以加一个目录或文件路径来只显示这个目录或文件中的区别:
1 | git diff /path/to/folder |
C++ std::optional 使用教程
1. std::optional 是什么
C++ 17 引入了std::optional,表示一个可能有值的对象(没有值时就是默认的std::nullopt
),例如这个例子中,std::optional 对象 even_value,如果is_even
为真的话就是128,否则就是默认值std::nullopt
:
1 | #include <iostream> |
其实std::optional的作用和Python里面的None
比较像,例如上面的例子用Python来写就是这样:
1 | is_even = True |
libtorch系列教程3:优雅地训练MNIST分类模型
在这篇文章中,我们对如何使用Libtorch进行MNIST分类模型的训练和测试进行详细描述。首先会浏览官方MNIST示例,然后对其进行模块化重构,为后续别的模型的训练提供 codebase。
由于Libtorch中包含很多和Pytorch中没有的类型,所以看Libtorch代码的时候时常会遇到不了解的函数或者类,这时候可以在这里查找对应的类的实现,了解其作用。Libtorch C++ 代码中的注释虽然不多但基本够用了。
这里列举一些常见的类的代码路径,方便查询:
- Datasets: https://github.com/pytorch/pytorch/blob/main/torch/csrc/api/include/torch/data/datasets/base.h
- DataLoader:https://github.com/pytorch/pytorch/tree/main/torch/csrc/api/include/torch/data/dataloader/base.h
- MNIST: https://github.com/pytorch/pytorch/blob/main/torch/csrc/api/include/torch/data/datasets/mnist.h
- Stack: https://github.com/pytorch/pytorch/blob/main/torch/csrc/api/include/torch/data/transforms/stack.h
- RandomSampler: https://github.com/pytorch/pytorch/tree/main/torch/csrc/api/src/data/samplers/random.cpp
- SequentialSampler: https://github.com/pytorch/pytorch/tree/main/torch/csrc/api/src/data/samplers/sequential.cpp
NeoVim 代码格式化教程
homebrew禁止执行install命令时自动更新
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 |
Python 命令补全神器 argcomplete
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。
talkGPT4All 2.0
1. 概述
talkGPT4All是基于GPT4All的一个语音聊天程序,运行在本地CPU上,支持Linux,Mac和Windows。它利用OpenAI的Whisper模型将用户输入的语音转换为文本,再调用GPT4All的语言模型得到回答文本,最后利用文本转语音(TTS)的程序将回答文本朗读出来。
关于 talkGPT4All 1.0的介绍在这篇文章。
talkGPT4All 1.0的视频效果。
由于GPT4All一直在迭代,相比上一篇文章发布时(2023-04-10)已经有较大的更新,今天将GPT4All的一些更新同步到talkGPT4All,由于支持的模型和运行模式都有较大的变化,因此发布 talkGPT4All 2.0。
具体来说,2.0版本相比1.0有下面的更新。
首先是GPT4All框架支持的语言模型从1个增加到8个,并且可以一键切换模型。具体的模型是
- Vicuna-7B-1.1-q4_2
- Vicuna-7B-1.2-q4_2
- wizardLM-7B.q4_2
- GPT4All
- GPT4All-J
- GPT4All-J-v1.1
- GPT4All-J-v1.2
- GPT4All-J-v1.3
可以看到除了GPT4All系列的模型,这个框架也支持Vicuna和Wizard的模型了。更多模型因为证书和格式的问题,还在集成中。
根据GPT4All的文档,不同模型在benchmark上的结果:
可以看到GPT4All系列的模型的指标还是比较高的。
另一个重要更新是GPT4All发布了更成熟的Python包,可以直接通过pip 来安装,因此1.0中集成的不同平台不同的GPT4All二进制包也不需要了。集成PyPI包的好处多多,既可以查看源码学习内部的实现,又更方便定位问题(之前的二进制包没法调试内部代码),且保证了不同平台安装命令一致(之前不同平台二进制包不同)。
还有一个变化是GPT4All会自动按需下载模型,因此用户不需要手动下载和维护模型路径。同时将模型统一放置到https://gpt4all.io/models/ 目录下,测试国内模型下载速度也很快,大家玩起来也会更舒服。
核心的更新内容就这些,下面对talkGPT4All的安装和使用进行说明,后面有空会添加一些多个语言模型效果的对比视频。
mac 编译问题解决——building for macOS-x86_64 but attempting to link with file built for xxx
在编译TVM的一个fork版本时,遇到下面的报错:
ld: warning: ignoring file libbacktrace/lib/libbacktrace.a, building for macOS-x86_64 but attempting to link with file built for unknown-unsupported file format ( 0x21 0x3C 0x61 0x72 0x63 0x68 0x3E 0x0A
0x2F 0x20 0x20 0x20 0x20 0x20 0x20 0x20 )
Undefined symbols for architecture x86_64:
“_backtrace_create_state”, referenced from:
__GLOBAL__sub_I_logging.cc in logging.cc.o
“_backtrace_full”, referenced from:
tvm::runtime::Backtrace() in logging.cc.o
“_backtrace_syminfo”, referenced from:
tvm::runtime::(anonymous namespace)::BacktraceFullCallback(void*, unsigned long, char const*, int, char const*) in logging.cc.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[3]: *** [libtvm_runtime.dylib] Error 1
make[2]: *** [CMakeFiles/tvm_runtime.dir/all] Error 2
make[2]: *** Waiting for unfinished jobs….
搜索了一下,发现核心原因是Mac下ranlib命令采用了GNU版本,而非Apple版本导致的,下面详细展开报错原因和解决办法。