pip install ultralytics opencv-python
from ultralytics import YOLO
import cv2
# 加载模型(需要一个支持 face 和 hair 的模型)
# 你可以使用自己训练的模型(例如 yolov8_face_hair.pt)
model = YOLO("yolov8_face_hair.pt") # 替换为你自己的模型路径
# 加载图片
img_path = "portrait.jpg" # 替换为你要检测的照片
img = cv2.imread(img_path)
# 推理
results = model(img)[0]
# 提取框
face_box = None
hair_box = None
for r in results.boxes:
cls_id = int(r.cls[0])
label = model.names[cls_id]
x1, y1, x2, y2 = map(int, r.xyxy[0])
if label == "face":
face_box = (x1, y1, x2, y2)
cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
elif label == "hair":
hair_box = (x1, y1, x2, y2)
cv2.rectangle(img, (x1, y1), (x2, y2), (0, 0, 255), 2)
# 判断遮挡
def calculate_overlap(boxA, boxB):
if not boxA or not boxB:
return 0
ax1, ay1, ax2, ay2 = boxA
bx1, by1, bx2, by2 = boxB
inter_x1 = max(ax1, bx1)
inter_y1 = max(ay1, by1)
inter_x2 = min(ax2, bx2)
inter_y2 = min(ay2, by2)
inter_area = max(0, inter_x2 - inter_x1) * max(0, inter_y2 - inter_y1)
face_area = (ax2 - ax1) * (ay2 - ay1)
return inter_area / face_area if face_area > 0 else 0
overlap_ratio = calculate_overlap(face_box, hair_box)
print(f"头发遮挡脸部比例:{overlap_ratio:.2f}")
if overlap_ratio > 0.3:
print("检测结果:头发遮住了脸")
else:
print("检测结果:头发未遮住脸")
# 显示图片
cv2.imshow("Result", img)
cv2.waitKey(0)
cv2.destroyAllWindows()