圖像相似度算法匯總及Python實現

? ? ? 下面整理了一些圖像相似度算法,可根據不同的需求選擇不同的算法,對每種算法進行了簡單描述并給出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域信息隱藏的效果很大程度上取決于各種超參數的精心調節,…