前置条件
配置好环境后不用修改代码。即可实现,实时目标检测多达80种物
离线的情况
下载yoloV5的代码
01.下载网络上的模型
02. 在detect 所在的文件夹下,创建 weights ,并把模型放在这个位置
./weights
03.执行代码
python detect.py --weights ./weights/yolov5s.pt --source ./data/images/ --classes 5 --save-txt --save-crop
04.查看预测的结果
即save_txt以及save_conf等,将这两个参数设置为True后,能在预测的文件里面找到中心坐标以及置信度了
runs/detect/exp3/labels
修改类别
python detect.py --weights ./weights/yolov5s.pt --source ./data/images/ --classes 0 1 2 3 5 7 9 11 12 --save-txt --save-crop
说明: YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x 按照其所含的残差结构的个数依次增多,网络的特征提取、融合能力不断加强,检测精度得到提高,但相应的时间花费也在增加
自定义类别进行训练
YOLO 格式的数据集
训练自己的数据集
1.数据集制作
数据集自己标注 或者其他类型的数据集转换
YOLO 格式的数据集
YOLO
classes.txt 是类的声明,一行一类。
images 目录包含所有图片 (目前支持png和jpg格式数据)
labels 目录包含所有标签(与图片同名的txt格式数据)
yolo的bbox数据格式为 (x_center, y_center, w, h);
边框坐标编码[x_center, y_center, width, height]
这4个值是经过数据规范化(normalized )--- 归一化真值框坐标的 txt 文件
不规范化是
[(98 + (322 / 2)), (345 + (117 / 2)), 322, 117]
=[259, 403.5, 322, 117]
规范化方法是
[259 / 640, 403.5 / 480, 322 / 640, 117 / 480]
return [(max_x + min_x)/(2*w), (max_y + min_y)/(2*h), (max_x - min_x)/w, (max_y - min_y)/h]
报错
labels, shapes, self.segments = zip(*cache.values())
ValueError: not enough values to unpack (expected 3, got 0 ---解决方式: 对标注坐标进行归一化处理
coco里bbox数据格格式为(x_left, y_top, w, h) 左上角的坐标以及边框的宽度和高度
pascal_voc 边框坐标编码是[x_min, y_min, x_max, y_max]
x_min和y_min表示边框左上角坐标,x_max和y_max表示边框的右下脚坐标
import numpy as np
def get_box(points):
min_x = min_y = np.inf
max_x = max_y = 0
for x, y in points:
min_x = min(min_x, flaot(x))
min_y = min(min_y, y)
max_x = max(max_x, x)
max_y = max(max_y, y)
#return [min_x, min_y, max_x - min_x, max_y - min_y]
return [(max_x - min_x)/2, (max_y + min_y)/2, max_x - min_x, max_y - min_y]
---yolodata
--------images
--------labels
区分训练集和验证集
---traindata
--------images
----------------train
----------------val
--------labels
----------------train
----------------val
01.图像没有标注的元素的,不需要有对应的txt 文件,即标注文件为空的,要移除
02.自建数据集中有以jpg也有以JPG为结尾的图片
03.负数class是不能被读入的
2.配置一份属于自己数据集的yaml文件。复制data目录下的coco.yaml,我这里命名为fish.yaml 主要修改三个地方
nc 里的数字代表数据集的类别, names 里为自己数据集标注的类名称
3.修改model.yaml文件
yolov5s.yaml,只需要将nc的类别修改为自己需要的即可
4.训练train.py
weights,yaml,data按照自己所需文件的路径修改即可 epochs迭代次数自己决定 batch_size
weights: 加载的权重文件(weights文件夹下yolov5m.pt) weights包含训练过程中最后一次训练好的模型last.pt和历史最佳模型best.pt
cfg: 模型配置文件,网络结构(model文件夹下yolov5m_light.yaml)
data: 数据集配置文件,数据集路径,类名等(datas文件夹下light.yaml)
python train.py
python train.py --weights /home/ai/project/yolov5-master/weights/yolov5s.pt \
--cfg /home/ai/project/yolov5-master/models/yolov5m_light.yaml \
--data /home/ai/project/yolov5-master/data/light.yaml \
--epochs 100 \
--batch-size 5
5.测试detect.py out
python detect.py --weights runs/train/exp9/weights/best.pt --source data/Samples/ --device 0 --save-txt
如果数据量较大,请注释掉detect.py的186-203行
参考
https://github.com/ultralytics/yolov5/releases