构建智能图库搜索引擎:CLIP-GmP-ViT-L-14与前端交互实战

news2026/3/17 11:06:30
构建智能图库搜索引擎CLIP-GmP-ViT-L-14与前端交互实战你有没有过这样的经历电脑里存了几千张产品图、设计稿或者旅行照片想找一张“蓝色背景的咖啡杯”或者“带小狗的公园照片”却只能对着文件夹列表干瞪眼一张张手动翻看效率低到让人抓狂。传统的图库管理要么靠文件名谁还记得每张图起过什么名字要么靠手动打标签工作量巨大且容易遗漏。现在借助多模态AI模型我们可以让电脑真正“看懂”图片内容实现用自然语言直接搜索图片。今天我就带你从零开始手把手搭建一个私有化的智能图库搜索引擎。这个系统的核心思路很简单我们用强大的CLIP-GmP-ViT-L-14模型为你的每一张图片生成一个“数字指纹”特征向量。当你想搜索时只需输入一句话系统同样把这句话转换成“指纹”然后在图库中快速找出“指纹”最相似的图片。整个过程你不需要懂任何复杂的算法只需要一个清晰的思路和一些代码。1. 为什么选择CLIP-GmP-ViT-L-14在开始动手之前我们先花几分钟聊聊为什么选这个模型。市面上能做图文匹配的模型不少但CLIP-GmP-ViT-L-14有几个特别适合我们这种个人或小团队项目的优点。首先它的“理解”能力很强。CLIP模型在训练时见过海量的图文对所以它不仅能识别物体比如“猫”、“狗”还能理解一些抽象概念和关系比如“温馨的家庭聚会”、“具有未来感的设计”。GmP-ViT-L-14则是它的一个具体实现版本在保持较高精度的同时模型大小和计算效率相对平衡。其次它用起来很方便。我们不需要为了搜索图片而去训练一个新模型直接使用它预训练好的能力就行这叫做“零样本”学习。你给它一张它从来没见过的图片和一段描述它也能给出一个靠谱的相关性分数。最后它的输出——那个512维的特征向量非常适合做快速检索。我们可以用专门的向量数据库来存储和索引这些向量实现毫秒级的搜索速度哪怕图库里有几十万张图片也不怕。简单来说它就像一个既博学又高效的“看图专家”我们把它请来为我们的图片库建立一套智能目录。2. 搭建智能搜索引擎的后端核心后端是整个系统的大脑负责最重的计算任务处理图片、生成向量、建立索引和执行搜索。我们把它分成几个清晰的步骤来实现。2.1 环境准备与模型加载我们使用Python来构建后端。首先确保你的环境里安装了必要的库。pip install torch torchvision transformers pillow numpy pip install sentence-transformers # 这是加载CLIP模型的一个便捷库 pip install faiss-cpu # 用于高效的向量相似度搜索接下来我们写一个脚本来初始化模型。这里的关键是加载正确的模型名称。import torch from sentence_transformers import SentenceTransformer from PIL import Image import os class ImageSearchBackend: def __init__(self, model_nameclip-ViT-L-14): 初始化搜索引擎后端加载CLIP模型。 注意我们使用sentence-transformers库封装的CLIP模型它接口更友好。 clip-ViT-L-14 对应着 OpenCLIP 中的 ViT-L/14 模型。 print(f正在加载模型: {model_name}...) # 加载用于编码文本和图像的双塔模型 self.model SentenceTransformer(model_name) self.device cuda if torch.cuda.is_available() else cpu self.model.to(self.device) print(f模型已加载至设备: {self.device}) def encode_image(self, image_path): 将单张图片编码为特征向量 try: img Image.open(image_path).convert(RGB) # 模型会自动处理图像的预处理如缩放、归一化 img_embedding self.model.encode([img], convert_to_tensorTrue, show_progress_barFalse) return img_embedding.cpu().numpy()[0] # 转换为numpy数组返回 except Exception as e: print(f处理图片 {image_path} 时出错: {e}) return None def encode_text(self, query_text): 将搜索文本编码为特征向量 text_embedding self.model.encode([query_text], convert_to_tensorTrue, show_progress_barFalse) return text_embedding.cpu().numpy()[0]这段代码创建了一个类它封装了模型加载、图片编码和文本编码的功能。encode_image方法会把一张图片变成512维的向量encode_text方法会把你的搜索词比如“一只在沙滩上的金毛犬”也变成同样维度的向量。这两个向量在同一个空间里它们的“距离”越近就表示图片和文字越相关。2.2 构建图片向量库与FAISS索引有了编码单张图片的能力接下来我们要批量处理整个图库并建立一个能快速检索的索引。这里我们用到Facebook开源的FAISS库它专门为向量搜索做了优化。import faiss import numpy as np import pickle from tqdm import tqdm # 用于显示进度条 class VectorIndex: def __init__(self, index_save_pathfaiss_index.bin, meta_save_pathimage_metadata.pkl): self.index_save_path index_save_path self.meta_save_path meta_save_path self.index None self.image_paths [] # 存储图片路径索引ID对应列表位置 self.dimension 512 # CLIP-ViT-L-14 生成向量的维度 def build_index_from_folder(self, image_folder, backend_model, batch_size32): 遍历文件夹编码所有图片并构建FAISS索引 supported_exts (.jpg, .jpeg, .png, .bmp, .gif) image_files [] for root, _, files in os.walk(image_folder): for file in files: if file.lower().endswith(supported_exts): image_files.append(os.path.join(root, file)) print(f发现 {len(image_files)} 张图片开始编码...) all_embeddings [] self.image_paths [] # 分批处理图片避免内存不足 for i in tqdm(range(0, len(image_files), batch_size)): batch_files image_files[i:ibatch_size] batch_embeddings [] batch_valid_paths [] for img_path in batch_files: emb backend_model.encode_image(img_path) if emb is not None: batch_embeddings.append(emb) batch_valid_paths.append(img_path) if batch_embeddings: all_embeddings.extend(batch_embeddings) self.image_paths.extend(batch_valid_paths) if not all_embeddings: print(未成功编码任何图片。) return False # 转换为numpy数组 embeddings_array np.array(all_embeddings).astype(float32) print(f编码完成共得到 {embeddings_array.shape[0]} 个向量。) # 创建FAISS索引。这里使用IndexFlatL2它计算标准的欧式距离简单有效。 self.index faiss.IndexFlatL2(self.dimension) self.index.add(embeddings_array) # 将向量添加到索引中 print(fFAISS索引构建完成包含 {self.index.ntotal} 个向量。) # 保存索引和元数据 self.save_index() return True def search(self, query_vector, top_k10): 在索引中搜索最相似的top_k张图片 if self.index is None: raise ValueError(索引未加载或未构建请先加载索引。) # 将查询向量重塑为2D数组并转换为float32 query_vector np.array([query_vector]).astype(float32) # 执行搜索返回距离和索引ID distances, indices self.index.search(query_vector, top_k) # 根据索引ID找到对应的图片路径 results [] for i, idx in enumerate(indices[0]): if idx len(self.image_paths): # 确保索引有效 results.append({ image_path: self.image_paths[idx], score: float(distances[0][i]) # 距离越小越相似 }) return results def save_index(self): 保存FAISS索引和图片路径元数据 if self.index: faiss.write_index(self.index, self.index_save_path) with open(self.meta_save_path, wb) as f: pickle.dump(self.image_paths, f) print(f索引和元数据已保存至 {self.index_save_path} 和 {self.meta_save_path}) def load_index(self): 加载已保存的FAISS索引和元数据 self.index faiss.read_index(self.index_save_path) with open(self.meta_save_path, rb) as f: self.image_paths pickle.load(f) print(f索引加载成功包含 {self.index.ntotal} 个向量{len(self.image_paths)} 条元数据。)这个VectorIndex类干了三件重要的事一是遍历你的图片文件夹调用之前的编码器把所有图片变成向量二是用FAISS建立一个高效的索引这个索引能让我们在百万级向量里快速找到最近的邻居三是提供了保存和加载的功能这样每次启动服务时就不用重新编码所有图片了大大节省时间。2.3 设计前后端交互的API后端算完了得把结果交给前端展示。我们用一个轻量级的Web框架比如Flask来创建几个简单的API接口。from flask import Flask, request, jsonify, send_file from flask_cors import CORS # 处理跨域请求 import os app Flask(__name__) CORS(app) # 允许前端跨域访问 # 初始化后端和索引 backend ImageSearchBackend() vector_index VectorIndex() # 尝试加载已有索引如果不存在则需要先通过管理接口构建 try: vector_index.load_index() print(成功加载已有索引。) except: print(未找到已有索引请先构建索引。) app.route(/api/search, methods[POST]) def handle_search(): 处理搜索请求 data request.json query_text data.get(query, ).strip() top_k data.get(top_k, 10) if not query_text: return jsonify({error: 搜索内容不能为空}), 400 try: # 1. 将搜索文本编码为向量 query_vector backend.encode_text(query_text) # 2. 在向量索引中搜索 search_results vector_index.search(query_vector, top_ktop_k) # 3. 处理结果将本地路径转换为前端可访问的URL processed_results [] for res in search_results: # 这里简化处理实际部署时需要配置静态文件服务或上传到云存储 # 假设图片存放在 static/images/ 目录下 rel_path os.path.relpath(res[image_path], startstatic) processed_results.append({ url: f/static/{rel_path}, score: res[score] }) return jsonify({query: query_text, results: processed_results}) except Exception as e: return jsonify({error: f搜索失败: {str(e)}}), 500 app.route(/api/health, methods[GET]) def health_check(): 健康检查接口 return jsonify({status: ok, index_size: vector_index.index.ntotal if vector_index.index else 0}) if __name__ __main__: # 在启动前确保 static 目录存在用于存放图片 os.makedirs(static, exist_okTrue) app.run(host0.0.0.0, port5000, debugTrue)这个API非常简单主要就两个端点/api/search用来接收前端的搜索词然后返回最相似的图片列表/api/health用来检查服务是否正常。返回给前端的图片地址我们这里做了简化实际部署时你可能需要用到云存储或者更完善的静态文件服务。3. 打造简洁易用的前端界面后端准备好了我们需要一个界面让用户能方便地搜索。前端的目标是简洁直观一个搜索框一个按钮一个展示结果的区域。我们使用基础的HTML、CSS和JavaScript来实现不依赖复杂的框架方便理解和集成。!DOCTYPE html html langzh-CN head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 title我的智能图库搜索/title style * { box-sizing: border-box; margin: 0; padding: 0; font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, sans-serif; } body { background-color: #f5f7fa; color: #333; line-height: 1.6; padding: 20px; max-width: 1200px; margin: 0 auto; } header { text-align: center; margin-bottom: 40px; padding-top: 20px; } h1 { color: #2c3e50; margin-bottom: 10px; } .subtitle { color: #7f8c8d; font-size: 1.1em; } .search-container { background: white; padding: 30px; border-radius: 12px; box-shadow: 0 5px 15px rgba(0,0,0,0.05); margin-bottom: 30px; } .search-box { display: flex; gap: 10px; } #searchInput { flex-grow: 1; padding: 15px 20px; border: 2px solid #e0e6ed; border-radius: 8px; font-size: 16px; transition: border 0.3s; } #searchInput:focus { outline: none; border-color: #3498db; } #searchButton { padding: 15px 30px; background-color: #3498db; color: white; border: none; border-radius: 8px; font-size: 16px; cursor: pointer; transition: background 0.3s; } #searchButton:hover { background-color: #2980b9; } #loading { text-align: center; color: #3498db; margin: 20px 0; display: none; } .results-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; } #resultsContainer { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 20px; } .image-card { background: white; border-radius: 10px; overflow: hidden; box-shadow: 0 3px 10px rgba(0,0,0,0.08); transition: transform 0.3s, box-shadow 0.3s; } .image-card:hover { transform: translateY(-5px); box-shadow: 0 10px 25px rgba(0,0,0,0.1); } .image-card img { width: 100%; height: 200px; object-fit: cover; display: block; } .image-info { padding: 15px; } .image-info .score { font-size: 0.9em; color: #95a5a6; } .error { background-color: #fee; color: #c0392b; padding: 15px; border-radius: 8px; margin: 20px 0; border-left: 4px solid #c0392b; } footer { text-align: center; margin-top: 50px; color: #95a5a6; font-size: 0.9em; } /style /head body header h1 智能图库搜索引擎/h1 p classsubtitle用自然语言描述找到你想要的任何图片/p /header main div classsearch-container div classsearch-box input typetext idsearchInput placeholder例如一只在草地上玩耍的柯基犬阳光很好... autofocus button idsearchButton搜索图片/button /div p stylemargin-top: 15px; color: #7f8c8d; font-size: 0.95em;试试搜索“城市夜景”、“水墨风格山水画”、“戴着眼镜的程序员”/p /div div idloading正在搜索中请稍候.../div div iderrorMessage classerror styledisplay: none;/div div classresults-header styledisplay: none; idresultsHeader h2搜索结果/h2 span idresultCount/span /div div idresultsContainer !-- 搜索结果会动态插入到这里 -- /div /main footer pPowered by CLIP-GmP-ViT-L-14 FAISS | 本地部署隐私安全/p /footer script const API_BASE_URL http://localhost:5000; // 后端API地址根据实际情况修改 const searchInput document.getElementById(searchInput); const searchButton document.getElementById(searchButton); const loadingEl document.getElementById(loading); const errorEl document.getElementById(errorMessage); const resultsHeader document.getElementById(resultsHeader); const resultCount document.getElementById(resultCount); const resultsContainer document.getElementById(resultsContainer); // 回车键触发搜索 searchInput.addEventListener(keypress, function(e) { if (e.key Enter) { performSearch(); } }); searchButton.addEventListener(click, performSearch); async function performSearch() { const query searchInput.value.trim(); if (!query) { showError(请输入搜索内容。); return; } // 清空之前的结果和错误信息 clearResults(); hideError(); showLoading(); try { const response await fetch(${API_BASE_URL}/api/search, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ query: query, top_k: 12 }) }); const data await response.json(); if (!response.ok) { throw new Error(data.error || 搜索请求失败); } hideLoading(); displayResults(data.query, data.results); } catch (error) { hideLoading(); showError(搜索出错: ${error.message}); console.error(搜索错误:, error); } } function displayResults(query, results) { if (!results || results.length 0) { showError(没有找到与“${query}”相关的图片。); return; } // 显示结果区域标题 resultsHeader.style.display flex; resultCount.textContent 共找到 ${results.length} 张相关图片; // 生成图片卡片 resultsContainer.innerHTML ; results.forEach(item { const card document.createElement(div); card.className image-card; // 分数越小越相似这里转换成一个更直观的百分比显示仅作示意 const displayScore (1 / (1 item.score) * 100).toFixed(1); card.innerHTML img src${item.url} alt搜索结果图片 loadinglazy onerrorthis.srchttps://via.placeholder.com/250x200?text图片加载失败 div classimage-info div classscore相关度: ${displayScore}%/div /div ; resultsContainer.appendChild(card); }); } function showLoading() { loadingEl.style.display block; } function hideLoading() { loadingEl.style.display none; } function showError(msg) { errorEl.textContent msg; errorEl.style.display block; } function hideError() { errorEl.style.display none; } function clearResults() { resultsContainer.innerHTML ; resultsHeader.style.display none; } /script /body /html这个前端页面非常直白。用户输入文字点击搜索JavaScript会把请求发给我们的后端API拿到结果后再把图片一张张渲染到页面上。我们甚至还加了一点小动画让卡片在鼠标移上去的时候有个上浮的效果体验更好。4. 让搜索更快更准的优化技巧基础功能跑通后我们来看看如何让它变得更快、更准、更能处理实际需求。这里有几个经过实践检验的优化方向。第一索引结构的优化。我们上面用的IndexFlatL2是精确搜索速度在数据量很大时会变慢。FAISS提供了多种近似搜索的索引类型比如IndexIVFFlat。它的原理是先对向量空间进行聚类搜索时只在最相关的几个聚类里找能极大提升速度代价是损失一点点精度。对于百万级别的图库这种 trade-off 通常是值得的。def build_ivf_index(self, embeddings_array, nlist100): 构建倒排文件索引 (IVF)加速大规模搜索 quantizer faiss.IndexFlatL2(self.dimension) self.index faiss.IndexIVFFlat(quantizer, self.dimension, nlist, faiss.METRIC_L2) # 需要先训练索引 self.index.train(embeddings_array) self.index.add(embeddings_array) self.index.nprobe 10 # 搜索时探查的聚类中心数越大越准越慢第二搜索结果的再排序。CLIP模型给出的相似度分数距离有时可能不够完美。我们可以引入一个简单的“重排序”机制。例如先使用快速的IVF索引召回100个候选结果然后再用更精细的模型或者同样的CLIP模型但进行更精确的计算对这100个结果重新计算分数并排序取前10个。这样既能保证速度又能提升最终结果的准确性。第三处理长尾搜索词。有时候用户会搜索非常具体或生僻的概念比如“维多利亚时期风格的蕾丝边”。如果直接搜索效果不好可以尝试对搜索词进行“扩展”。例如用一个大语言模型LLM将用户的查询分解或改写成几个相关的、更常见的概念组合“蕾丝”、“复古风格”、“复杂花纹”然后分别搜索这些概念最后合并结果。这相当于给搜索引擎加了一个“理解用户意图”的预处理层。第四前端体验优化。我们可以给搜索框增加自动补全功能根据历史搜索或常见标签提供建议。对于搜索结果可以实现无限滚动或分页加载避免一次性加载过多图片导致页面卡顿。还可以增加过滤选项比如按图片尺寸、创建时间或预估的相关度阈值进行筛选。5. 从项目到产品一些实用的思考把这个demo变成一个真正可用的工具还有一些实际问题需要考虑。首先是性能与规模。如果你的图片库超过十万张单机处理可能会遇到瓶颈。这时可以考虑将向量索引服务单独部署使用更专业的向量数据库比如Milvus或Qdrant它们专为分布式向量检索设计支持水平扩展。图片编码也可以做成分布式任务用队列如Redis来调度。其次是用户体验。除了关键词搜索可以增加“以图搜图”功能。用户上传一张图片系统找到相似的图片这在找同系列设计图或相似产品时非常有用。实现起来很简单用同样的encode_image方法把上传的图片变成向量然后去索引里搜索即可。最后是持续维护。图库不是静态的新图片会不断加入。我们需要一个机制来增量更新索引。可以写一个监控脚本定期扫描指定文件夹的新图片编码后增量添加到FAISS索引中FAISS支持add方法。对于删除的图片则需要记录一个无效ID列表在搜索返回结果时进行过滤。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…