人脸识别数据集构建:从图像采集到质量管理的完整技术方案
这次我们来看一个关于梁文峰照片资源的项目。虽然标题看起来像是个人分享但背后可能涉及图像采集、人脸识别或网络资源整理的技术需求。对于开发者来说这类需求常常出现在人物图像数据集构建、身份验证系统测试或内容管理工具开发中。从技术角度看这类项目需要解决几个核心问题如何高效采集网络图像、如何确保图像质量、如何进行人脸检测和识别、以及如何管理这些图像资源。虽然输入材料有限但我们可以基于常见的技术方案来探讨一套完整的实现思路。本文将重点介绍从网络图像采集到本地管理的全流程技术方案包括爬虫工具选择、人脸检测算法、图像去重方法、以及本地存储管理。无论你是需要构建人物图像数据集还是开发相关的图像处理工具都能从中获得实用的技术参考。1. 核心能力速览能力项说明图像采集支持从多个来源批量获取图像包括搜索引擎、社交媒体等人脸检测集成人脸识别算法自动检测和裁剪人脸区域质量筛选基于分辨率、清晰度、光照条件等参数自动过滤低质量图像去重处理使用图像哈希或特征比对消除重复或相似图像存储管理结构化存储图像元数据支持快速检索和分类批量处理支持并发处理提高大规模图像采集效率2. 适用场景与使用边界这类图像采集和处理技术主要适用于以下场景适用场景学术研究用于人脸识别算法训练和测试的数据集构建内容管理为媒体项目或档案系统整理人物图像资源身份验证开发基于人脸的身份验证系统所需测试数据数字档案建立人物数字档案的图像资料库使用边界与合规要求必须遵守相关法律法规仅采集公开可用的图像资源尊重肖像权和隐私权不得用于商业用途或侵权目的采集范围应限于合理使用范畴避免过度收集个人图像存储和使用过程中需确保数据安全防止信息泄露3. 环境准备与前置条件在开始图像采集和处理前需要准备以下环境硬件要求CPU支持AVX指令集的现代处理器Intel i5以上或同等AMD处理器内存至少8GB建议16GB以上用于批量处理存储SSD硬盘根据采集规模准备足够空间建议100GB起步GPU可选CUDA兼容显卡可加速人脸检测处理软件环境操作系统Windows 10/11, macOS 10.15, 或 Ubuntu 18.04Python 3.8 并安装以下核心库# 安装基础依赖 pip install requests beautifulsoup4 selenium pillow # 人脸检测相关 pip install opencv-python face-recognition dlib # 图像处理增强 pip install numpy scikit-image imagehash网络条件稳定的互联网连接用于图像采集配置适当的User-Agent遵守网站robots.txt规则设置合理的请求间隔避免对目标网站造成压力4. 图像采集技术方案4.1 搜索引擎图像采集使用搜索引擎的图片搜索功能是获取人物图像的常见方法。以下是一个基于Bing图片搜索的示例import requests import json from urllib.parse import urlencode import os from PIL import Image import io def bing_image_search(query, count50): 通过Bing图片搜索API获取图像 headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36, Ocp-Apim-Subscription-Key: 你的Bing搜索API密钥 } params { q: query, count: count, offset: 0, mkt: zh-CN, safeSearch: Moderate, imageType: Photo } search_url https://api.bing.microsoft.com/v7.0/images/search response requests.get(search_url, headersheaders, paramsparams) results response.json() image_urls [] for item in results.get(value, []): image_urls.append({ url: item[contentUrl], title: item[name], size: item[contentSize], dimensions: f{item[width]}x{item[height]} }) return image_urls4.2 多源采集策略为了提高采集覆盖率和质量建议采用多源采集策略class MultiSourceImageCollector: def __init__(self): self.sources [bing, google, flickr] # 可扩展更多源 def collect_images(self, query, max_per_source20): all_images [] for source in self.sources: try: if source bing: images self._bing_collect(query, max_per_source) elif source google: images self._google_collect(query, max_per_source) # 可以继续添加其他来源 all_images.extend(images) print(f从 {source} 采集到 {len(images)} 张图片) except Exception as e: print(f从 {source} 采集失败: {e}) continue return all_images def _bing_collect(self, query, count): # 实现Bing采集逻辑 pass def _google_collect(self, query, count): # 实现Google采集逻辑需使用合法API pass5. 人脸检测与质量筛选5.1 人脸检测实现使用OpenCV和dlib库进行人脸检测和特征提取import cv2 import dlib import numpy as np from pathlib import Path class FaceProcessor: def __init__(self): # 初始化人脸检测器 self.detector dlib.get_frontal_face_detector() self.predictor dlib.shape_predictor(shape_predictor_68_face_landmarks.dat) def detect_faces(self, image_path): 检测图像中的人脸并返回人脸区域 image cv2.imread(str(image_path)) if image is None: return None gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) faces self.detector(gray) face_regions [] for face in faces: # 获取人脸边界框 x, y, w, h face.left(), face.top(), face.width(), face.height() # 扩展边界框确保包含完整人脸 expansion 0.2 x_exp max(0, int(x - w * expansion)) y_exp max(0, int(y - h * expansion)) w_exp min(image.shape[1] - x_exp, int(w * (1 2 * expansion))) h_exp min(image.shape[0] - y_exp, int(h * (1 2 * expansion))) face_regions.append({ bbox: (x_exp, y_exp, w_exp, h_exp), confidence: face.confidence if hasattr(face, confidence) else 1.0 }) return face_regions def extract_face_embedding(self, face_region): 提取人脸特征向量用于去重 # 使用预训练模型提取512维特征向量 # 这里使用OpenFace或ArcFace等模型 pass5.2 图像质量评估建立多维度质量评估体系class ImageQualityAssessor: def __init__(self): self.min_resolution (200, 200) # 最小分辨率要求 self.max_file_size 10 * 1024 * 1024 # 最大文件大小10MB def assess_quality(self, image_path): 综合评估图像质量 try: with Image.open(image_path) as img: # 检查分辨率 if img.size[0] self.min_resolution[0] or img.size[1] self.min_resolution[1]: return False, 分辨率过低 # 检查文件大小 file_size Path(image_path).stat().st_size if file_size self.max_file_size: return False, 文件过大 # 检查图像模糊度 blur_score self._calculate_blurness(img) if blur_score 100: # 阈值可根据实际情况调整 return False, 图像过于模糊 # 检查亮度均匀性 brightness_score self._assess_brightness(img) if brightness_score 0.3 or brightness_score 0.7: return False, 亮度不适宜 return True, 质量合格 except Exception as e: return False, f图像损坏: {e} def _calculate_blurness(self, image): 计算图像模糊度 # 使用拉普拉斯方差法评估模糊度 image_cv cv2.cvtColor(np.array(image), cv2.COLOR_RGB2BGR) gray cv2.cvtColor(image_cv, cv2.COLOR_BGR2GRAY) return cv2.Laplacian(gray, cv2.CV_64F).var() def _assess_brightness(self, image): 评估图像亮度分布 image_array np.array(image) brightness np.mean(image_array) / 255.0 return brightness6. 去重处理与特征比对6.1 基于图像哈希的去重使用感知哈希算法快速识别相似图像import imagehash from PIL import Image class DuplicateDetector: def __init__(self, hash_size8, threshold5): self.hash_size hash_size self.threshold threshold # 哈希距离阈值 def calculate_hash(self, image_path): 计算图像感知哈希 try: with Image.open(image_path) as img: # 计算多种哈希值提高去重准确性 ahash imagehash.average_hash(img, self.hash_size) phash imagehash.phash(img, self.hash_size) dhash imagehash.dhash(img, self.hash_size) return { ahash: str(ahash), phash: str(phash), dhash: str(dhash), file_path: image_path } except Exception as e: print(f计算哈希失败 {image_path}: {e}) return None def is_duplicate(self, hash1, hash2): 判断两张图像是否重复 if hash1 is None or hash2 is None: return False # 计算多种哈希的距离 ahash_dist self.hamming_distance(hash1[ahash], hash2[ahash]) phash_dist self.hamming_distance(hash1[phash], hash2[phash]) dhash_dist self.hamming_distance(hash1[dhash], hash2[dhash]) # 如果任意一种哈希距离小于阈值认为是重复图像 return min(ahash_dist, phash_dist, dhash_dist) self.threshold def hamming_distance(self, hash1, hash2): 计算汉明距离 return sum(c1 ! c2 for c1, c2 in zip(hash1, hash2))6.2 批量去重处理实现完整的批量去重流水线class BatchDeduplicator: def __init__(self): self.detector DuplicateDetector() self.processed_hashes [] def process_directory(self, input_dir, output_dir): 处理整个目录的去重 input_path Path(input_dir) output_path Path(output_dir) output_path.mkdir(exist_okTrue) image_files list(input_path.glob(*.jpg)) list(input_path.glob(*.png)) unique_images [] for img_path in image_files: print(f处理: {img_path.name}) # 计算哈希值 current_hash self.detector.calculate_hash(img_path) if current_hash is None: continue # 检查是否重复 is_duplicate False for existing_hash in self.processed_hashes: if self.detector.is_duplicate(current_hash, existing_hash): is_duplicate True break if not is_duplicate: # 复制到输出目录 output_file output_path / img_path.name import shutil shutil.copy2(img_path, output_file) unique_images.append(img_path) self.processed_hashes.append(current_hash) print(f去重完成: 原始{len(image_files)}张, 去重后{len(unique_images)}张) return unique_images7. 存储管理与元数据记录7.1 元数据数据库设计使用SQLite管理图像元数据import sqlite3 from datetime import datetime import json class ImageMetadataManager: def __init__(self, db_pathimage_collection.db): self.db_path db_path self._init_database() def _init_database(self): 初始化数据库表结构 conn sqlite3.connect(self.db_path) cursor conn.cursor() cursor.execute( CREATE TABLE IF NOT EXISTS images ( id INTEGER PRIMARY KEY AUTOINCREMENT, file_path TEXT UNIQUE, file_name TEXT, file_size INTEGER, resolution TEXT, source_url TEXT, collection_date TEXT, face_count INTEGER, quality_score REAL, hash_values TEXT, tags TEXT ) ) conn.commit() conn.close() def add_image_record(self, image_info): 添加图像记录 conn sqlite3.connect(self.db_path) cursor conn.cursor() cursor.execute( INSERT OR REPLACE INTO images (file_path, file_name, file_size, resolution, source_url, collection_date, face_count, quality_score, hash_values, tags) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) , ( image_info[file_path], image_info[file_name], image_info[file_size], image_info[resolution], image_info.get(source_url, ), datetime.now().isoformat(), image_info.get(face_count, 0), image_info.get(quality_score, 0), json.dumps(image_info.get(hash_values, {})), json.dumps(image_info.get(tags, [])) )) conn.commit() conn.close()7.2 图像检索功能实现基于元数据的快速检索def search_images(self, criteria): 根据条件搜索图像 conn sqlite3.connect(self.db_path) cursor conn.cursor() query SELECT * FROM images WHERE 11 params [] if criteria.get(min_resolution): query AND resolution ? params.append(criteria[min_resolution]) if criteria.get(min_quality): query AND quality_score ? params.append(criteria[min_quality]) if criteria.get(has_faces): query AND face_count 0 cursor.execute(query, params) results cursor.fetchall() conn.close() return [self._row_to_dict(row) for row in results] def _row_to_dict(self, row): 将数据库行转换为字典 return { id: row[0], file_path: row[1], file_name: row[2], file_size: row[3], resolution: row[4], source_url: row[5], collection_date: row[6], face_count: row[7], quality_score: row[8], hash_values: json.loads(row[9]), tags: json.loads(row[10]) }8. 批量任务处理与性能优化8.1 并发处理实现使用多线程提高处理效率import concurrent.futures from threading import Lock class BatchImageProcessor: def __init__(self, max_workers4): self.max_workers max_workers self.lock Lock() self.processed_count 0 def process_batch(self, image_paths, output_dir): 批量处理图像 Path(output_dir).mkdir(exist_okTrue) with concurrent.futures.ThreadPoolExecutor(max_workersself.max_workers) as executor: future_to_path { executor.submit(self._process_single_image, path, output_dir): path for path in image_paths } for future in concurrent.futures.as_completed(future_to_path): path future_to_path[future] try: result future.result() with self.lock: self.processed_count 1 print(f进度: {self.processed_count}/{len(image_paths)}) except Exception as e: print(f处理失败 {path}: {e}) def _process_single_image(self, image_path, output_dir): 处理单张图像 # 人脸检测 face_processor FaceProcessor() faces face_processor.detect_faces(image_path) # 质量评估 quality_assessor ImageQualityAssessor() is_quality, reason quality_assessor.assess_quality(image_path) if faces and is_quality: # 保存合格图像 output_path Path(output_dir) / Path(image_path).name import shutil shutil.copy2(image_path, output_path) return { status: success, face_count: len(faces), output_path: str(output_path) } else: return { status: rejected, reason: reason if not is_quality else 无人脸 }8.2 内存优化策略处理大量图像时的内存管理class MemoryOptimizedProcessor: def __init__(self, batch_size10): self.batch_size batch_size def process_large_collection(self, image_dir, output_dir): 处理大规模图像集合分批处理避免内存溢出 image_files list(Path(image_dir).glob(*.[jp][pn]g)) total_batches (len(image_files) self.batch_size - 1) // self.batch_size for batch_idx in range(total_batches): start_idx batch_idx * self.batch_size end_idx min((batch_idx 1) * self.batch_size, len(image_files)) batch_files image_files[start_idx:end_idx] print(f处理批次 {batch_idx 1}/{total_batches}) self._process_batch(batch_files, output_dir) # 强制垃圾回收 import gc gc.collect() def _process_batch(self, batch_files, output_dir): 处理单个批次 processor BatchImageProcessor(max_workers2) # 减少并发数控制内存 processor.process_batch(batch_files, output_dir)9. 常见问题与排查方法问题现象可能原因排查方式解决方案采集到的图像数量少搜索关键词不准确或API限制检查搜索关键词验证API调用次数优化关键词申请更高API限额人脸检测准确率低图像质量差或角度特殊检查图像质量评估结果调整检测参数增加多角度检测去重效果不理想哈希阈值设置不当分析哈希距离分布调整阈值结合多种哈希算法内存使用过高批量处理规模过大监控内存使用情况减小批次大小优化图像加载处理速度慢单线程处理或硬件限制检查CPU使用率增加并发数使用GPU加速10. 最佳实践与使用建议10.1 采集策略优化关键词设计使用多种称呼和组合如梁文峰 照片、梁文峰 肖像等结合场景关键词如梁文峰 会议、梁文峰 活动使用不同语言版本的关键词扩大覆盖范围质量控制设置合理的分辨率阈值避免采集低质量图像建立人工审核流程对自动筛选结果进行抽样检查定期更新质量评估标准适应不同的图像类型10.2 技术实施建议增量采集# 实现增量采集避免重复工作 def incremental_collection(self, query, since_dateNone): 基于时间戳的增量采集 # 记录上次采集时间只采集新内容 pass错误处理与重试def robust_download(self, url, max_retries3): 带重试机制的下载函数 for attempt in range(max_retries): try: response requests.get(url, timeout30) if response.status_code 200: return response.content except Exception as e: print(f下载失败第{attempt1}次: {e}) time.sleep(2 ** attempt) # 指数退避 return None10.3 合规使用提醒仅采集公开可用的图像资源尊重版权和肖像权在商业使用前确保获得必要的授权许可建立数据保留和删除政策定期清理不再需要的图像对敏感个人信息采取适当的保护措施这套技术方案为人物图像资源的采集和管理提供了完整的实现框架。在实际应用中需要根据具体需求调整参数和流程同时始终遵守相关法律法规和伦理准则。通过自动化的采集、检测、去重和管理流程可以高效地构建高质量的人物图像数据集为各种应用场景提供可靠的图像资源支持。

