1 项目介绍
参考项目:YOLO项目
1.1训练模型
YOLOv5模型
train.py
训练预训练模型
...
...
def parse_opt(known=False):# 命令行参数解析器初始化parser = argparse.ArgumentParser()# 初始权重路径,默认为 ROOT / 'yolov5s.pt',用于指定模型的初始权重文件路径或者设为空自己训练模型parser.add_argument('--weights', type=str, default=ROOT / 'yolov5s.pt', help='initial weights path')# 模型配置文件路径,默认为空字符串,用于指定模型的配置文件。parser.add_argument('--cfg', type=str, default='', help='model.yaml path')# 数据集配置文件路径,默认为 ROOT / 'data/coco128.yaml',用于指定数据集的配置文件。parser.add_argument('--data', type=str, default=ROOT / 'data/coco128.yaml', help='dataset.yaml path')# 超参数配置文件路径,默认为 ROOT / 'data/hyps/hyp.scratch.yaml',用于指定模型的超参数配置。parser.add_argument('--hyp', type=str, default=ROOT / 'data/hyps/hyp.scratch.yaml', help='hyperparameters path')# 训练的总轮数,默认为 300parser.add_argument('--epochs', type=int, default=300)# 每个GPU的总批量大小,默认为 16parser.add_argument('--batch-size', type=int, default=16, help='total batch size for all GPUs')# 训练和验证图像的大小(像素数),默认为 640。parser.add_argument('--imgsz', '--img', '--img-size', type=int, default=640, help='train, val image size (pixels)')# 是否进行矩形训练的标志parser.add_argument('--rect', action='store_true', help='rectangular training')# 是否恢复最近的训练(是:自动加载最近训练的那一步模型)parser.add_argument('--resume', nargs='?', const=True, default=False, help='resume most recent training')# 只保存最终的检查点(过程中检查点不在保存)parser.add_argument('--nosave', action='store_true', help='only save final checkpoint')# 仅在最终时验证。parser.add_argument('--noval', action='store_true', help='only validate final epoch')# 禁用自动锚点检查parser.add_argument('--noautoanchor', action='store_true', help='disable autoanchor check')# 进化超参数进行 x 代演化。# 可能意味着在某个优化过程中,通过进化算法对模型的超参数进行了多轮(x 代)的优化和演化。这种方法可以自动地探索超参数空间,并尝试找到最优的超参数设置,以便最大化模型的预测能力或其他性能指标。parser.add_argument('--evolve', type=int, nargs='?', const=300, help='evolve hyperparameters for x generations')# gsutil 存储桶parser.add_argument('--bucket', type=str, default='', help='gsutil bucket')# 指在处理图像时选择将缓存存储在 RAM(默认)或者磁盘中,这种缓存通常用于加快图像处理的速度parser.add_argument('--cache', type=str, nargs='?', const='ram', help='--cache images in "ram" (default) or "disk"')# 是否使用加权图像选择进行训练parser.add_argument('--image-weights', action='store_true', help='use weighted image selection for training')parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')# 是否对图像尺寸进行变化parser.add_argument('--multi-scale', action='store_true', help='vary img-size +/- 50%%')# 将多类数据作为单类进行训练parser.add_argument('--single-cls', action='store_true', help='train multi-class data as single-class')# 是否使用 torch.optim.Adam() 优化器parser.add_argument('--adam', action='store_true', help='use torch.optim.Adam() optimizer')parser.add_argument('--sync-bn', action='store_true', help='use SyncBatchNorm, only available in DDP mode')parser.add_argument('--workers', type=int, default=0, help='maximum number of dataloader workers')# 保存到项目/名称parser.add_argument('--project', default=ROOT / 'runs/train', help='save to project/name')# 保存的项目/名称。parser.add_argument('--name', default='exp', help='save to project/name')# 设置为true每次预测结果默认保存上述文件夹,不再创建新的文件夹parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment')# 四重数据加载器parser.add_argument('--quad', action='store_true', help='quad dataloader')# 线性学习率parser.add_argument('--linear-lr', action='store_true', help='linear LR')# 标签平滑的 epsilon 值。parser.add_argument('--label-smoothing', type=float, default=0.0, help='Label smoothing epsilon')# EarlyStopping 的等待时间parser.add_argument('--patience', type=int, default=100, help='EarlyStopping patience (epochs without improvement)')# 要冻结的层数。parser.add_argument('--freeze', type=int, default=0, help='Number of layers to freeze. backbone=10, all=24')# 每 x 轮保存检查parser.add_argument('--save-period', type=int, default=-1, help='Save checkpoint every x epochs (disabled if < 1)')parser.add_argument('--local_rank', type=int, default=-1, help='DDP parameter, do not modify')# Weights & Biases argumentsparser.add_argument('--entity', default=None, help='W&B: Entity')parser.add_argument('--upload_dataset', action='store_true', help='W&B: Upload dataset as artifact table')parser.add_argument('--bbox_interval', type=int, default=-1, help='W&B: Set bounding-box image logging interval')parser.add_argument('--artifact_alias', type=str, default='latest', help='W&B: Version of dataset artifact to use')opt = parser.parse_known_args()[0] if known else parser.parse_args()return opt
...
...
1.加载预训练完成的模型,进行进一步训练
# 初始权重路径,默认为 ROOT / 'yolov5s.pt',用于指定模型的初始权重文件路径或者设为空自己训练模型parser.add_argument('--weights', type=str, default=ROOT / 'yolov5s.pt', help='initial weights path')
训练完成后,会生成在训练过程中最好的模型与最新的模型
2.存放预模型的相关参数
# 模型配置文件路径,默认为空字符串,用于指定模型的配置文件。parser.add_argument('--cfg', type=str, default='', help='model.yaml path')
3.数据集的相关配置文件
# 数据集配置文件路径,默认为 ROOT / 'data/coco128.yaml',用于指定数据集的配置文件
parser.add_argument('--data', type=str, default=ROOT / 'data/coco128.yaml', help='dataset.yaml path')
4.超参数配置文件路径
# 超参数配置文件路径,默认为 ROOT / 'data/hyps/hyp.scratch.yaml',用于指定模型的超参数配置。
parser.add_argument('--hyp', type=str, default=ROOT / 'data/hyps/hyp.scratch.yaml', help='hyperparameters path')
5.每次训练完的模型、参数、结果等均保存到该位置
# 保存到项目/名称
parser.add_argument('--project', default=ROOT / 'runs/train', help='save to project/name')
# 保存的项目/名称。
parser.add_argument('--name', default='exp', help='save to project/name')
1.2使用模型
detect.py
使用预训练或者上述训练完成的模型进行预测
...
...
if __name__ == '__main__':# 创建了一个ArgumentParser对象,用于处理命令行参数。parser = argparse.ArgumentParser()# 加载训练好的模型赋予权值parser.add_argument('--weights', nargs='+', type=str, default='yolov5s.pt', help='model.pt path(s)')# 指定网络的输入parser.add_argument('--source', type=str, default='data/images', help='source') # file/folder, 0 for webcam# 训练过程中照片的尺寸parser.add_argument('--img-size', type=int, default=640, help='inference size (pixels)')# 置信度 检测概率超过某个值,才判断预测成功parser.add_argument('--conf-thres', type=float, default=0.25, help='object confidence threshold')# 多个框重合度在某个标准时,才合为一个框(一个目标)parser.add_argument('--iou-thres', type=float, default=0.45, help='IOU threshold for NMS')parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')# 展示内容parser.add_argument('--view-img', action='store_true', help='display results')# 保存为txt文本parser.add_argument('--save-txt', action='store_true', help='save results to *.txt')# 保存为置信度parser.add_argument('--save-conf', action='store_true', help='save confidences in --save-txt labels')parser.add_argument('--nosave', action='store_true', help='do not save images/videos')# 规定展示预测哪一个类别 --class 0 只展示下标为0的类别parser.add_argument('--classes', nargs='+', type=int, help='filter by class: --class 0, or --class 0 2 3')# 增强的NMS 多个框重合度在某个标准时,才合为一个框(一个目标)parser.add_argument('--agnostic-nms', action='store_true', help='class-agnostic NMS')# 增强预测 提高预测准确parser.add_argument('--augment', action='store_true', help='augmented inference')parser.add_argument('--update', action='store_true', help='update all models')# 运行结果保存的位置parser.add_argument('--project', default='runs/detect', help='save results to project/name')# 运行结果保存的文件夹名称parser.add_argument('--name', default='exp', help='save results to project/name')# 设置为true每次预测结果默认保存上述文件夹,不再创建新的文件夹parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment')opt = parser.parse_args()print(opt)check_requirements(exclude=('pycocotools', 'thop'))with torch.no_grad():if opt.update: # update all models (to fix SourceChangeWarning)for opt.weights in ['yolov5s.pt', 'yolov5m.pt', 'yolov5l.pt', 'yolov5x.pt']:detect()strip_optimizer(opt.weights)else:detect()
...
...
1.加载训练好的模型,可以是预训练模型,也可以是上述训练的模型
# 加载训练好的模型赋予权值
parser.add_argument('--weights', nargs='+', type=str, default='yolov5s.pt', help='model.pt path(s)')
2.待预测识别的图片或视频
# 指定网络的输入
parser.add_argument('--source', type=str, default='data/images', help='source') # file/folder, 0 for webcam
3.每次识别完的结果保存到该位置
# 运行结果保存的位置
parser.add_argument('--project', default='runs/detect', help='save results to project/name')
# 运行结果保存的文件夹名称
parser.add_argument('--name', default='exp', help='save results to project/name')
2 YOLO数据集
数据与label进行标注MakeSense
标注完成后,导出数据集
由此建立该数据集的配置文件
parser.add_argument('--data', type=str, default=ROOT / 'data/coco128.yaml', help='dataset.yaml path')
# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]train: images/train2017 # train images (relative to 'path') 128 images
val: images/train2017 # val images (relative to 'path') 128 images
test: # test images (optional)# Classes
nc: 80 # number of classes
names: ['person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat', 'traffic light','fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow','elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee','skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard','tennis racket', 'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple','sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch','potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone','microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors', 'teddy bear','hair drier', 'toothbrush'] # class names
训练即可