本文通过一个车辆目标检测案例,教会你如何使用yolov3训练自己的目标检测模型;案例相关yolov3代码、数据集以及yolov3中文版论文放于文末获取;提供的代码经过严格调试,在windows10下可一键启动训练。
目录
- 项目介绍
- 模型训练
- 模型使用
- 资源获取
▍项目介绍
任务概述:
本篇文章,我们以车辆检测为例,使用labelimg工具在图片上标注了两个目标类:[car、bus] 。然后使用yolov3来训练一个能够识别检测:【汽车、大巴】的模型。当然我们也可以通过标注其它类别来实现自定义目标检测。
yolov3代码总览:
文件解释:
- checkpoints:存放训练过程中的模型权重文件;
- data:存放训练和测试数据集;
- log:存放日志文件(可以不用管);
- tools:存放用于解析标注数据的脚本文件;
- yolov3:存放模型核心代码文件;
- delect.py:模型预测文件;
- train.py:模型训练文件;
▍模型训练
模型的训练和预测过程先用视频演示一遍:
<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="gKI484Fi-1727518115160" src="https://live.csdn.net/v/embed/427343"></iframe>yolov3代码演示视频
1. 环境安装
这里默认已经安装好了python3.5以上版本的运行环境;
pip install numpy==1.26.4
pip install opencv_contrib_python==4.5.4.58
pip install opencv_python==4.5.4.58
pip install Pillow==10.4.0
pip install tensorflow==2.10.0
2. 数据准备
本案例数据集使用Labelimg工具进行标注(对Labelimg工具不熟悉的小伙伴请自行查阅相关教程),xml为标注文件。
数据标注好之后,将图片(.jpg文件)和标注文件(.xml文件)划分到train(训练数据集)和test(测试数据集)两个目录。
data/custom_data
├── train/
│ ├── image1.jpg
│ ├── image1.xml
│ ├── image2.jpg
│ ├── image2.xml
└── test/
├── image3.jpg
├── image3.xml
├── image4.jpg
├── image4.xml
使用tools目录下的脚本文件XML_to_YOLOv3.py解析标注数据;修改文件第八行的data_dir为标注数据的存放位置:data/custom_data,然后执行代码。
import xml.etree.ElementTree as ET
import os
import glob
foldername = os.path.basename(os.getcwd())
if foldername == "tools": os.chdir("..")
data_dir = '/data/custom_data/' # 输入的标注数据路径
Dataset_names_path = "data/names.txt" # 输出的类别
Dataset_train = "data/train.txt" # 数据的训练数据集路劲
Dataset_test = "data/test.txt" # 输出的测试数据集路径
is_subfolder = False
Dataset_names = []
def ParseXML(img_folder, file):
for img_path in glob.glob(img_folder+'/*.jpg') + glob.glob(img_folder+"/*.png"):
xml_file = img_path[:-4] + ".xml"
tree=ET.parse(open(xml_file))
root = tree.getroot()
# image_name = root.find('filename').text
# img_path = img_folder+'/'+image_name
for i, obj in enumerate(root.iter('object')):
difficult = obj.find('difficult').text
cls = obj.find('name').text
if cls not in Dataset_names:
Dataset_names.append(cls)
cls_id = Dataset_names.index(cls)
xmlbox = obj.find('bndbox')
OBJECT = (str(int(float(xmlbox.find('xmin').text)))+','
+str(int(float(xmlbox.find('ymin').text)))+','
+str(int(float(xmlbox.find('xmax').text)))+','
+str(int(float(xmlbox.find('ymax').text)))+','
+str(cls_id))
img_path += ' '+OBJECT
print(img_path)
file.write(img_path+'\n')
def run_XML_to_YOLOv3():
for i, folder in enumerate(['train','test']):
with open([Dataset_train,Dataset_test][i], "w") as file:
print(os.getcwd()+data_dir+folder)
img_path = os.path.join(os.getcwd()+data_dir+folder)
if is_subfolder:
for directory in os.listdir(img_path):
xml_path = os.path.join(img_path, directory)
ParseXML(xml_path, file)
else:
ParseXML(img_path, file)
print("Dataset_names:", Dataset_names)
with open(Dataset_names_path, "w") as file:
for name in Dataset_names:
file.write(str(name)+'\n')
run_XML_to_YOLOv3()
names.txt、train.txt、test.txt为运行之后生成的标注数据解析文件,可以直接用于模型训练。
3. 参数设置
模型的所有参数都被统一定义在yolov3/config.py文件中,在进行模型训练之前,我们需要修改几个参数:
- TRAIN_CLASSES:yolov3/config.py文件第28行,指定用于训练的目标类别的名称文件路径;
- TRAIN_ANNOT_PATH:yolov3/config.py文件第29行,指定了训练数据的注释文件路径;
- TEST_ANNOT_PATH:yolov3/config.py文件第45行,指定了测试数据的注释文件路径;
4. 运行代码
点击train.py文件直接运行代码,或者命令行cd进入到yolov3目录执行:
cd yolov3
python train.py
模型训练过程:
模型的训练权重默认保存在/checkpoints目录下(在config.py第31行定义)。
▍模型使用
1. 参数设置
修改detect.py文件的image_path参数指定进行预测的图片;config.py文件中的其它参数与训练时保持一致即可。
2. 运行代码
点击detect.py文件直接运行代码,或者命令行cd进入到yolov3目录执行:
cd yolov3
python detect.py
模型测试结果:
▍资源获取
本项目在windows系统下以调试好,按照上面步骤将环境安装好之后即可一键运行。代码跑不通可评论区留言或私信解决。