一.背景
还是为公司搭建开源的安全管理平台为目的,逐步探索。先找到了开源的安全帽识别的项目,之前文章学习了怎么简单运行。本次学习怎么去执行模型训练?
二.环境准备
1.准备Python、Pytorch的环境
参照我之前的文章。在windows系统用Anaconda搭建运行PyTorch识别安全帽项目的环境-CSDN博客
2.准备vscode
参考我之前的文章。
vscode(Visual Studio Code)的安装及汉化-CSDN博客
3.我机器的配置情况
CPU:12th Gen Intel(R) Core(TM) i7-12700 2.10 GHz
内存:16G
显卡:NVIDIA GeForce GT 730
没有GPU(我之前了解到PyTorch要区分是否使用GPU的版本,我这里虽然有独立显卡,但是没有使用支持GPU的版本)
三.执行训练的过程
1.vscode打开工程
2.运行model.py
3.训练的情况
执行了7.42个小时。日志如下:
D:\zsp\works\temp\20241119-zsp-helmet\Safety-Helmet-Detection-main> activateD:\zsp\works\temp\20241119-zsp-helmet\Safety-Helmet-Detection-main>conda.bat activate
PS D:\zsp\works\temp\20241119-zsp-helmet\Safety-Helmet-Detection-main> conda activate myenv
PS D:\zsp\works\temp\20241119-zsp-helmet\Safety-Helmet-Detection-main> & C:/Users/Dell/.conda/envs/myenv/python.exe d:/zsp/works/temp/20241119-zsp-helmet/Safety-Helmet-Detection-main/model/model.py
New https://pypi.org/project/ultralytics/8.3.50 available 😃 Update with 'pip install -U ultralytics'
Ultralytics 8.3.49 🚀 Python-3.12.7 torch-2.5.0 CPU (12th Gen Intel Core(TM) i7-12700)
engine\trainer: task=detect, mode=train, model=yolov8n.pt, data=data.yaml, epochs=10, time=None, patience=100, batch=16, imgsz=640, save=True, save_period=-1, cache=False, device=None, workers=8, project=None, name=train16, exist_ok=False, pretrained=True, optimizer=auto, verbose=True, seed=0, deterministic=True, single_cls=False, rect=False, cos_lr=False, close_mosaic=10, resume=False, amp=True, fraction=1.0, profile=False, freeze=None, multi_scale=False, overlap_mask=True, mask_ratio=4, dropout=0.0, val=True, split=val, save_json=False, save_hybrid=False, conf=None, iou=0.7, max_det=300, half=False, dnn=False, plots=True, source=None, vid_stride=1, stream_buffer=False, visualize=False, augment=False, agnostic_nms=False, classes=None, retina_masks=False, embed=None, show=False, save_frames=False, save_txt=False, save_conf=False, save_crop=False, show_labels=True, show_conf=True, show_boxes=True, line_width=None, format=torchscript, keras=False, optimize=False, int8=False, dynamic=False, simplify=True, opset=None, workspace=None, nms=False, lr0=0.01, lrf=0.01, momentum=0.937, weight_decay=0.0005, warmup_epochs=3.0, warmup_momentum=0.8, warmup_bias_lr=0.1, box=7.5, cls=0.5, dfl=1.5, pose=12.0, kobj=1.0, nbs=64, hsv_h=0.015, hsv_s=0.7, hsv_v=0.4, degrees=0.0, translate=0.1, scale=0.5, shear=0.0, perspective=0.0, flipud=0.0, fliplr=0.5, bgr=0.0, mosaic=1.0, mixup=0.0, copy_paste=0.0, copy_paste_mode=flip, auto_augment=randaugment, erasing=0.4, crop_fraction=1.0, cfg=None, tracker=botsort.yaml, save_dir=runs\detect\train16
Overriding model.yaml nc=80 with nc=3from n params module arguments0 -1 1 464 ultralytics.nn.modules.conv.Conv [3, 16, 3, 2]1 -1 1 4672 ultralytics.nn.modules.conv.Conv [16, 32, 3, 2]2 -1 1 7360 ultralytics.nn.modules.block.C2f [32, 32, 1, True]3 -1 1 18560 ultralytics.nn.modules.conv.Conv [32, 64, 3, 2]4 -1 2 49664 ultralytics.nn.modules.block.C2f [64, 64, 2, True]5 -1 1 73984 ultralytics.nn.modules.conv.Conv [64, 128, 3, 2]6 -1 2 197632 ultralytics.nn.modules.block.C2f [128, 128, 2, True]7 -1 1 295424 ultralytics.nn.modules.conv.Conv [128, 256, 3, 2]8 -1 1 460288 ultralytics.nn.modules.block.C2f [256, 256, 1, True]9 -1 1 164608 ultralytics.nn.modules.block.SPPF [256, 256, 5]10 -1 1 0 torch.nn.modules.upsampling.Upsample [None, 2, 'nearest']11 [-1, 6] 1 0 ultralytics.nn.modules.conv.Concat [1]12 -1 1 148224 ultralytics.nn.modules.block.C2f [384, 128, 1]13 -1 1 0 torch.nn.modules.upsampling.Upsample [None, 2, 'nearest']14 [-1, 4] 1 0 ultralytics.nn.modules.conv.Concat [1]15 -1 1 37248 ultralytics.nn.modules.block.C2f [192, 64, 1]16 -1 1 36992 ultralytics.nn.modules.conv.Conv [64, 64, 3, 2]17 [-1, 12] 1 0 ultralytics.nn.modules.conv.Concat [1]18 -1 1 123648 ultralytics.nn.modules.block.C2f [192, 128, 1]19 -1 1 147712 ultralytics.nn.modules.conv.Conv [128, 128, 3, 2]20 [-1, 9] 1 0 ultralytics.nn.modules.conv.Concat [1]21 -1 1 493056 ultralytics.nn.modules.block.C2f [384, 256, 1]22 [15, 18, 21] 1 751897 ultralytics.nn.modules.head.Detect [3, [64, 128, 256]]
Model summary: 225 layers, 3,011,433 parameters, 3,011,417 gradients, 8.2 GFLOPsTransferred 319/355 items from pretrained weights
Freezing layer 'model.22.dfl.conv.weight'
train: Scanning D:\zsp\works\temp\20241119-zsp-helmet\Safety-Helmet-Detection-main\data\labels.cache... 5000 images, 0 backgrounds, 0 corrupt: 100%|██████████| 5000/5000 [00:00<?, ?it/s]
val: Scanning D:\zsp\works\temp\20241119-zsp-helmet\Safety-Helmet-Detection-main\data\labels.cache... 5000 images, 0 backgrounds, 0 corrupt: 100%|██████████| 5000/5000 [00:00<?, ?it/s]
Plotting labels to runs\detect\train16\labels.jpg...
optimizer: 'optimizer=auto' found, ignoring 'lr0=0.01' and 'momentum=0.937' and determining best 'optimizer', 'lr0' and 'momentum' automatically...
optimizer: AdamW(lr=0.001429, momentum=0.9) with parameter groups 57 weight(decay=0.0), 64 weight(decay=0.0005), 63 bias(decay=0.0)
Image sizes 640 train, 640 val
Using 0 dataloader workers
Logging results to runs\detect\train16
Starting training for 10 epochs...
Closing dataloader mosaicEpoch GPU_mem box_loss cls_loss dfl_loss Instances Size1/10 0G 1.486 1.703 1.21 41 640: 100%|██████████| 313/313 [40:38<00:00, 7.79s/it]Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 157/157 [14:18<00:00, 5.47s/it]all 5000 25502 0.915 0.512 0.574 0.339Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size2/10 0G 1.419 1.107 1.178 20 640: 100%|██████████| 313/313 [40:11<00:00, 7.70s/it]Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 157/157 [13:28<00:00, 5.15s/it]all 5000 25502 0.915 0.527 0.586 0.348Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size3/10 0G 1.4 0.9633 1.174 45 640: 100%|██████████| 313/313 [39:57<00:00, 7.66s/it]Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 157/157 [13:56<00:00, 5.33s/it]all 5000 25502 0.914 0.5 0.564 0.337Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size4/10 0G 1.369 0.8802 1.165 44 640: 100%|██████████| 313/313 [40:57<00:00, 7.85s/it]Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 157/157 [13:54<00:00, 5.32s/it]all 5000 25502 0.93 0.546 0.603 0.369Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size5/10 0G 1.34 0.817 1.147 41 640: 100%|██████████| 313/313 [40:50<00:00, 7.83s/it]Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 157/157 [13:59<00:00, 5.35s/it]all 5000 25502 0.938 0.556 0.615 0.388Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size6/10 0G 1.317 0.7701 1.134 34 640: 100%|██████████| 313/313 [40:18<00:00, 7.73s/it]Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 157/157 [13:37<00:00, 5.20s/it]all 5000 25502 0.935 0.564 0.62 0.392Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size7/10 0G 1.291 0.7333 1.118 14 640: 100%|██████████| 313/313 [40:34<00:00, 7.78s/it]Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 157/157 [13:41<00:00, 5.23s/it]all 5000 25502 0.946 0.573 0.629 0.395Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size8/10 0G 1.271 0.6964 1.108 45 640: 100%|██████████| 313/313 [20:10<00:00, 3.87s/it]Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 157/157 [06:04<00:00, 2.32s/it]all 5000 25502 0.95 0.584 0.636 0.41Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size9/10 0G 1.243 0.6622 1.094 39 640: 100%|██████████| 313/313 [14:33<00:00, 2.79s/it]Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 157/157 [06:08<00:00, 2.35s/it]all 5000 25502 0.95 0.591 0.64 0.421Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size10/10 0G 1.221 0.6353 1.088 22 640: 100%|██████████| 313/313 [14:36<00:00, 2.80s/it]Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 157/157 [06:08<00:00, 2.35s/it]all 5000 25502 0.954 0.595 0.644 0.42910 epochs completed in 7.472 hours.
Optimizer stripped from runs\detect\train16\weights\last.pt, 6.2MB
Optimizer stripped from runs\detect\train16\weights\best.pt, 6.2MBValidating runs\detect\train16\weights\best.pt...
Ultralytics 8.3.49 🚀 Python-3.12.7 torch-2.5.0 CPU (12th Gen Intel Core(TM) i7-12700)
Model summary (fused): 168 layers, 3,006,233 parameters, 0 gradients, 8.1 GFLOPsClass Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 157/157 [04:53<00:00, 1.87s/it]all 5000 25502 0.954 0.596 0.644 0.429helmet 4581 18966 0.953 0.904 0.966 0.649head 920 5785 0.91 0.883 0.936 0.621person 158 751 1 0 0.0307 0.0175
Speed: 1.2ms preprocess, 50.8ms inference, 0.0ms loss, 0.3ms postprocess per image
Results saved to runs\detect\train16
Ultralytics 8.3.49 🚀 Python-3.12.7 torch-2.5.0 CPU (12th Gen Intel Core(TM) i7-12700)
Model summary (fused): 168 layers, 3,006,233 parameters, 0 gradients, 8.1 GFLOPs
val: Scanning D:\zsp\works\temp\20241119-zsp-helmet\Safety-Helmet-Detection-main\data\labels.cache... 5000 images, 0 backgrounds, 0 corrupt: 100%|██████████| 5000/5000 [00:00<?, ?it/s]Class Images Instances Box(P R mAP50 mAP50-95): 100%|██████████| 313/313 [04:25<00:00, 1.18it/s]all 5000 25502 0.954 0.596 0.644 0.429helmet 4581 18966 0.953 0.904 0.966 0.649head 920 5785 0.91 0.883 0.936 0.621person 158 751 1 0 0.0307 0.0175
Speed: 1.2ms preprocess, 45.4ms inference, 0.0ms loss, 0.3ms postprocess per image
Results saved to runs\detect\train162
Ultralytics 8.3.49 🚀 Python-3.12.7 torch-2.5.0 CPU (12th Gen Intel Core(TM) i7-12700)PyTorch: starting from 'runs\detect\train16\weights\best.pt' with input shape (1, 3, 640, 640) BCHW and output shape(s) (1, 7, 8400) (6.0 MB)ONNX: starting export with onnx 1.17.0 opset 19...
ONNX: slimming with onnxslim 0.1.43...
ONNX: export success ✅ 1.0s, saved as 'runs\detect\train16\weights\best.onnx' (11.7 MB)Export complete (1.1s)
Results saved to D:\zsp\works\temp\20241119-zsp-helmet\Safety-Helmet-Detection-main\runs\detect\train16\weights
Predict: yolo predict task=detect model=runs\detect\train16\weights\best.onnx imgsz=640
Validate: yolo val task=detect model=runs\detect\train16\weights\best.onnx imgsz=640 data=data.yaml
Visualize: https://netron.app
四.过程中可能遇到的问题
我记得我遇到了onnx没有安装,用我之前文章里面的命令安装就行了。
#激活(使用)环境
conda activate myenv#安装 python 需要的包
conda install onnx
一般的报错,都能解决的,看日志,想办法