相关新闻

知网AIGC检测和iThenticate哪个更严?实测同一篇论文相差27个百分点,附免费过检方法

知网AIGC检测和iThenticate哪个更严?实测同一篇论文相差27个百分点,附免费过检方法

同一篇论文,知网AIGC检测18%,iThenticate检测45%。 不是笔误——同一篇文章,两个平台差了27个百分点。 这种情况很多投期刊的同学遇到过,不知道哪个才算"真实的"AI率,也不知道该用哪个平台为准来降AI。 这…

2026/9/30 11:22:06 阅读更多 →
5分钟上手vim-oscyank:让Vim跨终端复制文本不再头疼

5分钟上手vim-oscyank:让Vim跨终端复制文本不再头疼

5分钟上手vim-oscyank:让Vim跨终端复制文本不再头疼 【免费下载链接】vim-oscyank A Vim plugin to copy text through SSH with OSC52 项目地址: https://gitcode.com/gh_mirrors/vi/vim-oscyank vim-oscyank是一款强大的Vim插件,它利用ANSI OSC…

2026/10/5 15:35:31 阅读更多 →
AgentScope-Java核心术语解析与应用指南

AgentScope-Java核心术语解析与应用指南

1. AgentScope-Java 词汇表的价值与定位 作为《AgentScope-Java 深入浅出教程》的附录部分,这个词汇表绝非简单的术语堆砌。在真实的开发场景中,我发现很多Java开发者在使用AgentScope框架时,经常被一些特定术语和缩写搞得晕头转向。比如第一…

