下面整理了一些图像相似度算法,可根据不同的需求选择不同的算法,对每种算法进行了简单描述并给出Python实现:

      1. 基于像素的算法:

      (1).MSE(Mean Squared Error):均方误差,通过计算两幅图像对应像素值差的平方和的平均值来衡量图像间的差异。值越小表示两幅图像越相似;差异越大值越高,没有上限;对噪声/光照/几何变换非常敏感;忽略结构信息,不符合人眼感知。

def mse(images1, images2):results = []for name1 in images1:img1 = cv2.imread(str(name1), cv2.IMREAD_GRAYSCALE)for name2 in images2:img2 = cv2.imread(str(name2), cv2.IMREAD_GRAYSCALE)mse = np.mean((img1.astype(np.float32) - img2.astype(np.float32)) ** 2)results.append((name1.name, name2.name, f"{mse:.2f}"))return results

      (2).PSNR(Peak Signal-to-Noise Ratio):峰值信噪比,基于MSE的图像质量评估指标,用于衡量图像的失真程度。值越大表示图像越接近(差异越小);常用于图像压缩质量评估;不符合人眼感知,对几何变换敏感。

def psnr(images1, images2):results = []max_pixel = 255.0for name1 in images1:img1 = cv2.imread(str(name1), cv2.IMREAD_GRAYSCALE)for name2 in images2:img2 = cv2.imread(str(name2), cv2.IMREAD_GRAYSCALE)mse = np.mean((img1.astype(np.float32) - img2.astype(np.float32)) ** 2)if mse == 0:results.append((name1.name, name2.name, float("inf")))else:psnr = 10 * np.log10((max_pixel ** 2) / mse)results.append((name1.name, name2.name, f"{psnr:.2f}"))return results

      (3).SSIM(Structural Similarity Index Measure):结构相似性指数,是一种感知图像质量评估方法,它不是逐像素比较,而是模拟人眼感知,从亮度、对比度、结构三方面来评估两幅图像的相似度。值范围为[-1, 1],越接近1表示两幅图像越相似;符合人眼感知,对亮度、对比度相对不敏感;对几何变换不鲁棒;参数需要调优。

def ssim(images1, images2):results = []L = 255K1 = 0.01; K2 = 0.03C1 = (K1 * L) ** 2; C2 = (K2 * L) ** 2kernel = (11, 11)sigma = 1.5for name1 in images1:img1 = cv2.imread(str(name1), cv2.IMREAD_GRAYSCALE).astype(np.float32)mu1 = cv2.GaussianBlur(img1, kernel, sigma)mu1_sq = mu1 ** 2sigmal_sq = cv2.GaussianBlur(img1 ** 2, kernel, sigma) - mu1_sqfor name2 in images2:img2 = cv2.imread(str(name2), cv2.IMREAD_GRAYSCALE).astype(np.float32)mu2 = cv2.GaussianBlur(img2, kernel, sigma)mu2_sq = mu2 ** 2sigmal2_sq = cv2.GaussianBlur(img2 ** 2, kernel, sigma) - mu2_sqmu1_mu2 = mu1 * mu2sigmal2 = cv2.GaussianBlur(img1 * img2, kernel, sigma) - mu1_mu2ssim_map = ((2 * mu1_mu2 + C1) * (2 * sigmal2 + C2)) / \((mu1_sq + mu2_sq + C1) * (sigmal_sq + sigmal2_sq + C2))results.append((name1.name, name2.name, f"{np.mean(ssim_map):.4f}"))return results

      2. 基于直方图的算法:

      (1).颜色直方图:统计图像中不同颜色值的分布情况。对平移、旋转鲁棒(只看颜色分布);对光照变化敏感;对颜色分布相似但结构不同的图像区分能力弱;可用于基于颜色分布的图像检索、图像去重。

