口罩检测数据集构建指南:爬虫+人工标注全流程

张开发
2026/5/17 13:20:41 15 分钟阅读
口罩检测数据集构建指南:爬虫+人工标注全流程
口罩检测数据集构建指南爬虫人工标注全流程1. 引言想自己训练一个口罩检测模型但找不到合适的数据集市面上的公开数据集要么质量参差不齐要么场景单一不够用。其实自己构建数据集并不难只需要掌握正确的方法和工具。本文将带你完整走一遍口罩检测数据集的构建流程从使用Python爬虫收集图像到用LabelImg进行人工标注最后在GPU平台上进行数据增强。跟着步骤操作你就能获得一个高质量的定制化数据集为后续模型训练打下坚实基础。2. 环境准备与工具安装2.1 Python环境配置首先确保你的Python环境是3.7或更高版本。推荐使用Anaconda来管理环境conda create -n mask_detection python3.8 conda activate mask_detection2.2 必要库安装安装爬虫和数据处理所需的库pip install requests beautifulsoup4 opencv-python pillow pip install selenium webdriver-manager # 用于动态网页爬取2.3 标注工具安装LabelImg是常用的图像标注工具安装很简单pip install labelimg # 或者从GitHub克隆 git clone https://github.com/tzutalin/labelImg.git cd labelImg pip install -r requirements/requirements-linux-python3.txt python labelImg.py3. 爬虫收集原始图像3.1 选择合适的图像源找图像源时要考虑多样性不同光照条件、不同角度、不同口罩类型医用口罩、N95、布口罩等、不同人种和年龄。好的来源包括公开数据集中的图像适当使用注意版权免费图库网站如Pexels、Unsplash搜索引擎的图像搜索功能3.2 简单爬虫示例这里以静态网页爬取为例import requests from bs4 import BeautifulSoup import os import time def download_images(search_query, num_images100): # 创建保存目录 os.makedirs(mask_images, exist_okTrue) # 模拟搜索URL实际使用时需根据具体网站调整 url fhttps://example.com/search?q{search_query} headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 } response requests.get(url, headersheaders) soup BeautifulSoup(response.text, html.parser) # 解析图像链接需要根据实际网页结构调整 img_tags soup.find_all(img, limitnum_images) for i, img_tag in enumerate(img_tags): img_url img_tag[src] if not img_url.startswith(http): img_url https: img_url try: img_data requests.get(img_url).content with open(fmask_images/image_{i}.jpg, wb) as f: f.write(img_data) time.sleep(0.5) # 礼貌延迟 except Exception as e: print(f下载失败: {img_url}, 错误: {e}) # 下载戴口罩的图像 download_images(person wearing mask, 200) # 下载未戴口罩的图像作为负样本 download_images(person without mask, 200)3.3 爬虫注意事项尊重网站的robots.txt文件设置合理的请求间隔避免给服务器造成压力注意版权问题仅用于学习和研究多样化搜索关键词确保数据多样性4. 数据清洗与整理4.1 去除低质量图像收集到的图像需要清洗import cv2 import os def clean_images(folder_path): valid_images [] for img_name in os.listdir(folder_path): img_path os.path.join(folder_path, img_name) try: img cv2.imread(img_path) if img is not None and img.size 0: # 检查图像尺寸过小的删除 if img.shape[0] 100 and img.shape[1] 100: valid_images.append(img_path) else: os.remove(img_path) else: os.remove(img_path) except: os.remove(img_path) return valid_images clean_images(mask_images)4.2 数据分类整理建立清晰的目录结构dataset/ ├── raw_images/ # 原始图像 ├── annotated_images/ # 标注后的图像 ├── labels/ # 标注文件 └── augmented_images/ # 增强后的图像5. 使用LabelImg进行人工标注5.1 标注准备工作在开始标注前创建预定义的类别文件classes.txtwith_mask without_mask mask_worn_incorrectly5.2 标注步骤详解打开LabelImglabelImg.py选择图像目录指向你的raw_images文件夹设置标注文件保存目录选择labels文件夹选择PascalVOC或YOLO格式推荐YOLO格式开始标注按w键创建边界框选择正确的类别调整边界框确保准确包围目标5.3 标注质量保证确保边界框紧贴口罩边缘对于遮挡情况尽量标注可见部分统一标注标准避免不同标注者之间的差异定期检查标注质量进行二次审核6. 数据增强技巧6.1 基础增强方法使用Albumentations库进行数据增强import albumentations as A import cv2 transform A.Compose([ A.HorizontalFlip(p0.5), A.RandomBrightnessContrast(p0.2), A.Rotate(limit15, p0.5), A.Blur(blur_limit3, p0.1), A.CLAHE(p0.2), ], bbox_paramsA.BboxParams(formatyolo)) def augment_image(image_path, label_path, save_dir): image cv2.imread(image_path) image cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 读取YOLO格式的标注 with open(label_path, r) as f: bboxes [] for line in f.readlines(): class_id, x_center, y_center, width, height map(float, line.split()) bboxes.append([x_center, y_center, width, height, class_id]) transformed transform(imageimage, bboxesbboxes) transformed_image transformed[image] transformed_bboxes transformed[bboxes] # 保存增强后的图像和标注 base_name os.path.basename(image_path).split(.)[0] cv2.imwrite(f{save_dir}/{base_name}_aug.jpg, transformed_image) with open(f{save_dir}/{base_name}_aug.txt, w) as f: for bbox in transformed_bboxes: f.write(f{int(bbox[4])} {bbox[0]} {bbox[1]} {bbox[2]} {bbox[3]}\n)6.2 高级增强策略在星图GPU平台上可以进行更复杂的增强# 在GPU环境下使用更复杂的增强管道 gpu_transform A.Compose([ A.HueSaturationValue(p0.3), A.RandomGamma(p0.2), A.Cutout(num_holes8, max_h_size8, max_w_size8, p0.5), A.ShiftScaleRotate(shift_limit0.05, scale_limit0.1, rotate_limit15, p0.5), A.Perspective(scale(0.05, 0.1), p0.3), ], bbox_paramsA.BboxParams(formatyolo))6.3 增强注意事项保持增强后标注的准确性避免过度增强导致图像失真根据实际场景选择合适的增强方法确保增强后的数据分布合理7. 数据集划分与整理7.1 标准划分比例通常按以下比例划分数据集训练集70%验证集15%测试集15%import splitfolders splitfolders.ratio(dataset/annotated_images, outputdataset/split, seed42, ratio(0.7, 0.15, 0.15))7.2 创建数据集配置文件为YOLO训练创建data.yaml文件train: ../dataset/split/train val: ../dataset/split/val test: ../dataset/split/test nc: 3 # 类别数量 names: [with_mask, without_mask, mask_worn_incorrectly]8. 总结构建一个高质量的口罩检测数据集确实需要一些时间和精力但这个过程的价值远远超出了最终得到的数据集本身。通过亲手收集和标注数据你会更深入理解数据质量对模型性能的影响也能更好地把握实际应用中的各种边界情况。实际操作中可能会遇到各种预料之外的情况比如图像质量参差不齐、标注标准难以统一、数据增强后标注错位等。这些都是很正常的关键是要建立严格的质量控制流程定期检查和处理问题样本。如果你打算大规模应用建议考虑自动化部分流程比如用训练好的初版模型进行预标注然后人工校正这样可以大大提高效率。记住好的数据集是成功的一半前期多花些时间在数据质量上后期模型训练会事半功倍。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

更多文章