2026/10/6 20:08:29 阅读更多 →

最新新闻

GEO优化与向量数据库:品牌如何赢得AI搜索答案的引用

GEO优化与向量数据库:品牌如何赢得AI搜索答案的引用

过去这半年,我一直在跟品牌方讲一个反直觉的结论:2026年的搜索优化,第一战场早就不是网页排名,而是AI大模型的答案生成链路。GEO优化,即面向生成式AI搜索引擎的内容可见性优化,核心思路从“让搜索引擎抓取你…

2026/10/7 4:40:36 阅读更多 →
药品主数据管理:以INN为锚统一ATC编码与化学结构标识

药品主数据管理:以INN为锚统一ATC编码与化学结构标识

做药品数据管理的朋友,应该都经历过这种场面:供应商系统里叫“阿托伐他汀钙片”,临床系统里写“阿托伐他汀”,研发数据库里是“Atorvastatin Calcium”,仓储那边拿着商品名“立普妥”,而稽查要的ATC编码又是…

2026/10/7 4:40:36 阅读更多 →
光伏阵列Boost与MPPT扰动观察法及储能控制Simulink仿真实践

光伏阵列Boost与MPPT扰动观察法及储能控制Simulink仿真实践

最近在做光伏发电系统的仿真验证时,我重新把“光伏阵列Boost电路MPPT控制储能单元”这套组合完整搭建了一遍。这个项目模型的核心是扰动观察法(P&O)实现最大功率点跟踪(MPPT),同时叠加了储能控制策略&a…