def color_histogram(images1, images2):results = []bins = [50, 60]for name1 in images1:img1 = cv2.imread(str(name1))hsv1 = cv2.cvtColor(img1, cv2.COLOR_BGR2HSV)hist1 = cv2.calcHist([hsv1], [0, 1], None, bins, [0, 180, 0, 256])cv2.normalize(hist1, hist1, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX)for name2 in images2:img2 = cv2.imread(str(name2))hsv2 = cv2.cvtColor(img2, cv2.COLOR_BGR2HSV)hist2 = cv2.calcHist([hsv2], [0, 1], None, bins, [0, 180, 0, 256])cv2.normalize(hist2, hist2, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX)score = cv2.compareHist(hist1, hist2, cv2.HISTCMP_CORREL)results.append((name1.name, name2.name, f"{score:.4f}"))return results

      (2).HOG(Histogram of Oriented Gradients):梯度直方图,能有效描述图像结构特征。对大角度旋转、边缘、纹理敏感;对光照变化鲁棒;参数需要调优;可用于基于形状的图像检索。

def _resize_padding(img, size, color = (0,0,0)):h, w = img.shape[:2]ratio = min(size[0] / w, size[1] / h)neww, newh = int(w*ratio), int(h*ratio)resized = cv2.resize(img, (neww, newh))padw = size[0] - newwpadh = size[1] - newhtop, bottom = padh // 2, padh - padh // 2left, right = padw // 2, padw - padw //2return cv2.copyMakeBorder(resized, top, bottom, left, right, borderType=cv2.BORDER_CONSTANT, value=color)def _cosine_similarity(feature1, feature2):dot = np.dot(feature1, feature2)norm1 = np.linalg.norm(feature1)norm2 = np.linalg.norm(feature2)if norm1 == 0 or norm2 == 0:return 0.0return dot / (norm1 * norm2)def hog(images1, images2):results = []win_size = (488, 488)cell_size = (8, 8)block_size = (16, 16)block_stride = (8, 8)nbins = 9hog = cv2.HOGDescriptor(_winSize=win_size, _blockSize=block_size, _blockStride=block_stride, _cellSize=cell_size, _nbins=nbins)for name1 in images1:img1 = cv2.imread(str(name1), cv2.IMREAD_GRAYSCALE)img1 = _resize_padding(img1, win_size)feature1 = hog.compute(img1).flatten()for name2 in images2:img2 = cv2.imread(str(name2), cv2.IMREAD_GRAYSCALE)img2 = _resize_padding(img2, win_size)feature2 = hog.compute(img2).flatten()results.append((name1.name, name2.name, f"{_cosine_similarity(feature1, feature2):.4f}"))return results

      3. 基于特征点的算法:

      (1).SIFT(Scale-Invariant Feature Transform):局部特征描述子算法。对尺度、旋转、光照鲁棒;可用于基于内容的图像检索。

def sift(images1, images2):results = []ratio_threshold = 0.75sift = cv2.SIFT_create()bf = cv2.BFMatcher(cv2.NORM_L2, crossCheck=False)for name1 in images1:img1 = cv2.imread(str(name1), cv2.IMREAD_GRAYSCALE)kp1, des1 = sift.detectAndCompute(img1, None)for name2 in images2:img2 = cv2.imread(str(name2), cv2.IMREAD_GRAYSCALE)kp2, des2 = sift.detectAndCompute(img2, None)if des1 is None or des2 is None:results.append((name1.name, name2.name, 0.0))continuetotal_features = min(len(kp1), len(kp2))if total_features == 0:results.append((name1.name, name2.name, 0.0))continuematches = bf.knnMatch(des1, des2, k=2)good_matches = []for match_pair in matches:if len(match_pair) == 2:m, n = match_pairif m.distance < ratio_threshold * n.distance:good_matches.append(m)results.append((name1.name, name2.name, f"{len(good_matches)/total_features:.4f}"))return results

      (2).SURF(Speeded-Up Robust Features):快速的局部特征描述子算法,是SIFT的加速版本。默认的opencv-contrib-python包未启用nonfree模块,编译OpenCV源码时需开启OPENCV_ENABLE_NONFREE选项。对尺度、旋转、光照鲁棒;可用于基于内容的图像检索、图像去重。

      (3).ORB(Oriented FAST and Rotated BRIEF):快速的局部特征描述子算法。对旋转鲁棒;对尺度、光照敏感;计算速度快于SIFT/SURF。

