)
从零到一搭建YOLOv11汽车品牌识别系统引言在计算机视觉领域目标检测是一项基础且重要的任务。YOLO(You Only Look Once)系列算法因其出色的速度和精度平衡而广受欢迎。本文将详细介绍如何使用最新的YOLOv11框架从零开始构建一个汽车品牌识别系统涵盖环境搭建、数据准备、模型训练的全过程。一、环境搭建1.1 硬件准备汽车品牌识别是一个中等复杂度的目标检测任务建议使用以下硬件配置GPUNVIDIA GTX 1660及以上(推荐RTX 3060及以上)内存16GB及以上存储至少50GB可用空间(用于存储数据集和模型)1.2 软件环境配置我们使用Python 3.8和PyTorch框架# 创建conda虚拟环境conda create-nyolov11python3.8-yconda activate yolov11# 安装PyTorch(根据CUDA版本选择)pipinstalltorch1.12.1cu113torchvision0.13.1cu113torchaudio0.12.1 --extra-index-url https://download.pytorch.org/whl/cu113# 安装YOLOv11及相关依赖gitclone https://github.com/WongKinY/yolov11.gitcdyolov11 pipinstall-rrequirements.txt1.3 验证安装importtorchprint(torch.__version__)print(torch.cuda.is_available())# 应返回True二、数据准备2.1 数据收集汽车品牌识别需要收集包含各种品牌汽车的图片可通过以下途径公开数据集Stanford Cars、CompCars等网络爬取(注意版权)自行拍摄2.2 数据标注使用LabelImg工具进行标注pipinstalllabelImg labelImg# 启动标注工具标注时需注意每张图片中包含的汽车都要标注标注框应紧密贴合汽车品牌名称作为类别标签(如Toyota, BMW等)2.3 数据格式转换YOLOv11使用YOLO格式的标注每张图片对应一个.txt文件每行格式class_id x_center y_center width height(归一化坐标)可使用以下脚本转换VOC格式到YOLO格式importxml.etree.ElementTreeasETimportosdefconvert_voc_to_yolo(voc_dir,output_dir,class_list):os.makedirs(output_dir,exist_okTrue)forfileinos.listdir(voc_dir):iffile.endswith(.xml):treeET.parse(os.path.join(voc_dir,file))roottree.getroot()img_nameroot.find(filename).text img_widthint(root.find(size/width).text)img_heightint(root.find(size/height).text)yolo_lines[]forobjinroot.iter(object):clsobj.find(name).textifclsnotinclass_list:continuecls_idclass_list.index(cls)xmlboxobj.find(bndbox)x1float(xmlbox.find(xmin).text)y1float(xmlbox.find(ymin).text)x2float(xmlbox.find(xmax).text)y2float(xmlbox.find(ymax).text)# 转换坐标x_center(x1x2)/2/img_width y_center(y1y2)/2/img_height w(x2-x1)/img_width h(y2-y1)/img_height yolo_lines.append(f{cls_id}{x_center}{y_center}{w}{h})# 写入YOLO格式文件output_pathos.path.join(output_dir,img_name.replace(.jpg,.txt))withopen(output_path,w)asf:f.write(\n.join(yolo_lines))2.4 数据集划分将数据集划分为训练集、验证集和测试集(建议比例7:2:1)importosimportrandomimportshutildefsplit_dataset(data_dir,output_dir,train_ratio0.7,val_ratio0.2):images_diros.path.join(data_dir,images)labels_diros.path.join(data_dir,labels)# 创建输出目录os.makedirs(os.path.join(output_dir,train/images),exist_okTrue)os.makedirs(os.path.join(output_dir,train/labels),exist_okTrue)os.makedirs(os.path.join(output_dir,val/images),exist_okTrue)os.makedirs(os.path.join(output_dir,val/labels),exist_okTrue)os.makedirs(os.path.join(output_dir,test/images),exist_okTrue)os.makedirs(os.path.join(output_dir,test/labels),exist_okTrue)# 获取所有图片文件all_files[fforfinos.listdir(images_dir)iff.endswith(.jpg)]random.shuffle(all_files)# 划分数据集train_countint(len(all_files)*train_ratio)val_countint(len(all_files)*val_ratio)train_filesall_files[:train_count]val_filesall_files[train_count:train_countval_count]test_filesall_files[train_countval_count:]# 复制文件forphase,filesin[(train,train_files),(val,val_files),(test,test_files)]:forfileinfiles:# 复制图片shutil.copy(os.path.join(images_dir,file),os.path.join(output_dir,phase,images,file)# 复制标签label_filefile.replace(.jpg,.txt)shutil.copy(os.path.join(labels_dir,label_file),os.path.join(output_dir,phase,labels,label_file))print(f数据集划分完成: 训练集{len(train_files)}张, 验证集{len(val_files)}张, 测试集{len(test_files)}张)三、模型训练3.1 配置文件准备YOLOv11需要两个主要配置文件模型配置文件(如yolov11s.yaml)数据配置文件(如car_brand.yaml)数据配置文件示例# car_brand.yamlpath:../datasets/car_brand# 数据集根目录train:train/images# 训练集路径val:val/images# 验证集路径test:test/images# 测试集路径# 类别数量和名称nc:10# 汽车品牌数量names:[Toyota,Honda,BMW,Mercedes,Audi,Ford,Chevrolet,Nissan,Volkswagen,Hyundai]3.2 开始训练使用以下命令启动训练python train.py\--batch-size16\--epochs100\--img640\--datadata/car_brand.yaml\--cfgmodels/yolov11s.yaml\--weights\--device0\--nameyolov11s_car_brand\--hypdata/hyps/hyp.scratch-low.yaml关键参数说明--batch-size: 根据GPU内存调整--epochs: 训练轮次--img: 输入图像尺寸--data: 数据配置文件路径--cfg: 模型配置文件路径--device: 使用GPU编号3.3 训练监控YOLOv11会自动记录训练日志可以使用TensorBoard监控训练过程tensorboard--logdirruns/train监控指标包括损失函数变化mAP(mean Average Precision)精确率和召回率3.4 模型评估训练完成后使用以下命令评估模型性能python val.py\--weightsruns/train/yolov11s_car_brand/weights/best.pt\--datadata/car_brand.yaml\--img640\--batch-size16\--tasktest\--nameyolov11s_car_brand_eval四、模型优化技巧4.1 数据增强在hyp.scratch-low.yaml中调整数据增强参数# 颜色空间增强hsv_h:0.015# 色调hsv_s:0.7# 饱和度hsv_v:0.4# 亮度# 平移、缩放、旋转translate:0.1scale:0.5flipud:0.0fliplr:0.5mosaic:1.0mixup:0.04.2 模型微调对于预训练模型可以冻结部分层进行微调调整学习率策略使用更小的学习率python train.py\--weightsyolov11s.pt\--freeze10\# 冻结前10层--lr00.01\# 初始学习率--lrf0.01\# 最终学习率...4.3 类别不平衡处理对于样本数量差异大的品牌使用过采样/欠采样调整损失函数的类别权重使用Focal Loss五、模型部署与应用5.1 模型导出导出为ONNX格式以便部署python export.py\--weightsruns/train/yolov11s_car_brand/weights/best.pt\--includeonnx\--img640\--device05.2 使用训练好的模型进行推理fromyolov11.models.experimentalimportattempt_loadfromyolov11.utils.generalimportnon_max_suppression,scale_boxesfromyolov11.utils.torch_utilsimportselect_deviceimportcv2importtorch# 加载模型deviceselect_device(0)modelattempt_load(runs/train/yolov11s_car_brand/weights/best.pt,devicedevice)# 图像预处理defpreprocess(image,img_size640):# 调整大小、归一化等pass# 推理defdetect(image):imgpreprocess(image)imgtorch.from_numpy(img).to(device)imgimg.float()/255.0ifimg.ndimension()3:imgimg.unsqueeze(0)# 推理predmodel(img,augmentFalse)[0]prednon_max_suppression(pred,conf_thres0.25,iou_thres0.45)# 解析结果results[]fordetinpred:ifdetisnotNoneandlen(det):det[:,:4]scale_boxes(img.shape[2:],det[:,:4],image.shape).round()for*xyxy,conf,clsindet:results.append({bbox:[int(x)forxinxyxy],conf:float(conf),class:int(cls),class_name:model.names[int(cls)]})returnresults# 使用示例imagecv2.imread(test.jpg)resultsdetect(image)forrinresults:print(f检测到:{r[class_name]}, 置信度:{r[conf]:.2f}, 位置:{r[bbox]})六、常见问题解决CUDA内存不足减小batch size减小输入图像尺寸使用混合精度训练(--half)过拟合增加数据增强使用早停(early stopping)添加正则化训练不收敛检查学习率设置检查数据标注是否正确尝试预训练模型类别识别错误增加困难样本调整类别权重检查相似品牌间的区分度结语通过本文的步骤我们完成了从零开始搭建YOLOv11汽车品牌识别系统的全过程。实际应用中还可以进一步优化收集更多样化的数据尝试更大的模型(yolov11m/yolov11l)集成多个模型提升性能开发友好的用户界面目标检测技术在实际场景中有广泛应用掌握YOLOv11的使用方法将为解决各类视觉识别问题提供有力工具。