2026/10/7 4:40:36 阅读更多 →
提示系统集成测试全攻略:从DSL版本兼容到预发环境落地

提示系统集成测试全攻略:从DSL版本兼容到预发环境落地

做提示词(Prompt)工程的都知道,单写一条高质量的提示词不难,难的是把一整套提示系统稳定地集成进业务里。我在大厂这几年,带过不下二十个提示系统的集成测试项目,见过太多“开发环境跑得好好的,…

2026/10/7 4:40:36 阅读更多 →
Node伪请求服务实战:解决前后端联调等待难题

Node伪请求服务实战:解决前后端联调等待难题

搞服务器运维搞到第四十三篇,今天想聊聊一个看起来不起眼、但在联调阶段能省下大量时间的活儿——用 Node 搭一个“伪请求”(pseudo http)服务。我们内部有个后台系统叫“东方仙盟”,前后端小团队联调时最烦的就是后端接口还没就绪…

2026/10/7 4:40:36 阅读更多 →
华为交换机路由器配置实例:从初始化到VLAN、路由与DHCP排障

华为交换机路由器配置实例:从初始化到VLAN、路由与DHCP排障

简介:这份华为交换机和路由器配置实例文档,面向企业网络管理员与运维工程师,系统梳理了多个主流系列交换机的端口限速配置场景,帮助读者根据设备型号选择合适的限速命令与参数。文档为单个电子文档文件,大小仅98KB&…

2026/10/7 4:39:36 阅读更多 →

日新闻

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:01:58 阅读更多 →
用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →
芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 7:15:40 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 5:29:09 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 6:26:51 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 8:21:32 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 4:21:51 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 1:18:13 阅读更多 →