def orb(images1, images2):results = []nfeatures = 1000orb = cv2.ORB_create(nfeatures=nfeatures)bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)for name1 in images1:img1 = cv2.imread(str(name1), cv2.IMREAD_GRAYSCALE)kp1, des1 = orb.detectAndCompute(img1, None)for name2 in images2:img2 = cv2.imread(str(name2), cv2.IMREAD_GRAYSCALE)kp2, des2 = orb.detectAndCompute(img2, None)if des1 is None or des2 is None:results.append((name1.name, name2.name, 0.0))continuematches = bf.match(des1, des2)if len(matches) == 0:results.append((name1.name, name2.name, 0.0))continuegood_matches = sorted(matches, key=lambda x: x.distance)results.append((name1.name, name2.name, f"{len(good_matches)/min(len(kp1), len(kp2)):.4f}"))return results

      (4).LBP(Local Binary Pattern):纹理特征描述算法。安装scikit-image,直接调用其接口。对光照鲁棒;对尺度、噪声敏感。

def _lbp_histogram(img, P=8, R=1):lbp = local_binary_pattern(img, P, R, method="uniform")hist = cv2.calcHist([lbp.astype(np.float32)], [0], None, [P+2], [0, P+2])hist = cv2.normalize(hist, hist).flatten()return histdef lbp(images1, images2):results = []for name1 in images1:img1 = cv2.imread(str(name1), cv2.IMREAD_GRAYSCALE)hist1 = _lbp_histogram(img1)for name2 in images2:img2 = cv2.imread(str(name2), cv2.IMREAD_GRAYSCALE)hist2 = _lbp_histogram(img2)results.append((name1.name, name2.name, f"{_cosine_similarity(hist1, hist2):.4f}"))return results

      (5).Template Matching:模板匹配,滑动窗口匹配方法。对尺度、光照敏感。

def template_matching(images1, images2):results = []method = cv2.TM_CCOEFF_NORMEDfor name1 in images1:img1 = cv2.imread(str(name1), cv2.IMREAD_GRAYSCALE)for name2 in images2:img2 = cv2.imread(str(name2), cv2.IMREAD_GRAYSCALE)res = cv2.matchTemplate(img2, img1, method)min_val, max_val, _, _ = cv2.minMaxLoc(res)if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:results.append((name1.name, name2.name, f"{1-min_val:.4f}"))else:results.append((name1.name, name2.name, f"{max_val:.4f}"))return results

      (6).GLCM(Gray-Level Co-occurrence Matrix):灰度共生矩阵,提取纹理特征。参数需要调优;对噪声、尺度敏感;对光照相对鲁棒。

def _get_glcm_features(img):distances = [1]angles = [0, np.pi/4, np.pi/2, 3*np.pi/4]features = ["contrast", "correlation", "energy", "homogeneity"]img = cv2.equalizeHist(img)glcm = graycomatrix(img, distances=distances, angles=angles, symmetric=True, normed=True)feat = np.hstack([graycoprops(glcm, f).flatten() for f in features])return featdef glcm(images1, images2):results = []for name1 in images1:img1 = cv2.imread(str(name1), cv2.IMREAD_GRAYSCALE)feat1 = _get_glcm_features(img1)for name2 in images2:img2 = cv2.imread(str(name2), cv2.IMREAD_GRAYSCALE)feat2 = _get_glcm_features(img2)results.append((name1.name, name2.name, f"{_cosine_similarity(feat1, feat2):.4f}"))return results

      (7).Hausdorff距离:衡量两个点集之间的最大距离。对噪声敏感。

def _get_hausdorff_contours(img):_, binary = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)contour = max(contours, key=cv2.contourArea)return contourdef hausdorff(images1, images2):results = []extractor = cv2.createHausdorffDistanceExtractor()for name1 in images1:img1 = cv2.imread(str(name1), cv2.IMREAD_GRAYSCALE)contour1 = _get_hausdorff_contours(img1)for name2 in images2:img2 = cv2.imread(str(name2), cv2.IMREAD_GRAYSCALE)contour2 = _get_hausdorff_contours(img2)results.append((name1.name, name2.name, f"{extractor.computeDistance(contour1, contour2):.4f}"))return results

      4. 基于频域的算法:

      (1).FFT(Fast Fourier Transform):傅里叶变换,通过分析图像在频域的特性来计算相似度。对尺度敏感;对光照鲁棒。

