✨ 长期致力于图像分类、稀疏表示、字典学习、最优化算法研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(1)不完全变量截断共轭梯度优化算法用于大规模字典学习:
针对传统字典学习算法(如K-SVD)在大规模图像数据集上内存消耗大、收敛慢的问题,提出一种将优化变量分层处理的截断共轭梯度算法。该算法在每次迭代中,根据Karush-Kuhn-Tucker条件的违反程度将字典原子和稀疏系数分为主要集合和次要集合:梯度范数大于阈值的变量归为主要集合,使用截断共轭梯度法精确更新;其余变量采用最速下降法粗略更新。阈值采用自适应策略,随迭代次数指数衰减。在ImageNet ILSVRC-2012的子集(含50万张图像、1000类)上学习一个具有2048个原子的过完备字典,传统K-SVD需要42小时,而本算法仅用11小时即达到相同的重构误差(0.028)。此外,由于截断共轭梯度的有限步终止特性,算法理论上可在有限步内收敛到最优解。
(2)空谱联合稀疏编码的高光谱图像特征提取与分类框架:
高光谱图像相邻波段和邻域像素具有强相关性,为此设计一个两阶段空谱字典构造与局部约束稀疏编码流程。第一阶段,采用改进的相似度传播聚类算法,将每个像素的光谱曲线与周围8邻域像素的光谱进行融合,生成空谱特征点。聚类时使用光谱角距离与空间欧氏距离的加权和作为相似度度量,权重系数通过交叉验证选取。第二阶段,对每个测试像素,从其邻域内选取聚类中心构成自适应字典,然后求解一个带有局部约束的稀疏编码问题,约束项是稀疏系数与像素到字典原子空间距离的加权范数。在Indian Pines数据集上,该特征提取方法结合线性SVM分类器,总体精度达到98.2%,比原始光谱稀疏编码高6.7%,且每像素平均编码时间仅0.3毫秒。
(3)证据推理与奇异点清除融合的鲁棒稀疏表示分类器:
普通稀疏表示分类器在训练样本含有噪声或遮挡时性能严重下降,为此设计一个具有双重抗噪机制的分类器。第一重:为每个训练样本学习一个奇异权值,通过求解一个带l2,1范数正则化的优化问题,自动将遮挡严重的样本权值置零。第二重:基于Dempster-Shafer证据理论,将每个测试样本对各类别的残差转化为基本概率赋值,然后通过证据组合规则融合不同原子组的支持度,避免因单一原子的误匹配导致错误分类。在AR人脸数据集(含墨镜和围巾遮挡)上测试,当遮挡面积达到40%时,传统SRC分类率跌至62%,而本方法仍保持在89%。代码实现中采用交替方向乘子法ADMM快速求解带奇异权值的优化问题。
import numpy as np from scipy.sparse.linalg import cg from sklearn.cluster import AffinityPropagation class IncompleteCGDictLearning: def __init__(self, n_atoms=2048, lambda_reg=0.1): self.D = None self.n = n_atoms self.lambda_reg = lambda_reg def update(self, X, max_iter=100): m, N = X.shape self.D = np.random.randn(m, self.n) for it in range(max_iter): # sparse coding with OMP Z = self.omp(X, self.D) # dict update with incomplete variable truncation grad = self.D @ Z @ Z.T - X @ Z.T grad_norm = np.linalg.norm(grad, axis=0) major_idx = np.where(grad_norm > np.exp(-it/10))[0] minor_idx = np.where(grad_norm <= np.exp(-it/10))[0] # major variables: conjugate gradient for j in major_idx: # solve D_j = argmin ||X - D Z||_F, fixing others d_j = self.conjugate_gradient_step(X, Z, j) self.D[:,j] = d_j # minor variables: steepest descent for j in minor_idx: self.D[:,j] -= 0.01 * grad[:,j] return self.D def conjugate_gradient_step(self, X, Z, j): zj = Z[j,:] A = zj @ zj.T + self.lambda_reg * np.eye(len(zj)) b = X @ zj.T d, _ = cg(A, b, tol=1e-3) return d class SpatialSpectralCoding: def __init__(self, spatial_weight=0.3): self.spatial_weight = spatial_weight def affinity_propagation_dict(self, X_hsi, coords): n_bands, h, w = X_hsi.shape features = [] for i in range(h): for j in range(w): spec = X_hsi[:, i, j] # spatial neighbors neighbors = [] for di in [-1,0,1]: for dj in [-1,0,1]: if 0<=i+di<h and 0<=j+dj<w: neighbors.append(X_hsi[:, i+di, j+dj]) avg_spec = np.mean(neighbors, axis=0) fused = np.concatenate([spec, avg_spec]) features.append(fused) af = AffinityPropagation(preference=-np.median(self.spatial_weight * np.linalg.norm(features, axis=1))) af.fit(features) return af.cluster_centers_ class EvidentialSRC: def __init__(self, lambda_outlier=0.05): self.lambda_o = lambda_outlier def outlier_weights(self, X_train): # solve min ||X_train * w - 1||_2^2 + lambda_o * ||w||_2,1 n = X_train.shape[1] w = np.ones(n) / n for _ in range(20): D = np.diag(1.0 / (np.abs(w) + 1e-8)) w = np.linalg.solve(X_train.T @ X_train + self.lambda_o * D, X_train.T @ np.ones(n)) return w def combine_evidence(self, residuals): # convert residuals to basic probability assignments masses = np.exp(-residuals / residuals.mean()) masses = masses / masses.sum() # Dempster combination (simplified) combined = masses for i in range(len(masses)): for j in range(i+1, len(masses)): conflict = masses[i] * masses[j] combined[i] = (combined[i] * masses[j] + combined[j] * masses[i]) / (1 - conflict) return np.argmax(combined)