YOLOv12目标检测实战教程:基于Python爬虫的数据集构建与标注

YOLOv12目标检测实战教程:基于Python爬虫的数据集构建与标注 YOLOv12目标检测实战教程基于Python爬虫的数据集构建与标注想用YOLOv12做个自己的目标检测模型第一步就被数据集给难住了网上找不到合适的图片手动下载又太费时间你是不是也遇到过这种问题别担心今天咱们就来解决这个痛点。我把自己做项目时常用的一套方法分享给你核心就是用Python爬虫来批量抓取图片再配合标注工具快速搞定数据集。整个过程就像搭积木一步步来小白也能轻松上手。学完这篇你就能自己动手为任何你想检测的目标比如街上的特定车型、花园里的某种花卉构建专属数据集了。咱们这个教程会非常“接地气”从在云平台一键部署环境开始到写爬虫脚本、标注图片最后用YOLOv12训练出第一个模型。我会把每个步骤都掰开揉碎了讲保证你看得懂、学得会、用得上。1. 环境准备与YOLOv12快速部署工欲善其事必先利其器。第一步咱们得有个能跑YOLOv12和Python爬虫的环境。这里我推荐直接在云GPU平台上操作省去了自己配置CUDA、PyTorch这些复杂依赖的麻烦速度也快得多。1.1 选择并启动计算镜像现在很多平台都提供了预装好深度学习框架的镜像。你可以找一个提供了“PyTorch”或“深度学习”基础镜像的环境。通常选择带有GPU支持的实例规格比如NVIDIA T4或V100这样后续模型训练会快很多。启动实例后通过终端SSH连接进去。第一件事是更新系统包并安装我们后续需要的工具# 更新软件包列表 sudo apt-get update # 安装一些基础工具和Python开发包 sudo apt-get install -y wget git curl python3-pip python3-dev # 确保pip是最新版本 pip3 install --upgrade pip1.2 获取YOLOv12官方代码YOLO系列的官方实现更新很快。我们直接从GitHub上克隆Ultralytics的YOLO仓库它维护得非常好集成了最新的YOLOv12。# 克隆YOLOv12的官方仓库 git clone https://github.com/ultralytics/ultralytics.git cd ultralytics # 安装所需的Python包requirements.txt里定义了所有依赖 pip install -r requirements.txt安装过程可能需要几分钟。完成后你可以快速验证一下YOLO是否安装成功# 在Python交互环境或一个.py文件里运行 from ultralytics import YOLO # 尝试加载一个预训练模型比如轻量级的YOLOv12n model YOLO(yolov12n.pt) print(“YOLOv12环境配置成功”)如果没报错看到成功信息那么恭喜你最基础的环境已经就绪了。1.3 安装爬虫与数据处理库构建数据集我们需要两个核心库requests用于网络请求BeautifulSoup4用于解析网页HTML。另外opencv-python和Pillow用来处理下载的图片。pip install requests beautifulsoup4 opencv-python pillow好了到这里我们的“作战指挥部”就搭建完成了。接下来进入最核心的环节——为我们的目标“搜集情报”图片数据。2. 使用Python爬虫构建图像数据集手动一张张下载图片那太原始了。用爬虫我们可以指定目标让程序自动、批量地从互联网上收集图片。这里我以从“必应”图片搜索构建一个“猫”的数据集为例你可以把“猫”替换成任何你想检测的目标比如“交通锥”、“红色轿车”、“太阳能板”。2.1 编写图片爬虫脚本我们写一个脚本它的核心工作是模拟浏览器搜索关键词解析搜索结果页面提取图片链接并下载保存。这里一定要注意遵守网站的robots.txt规则并且不要过于频繁请求以免对服务器造成压力。创建一个文件叫image_crawler.pyimport os import time import requests from bs4 import BeautifulSoup import re import urllib.parse def download_images(keyword, num_images100, save_dir‘./dataset/raw_images’): “”” 从必应图片搜索下载指定关键词的图片 Args: keyword: 搜索关键词如 ‘cat’ num_images: 想要下载的图片数量 save_dir: 图片保存的目录 “”” # 创建保存目录 os.makedirs(save_dir, exist_okTrue) # 设置请求头模拟浏览器访问 headers { ‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36’ } downloaded 0 page 0 base_url “https://www.bing.com/images/search” print(f“开始搜索并下载关键词 ‘{keyword}’ 的图片...”) while downloaded num_images: # 构建搜索URLq是关键词first是分页参数 params {‘q’: keyword, ‘first’: page * 35} try: response requests.get(base_url, paramsparams, headersheaders, timeout10) response.raise_for_status() except requests.RequestException as e: print(f“网络请求出错: {e}”) break soup BeautifulSoup(response.text, ‘html.parser’) # 在必应页面中图片链接可能藏在特定的属性里这里是一个通用查找模式 # 实际使用时可能需要根据网站结构调整 image_elements soup.find_all(‘a’, {‘class’: ‘iusc’}) for elem in image_elements: if downloaded num_images: break # 尝试从JSON格式的字符串中提取图片原图链接 m re.search(r‘“murl”:“(.*?)”’, str(elem)) if m: img_url m.group(1) # 简单过滤掉非图片链接 if not img_url.lower().endswith((‘.jpg’, ‘.jpeg’, ‘.png’, ‘.bmp’, ‘.gif’)): continue try: # 下载图片 img_data requests.get(img_url, headersheaders, timeout15).content # 生成文件名 file_name f“{keyword}_{downloaded:04d}.jpg” file_path os.path.join(save_dir, file_name) # 保存图片 with open(file_path, ‘wb’) as f: f.write(img_data) downloaded 1 print(f“已下载: {file_path}”) # 礼貌性暂停避免请求过快 time.sleep(0.5) except Exception as e: print(f“下载失败 {img_url}: {e}”) continue page 1 print(f“翻页当前第{page}页...”) time.sleep(1) # 翻页间隔 print(f“下载完成共下载 {downloaded} 张图片到 {save_dir}”) if __name__ ‘__main__’: # 使用示例下载100张关于‘cat’的图片 download_images(keyword‘cat’, num_images100, save_dir‘./dataset/raw_cats’)重要提示网站结构可能会变化上面的解析方法可能需要调整。更稳定的一种方法是使用搜索引擎提供的官方API如果有的话或者使用像selenium这样的工具模拟浏览器操作但后者更复杂。对于初学者上面的脚本是一个很好的起点。2.2 运行爬虫并初步筛选运行脚本坐等收图python image_crawler.py下载下来的图片质量参差不齐可能有水印、无关内容或损坏的图片。我们可以写一个简单的脚本进行初步筛选删除那些无法用OpenCV打开的图片通常是损坏的或者根据大小过滤掉太小的图片。import os import cv2 def clean_images(image_dir): “””初步清理图片目录删除无法打开的图片。“”” valid_extensions (‘.jpg’, ‘.jpeg’, ‘.png’, ‘.bmp’) removed_count 0 for img_name in os.listdir(image_dir): img_path os.path.join(image_dir, img_name) # 检查文件扩展名 if not img_name.lower().endswith(valid_extensions): os.remove(img_path) print(f“移除非常规格式文件: {img_name}”) removed_count 1 continue # 尝试用OpenCV打开图片 img cv2.imread(img_path) if img is None: os.remove(img_path) print(f“移除损坏图片: {img_name}”) removed_count 1 else: # 可选删除分辨率过低的图片 h, w img.shape[:2] if h 100 or w 100: os.remove(img_path) print(f“移除分辨率过低图片: {img_name} ({w}x{h})”) removed_count 1 print(f“清理完成共移除 {removed_count} 个文件。”) # 使用 clean_images(‘./dataset/raw_cats’)经过这一步我们就得到了一个相对干净的原始图片库。接下来需要告诉计算机图片里哪里是我们的目标物体这就是标注。3. 数据标注与YOLO格式准备YOLO模型训练需要知道每张图片里目标的位置和类别。这个位置用一个矩形框Bounding Box来表示格式是归一化的中心点坐标和宽高(x_center, y_center, width, height)。3.1 使用标注工具手动画框和计算坐标太痛苦了我们用图形化工具。这里推荐LabelImg或Roboflow。LabelImg是本地开源工具Roboflow是在线平台有免费额度功能更强大。我以LabelImg为例。首先安装LabelImgpip install labelImg # 或者从源码安装 # git clone https://github.com/HumanSignal/labelImg.git # cd labelImg pip install -r requirements.txt pip install pyqt5 lxml启动LabelImglabelImg使用步骤很简单打开目录指向你存放图片的文件夹./dataset/raw_cats。设置保存目录指向一个准备存放标注文件的新文件夹例如./dataset/labels。选择标注格式在菜单栏选择标注格式为YOLO。开始标注用鼠标拖拽画出目标猫的矩形框输入类别名如“cat”保存。软件会自动生成一个同名的.txt文件里面就是YOLO格式的标注。标注小技巧框要尽可能紧贴目标物体。对于被遮挡的物体尽量标注可见部分。保持类别名称一致比如都用小写“cat”。3.2 组织YOLOv12所需的数据集结构YOLO训练需要按照特定的文件夹结构来组织数据。我们来创建这个结构yolo_cat_dataset/ ├── images/ │ ├── train/ # 存放训练图片 │ └── val/ # 存放验证图片 └── labels/ ├── train/ # 存放训练图片对应的标注文件 (.txt) └── val/ # 存放验证图片对应的标注文件 (.txt)我们需要把刚才标注好的图片和对应的.txt文件按照一定比例比如8:2拆分到train和val文件夹。写个脚本自动完成import os import random import shutil def split_dataset(image_dir, label_dir, output_base, train_ratio0.8): “”” 划分训练集和验证集 Args: image_dir: 原始图片目录 label_dir: 原始标注目录 output_base: 输出数据集根目录 train_ratio: 训练集比例 “”” # 创建目录 paths { ‘images_train’: os.path.join(output_base, ‘images’, ‘train’), ‘images_val’: os.path.join(output_base, ‘images’, ‘val’), ‘labels_train’: os.path.join(output_base, ‘labels’, ‘train’), ‘labels_val’: os.path.join(output_base, ‘labels’, ‘val’), } for p in paths.values(): os.makedirs(p, exist_okTrue) # 获取所有图片文件名不含扩展名 all_images [os.path.splitext(f)[0] for f in os.listdir(image_dir) if f.endswith((‘.jpg’, ‘.png’))] random.shuffle(all_images) # 打乱顺序 split_idx int(len(all_images) * train_ratio) train_names all_images[:split_idx] val_names all_images[split_idx:] print(f“总样本数: {len(all_images)}”) print(f“训练集: {len(train_names)}”) print(f“验证集: {len(val_names)}”) # 复制文件 for name in train_names: # 复制图片 for ext in [‘.jpg’, ‘.png’, ‘.jpeg’]: src_img os.path.join(image_dir, name ext) if os.path.exists(src_img): shutil.copy(src_img, paths[‘images_train’]) break # 复制标注 src_label os.path.join(label_dir, name ‘.txt’) if os.path.exists(src_label): shutil.copy(src_label, paths[‘labels_train’]) for name in val_names: for ext in [‘.jpg’, ‘.png’, ‘.jpeg’]: src_img os.path.join(image_dir, name ext) if os.path.exists(src_img): shutil.copy(src_img, paths[‘images_val’]) break src_label os.path.join(label_dir, name ‘.txt’) if os.path.exists(src_label): shutil.copy(src_label, paths[‘labels_val’]) print(“数据集划分完成”) return paths # 使用示例 split_dataset( image_dir‘./dataset/raw_cats’, label_dir‘./dataset/labels’, output_base‘./yolo_cat_dataset’ )3.3 创建数据集配置文件最后我们需要创建一个YAML配置文件告诉YOLOv12我们的数据集在哪里有哪些类别。创建一个文件cat_dataset.yaml放在项目根目录# cat_dataset.yaml path: /path/to/your/yolo_cat_dataset # 数据集根目录的绝对路径 train: images/train # 训练集图片相对路径 val: images/val # 验证集图片相对路径 # 类别数 nc: 1 # 类别名称列表 names: [‘cat’] # 可选下载数据集的URL这里不需要 # download: https://...注意请将/path/to/your/yolo_cat_dataset替换成你实际的数据集绝对路径。至此最耗时、最核心的数据准备工作全部完成我们拥有了一个结构清晰、标注完整的自定义数据集。接下来就是享受成果的时刻——训练我们自己的YOLOv12模型。4. 使用自定义数据集训练YOLOv12模型万事俱备只欠训练。YOLOv12的API设计得非常简洁几行代码就能启动训练。4.1 准备模型与训练脚本我们选择YOLOv12的一个中等尺寸的预训练模型例如yolov12m.pt作为起点。使用预训练模型进行微调Fine-tuning比从零开始训练快得多效果也通常更好。创建一个train.py脚本from ultralytics import YOLO def main(): # 1. 加载一个预训练模型 # 可选模型: yolov12n.pt (最小最快), yolov12s.pt, yolov12m.pt, yolov12l.pt, yolov12x.pt (最大最准) model YOLO(‘yolov12m.pt’) # 2. 使用自定义数据集训练模型 results model.train( data‘cat_dataset.yaml’, # 上一步创建的配置文件路径 epochs50, # 训练轮数根据数据集大小调整 imgsz640, # 输入图片尺寸 batch16, # 批次大小根据GPU内存调整 name‘yolov12_cat_detector’, # 训练结果保存的名称 pretrainedTrue, # 使用预训练权重 optimizer‘AdamW’, # 优化器 lr00.001, # 初始学习率 patience10, # 早停耐心值 device‘0’, # 使用GPU 0如果是CPU则设为 ‘cpu’ workers4, # 数据加载线程数 ) print(“训练完成”) if __name__ ‘__main__’: main()4.2 启动训练与监控在终端运行训练脚本python train.py训练开始后你会看到控制台输出每个epoch的损失loss和评估指标如mAP。Ultralytics框架会自动帮你保存最佳模型runs/detect/yolov12_cat_detector/weights/best.pt。保存最后一个epoch的模型last.pt。生成训练过程的可视化图表损失曲线、精度曲线等在runs/detect/yolov12_cat_detector目录下。你可以使用TensorBoard来更直观地监控训练过程如果安装了的话tensorboard --logdir runs/detect然后在浏览器打开http://localhost:6006查看。4.3 模型验证与测试训练完成后我们需要看看模型在没见过的数据验证集上表现如何。使用下面的脚本进行评估和测试from ultralytics import YOLO import cv2 # 加载训练得到的最佳模型 best_model YOLO(‘runs/detect/yolov12_cat_detector/weights/best.pt’) # 1. 在验证集上评估模型性能 metrics best_model.val() # 默认使用训练时data配置中的验证集 print(f“模型在验证集上的mAP50-95: {metrics.box.map:.4f}”) # 2. 用一张新图片进行测试 img_path ‘./dataset/raw_cats/cat_0050.jpg’ # 换一张你自己的图片 results best_model(img_path) # 显示带预测框的结果 for r in results: im_array r.plot() # 绘制预测框 cv2.imshow(‘Detection Result’, im_array) cv2.waitKey(0) cv2.destroyAllWindows() # 保存结果图片 cv2.imwrite(‘detection_result.jpg’, im_array) print(“检测结果已保存为 ‘detection_result.jpg’”)运行这个脚本你就能看到模型对你提供的图片的检测效果了。如果效果不错恭喜你一个专属于你的目标检测模型就诞生了5. 总结与后续建议走完这一整套流程从无到有构建一个可用的目标检测模型感觉怎么样其实核心思路很清晰找数据爬虫 - 标数据标注工具 - 练模型YOLO训练。Python爬虫在这里扮演了“数据采集员”的关键角色极大地解放了我们的双手。用这个方法你可以轻松地为各种长尾场景构建数据集比如检测工厂流水线上的特定零件、识别农田里的病虫害、或者统计停车场车辆类型。关键在于你的数据越贴合实际场景训练出来的模型就越“懂你”。第一次训练可能会遇到各种小问题比如爬虫被封、标注不对齐、训练不收敛。这都很正常。多试几次调整一下爬虫的请求间隔、检查标注框是否准确、或者尝试调整学习率、增加训练轮数问题大多能解决。模型训练出来后你可以把它集成到你的应用中比如做一个实时猫猫检测摄像头或者一个图片批量处理工具。YOLOv12也提供了方便的导出功能可以导出成ONNX、TensorRT等格式部署到移动端或边缘设备上。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。