def _get_fft_features(img):f = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)mag = cv2.magnitude(f[:,:,0], f[:,:,1])mag = np.log1p(mag)mag = cv2.normalize(mag, None, 0, 1, cv2.NORM_MINMAX)return mag.flatten()def fft(images1, images2):results = []for name1 in images1:img1 = cv2.imread(str(name1), cv2.IMREAD_GRAYSCALE)v1 = _get_fft_features(img1)for name2 in images2:img2 = cv2.imread(str(name2), cv2.IMREAD_GRAYSCALE)v2 = _get_fft_features(img2)results.append((name1.name, name2.name, f"{_cosine_similarity(v1, v2):.4f}"))return results

      (2).Wavelet Transform:小波变换,通过将图像分解为不同频率和空间位置的小波系数来分析图像特征。对噪声鲁棒。需安装pywavelets。

      (3).DCT(Discrete Cosine Transform):离散余弦变换,将图像从空间域转换到频域。对几何变换、噪声敏感;对光照鲁棒。

def _get_dct_features(img, low_freq_size):dct = cv2.dct(np.float32(img))dct = dct[:low_freq_size, :low_freq_size]v = dct.flatten()v = (v - np.min(v)) / (np.max(v) - np.min(v) + 1e-8)return vdef dct(images1, images2):results = []low_freq_size = 8for name1 in images1:img1 = cv2.imread(str(name1), cv2.IMREAD_GRAYSCALE)v1 = _get_dct_features(img1, low_freq_size)for name2 in images2:img2 = cv2.imread(str(name2), cv2.IMREAD_GRAYSCALE)v2 = _get_dct_features(img2, low_freq_size)results.append((name1.name, name2.name, f"{_cosine_similarity(v1, v2):.4f}"))return results

      5. 基于哈希算法:

      (1).pHash(Perceptual Hash):感知哈希,将图片转换成哈希值的方法,通过比较哈希值的汉明距离(Hamming Distance)计算相似度。可用于图像去重。

def _get_hash_value(img, low_freq_size):dct = cv2.dct(np.float32(img))dct = dct[:low_freq_size, :low_freq_size]mean = np.mean(dct)value = (dct > mean).astype(np.uint8).flatten()return valuedef _hamming_distance(hash1, hash2):return np.count_nonzero(hash1 != hash2)def phash(images1, images2):results = []hash_size = 32low_freq_size = 8for name1 in images1:img1 = cv2.imread(str(name1), cv2.IMREAD_GRAYSCALE)img1 = cv2.resize(img1, (hash_size, hash_size))hash_value1 = _get_hash_value(img1, low_freq_size)for name2 in images2:img2 = cv2.imread(str(name2), cv2.IMREAD_GRAYSCALE)img2 = cv2.resize(img2, (hash_size, hash_size))hash_value2 = _get_hash_value(img2, low_freq_size)dist = _hamming_distance(hash_value1, hash_value2)results.append((name1.name, name2.name, f"{1 - dist / hash_value1.size:.4f}"))return results

      除pHash外还有aHash(Average Hash,均值哈希)、dHash(Difference Hash,差值哈希)等。

      6. 基于深度学习的算法:CNN特征提取,CNN特征比传统手工特征更鲁棒;无需重新训练,直接使用已有的预训练模型即可;提取特征后可使用余弦相似度、欧式距离等计算相似度。以下是使用DenseNet和ResNet预训练模型的代码:

