当前位置:   article > 正文

yolov8人脸识别-脸部关键点检测(代码+原理)_1.利用yolo实现自身人脸检测和视频中的车辆,编写卷积神经网络(cnn)代码进行实现

1.利用yolo实现自身人脸检测和视频中的车辆,编写卷积神经网络(cnn)代码进行实现

1. 人脸识别

Yolov8可用于人脸识别,它可以识别人脸的位置、大小和角度等信息,并对人脸进行精确的识别。通过使用Yolov8,可以实现高效准确的人脸识别,不仅可以应用于安防领域,也可以应用于人脸支付、人脸门禁等场景。

2. 脸部关键点检测

除了人脸识别外,Yolov8还可以用于脸部关键点检测。它可以检测出人脸的各个部位,如眼睛、鼻子、嘴巴等,并预测出它们的坐标位置。这种技术可以被广泛应用于人脸美化、表情识别、虚拟试妆等领域。

3. 基于深度学习的模型:

Yolov8是一个基于深度学习的模型,它使用卷积神经网络(Convolutional Neural Network)对图像进行处理和特征提取。通过使用深度学习技术,Yolov8可以自动地学习人脸和脸部关键点的特征,从而提高检测的精度和准确度。

4. 高效准确的检测能力:

Yolov8具有高效准确的检测能力,可以在较短的时间内完成对图像中人脸和脸部关键点的检测任务。同时,Yolov8还可以实现实时检测,可以应用于视频监控、直播等场景。

总之,Yolov8是一种强大的目标检测模型,在人脸识别和脸部关键点检测方面有广泛的应用前景。通过使用Yolov8,可以实现高效准确的检测,并为各种应用场景提供更好的解决方案。

YOLOv8 脸部识别是一个基于YOLOv8算法的人脸检测项目,旨在实现快速、准确地检测图像和视频中的人脸。该项目是对YOLOv8算法的扩展和优化,专门用于人脸检测任务。

YOLOv8是一种基于深度学习的目标检测算法,通过将目标检测问题转化为一个回归问题,可以实现实时的目标检测。YOLOv8 Face项目在YOLOv8的基础上进行了改进,使其更加适用于人脸检测。以下是YOLOv8 Face项目的一些特点和关键技术:

高准确性:

YOLOv8
Face采用了一系列的优化策略,包括网络结构的设计、数据增强和训练技巧等,从而提高了模型的准确性。它能够精确地检测出各种不同姿态、光照和遮挡条件下的人脸。

实时性能:

YOLOv8Face具有较高的实时性能,可以在实时图像和视频流中快速检测人脸。它采用了一种轻量级的网络结构和高效的推理算法,以实现实时的人脸检测。

多尺度检测:

为了适应不同大小和尺度的人脸,YOLOv8 Face使用了多尺度检测技术。通过在不同尺度下进行检测,可以提高模型对小尺寸人脸的检测能力。

数据增强:

YOLOv8 Face使用了各种数据增强技术,如随机裁剪、旋转和缩放等,以增加训练数据的多样性和丰富性。这有助于提高模型的泛化能力和鲁棒性。

高效推理:

为了提高推理效率,YOLOv8 Face使用了一些优化技术,如模型压缩、量化和推理引擎的优化等。这使得模型可以在嵌入式设备和移动端实现快速的人脸检测。

代码运行

