2026/5/21 15:24:15
网站建设
项目流程
网站技术支持是什么,创建一个网站的一般步骤要点,wordpress做下载型网站,百度一下 官方网第一步#xff1a;YOLOv5介绍
YOLOv5是一种目标检测算法#xff0c;它是YOLO#xff08;You Only Look Once#xff09;系列的最新版本。YOLOv5在YOLOv4的基础上进行了改进和优化#xff0c;以提高检测的准确性和速度。
YOLOv5采用了一些新的技术和方法来改进目标检测的…第一步YOLOv5介绍YOLOv5是一种目标检测算法它是YOLOYou Only Look Once系列的最新版本。YOLOv5在YOLOv4的基础上进行了改进和优化以提高检测的准确性和速度。YOLOv5采用了一些新的技术和方法来改进目标检测的性能。其中包括以下几个方面损失函数YOLOv5使用了CIOU_Loss作为bounding box的损失函数。CIOU_Loss是一种改进的IOU_Loss可以更好地衡量目标框的位置和大小。非极大值抑制NMSYOLOv5使用NMS来抑制重叠的边界框以减少重复检测的问题。聚类anchorsYOLOv5使用k-means聚类算法来生成anchors这些anchors用于检测不同尺度的目标。总的来说YOLOv5在YOLOv4的基础上进行了一些改进和优化以提高目标检测的准确性和速度。标注数据YOLOv5的训练和测试步骤各路大神都已经做了很多工作我就不再写了这里有几个写的比较好的博客可以参考无脑008——yolov5目标检测全流程训练自己的庞大数据集半自动标注数据集_python 实现yolov5s 目标检测训练-CSDN博客基于YOLOV5的数据集标注训练Windows/Linux/Jetson Nano多平台部署全流程-CSDN博客使用 YOLOv5 训练自建数据集教程 - 知乎第二步YOLOv5网络结构第三步代码展示Run inference with a YOLOv5 model on images, videos, directories, streams Usage: $ python path/to/detect.py --source path/to/img.jpg --weights yolov5s.pt --img 640 import argparse import sys import time from pathlib import Path import cv2 import torch import torch.backends.cudnn as cudnn FILE Path(__file__).absolute() sys.path.append(FILE.parents[0].as_posix()) # add yolov5/ to path from models.experimental import attempt_load from utils.datasets import LoadStreams, LoadImages from utils.general import check_img_size, check_requirements, check_imshow, colorstr, non_max_suppression, \ apply_classifier, scale_coords, xyxy2xywh, strip_optimizer, set_logging, increment_path, save_one_box from utils.plots import colors, plot_one_box from utils.torch_utils import select_device, load_classifier, time_sync torch.no_grad() def run(weightshelmet.pt, # model.pt path(s) sourcedata/images, # file/dir/URL/glob, 0 for webcam imgsz640, # inference size (pixels) conf_thres0.25, # confidence threshold iou_thres0.45, # NMS IOU threshold max_det1000, # maximum detections per image device, # cuda device, i.e. 0 or 0,1,2,3 or cpu view_imgFalse, # show results save_txtFalse, # save results to *.txt save_confFalse, # save confidences in --save-txt labels save_cropFalse, # save cropped prediction boxes nosaveFalse, # do not save images/videos classesNone, # filter by class: --class 0, or --class 0 2 3 agnostic_nmsFalse, # class-agnostic NMS augmentFalse, # augmented inference visualizeFalse, # visualize features updateFalse, # update all models projectruns/detect, # save results to project/name nameexp, # save results to project/name exist_okFalse, # existing project/name ok, do not increment line_thickness3, # bounding box thickness (pixels) hide_labelsFalse, # hide labels hide_confFalse, # hide confidences halfFalse, # use FP16 half-precision inference ): save_img not nosave and not source.endswith(.txt) # save inference images webcam source.isnumeric() or source.endswith(.txt) or source.lower().startswith( (rtsp://, rtmp://, http://, https://)) # Directories save_dir increment_path(Path(project) / name, exist_okexist_ok) # increment run (save_dir / labels if save_txt else save_dir).mkdir(parentsTrue, exist_okTrue) # make dir # Initialize set_logging() device select_device(device) half device.type ! cpu # half precision only supported on CUDA # Load model w weights[0] if isinstance(weights, list) else weights classify, pt, onnx False, w.endswith(.pt), w.endswith(.onnx) # inference type stride, names 64, [fclass{i} for i in range(1000)] # assign defaults if pt: model attempt_load(weights, map_locationdevice) # load FP32 model stride int(model.stride.max()) # model stride names model.module.names if hasattr(model, module) else model.names # get class names names[0] nohat if half: model.half() # to FP16 if classify: # second-stage classifier modelc load_classifier(nameresnet50, n2) # initialize modelc.load_state_dict(torch.load(resnet50.pt, map_locationdevice)[model]).to(device).eval() elif onnx: check_requirements((onnx, onnxruntime)) import onnxruntime session onnxruntime.InferenceSession(w, None) imgsz check_img_size(imgsz, sstride) # check image size # Dataloader if webcam: view_img check_imshow() cudnn.benchmark True # set True to speed up constant image size inference dataset LoadStreams(source, img_sizeimgsz, stridestride) bs len(dataset) # batch_size else: dataset LoadImages(source, img_sizeimgsz, stridestride) bs 1 # batch_size vid_path, vid_writer [None] * bs, [None] * bs # Run inference if pt and device.type ! cpu: model(torch.zeros(1, 3, imgsz, imgsz).to(device).type_as(next(model.parameters()))) # run once t0 time.time() for path, img, im0s, vid_cap in dataset: if pt: img torch.from_numpy(img).to(device) img img.half() if half else img.float() # uint8 to fp16/32 elif onnx: img img.astype(float32) img / 255.0 # 0 - 255 to 0.0 - 1.0 if len(img.shape) 3: img img[None] # expand for batch dim # Inference t1 time_sync() if pt: visualize increment_path(save_dir / Path(path).stem, mkdirTrue) if visualize else False pred model(img, augmentaugment, visualizevisualize)[0] elif onnx: pred torch.tensor(session.run([session.get_outputs()[0].name], {session.get_inputs()[0].name: img})) # NMS pred non_max_suppression(pred, conf_thres, iou_thres, classes, agnostic_nms, max_detmax_det) t2 time_sync() # Second-stage classifier (optional) if classify: pred apply_classifier(pred, modelc, img, im0s) # Process predictions for i, det in enumerate(pred): # detections per image if webcam: # batch_size 1 p, s, im0, frame path[i], f{i}: , im0s[i].copy(), dataset.count else: p, s, im0, frame path, , im0s.copy(), getattr(dataset, frame, 0) p Path(p) # to Path save_path str(save_dir / p.name) # img.jpg txt_path str(save_dir / labels / p.stem) ( if dataset.mode image else f_{frame}) # img.txt s %gx%g % img.shape[2:] # print string gn torch.tensor(im0.shape)[[1, 0, 1, 0]] # normalization gain whwh imc im0.copy() if save_crop else im0 # for save_crop if len(det): # Rescale boxes from img_size to im0 size det[:, :4] scale_coords(img.shape[2:], det[:, :4], im0.shape).round() # Print results for c in det[:, -1].unique(): n (det[:, -1] c).sum() # detections per class s f{n} {names[int(c)]}{s * (n 1)}, # add to string # Write results for *xyxy, conf, cls in reversed(det): if save_txt: # Write to file xywh (xyxy2xywh(torch.tensor(xyxy).view(1, 4)) / gn).view(-1).tolist() # normalized xywh line (cls, *xywh, conf) if save_conf else (cls, *xywh) # label format with open(txt_path .txt, a) as f: f.write((%g * len(line)).rstrip() % line \n) if save_img or save_crop or view_img: # Add bbox to image c int(cls) # integer class label None if hide_labels else (names[c] if hide_conf else f{names[c]} {conf:.2f}) plot_one_box(xyxy, im0, labellabel, colorcolors(c, True), line_thicknessline_thickness) if save_crop: save_one_box(xyxy, imc, filesave_dir / crops / names[c] / f{p.stem}.jpg, BGRTrue) # Print time (inference NMS) print(f{s}Done. ({t2 - t1:.3f}s)) # Stream results if view_img: cv2.imshow(str(p), im0) cv2.waitKey(1) # 1 millisecond # Save results (image with detections) if save_img: if dataset.mode image: cv2.imwrite(save_path, im0) else: # video or stream if vid_path[i] ! save_path: # new video vid_path[i] save_path if isinstance(vid_writer[i], cv2.VideoWriter): vid_writer[i].release() # release previous video writer if vid_cap: # video fps vid_cap.get(cv2.CAP_PROP_FPS) w int(vid_cap.get(cv2.CAP_PROP_FRAME_WIDTH)) h int(vid_cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) else: # stream fps, w, h 30, im0.shape[1], im0.shape[0] save_path .mp4 vid_writer[i] cv2.VideoWriter(save_path, cv2.VideoWriter_fourcc(*mp4v), fps, (w, h)) vid_writer[i].write(im0) if save_txt or save_img: s f\n{len(list(save_dir.glob(labels/*.txt)))} labels saved to {save_dir / labels} if save_txt else print(fResults saved to {colorstr(bold, save_dir)}{s}) if update: strip_optimizer(weights) # update model (to fix SourceChangeWarning) print(fDone. ({time.time() - t0:.3f}s)) return im0 def parse_opt(): parser argparse.ArgumentParser() parser.add_argument(--weights, nargs, typestr, defaulthelmet.pt, helpmodel.pt path(s)) parser.add_argument(--source, typestr, default0, helpfile/dir/URL/glob, 0 for webcam) parser.add_argument(--imgsz, --img, --img-size, typeint, default640, helpinference size (pixels)) parser.add_argument(--conf-thres, typefloat, default0.25, helpconfidence threshold) parser.add_argument(--iou-thres, typefloat, default0.45, helpNMS IoU threshold) parser.add_argument(--max-det, typeint, default1000, helpmaximum detections per image) parser.add_argument(--device, default, helpcuda device, i.e. 0 or 0,1,2,3 or cpu) parser.add_argument(--view-img, actionstore_true, helpshow results) parser.add_argument(--save-txt, actionstore_true, helpsave results to *.txt) parser.add_argument(--save-conf, actionstore_true, helpsave confidences in --save-txt labels) parser.add_argument(--save-crop, actionstore_true, helpsave cropped prediction boxes) parser.add_argument(--nosave, actionstore_true, helpdo not save images/videos) parser.add_argument(--classes, nargs, typeint, helpfilter by class: --class 0, or --class 0 2 3) parser.add_argument(--agnostic-nms, actionstore_true, helpclass-agnostic NMS) parser.add_argument(--augment, actionstore_true, helpaugmented inference) parser.add_argument(--visualize, actionstore_true, helpvisualize features) parser.add_argument(--update, actionstore_true, helpupdate all models) parser.add_argument(--project, defaultruns/detect, helpsave results to project/name) parser.add_argument(--name, defaultexp, helpsave results to project/name) parser.add_argument(--exist-ok, actionstore_true, helpexisting project/name ok, do not increment) parser.add_argument(--line-thickness, default3, typeint, helpbounding box thickness (pixels)) parser.add_argument(--hide-labels, defaultFalse, actionstore_true, helphide labels) parser.add_argument(--hide-conf, defaultFalse, actionstore_true, helphide confidences) parser.add_argument(--half, actionstore_true, helpuse FP16 half-precision inference) opt parser.parse_args() return opt def main(opt): print(colorstr(detect: ) , .join(f{k}{v} for k, v in vars(opt).items())) check_requirements(exclude(tensorboard, thop)) run(**vars(opt)) if __name__ __main__: opt parse_opt() main(opt)第四步运行图片识别效果第五步整个工程的内容项目完整文件下载请见演示与介绍视频的简介处给出➷➷➷https://www.bilibili.com/video/BV13qUxYsEB7/