def cnn(images1, images2, net_name):if net_name == "densenet":model = models.densenet121(weights=models.DenseNet121_Weights.DEFAULT) # densenet121-a639ec97.pthelse:model = models.resnet101(weights=models.ResNet101_Weights.DEFAULT) # resnet101-cd907fc2.pthmodel = nn.Sequential(*list(model.children())[:-1])# print(f"model: {model}")model.eval()device = torch.device("cuda" if torch.cuda.is_available() else "cpu")model.to(device)transform = transforms.Compose([transforms.Resize((224, 224)),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])])def _extract_features(name):img = Image.open(name).convert("RGB")tensor = transform(img).unsqueeze(0).to(device) # [1, 3, 224, 224]with torch.no_grad():features = model(tensor) # densenet: [1, 1024, 7, 7]; resnet: [1, 2048, 1, 1]if net_name == "densenet":features = F.adaptive_avg_pool2d(features, (1, 1)) # densenet: [1, 1024, 1, 1]return features.cpu().numpy().flatten()results = []for name1 in images1:features1 = _extract_features(str(name1))for name2 in images2:features2 = _extract_features(str(name2))results.append((name1.name, name2.name, f"{_cosine_similarity(features1, features2):.4f}"))return results

      其它辅助代码如下所示:

def parse_args():parser = argparse.ArgumentParser(description="summary of image similarity algorithms")parser.add_argument("--algorithm", required=True, type=str, choices=["mse", "psnr", "ssim", "color_histogram", "hog", "sift", "orb", "lbp", "template_matching", "glcm", "hausdorff", "fft", "dct", "phash", "densenet", "resnet"], help="specify what kind of algorithm")parser.add_argument("--src_path1", required=True, type=str, help="source images directory or image name")parser.add_argument("--src_path2", required=True, type=str, help="source images directory or image name")parser.add_argument("--suffix1", type=str, default="jpg", help="image suffix")parser.add_argument("--suffix2", type=str, default="jpg", help="image suffix")args = parser.parse_args()return argsdef _get_images(src_path, suffix):images = []path = Path(src_path)if path.is_dir():images = [img for img in path.rglob("*."+suffix)]else:if path.exists() and path.name.split(".")[1] == suffix:images.append(path)if not images:raise FileNotFoundError(colorama.Fore.RED + f"there are no matching images: src_path:{src_path}; suffix:{suffix}")return imagesdef _check_images(images1, images2):for name1 in images1:img1 = cv2.imread(str(name1), cv2.IMREAD_UNCHANGED)if img1 is None:raise FileNotFoundError(colorama.Fore.RED + f"image not found: {name1}")for name2 in images2:img2 = cv2.imread(str(name2), cv2.IMREAD_UNCHANGED)if img1 is None:raise FileNotFoundError(colorama.Fore.RED + f"image not found: {name2}")if img1.shape != img2.shape:raise ValueError(colorama.Fore.RED + f"images must have the same dimensions: {img1.shape}:{img2.shape}")def _print_results(results):for ret in results:print(f"{ret[0]} ---- {ret[1]}\t: {ret[2]}")if __name__ == "__main__":colorama.init(autoreset=True)args = parse_args()images1 = _get_images(args.src_path1, args.suffix1)images2 = _get_images(args.src_path2, args.suffix2)_check_images(images1, images2)if args.algorithm == "mse": # Mean Squared Errorresults = mse(images1, images2)elif args.algorithm == "psnr": # Peak Signal-to Noise Ratioresults = psnr(images1, images2)elif args.algorithm == "ssim": # Structural Similarity Index Measureresults = ssim(images1, images2)elif args.algorithm == "color_histogram":results = color_histogram(images1, images2)elif args.algorithm == "hog": # Histogram of Oriented Gradientsresults = hog(images1, images2)elif args.algorithm == "sift": # Scale-Invariant Feature Transformresults = sift(images1, images2)elif args.algorithm == "orb": # Oriented FAST and Rotated BRIEFresults = orb(images1, images2)elif args.algorithm == "lbp": # Local Binary Pattenresults = lbp(images1, images2)elif args.algorithm == "template_matching":results = template_matching(images1, images2)elif args.algorithm == "glcm": # Gray-Level Co-occurrence Matrixresults = glcm(images1, images2)elif args.algorithm == "hausdorff": # Hausdorff distanceresults = hausdorff(images1, images2)elif args.algorithm == "fft": # Fast Fourier Transformresults = fft(images1, images2)elif args.algorithm == "dct": # Discrete Cosine Transformresults = dct(images1, images2)elif args.algorithm == "phash": # Perceptual Hashresults = phash(images1, images2)elif args.algorithm == "densenet" or args.algorithm == "resnet":results = cnn(images1, images2, args.algorithm)_print_results(results)print(colorama.Fore.GREEN + "====== execution completed ======")

      基于DenseNet的执行结果如下图所示:

      GitHub:https://github.com/fengbingchun/NN_Test

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/93280.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/93280.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/93280.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IO流与单例模式