数据准备

  1. 下载WIDERFace数据集
  2. 从Google Drive下载注释文件
  3. 进入data文件夹
  4. 运行python3 train2yolo.py /path/to/original/widerface/train` [/path/to/save/widerface/train],将训练集转换为YOLOv5格式
  5. 运行python3 val2yolo.py /path/to/original/widerface [/path/to/save/widerface/val],将验证集转换为YOLOv5格式

训练

6.运行 CUDA_VISIBLE_DEVICES="0,1,2,3" python3 train.py --data data/widerface.yaml --cfg models/yolov5s.yaml --weights 'pretrained models',进行训练

WIDERFace评估

  1. 进入widerface_evaluate文件夹
  2. 运行python3 evaluation.py,进行评估

demo代码

运行下列demo示例,可以帮助我们推理出结果!!!!!!

  1. import argparse
  2. import time
  3. from pathlib import Path
  4. import cv2
  5. import torch
  6. import torch.backends.cudnn as cudnn
  7. from numpy import random
  8. from models.experimental import attempt_load
  9. from utils.datasets import LoadStreams, LoadImages
  10. from utils.general import check_img_size, non_max_suppression, apply_classifier, scale_coords, xyxy2xywh, \
  11. strip_optimizer, set_logging, increment_path
  12. from utils.plots import plot_one_box
  13. from utils.torch_utils import select_device, load_classifier, time_synchronized
  14. def detect(save_img=False):
  15. source, weights, view_img, save_txt, imgsz = opt.source, opt.weights, opt.view_img, opt.save_txt, opt.img_size
  16. print('weights: ', weights)
  17. webcam = source.isnumeric() or source.endswith('.txt') or source.lower().startswith(
  18. ('rtsp://', 'rtmp://', 'http://'))
  19. # Directories
  20. save_dir = Path(increment_path(Path(opt.project) / opt.name, exist_ok=opt.exist_ok)) # increment run
  21. (save_dir / 'labels' if save_txt else save_dir).mkdir(parents=True, exist_ok=True) # make dir
  22. # Initialize
  23. set_logging()
  24. device = select_device(opt.device)
  25. half = device.type != 'cpu' # half precision only supported on CUDA
  26. # Load model
  27. model = attempt_load(weights, map_location=device) # load FP32 model
  28. imgsz = check_img_size(imgsz, s=model.stride.max()) # check img_size
  29. if half:
  30. model.half() # to FP16
  31. # Second-stage classifier
  32. classify = False
  33. if classify:
  34. modelc = load_classifier(name='resnet101', n=2) # initialize
  35. modelc.load_state_dict(torch.load('weights/resnet101.pt', map_location=device)['model']).to(device).eval()
  36. # Set Dataloader
  37. vid_path, vid_writer = None, None
  38. if webcam:
  39. view_img = True
  40. cudnn.benchmark = True # set True to speed up constant image size inference
  41. dataset = LoadStreams(source, img_size=imgsz)
  42. else:
  43. save_img = True
  44. dataset = LoadImages(source, img_size=imgsz)
  45. # Get names and colors
  46. names = model.module.names if hasattr(model, 'module') else model.names
  47. colors = [[random.randint(0, 255) for _ in range(3)] for _ in names]
  48. # Run inference
  49. t0 = time.time()
  50. img = torch.zeros((1, 3, imgsz, imgsz), device=device) # init img
  51. _ = model(img.half() if half else img) if device.type != 'cpu' else None # run once
  52. for path, img, im0s, vid_cap in dataset:
  53. img = torch.from_numpy(img).to(device)
  54. img = img.half() if half else img.float() # uint8 to fp16/32
  55. img /= 255.0 # 0 - 255 to 0.0 - 1.0
  56. if img.ndimension() == 3:
  57. img = img.unsqueeze(0)
  58. # Inference
  59. t1 = time_synchronized()
  60. pred = model(img, augment=opt.augment)[0]
  61. # Apply NMS
  62. pred = non_max_suppression(pred, opt.conf_thres, opt.iou_thres, classes=opt.classes, agnostic=opt.agnostic_nms)
  63. t2 = time_synchronized()
  64. # Apply Classifier
  65. if classify:
  66. pred = apply_classifier(pred, modelc, img, im0s)
  67. # Process detections
  68. for i, det in enumerate(pred): # detections per image
  69. if webcam: # batch_size >= 1
  70. p, s, im0, frame = path[i], '%g: ' % i, im0s[i].copy(), dataset.count
  71. else:
  72. p, s, im0, frame = path, '', im0s, getattr(dataset, 'frame', 0)
  73. p = Path(p) # to Path
  74. save_path = str(save_dir / p.name) # img.jpg
  75. txt_path = str(save_dir / 'labels' / p.stem) + ('' if dataset.mode == 'image' else f'_{frame}') # img.txt
  76. s += '%gx%g ' % img.shape[2:] # print string
  77. gn = torch.tensor(im0.shape)[[1, 0, 1, 0]] # normalization gain whwh
  78. if len(det):
  79. # Rescale boxes from img_size to im0 size
  80. det[:, :4] = scale_coords(img.shape[2:], det[:, :4], im0.shape).round()
  81. # Print results
  82. for c in det[:, -1].unique():
  83. n = (det[:, -1] == c).sum() # detections per class
  84. s += f'{n} {names[int(c)]}s, ' # add to string
  85. # Write results
  86. for *xyxy, conf, cls in reversed(det):
  87. if save_txt: # Write to file
  88. xywh = (xyxy2xywh(torch.tensor(xyxy).view(1, 4)) / gn).view(-1).tolist() # normalized xywh
  89. line = (cls, *xywh, conf) if opt.save_conf else (cls, *xywh) # label format
  90. with open(txt_path + '.txt', 'a') as f:
  91. f.write(('%g ' * len(line)).rstrip() % line + '\n')
  92. if save_img or view_img: # Add bbox to image
  93. label = f'{names[int(cls)]} {conf:.2f}'
  94. plot_one_box(xyxy, im0, label=label, color=colors[int(cls)], line_thickness=3)
  95. # Print time (inference + NMS)
  96. print(f'{s}Done. ({t2 - t1:.3f}s)')
  97. # Stream results
  98. if view_img:
  99. cv2.imshow(str(p), im0)
  100. if cv2.waitKey(1) == ord('q'): # q to quit
  101. raise StopIteration
  102. # Save results (image with detections)
  103. if save_img:
  104. if dataset.mode == 'image':
  105. cv2.imwrite(save_path, im0)
  106. else: # 'video'
  107. if vid_path != save_path: # new video
  108. vid_path = save_path
  109. if isinstance(vid_writer, cv2.VideoWriter):
  110. vid_writer.release() # release previous video writer
  111. fourcc = 'mp4v' # output video codec
  112. fps = vid_cap.get(cv2.CAP_PROP_FPS)
  113. w = int(vid_cap.get(cv2.CAP_PROP_FRAME_WIDTH))
  114. h = int(vid_cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
  115. vid_writer = cv2.VideoWriter(save_path, cv2.VideoWriter_fourcc(*fourcc), fps, (w, h))
  116. vid_writer.write(im0)
  117. if save_txt or save_img:
  118. s = f"\n{len(list(save_dir.glob('labels/*.txt')))} labels saved to {save_dir / 'labels'}" if save_txt else ''
  119. print(f"Results saved to {save_dir}{s}")
  120. print(f'Done. ({time.time() - t0:.3f}s)')
  121. if __name__ == '__main__':
  122. parser = argparse.ArgumentParser()
  123. parser.add_argument('--weights', nargs='+', type=str, default='./weights/yolov5s.pt', help='model.pt path(s)')
  124. parser.add_argument('--source', type=str, default='data/images', help='source') # file/folder, 0 for webcam
  125. parser.add_argument('--img-size', type=int, default=640, help='inference size (pixels)')
  126. parser.add_argument('--conf-thres', type=float, default=0.25, help='object confidence threshold')
  127. parser.add_argument('--iou-thres', type=float, default=0.45, help='IOU threshold for NMS')
  128. parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
  129. parser.add_argument('--view-img', action='store_true', help='display results')
  130. parser.add_argument('--save-txt', action='store_true', help='save results to *.txt')
  131. parser.add_argument('--save-conf', action='store_true', help='save confidences in --save-txt labels')
  132. parser.add_argument('--classes', nargs='+', type=int, help='filter by class: --class 0, or --class 0 2 3')
  133. parser.add_argument('--agnostic-nms', action='store_true', help='class-agnostic NMS')
  134. parser.add_argument('--augment', action='store_true', help='augmented inference')
  135. parser.add_argument('--update', action='store_true', help='update all models')
  136. parser.add_argument('--project', default='runs/detect', help='save results to project/name')
  137. parser.add_argument('--name', default='exp', help='save results to project/name')
  138. parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment')
  139. opt = parser.parse_args()
  140. print(opt)
  141. with torch.no_grad():
  142. if opt.update: # update all models (to fix SourceChangeWarning)
  143. for opt.weights in ['yolov5s.pt', 'yolov5m.pt', 'yolov5l.pt', 'yolov5x.pt']:
  144. detect()
  145. strip_optimizer(opt.weights)
  146. else:
  147. detect()

总之,YOLOv8 Face项目是一个基于YOLOv8算法的人脸检测项目,具有高准确性、实时性能和多尺度检测等特点。它可以广泛应用于人脸识别、人脸表情分析、人脸属性识别等领域,为人脸相关的应用提供强大的支持。 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/575141
推荐阅读
相关标签
  

闽ICP备14008679号