VQ & Kmeans
VQ(vector quantization)应用最多的是在信号处理的领域,常用于将模拟信号值转为数字信号(计算机可以处理的形式)。目前vq在深度学习上也有应用,比较典型的是近两年出现的vq-vae模型,其中vq模块实现了将连续的embedding映射到离散的codebook上,获得了更加鲁棒的特征,也有人对转换后的特征的可解释性做了实验,比如用在speech上获得的特征理解成phoneme的feature。这里贴两篇典型的vq应用的paper日后填坑。
vq-vae-2 (image generation)
vq-wav2vec: Self-Supervised Learning of Discrete Speech Representations
Kmeans不做多的解释,机器学习unsupervised方法的典型方法,用于数据压缩,稀疏特征的预处理等。聚类方法与vq结合,聚类得到的 centroids 即为vq中的 codebook。
VQ&Kmeans在图片压缩上的应用
代码
from scipy.cluster.vq import kmeans, vq
from numpy import array, reshape, zeros
from PIL import Image
import numpy as np
vqclst = [2, 5, 10] # 聚类centroids个数,聚类后的颜色总数
im = Image.open('photos/example.jpg')
data = np.array(im).astype(np.float32)
(width, height, channel) = data.shape
data = reshape(data, (height*width, channel))
for k in vqclst:
print ('Generating vq-%d...' % k)
# kmeans to get centroids (codebook)
(centroids, distor) = kmeans(data, k) # (k, n), float
# vq to get code of each pixel
(code, distor) = vq(data, centroids) # (n, ), (n, )
im_vq = centroids[code, :]
im_vq = im_vq.reshape(width, height, channel).astype(dtype=np.uint8)
new_img = Image.fromarray(im_vq)
new_img.save('converted/%d-example.jpg' % k) # save the picture
还有另一种implementation, 来自sklearn官方demo。
输出结果
漫谈 Clustering (番外篇): Vector Quantization
Color Quantization using K-Means