单例模式 单例模式是指一个类只能有一个对象。 饿汉模式 在单例模式下&#xff0c;在程序开始&#xff08;main函数运行前&#xff09;的时候创建一个对象&#xff0c;这之后就不能再创建这个对象。 class HungryMan { public:static HungryMan* getinstance(){return &ins…

Java设计模式之依赖倒置原则使用举例说明

示例1&#xff1a;司机驾驶汽车 问题场景&#xff1a;司机类直接依赖奔驰车类&#xff0c;新增宝马车需修改司机类代码。 // 未遵循DIP class Benz { public void run() { /*...*/ } } class Driver { public void drive(Benz benz) { benz.run(); } } // 遵循DIP&#xff1a;…

【Docker】openEuler 使用docker-compose部署gitlab-ce

docker-compose配置 services:gitlab:image: gitlab/gitlab-ce:latestcontainer_name: gitlabrestart: alwayshostname: gitlab.example.comenvironment:GITLAB_OMNIBUS_CONFIG: |# Add any other gitlab.rb configuration here, each on its own lineexternal_url https://gi…

ElasticSearch 父子文档使用简记

一. ES parent-child 文档简介 ES 提供了类似数据库中 Join 联结的实现&#xff0c;可以通过 Join 类型的字段维护父子关系的数据&#xff0c;其父文档和子文档可以单独维护。 二. 父子文档的索引创建与数据插入 ES 父子文档的创建可以分为下面三步&#xff1a; 创建索引 M…

【Linux】编辑器vim的使用

目录 1. vim的基本概念 2. vim的基本使用 3. vim命令模式操作 3.1 移动光标 3.2 删除 3.3 复制 3.4 替换 3.5 撤销 3.6 更改 3.7 跳转 4. vim底行模式操作 4.1 列出行号 4.2 跳到文件中的某行 4.3 查找字符 4.4 保存文件 4.5 离开vim 1. vim的基本概念 Vim&…

《零基础掌握飞算Java AI:核心概念与案例解析》

前引&#xff1a;飞算科技是一家专注于企业级智能化技术服务的公司&#xff0c;核心领域包括AI、大数据、云计算等。其Java AI解决方案主要面向企业级应用开发&#xff0c;提供从数据处理到模型部署的全流程支持&#xff01;飞算Java AI是一款基于人工智能技术的Java开发辅助工…

Chrome腾讯翻译插件transmart的安装

文章目录一、官网地址二、安装过程1. 下载插件2. 解压crx3, chrome安装三、如何使用一、官网地址 腾讯翻译插件官网 二、安装过程 1. 下载插件 点击上面的官网地址&#xff0c;下拉到如图所示chrome插件位置&#xff0c;点击立即下载 2. 解压crx 从压缩文件中解压出crx文…

IOMMU的2级地址翻译机制及多级(2~5)页表查找

IOMMU的2级地址翻译机制及多级(2~5)页表查找 摘要:IOMMU是现代计算机系统中用于I/O设备(如GPU、NIC、网络接口卡)的地址翻译和保护机制,类似于CPU的MMU(Memory Management Unit),但专为设备DMA(Direct Memory Access,直接内存访问)设计。它支持虚拟化环境(…

C++STL标准模板库详解

一、引言STL&#xff08;Standard Template Library&#xff09;是 C 标准库的核心组成部分&#xff0c;其中容器&#xff08;Containers&#xff09; 作为数据存储的基础组件&#xff0c;为开发者提供了丰富的数据结构选择。本文将聚焦 STL 容器的核心类型&#xff0c;结合具体…

神经网络 常见分类

&#x1f4da; 神经网络的常见分类方式可以从不同角度来划分&#xff0c;以下是几种主流思路&#xff0c;帮你快速梳理清晰&#xff1a;1️⃣ 按网络结构分类前馈神经网络&#xff08;Feedforward Neural Network, FNN&#xff09; 数据从输入层→隐藏层→输出层单向传递&#…

生产环境Redis缓存穿透与雪崩防护性能优化实战指南

生产环境Redis缓存穿透与雪崩防护性能优化实战指南 在当下高并发场景下&#xff0c;Redis 作为主流缓存组件&#xff0c;能够极大地提升读写性能&#xff0c;但同时也容易引发缓存穿透、缓存击穿及缓存雪崩等问题&#xff0c;导致后端依赖数据库的请求激增&#xff0c;系统稳定…

【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)

