DOLG Single Stage Image Retrieval with Deep Orthogonal Fusion of Local and Global Features
0x00 导言
传统的图像检索往往分为两个步骤,第一步即提取图像的全局特征并在搜索引擎中进行搜索,第二步即对检索出图像的局部特征采用空间验证等手段对进行重排序并返回。本文提出了一种新的特征算法,有效融合了局部特征及全局特征,仅一步就可返回最佳结果。
0x01 背景知识
0x00 GeM池化
对于一张K×h×wK\times h\times wK×h×w(KKK为通道数)的特征图X\mathcal{X}X而言,GeM池化的公式表达是这样的:
f(g)=[f1(g)⋯fk(g)⋯fK(g)]where fk(g)=(1∣Xk∣∑x∈Xkxpk)1pk, ∣Xk∣=h×w\text{f}^{(g)}=[\text{f}^{(g)}_1 \cdots\text{f}^{(g)}_k\cdots\text{f}^{(g)}_K] \\
\text{where }\text{f}^{(g)}_k=(\frac{1}{|\mathcal{X}_k|}\sum_{x\in \mathcal{X}_k}x^{p_k})^{\frac{1}{p_k}},~ |\mathcal{X}_k|=h\times ...
Block Based Image Matching for Image Retrieval
0x00 导言
文章地址:Science Direct
我的批注版地址:Commented Paper
这篇文章旨在解决图像检索问题中以子图搜全图的问题。
0x01 背景知识
0x00 VLAD
VLAD算法的简介可简单参考这篇论文的2.1小节All about VLAD。
VLAD是一个比较老的图像特征提取算法,过程也相对简单:
首先需要在训练图片数据集上训练一个码表(codebook),词表的训练方法为:对训练集中的图像提取d维的SIFT特征,然后将所有图像的所有SIFT描述子汇总在一块,使用K-means算法去做一个聚类,然后将所有聚类的中心点组合为一个码表。其中K的选择一般为64或256。在此步,我们可以将提取出的SIFT兴趣点记为x=(x1,x2,⋯ ,xn)x=(x_1, x_2,\cdots, x_n)x=(x1,x2,⋯,xn),同时将训练好的码表记为Cvlad=(c1,c2,⋯ ,cK)C_{vlad}=(c_1, c_2, \cdots, c_K)Cvlad=(c1,c2,⋯,cK),其中K为聚类中心点的个数。
对于一张新来的图像,首先 ...
优雅的 Windows 开发
0x00 背景
本文讲述如何在 Windows Subsystem for Linux 里跑起一个支持 CUDA 的 docker 容器来的。
我们的工作相当于将上图中的 NVIDIA CUDA 换成了 docker container。
0x01 步骤
0x00 安装 WSL
首先,现在 win11 默认装的 WSL 已经是2.0版本了,所以无需在命令里单独使用 wsl –set-default-version 2 指定2.0版本的 WSL 了。仅使用如下命令即可一键安装 Ubuntu 发行版的 WSL:
1wsl --install -d Ubuntu
Tips
不用重启 Windows,仅重启 Ubuntu subsystem 的方法:
1wsl --shutdown
同时,我们可以关闭Windows Subsystem for Linux GUI来降低WSL的CPU占用,以及解决日常高CPU占用、屏幕频繁刷新以及频繁获取失去焦点的bug。可以在%UserProfile%目录下新建一个.wslconfig文件,并写入如下配置:
12[wsl2]guiApplications=f ...
Deep Image Retrieval A Survey
导言
文章地址:Arxiv
本文是一篇Survey,主要调研了2012年以来的基于深度学习的图像检索方法。这篇Survey主要是从如下3个科学问题展开:
如何使预训练的模型提取出来的特征超过传统数学模型?
如果我们使用在别的领域训练过的模型(比如:图像分类)所提取出来的特征来做图像检索的话,如何才能让这些模型保持或取得更好的效果呢?
深度特征普遍维度较高,如何才能更好地利用这些特征在大规模图像数据集上取得更好的检索效果呢?
总结
目前来说,现有的DCNN模型的来源主要有二:在别的任务上预训练好的以及fine-tune过的。二者之发展,可参照下图:
上图中,左侧路线呢是off-the-shelf模型,也就是说,一个预训练好的DCNN模型就直接拿过来,什么也不做,就直接应用到图像检索任务中。在这方面的研究呢,主要集中在提升表现层的输出质量上,相关的工作则有单次通过模型,或多次通过模型(将一张图片拆分为多个子图然后多次通过模型)。而右侧路线呢,则是针对已有模型在检索任务上进行过fine-tune后的模型,工作主要可以分为有监督的学习和无监督的学习两类。
如果从检索效果的提升上来 ...
Three Things Everyone Should Know to Improve Object Retrieval
0x00 导言
文章地址:Visual Geometry Group - University of Oxford
我的批注版地址:Commented Paper
本文旨在解决在大规模图像数据集中依据给定图片做快速(准实时的)目标检索。
0x01 背景知识
此前解决此类问题,有一个标准的方法:首先,使用词袋模型(BoW)来表示一张图片。其次,使用TF-IDF(Term Frequency Inverse Document Frequency)算法计算一个Rank值用于对图像进行排序和召回。
传统的方法有如下几个痛点:特征提取中的丢失,噪音点,描述子比较标准(距离计算方法)不合适,量化或归一化描述子时带来的损失。
0x00 TF-IDF(Term Frequency Inverse Document Frequency)
TF-IDF(Term Frequency Inverse Document Frequency),中文即:词频逆文本指数,是一种用于信息检索的加权技术。这是一种统计方法,用于评估一个词对于一个文件集或者一个语料库中某一份文件的重要程度。字词的重要性与它在文件中出现 ...
CTF Penetration Writeup 2
0x00 前言
比赛入口:
1http://192.168.50.133/intro.html
代码部分:
Flag A level 0: https://pastebin.ubuntu.com/p/HDWBHp3cRY/
Flag A level 1: https://pastebin.ubuntu.com/p/sv2DXCqjTN/
Flag B&C: https://pastebin.ubuntu.com/p/cCrgMFhVTK/
Flag D:
Flag E:
0x00 Flag A
这个题的目的很简单——登陆系统。我们可以从代码中看出,三个level用的都是相同的登陆逻辑,只不过是对输入内容的过滤措施不一样而已。我们挨个等级来看一下。
level 0: FLAG_A0_13FFEDE591_A
从代码中我们可以看到,level0的反注入措施只是仅仅将输入中的空格去掉了。我们可以使用块注释符来代替空格:
输入的用户名为:
12-- md5('123')='202CB962AC59075B964B07152D234B70'123 ...
CTF Intro
0x00 前言
挖洞,也就是找漏洞,本身就是个很随缘的技术,而且多半是八分靠运气,二分靠实力,尤其是在你不知道你要渗透的网站后端源代码的情况下。所以说,即便找不到漏洞,也不要认为是你个人能力不行导致的。举个例子,Linux系统被安全人员研究了几十年了,但是到目前为止,被发现的内核提权漏洞你用一双手就能数得过来。这不是研究它的安全人员的能力不行,而是找漏洞本身就是个很随缘的过程。你缘分到了,有个漏洞可能就被你找着了。缘分没到,那也没办法。
很有幸,本科期间遇到一位对的老师,打过一年CTF比赛,也曾给校赛出过题。但是我和安全行业的缘分实在没到,所以后来读研、实习也没有选择安全方向。
现在只能以一位业余安全爱好者的身份,在组里,来介绍一些安全方面的常识,组织这么一场比赛,来增进大家的安全防范意识。也算对我曾经学过的知识的一次复习。
0x01 SQLi
SQL注入问题产生的根源在于直接拼接SQL语句,而使用预编译的SQL语句则没有SQL注入的问题。目前已经很少有场景下会直接拼接SQL语句了,所以SQL注入攻击也在逐渐淡出网络安全圈的视野。不过校级的CTF比赛往往还比较喜欢往这个方向上出题,因为 ...
JVM 内存管理及垃圾回收
0x00 运行时数据区组成
程序计数器(Program Counter Register):如果线程执行的是非native方法,则程序计数器中保存的是当前需要执行的指令的地址;如果线程执行的是native方法,则程序计数器中的值是undefined。由于程序计数器中存储的数据所占空间的大小不会随程序的执行而发生改变,因此,对于程序计数器是不会发生内存溢出现象(OutOfMemory)的。
虚拟机栈(VM Stack):虚拟机栈中存放的是一个个的栈帧,每个栈帧对应一个被调用的方法。当线程执行一个方法时,就会随之创建一个对应的栈帧,并将建立的栈帧压栈。当方法执行完毕之后,便会将栈帧出栈。同理,这也是递归容易导致内存溢出现象的原因。
本地方法栈(Native Method Stack):Java栈是为执行Java方法服务,而本地方法栈则是为执行本地方法(Native Method)服务。在JVM规范中,并没有对其具体实现方法以及数据结构作强制规定,虚拟机可以自由实现它。在Hotspot虚拟机中直接就把本地方法栈和Java栈合二为一。
方法区(Method Area):存储每个类的信息(包括 ...
无头浏览器识别
0x00 常规测试
0x00 Chrome Headless User Agent
Chrome无头版本的UA中含有HeadlessChrome字样,示例:
1Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/60.0.3112.50 Safari/537.36
0x01 WebDriver
基于Selenium WebDriver驱动的无头浏览器会在js中生成一个window.navigator.webdriver对象,正常的浏览器中是没有这个对象的。
0x02 WebDriver Advanced
在浏览器中执行如下js:
1navigator.webdriver = false
在正常的浏览器中,执行上述js后再次访问navigator.webdriver的值,其值为false,但在无头浏览器中,其值仍然为true。
0x03 Chrome Test
在Chrome无头模式的js环境中访问window.chrome的值为undefined。
0x04 Perm ...
Java 基础汇总
0x00 equals、hashCode和==的关系
==对于基本数据类型比较的是值,对于对象,比较的是对象的堆地址是否相等。Object类中equals()方法底层依赖的是==,默认的Object类中使用equals方法也是对比的对象的堆地址是否相等。hashCode是计算的对象的散列值。三者关系如下:
两个对象的hashcode相同,对象不一定是同一个对象。
两个对象的hashcode不同,那一定不是同一个对象。
如果两个对象的equals相同,那么hashcode一定相同。
有关String对象的特殊说明,看下面的代码:
123456String a = "ab";String b = "ab";System.out.println(a == b);String c = "a";String d = c + "b";System.out.println(a == d);
第一个输出为true,因为"ab"为字符串直接量,同样的字符串直接量将被存储为一个实例,所以a和b都指向一个 ...