如何跳过标注步骤,利用现有数据训练YOLO检测巴基斯坦车牌?
嘿,既然你已经有现成的标注好的巴基斯坦车牌训练数据,那跳过重新标注步骤直接训YOLOv2完全没问题!我来给你一步步讲清楚怎么做:
YOLOv2对标注文件有严格要求:每张图片必须对应一个同名的.txt文件,里面的标注格式是:
<class_id> <x_center> <y_center> <width> <height>
解释一下每个参数:
<class_id>:因为你只检测车牌这一个类别,直接设为0就行<x_center>/<y_center>:车牌框的中心坐标,是相对于图片宽高的比例值(比如图片宽1000像素,框中心x坐标是500,那就是0.5)<width>/<height>:车牌框的宽度和高度,同样是相对于图片宽高的比例值
如果你的现有标注不是这个格式(比如是XML、JSON这类),得先转成YOLO格式——网上有很多现成的Python脚本可以批量转换,搜一下对应格式的转换工具就行,很方便。
把图片和标注文件按YOLO要求的结构摆好,大概是这样:
巴基斯坦车牌数据集/ ├── 图片文件夹/ │ ├── 训练集/ │ │ ├── 车1.jpg │ │ ├── 车2.jpg │ │ └── ... │ └── 测试集/ │ ├── 测试车1.jpg │ ├── 测试车2.jpg │ └── ... └── 标注文件夹/ ├── 训练集/ │ ├── 车1.txt │ ├── 车2.txt │ └── ... └── 测试集/ ├── 测试车1.txt ├── 测试车2.txt └── ...
要保证每张图片和它的标注文件名完全一致,比如车1.jpg对应车1.txt,不然YOLO找不到标注。
这一步是关键,要搞定4个配置文件:
(1)数据配置文件(比如命名为plate_data.data)
打开文本编辑器写下面内容,把路径改成你自己的:
classes=1 train=/你的数据集路径/训练集图片列表.txt valid=/你的数据集路径/测试集图片列表.txt names=/你的数据集路径/类别名称.txt backup=/你想保存模型的文件夹路径/
classes:填1,因为只有车牌一个类别train和valid:分别指向训练集和测试集的图片路径列表文件(下面教你生成)names:类别名称文件backup:训练时自动保存模型权重的文件夹,提前建好就行
(2)类别名称文件(命名为plate.names)
里面只需要一行内容:
license_plate
这就是你要检测的类别名称,YOLO会用它来显示检测结果。
(3)生成训练/测试集图片列表(训练集图片列表.txt和测试集图片列表.txt)
这两个文件里,每行是一张图片的绝对路径。比如在Linux/macOS下,用终端命令就能批量生成:
# 生成训练集列表 find /你的数据集路径/图片文件夹/训练集 -name "*.jpg" > 训练集图片列表.txt # 生成测试集列表 find /你的数据集路径/图片文件夹/测试集 -name "*.jpg" > 测试集图片列表.txt
Windows的话可以用PowerShell或者写个简单的批处理脚本,把所有图片路径导出到txt里就行。
(4)修改YOLOv2的网络配置文件
复制Darknet框架里的cfg/yolov2.cfg,改个名字比如yolov2_plate.cfg,然后修改3个地方:
- 找到
[net]部分的batch和subdivisions:根据你的GPU显存调整,显存小的话把subdivisions设大一点(比如16),避免显存溢出 - 找到最后一个
[convolutional]层:把filters的值改成(类别数 + 5)*5,这里类别数是1,所以就是(1+5)*5=30 - 找到下面的
[yolo]层:把classes改成1,num改成5(和上面的filters对应)
确保你已经装好Darknet(YOLOv2的官方框架),然后在终端里运行训练命令:
./darknet detector train plate_data.data yolov2_plate.cfg darknet19_448.conv.23
这里darknet19_448.conv.23是YOLOv2的预训练权重,如果你的电脑里没有,Darknet会自动下载它,用来加速训练。
训练过程中,模型权重会定期保存到你设置的backup文件夹里,等训练得差不多了,就可以用./darknet detector test命令来测试你的模型啦!
内容的提问来源于stack exchange,提问作者Abdul Wahab