&#x1f525;个人主页&#xff1a;艾莉丝努力练剑 ❄专栏传送门&#xff1a;《C语言》、《数据结构与算法》、C语言刷题12天IO强训、LeetCode代码强化刷题、洛谷刷题、C/C基础知识知识强化补充、C/C干货分享&学习过程记录 &#x1f349;学习方向&#xff1a;C/C方向 ⭐️人…

嵌入式硬件篇---常见的单片机型号

以下是目前常用的单片机型号及其应用场景、优劣势的详细解析&#xff0c;结合最新行业动态和技术特性&#xff0c;帮助你精准匹配需求&#xff1a;一、经典 8 位单片机&#xff1a;低成本入门首选1. 51 系列&#xff08;代表型号&#xff1a;AT89C51、STC89C52&#xff09;应用…

windows下ArcGIS 10.8.2下载安装教程

ArcGIS是由美国环境系统研究所&#xff08;Esri&#xff09;开发的一款功能强大且应用广泛的综合性地理信息系统&#xff08;GIS&#xff09;软件平台&#xff0c;在空间数据的采集、管理、分析、可视化和共享等方面表现出色&#xff0c;是GIS领域的标杆产品。它拥有丰富的功能…

防御保护15

混合密码体系 --- 数字信封 逻辑 --- 先用快速的对称密钥来对消息进行加密&#xff0c;保证数据的机密性。然后只需要保证对称密钥的机密性即可&#xff0c;使用公钥密钥体系来对对称秘钥消息进行加密。身份认证和数据认证技术 Hash散列 指纹 ---> 单向散列函数 Hash --->…

Linux上管理Java的JDK版本

1.alternatives简介alternatives是 Linux 系统&#xff08;尤其是 ​​RHEL/CentOS/Fedora​​ 等基于 RPM 的发行版&#xff09;中用于管理​​同一软件多个版本​​的系统工具。它通过维护符号链接&#xff08;软链接&#xff09;的层级结构&#xff0c;帮助用户在不冲突的情…

webrtc编译arm/arm64

webrtc版本 m125版本 编译arm sudo apt install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf //下载失败,需要多次尝试 python3 build/linux/sysroot_scripts/install-sysroot.py --arch=arm //python3 bui

【读论文】医疗AI大模型:百川开源Baichuan-M2

1. 引言 最新百川开源了一个可以和openai新模型掰手腕的医疗垂直大模型:Baichuan-M2在HealthBench基准上取值60.1的高分,超过了gpt-oss-120b。这次一起回顾下百川给的技术报告。 2. Baichuan-M2概览:“模型+系统” Baichuan-M2的成功源于一套精心设计的、端到端的训练与优…

OBOO鸥柏丨75寸/86平板企业办公会议触控一体机核心国产化品牌招投标参数

OBOO鸥柏整机参数要求&#xff1a;55寸/65寸/75寸/85-86寸/98寸/100寸/110寸/115寸智能会议平板教学触控一体机/智慧黑板触摸屏参数要求。系统可灵活选择如&#xff1a;支持安卓&#xff08;Android&#xff09;&#xff0c;Windows可选择。并在KylinOS银河麒麟操作系统、统信U…

DCT域信息隐藏中超参数影响的深度解析:从理论到实践的完整指南

摘要 随着数字媒体技术的飞速发展,信息隐藏技术在版权保护、内容认证和隐私保护等领域发挥着越来越重要的作用。离散余弦变换(DCT)域作为信息隐藏的经典载体,因其与JPEG压缩标准的天然兼容性而备受关注。然而,DCT域信息隐藏的效果很大程度上取决于各种超参数的精心调节,…