程序示例精选
Python+Yolov5人脸口罩识别
如需安装运行环境或远程调试,见文章底部微信名片,由专业技术人员远程协助!
前言
Yolov5比较Yolov4,Yolov3等其他识别框架,速度快,代码结构简单,识别效率高,对硬件要求比较低。这篇博客针对Python+Yolov5人脸口罩识别编写代码,代码整洁,规则,易读。 学习与应用推荐首选。
文章目录
一、所需工具软件
二、使用步骤
1. 引入库
2. 识别图像特征
3. 识别参数定义
4. 运行结果
三、在线协助
一、所需工具软件
1. Python3.6以上
2. Pycharm代码编辑器
3. Torch, OpenCV库
二、使用步骤
1.引入库
代码如下(示例):
  
   - 
    
     
    
    
     
      import cv2
     
    
- 
    
     
    
    
     
      import torch
     
    
- 
    
     
    
    
     
      from numpy import random
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      from models.experimental import attempt_load
     
    
- 
    
     
    
    
     
      from utils.datasets import LoadStreams, LoadImages
     
    
- 
    
     
    
    
     
      from utils.general import check_img_size, check_requirements, check_imshow, non_max_suppression, apply_classifier, \
     
    
- 
    
     
    
    
     
          scale_coords, xyxy2xywh, strip_optimizer, set_logging, increment_path
     
    
- 
    
     
    
    
     
      from utils.plots import plot_one_box
     
    
- 
    
     
    
    
     
      from utils.torch_utils import select_device, load_classifier, time_synchronized
     
    
2.识别图像特征
代码如下(示例):
  
   - 
    
     
    
    
     
      def 
      detect
      (save_img=False):
     
    
- 
    
     
    
    
     
          source, weights, view_img, save_txt, imgsz = opt.source, opt.weights, opt.view_img, opt.save_txt, opt.img_size
     
    
- 
    
     
    
    
     
          webcam = source.isnumeric() or source.endswith(
      '.txt') or source.lower().startswith(
     
    
- 
    
     
    
    
     
              (
      'rtsp://', 
      'rtmp://', 
      'http://'))
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
          # Directories
     
    
- 
    
     
    
    
     
          save_dir = Path(increment_path(Path(opt.project) / opt.name, exist_ok=opt.exist_ok))  
      # increment run
     
    
- 
    
     
    
    
     
          (save_dir / 
      'labels' 
      if save_txt 
      else save_dir).mkdir(parents=True, exist_ok=True)  
      # make dir
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
          # Initialize
     
    
- 
    
     
    
    
     
          set_logging()
     
    
- 
    
     
    
    
     
          device = select_device(opt.device)
     
    
- 
    
     
    
    
     
          half = device.type != 
      'cpu'  
      # half precision only supported on CUDA
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
          # Load model
     
    
- 
    
     
    
    
     
          model = attempt_load(weights, map_location=device)  
      # load FP32 model
     
    
- 
    
     
    
    
     
          stride = 
      int(model.stride.max())  
      # model stride
     
    
- 
    
     
    
    
     
          imgsz = check_img_size(imgsz, s=stride)  
      # check img_size
     
    
- 
    
     
    
    
         
      if half:
     
    
- 
    
     
    
    
     
              model.half()  
      # to FP16
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
          # Second-stage classifier
     
    
- 
    
     
    
    
     
          classify = False
     
    
- 
    
     
    
    
         
      if classify:
     
    
- 
    
     
    
    
     
              modelc = load_classifier(name=
      'resnet101', n=
      2)  
      # initialize
     
    
- 
    
     
    
    
     
              modelc.load_state_dict(torch.load(
      'weights/resnet101.pt', map_location=device)[
      'model']).to(device).eval()
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
          # Set Dataloader
     
    
- 
    
     
    
    
     
          vid_path, vid_writer = None, None
     
    
- 
    
     
    
    
         
      if webcam:
     
    
- 
    
     
    
    
     
              view_img = check_imshow()
     
    
- 
    
     
    
    
     
              cudnn.benchmark = True  
      # set True to speed up constant image size inference
     
    
- 
    
     
    
    
     
              dataset = LoadStreams(source, img_size=imgsz, stride=stride)
     
    
- 
    
     
    
    
         
      else:
     
    
- 
    
     
    
    
     
              save_img = True
     
    
- 
    
     
    
    
     
              dataset = LoadImages(source, img_size=imgsz, stride=stride)
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
          # Get names and colors
     
    
- 
    
     
    
    
     
          names = model.module.names 
      if hasattr(model, 
      'module') 
      else model.names
     
    
- 
    
     
    
    
     
          colors = [[random.randint(
      0, 
      255) 
      for _ in range(
      3)] 
      for _ in names]
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
          # Run inference
     
    
- 
    
     
    
    
         
      if 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:
     
    
- 
    
     
    
    
     
              img = torch.from_numpy(img).to(device)
     
    
- 
    
     
    
    
     
              img = img.half() 
      if half 
      else img.
      float()  # uint8 to fp16/
      32
     
    
- 
    
     
    
    
     
              img /= 
      255.0  # 
      0 - 
      255 to 
      0.0 - 
      1.0
     
    
- 
    
     
    
    
             
      if img.ndimension() == 
      3:
     
    
- 
    
     
    
    
     
                  img = img.unsqueeze(
      0)
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
              # Inference
     
    
- 
    
     
    
    
     
              t1 = time_synchronized()
     
    
