标注工具labelimg使用简介
以yolov11为例,训练之前要先准备好数据集,以下是yolov11的训练代码,其中data.yaml 指向数据集的路径,以网上检测安全帽为例,下载连接:
工地安全帽识别检测数据集
https://gitcode.com/open-source-toolkit/10c53
train.py代码
from ultralytics import YOLOif __name__ == '__main__':# Load a pretrained YOLOv8 modelmodel = YOLO('yolo11n.pt')# Train the model on a custom datasetmodel.train(data='data/data.yaml', epochs=400, imgsz=640, batch=64, workers=8)
data.yaml内容,里面有7个类别,可根据需要调整
train: ../train/images
val: ../valid/images
test: ../test/imagesnc: 7
names: ['Gloves', 'Helmet', 'Non-Helmet', 'Person', 'Shoes', 'Vest', 'bare-arms']
成品数据集的样子,test可选
而labelimg正是制作数据集的一种常见工具
安装:
pip install labelimg
建议使用python3.9版本,python3.10或更高python版本中labelimg可能会闪退
启动labelimg
在安装了labelimg的python环境中直接输入:labelimg 按回车即可打开
现在从上面下载的数据集中取10张图片进行标注练习,为了简便
再点击左侧的Open Dir,它会提示以下窗口,点Yes,然后再去选择图片文件夹
Change Save Dir是选择保存目录,也可以指定到Test下面,到时候再划分
这个下载的数据集有7个类别:names: ['Gloves', 'Helmet', 'Non-Helmet', 'Person', 'Shoes', 'Vest', 'bare-arms']
- Gloves:手套
- Helmet:头盔
- Non-Helmet:未戴头盔
- Person:人员
- Shoes:鞋子
- Vest:背心
- bare-arms:裸露手臂
我们可以根据需要来标注,以只检测安全帽为例,取2个类别'Helmet', 'Non-Helmet'
按字母W可切换到画框模式,例如框中图片中的人头,它会跳出类别窗口,输入Non-Helmet
下次就直接可以选择这个类别了
一张图片完成标注后,点Next Image会转到下一张,快捷键是d (文章底部有快捷键大全)
检测完最后一张就可以关闭labelimg了,然后打开Test文件夹
里面有对应生成了txt标签信息
打开其中一个txt
制作好数据集之后,还要进行划分,可以借助ai实现,以阿里通义为例
Test下添加01文件夹,把图片和txt移动到01文件夹里面
用vscode打开Test文件夹
用vscode中的通义灵码,进行划分,如下图告诉ai要实现的功能,它会生成一个python文件,运行后,就会多出3个文件夹了
新建一个Dataset文件夹,把这3个文件夹移动到Dataset内
再添加data.yaml文件
train: ./train/images
val: ./val/images
test: ./test/imagesnc: 2
names: ['Non-Helmet', 'Helmet']
最后的目录结构如下图,注意以上只用10张图片进行演示标注过程,实际上训练的图片最好100张或更多。val也就是valid文件夹,名字可以修改
然后,如果电脑上已经配置好yolov11环境,就可以开始训练了
from ultralytics import YOLOif __name__ == '__main__':# Load a pretrained YOLOv8 model (e.g., yolo11n.pt)model = YOLO('yolo11n.pt')# Train the model with early stoppingresults = model.train(data='Dataset/data.yaml', # 数据配置文件epochs=100, # 最大训练轮数(早停会提前停止)patience=50, # ⭐ 早停耐心值:连续50轮没提升就停imgsz=640, # 图像尺寸batch=16, # batch sizeworkers=8, # 数据加载线程数device=0, # 使用GPU(0表示第一块GPU)project='runs/train', # 保存项目目录name='exp', # 实验名称exist_ok=False, # 防止覆盖已有实验optimizer='AdamW', # 可选优化器lr0=0.001, # 初始学习率amp=True, # 自动混合精度(加速训练))print("✅ Training completed. Best model saved automatically.")
经过大概20多分钟,训练完成 ,次数这里选择的是100,根据需要选择
训练完成后会生成best.pt,写一个检测图片的代码:
from ultralytics import YOLO
import cv2
import osdef detect_image(image_path, model_path='best.pt', save_dir='runs/detect', show_result=True):"""使用训练好的YOLO模型检测单张图片Args:image_path (str): 要检测的图片路径model_path (str): 训练好的模型路径save_dir (str): 检测结果保存目录show_result (bool): 是否显示检测结果窗口"""# 加载模型model = YOLO(model_path)# 创建保存目录os.makedirs(save_dir, exist_ok=True)# 进行检测results = model.predict(source=image_path,save=True, # 保存检测结果save_dir=save_dir, # 保存目录show=show_result, # 是否显示图片窗口conf=0.5, # 置信度阈值iou=0.5 # IOU阈值)print(f"✅ 检测完成,结果已保存到 {save_dir}")# 如果需要显示结果且有检测到对象,则显示if show_result and results[0].boxes is not None:# 获取检测结果图像plotted_image = results[0].plot()# 显示图像cv2.imshow('Detection Result', plotted_image)print("按任意键关闭显示窗口...")cv2.waitKey(0)cv2.destroyAllWindows()return resultsdef detect_images_in_directory(images_dir, model_path='yolo11n.pt', save_dir='runs/detect', show_result=False):"""使用训练好的YOLO模型检测目录中的所有图片Args:images_dir (str): 包含图片的目录路径model_path (str): 训练好的模型路径save_dir (str): 检测结果保存目录show_result (bool): 是否显示检测结果窗口(仅对最后一张图片有效)"""# 加载模型model = YOLO(model_path)# 创建保存目录os.makedirs(save_dir, exist_ok=True)# 进行检测results = model.predict(source=images_dir,save=True,save_dir=save_dir,show=show_result,conf=0.5,iou=0.5)print(f"✅ 检测完成,{len(results)} 张图片的结果已保存到 {save_dir}")# 显示最后一张图片的检测结果if show_result and len(results) > 0 and results[-1].boxes is not None:# 获取最后一张图片的检测结果plotted_image = results[-1].plot()# 显示图像cv2.imshow('Detection Result', plotted_image)print("按任意键关闭显示窗口...")cv2.waitKey(0)cv2.destroyAllWindows()return resultsif __name__ == '__main__':# 示例1: 检测单张图片并显示结果detect_image(r'G:\cpppro2\TestYolov11\Dataset\test\images\Video4_260_jpg.rf.05ceff198aeb0fe5870232779710005d.jpg')# 示例2: 检测目录中的所有图片,显示最后一张的检测结果# detect_images_in_directory('Dataset/test/images')print("请取消注释上面的示例代码并提供正确的图片路径来运行检测")
labelImg快捷键:
关于:imgsz
参数