- 
    
     
    
    
     
              pred = model(img, augment=opt.augment)[
      0]
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
              # Apply NMS
     
    
- 
    
     
    
    
     
              pred = non_max_suppression(pred, opt.conf_thres, opt.iou_thres, classes=opt.classes, agnostic=opt.agnostic_nms)
     
    
- 
    
     
    
    
     
              t2 = time_synchronized()
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
              # Apply Classifier
     
    
- 
    
     
    
    
             
      if classify:
     
    
- 
    
     
    
    
     
                  pred = apply_classifier(pred, modelc, img, im0s)
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
              # Process detections
     
    
- 
    
     
    
    
             
      for i, det in enumerate(pred):  
      # detections per image
     
    
- 
    
     
    
    
                 
      if webcam:  # batch_size >= 
      1
     
    
- 
    
     
    
    
     
                      p, s, im0, frame = path[i], 
      '%g: ' % i, im0s[i].copy(), dataset.count
     
    
- 
    
     
    
    
                 
      else:
     
    
- 
    
     
    
    
     
                      p, s, im0, frame = path, 
      '', im0s, 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
     
    
- 
    
     
    
    
     
       if len(det):
     
    
- 
    
     
    
    
     
       # Rescale boxes from img_size to im0 size
     
    
- 
    
     
    
    
     
       det[:, :4] = scale_coords(img.shape[2:], det[:, :4], im0.shape).round()
     
    
- 
    
     
    
    
     
       
     
    
- 
    
     
    
    
     
       
     
    
- 
    
     
    
    
     
       # 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 opt.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 view_img:  # Add bbox to image
     
    
- 
    
     
    
    
     
                              label = f
      '{names[
      int(cls)]} {conf:
      .2f}'
     
    
- 
    
     
    
    
     
                              plot_one_box(xyxy, im0, label=label, color=colors[
      int(cls)], line_thickness=
      3)
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
                  # Print time (inference + NMS)
     
    
- 
    
     
    
    
     
                  print(f
      '{s}Done. ({t2 - t1:
      .3f}s)
      ')
     
    
- 
    
     
    
    
     
       
     
    
- 
    
     
    
    
     
       
     
    
- 
    
     
    
    
     
       # Save results (image with detections)
     
    
- 
    
     
    
    
     
       if save_img:
     
    
- 
    
     
    
    
     
       if dataset.mode == 'image
      ':
     
    
- 
    
     
    
    
     
                          cv2.imwrite(save_path, im0)
     
    
- 
    
     
    
    
                     
      else:  # 
      'video'
     
    
- 
    
     
    
    
                         
      if vid_path != save_path:  
      # new video
     
    
- 
    
     
    
    
     
                              vid_path = save_path
     
    
- 
    
     
    
    
                             
      if isinstance(vid_writer, cv2.VideoWriter):
     
    
- 
    
     
    
    
     
                                  vid_writer.release()  
      # release previous video writer
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
                              fourcc = 
      'mp4v'  
      # output video codec
     
    
- 
    
     
    
    
     
                              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))
     
    
- 
    
     
    
    
     
                              vid_writer = cv2.VideoWriter(save_path, cv2.VideoWriter_fourcc(*fourcc), fps, (w, h))
     
    
- 
    
     
    
    
     
                          vid_writer.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(f"Results saved to {save_dir}{s}")
     
    
- 
    
     
    
    
     
       
     
    
- 
    
     
    
    
     
       print(f'Done. ({time.time() - t0:
      .3f}s)
      ')
     
    
- 
    
     
    
    
     
       
     
    
- 
    
     
    
    
     
       print(opt)
     
    
- 
    
     
    
    
     
       check_requirements()
     
    
- 
    
     
    
    
     
       
     
    
- 
    
     
    
    
     
       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()
     
    
 该处使用的url网络请求的数据。
3.识别参数定义:
代码如下(示例):
  
   - 
    
     
    
    
     
      if __name__ == 
      '__main__':
     
    
- 
    
     
    
    
     
          parser = argparse.ArgumentParser()
     
    
- 
    
     
    
    
     
          parser.add_argument(
      '--weights', nargs=
      '+', 
      type=
      str, default=
      'yolov5_best_road_crack_recog.pt', 
      help=
      'model.pt path(s)')
     
    
- 
    
     
    
    
     
          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(
      '--view-img', action=
      'store_true', 
      help=
      'display results')
     
    
- 
    
     
    
    
     
          parser.add_argument(
      '--save-txt', action=
      'store_true', 
      help=
      'save results to *.txt')
     
    
- 
    
     
    
    
     
          parser.add_argument(
      '--classes', nargs=
      '+', 
      type=
      int, default=
      '0', 
      help=
      'filter by class: --class 0, or --class 0 2 3')
     
    
- 
    
     
    
    
     
          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')
     
    
- 
    
     
    
    
     
          parser.add_argument(
      '--exist-ok', action=
      'store_true', 
      help=
      'existing project/name ok, do not increment')
     
    
- 
    
     
    
    
     
          opt = parser.parse_args()
     
    
- 
    
     
    
    
         
     
    
- 
    
     
    
    
         
      print(opt)
     
    
- 
    
     
    
    
     
          check_requirements()
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
         
      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()
     
    
 4.运行结果如下:

三、在线协助:
如需安装运行环境或远程调试,见文章底部微信名片,由专业技术人员远程协助!
转载:https://blog.csdn.net/alicema1111/article/details/128324661
查看评论
					 
					