当前位置: 首页 > news >正文

计算机毕业设计之:基于深度学习的路面检测系统(源码+部署文档+讲解)

博主介绍:
    ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W+粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台的优质作者。通过长期分享和实战指导,我致力于帮助更多学生完成毕业项目和技术提升。

技术范围:
    我熟悉的技术领域涵盖SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等方面的设计与开发。如果你有任何技术难题,我都乐意与你分享解决方案。

 主要内容:
     我的服务内容包括:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文撰写与辅导、论文降重、长期答辩答疑辅导。此外,我还提供腾讯会议一对一的专业讲解和模拟答辩演练,帮助你全面掌握答辩技巧与代码逻辑。

🍅获取源码请在文末联系我🍅
如果你对我的内容感兴趣,记得先收藏!对于毕设选题、项目开发或论文撰写等相关问题,随时欢迎留言咨询,我会尽力帮助更多同学顺利完成学业。

最主要的是免费咨询相关问题!!

一、详细操作演示视频
       在文章的尾声,您会发现一张电子名片👤,欢迎通过名片上的联系方式与我取得联系,以获取更多关于项目演示的详尽视频内容。视频将帮助您全面理解项目的关键点和操作流程。期待与您的进一步交流!
        承诺所有开发的项目,全程售后陪伴!!!文章下方有历年的好评(部分)!!

文档学习资料(阿龙可以赠送所有的录制好的讲解视频):

系统简介:
 

     随着城市交通系统的日益复杂化,道路安全和交通效率成为当下社会关注的重点。特别是在自动驾驶技术、智能交通系统及交通监控设备广泛应用的背景下,路面裂缝检测的重要性日益凸显。路面裂缝不仅影响交通安全,还可能成为交通事故的诱因,因此,开发一种高效、准确的路面裂缝检测系统对于现代交通管理至关重要。

   传统的路面检测方法,如人工视觉检查和基于简单传感器的方法,虽然广泛应用,但这些方法往往劳动强度大、效率低下,且无法实现实时监控和快速反应。随着计算机视觉和深度学习技术的迅速发展,利用这些先进技术来改进路面裂缝检测的方法显得尤为重要。

   本研究旨在开发一个基于YOLOv5s模型的路面裂缝检测系统。该系统利用深度学习技术,特别是卷积神经网络(CNN),能够在不同环境和光照条件下,自动检测和分类路面裂缝。与传统方法相比,本系统具有更高的检测速度和更好的鲁棒性,能够实现大规模和实时的路面状态监控。

   本研究的实施不仅能够提高道路维护的效率,减少因路面问题引发的交通事故,还能为智能交通系统的发展提供技术支持。系统的开发将集成视频上传、裂缝检测及结果展示等功能,为用户提供一个全面的路面检测解决方案。此外,系统还将支持笔记本摄像头进行实时仿真检测,进一步扩展其应用场景。

   通过深入研究和应用深度学习在图像处理领域的先进技术,本项目旨在为路面裂缝检测提供一个更加准确、高效且成本效益高的解决方案,为交通安全管理和智能交通系统的发展做出贡献。

系统实现界面:

训练结果:

实现代码:

aimport argparse
import platform
import shutil
import time
from numpy import random
import argparse
import os
import sys
from pathlib import Path
import cv2
import numpy as np
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5 import QtCore, QtGui, QtWidgets
import os
import sys
from pathlib import Pathimport cv2
import torch
import torch.backends.cudnn as cudnnFILE = Path(__file__).resolve()
ROOT = FILE.parents[0]  # YOLOv5 root directory
if str(ROOT) not in sys.path:sys.path.append(str(ROOT))  # add ROOT to PATH
ROOT = Path(os.path.relpath(ROOT, Path.cwd()))  # relativefrom models.common import DetectMultiBackend
from utils.augmentations import letterbox
from utils.datasets import IMG_FORMATS, VID_FORMATS, LoadImages, LoadStreams
from utils.general import (LOGGER, check_file, check_img_size, check_imshow, check_requirements, colorstr,increment_path, non_max_suppression, print_args, scale_coords, strip_optimizer, xyxy2xywh)from utils.torch_utils import select_device, time_sync
import numpy as np
import timedef load_model(weights=ROOT / 'best.pt',  # model.pt path(s)data=ROOT / 'data/coco128.yaml',  # dataset.yaml pathdevice='',  # cuda device, i.e. 0 or 0,1,2,3 or cpuhalf=False,  # use FP16 half-precision inferencednn=False,  # use OpenCV DNN for ONNX inference):# Load modeldevice = select_device(device)model = DetectMultiBackend(weights, device=device, dnn=dnn, data=data)stride, names, pt, jit, onnx, engine = model.stride, model.names, model.pt, model.jit, model.onnx, model.engine# Halfhalf &= (pt or jit or onnx or engine) and device.type != 'cpu'  # FP16 supported on limited backends with CUDAif pt or jit:model.model.half() if half else model.model.float()return model, stride, names, pt, jit, onnx, engine#
def run(model, img, stride, pt,imgsz=(640, 640),  # inference size (height, width)conf_thres=0.15,  # confidence thresholdiou_thres=0.05,  # NMS IOU thresholdmax_det=1000,  # maximum detections per imagedevice='',  # cuda device, i.e. 0 or 0,1,2,3 or cpuclasses=None,  # filter by class: --class 0, or --class 0 2 3agnostic_nms=False,  # class-agnostic NMSaugment=False,  # augmented inferencehalf=False,  # use FP16 half-precision inference):cal_detect = []device = select_device(device)names = model.module.names if hasattr(model, 'module') else model.names  # get class names# Set Dataloaderim = letterbox(img, imgsz, stride, pt)[0]# Convertim = im.transpose((2, 0, 1))[::-1]  # HWC to CHW, BGR to RGBim = np.ascontiguousarray(im)im = torch.from_numpy(im).to(device)im = im.half() if half else im.float()  # uint8 to fp16/32im /= 255  # 0 - 255 to 0.0 - 1.0if len(im.shape) == 3:im = im[None]  # expand for batch dimpred = model(im, augment=augment)pred = non_max_suppression(pred, conf_thres, iou_thres, classes, agnostic_nms, max_det=max_det)# Process detectionsfor i, det in enumerate(pred):  # detections per imageif len(det):# Rescale boxes from img_size to im0 sizedet[:, :4] = scale_coords(im.shape[2:], det[:, :4], img.shape).round()# Write resultsfor *xyxy, conf, cls in reversed(det):c = int(cls)  # integer classlabel = f'{names[c]}'cal_detect.append([label, xyxy,float(conf)])return cal_detectdef det_yolov7(info1):global model, stride, names, pt, jit, onnx, engineif info1[-3:] in ['jpg','png','jpeg','tif','bmp']:image = cv2.imread(info1)  # 读取识别对象try:results = run(model, image, stride, pt)  # 识别, 返回多个数组每个第一个为结果,第二个为坐标位置for i in results:box = i[1]p1, p2 = (int(box[0]), int(box[1])), (int(box[2]), int(box[3]))color = [0, 0, 255]cv2.rectangle(image, p1, p2, color, thickness=3, lineType=cv2.LINE_AA)cv2.putText(image, str(i[0]) + ' ' + str(i[2])[:5], (int(box[0]), int(box[1]) - 10),cv2.FONT_HERSHEY_SIMPLEX, 2, color, 3)except:passui.showimg(image)if info1[-3:] in ['mp4','avi']:capture = cv2.VideoCapture(info1)while True:_, image = capture.read()if image is None:breaktry:results = run(model, image, stride, pt)  # 识别, 返回多个数组每个第一个为结果,第二个为坐标位置for i in results:box = i[1]p1, p2 = (int(box[0]), int(box[1])), (int(box[2]), int(box[3]))color = [0, 0, 255]cv2.rectangle(image, p1, p2, color, thickness=3, lineType=cv2.LINE_AA)cv2.putText(image, str(i[0]) + ' ' + str(i[2])[:5], (int(box[0]), int(box[1]) - 10),cv2.FONT_HERSHEY_SIMPLEX, 2, color, 3)except:passui.showimg(image)QApplication.processEvents()class Thread_1(QThread):  # 线程1def __init__(self,info1):super().__init__()self.info1=info1self.run2(self.info1)def run2(self, info1):result = []result = det_yolov7(info1)class Ui_MainWindow(object):def setupUi(self, MainWindow):MainWindow.setObjectName("MainWindow")MainWindow.resize(1280, 960)MainWindow.setStyleSheet("background-image: url(\"./template/carui.png\")")self.centralwidget = QtWidgets.QWidget(MainWindow)self.centralwidget.setObjectName("centralwidget")self.label = QtWidgets.QLabel(self.centralwidget)self.label.setGeometry(QtCore.QRect(168, 60, 491, 71))self.label.setAutoFillBackground(False)self.label.setStyleSheet("")self.label.setFrameShadow(QtWidgets.QFrame.Plain)self.label.setAlignment(QtCore.Qt.AlignCenter)self.label.setObjectName("label")self.label.setStyleSheet("font-size:22px;font-weight:bold;font-family:SimHei;background:rgba(255,255,255,0);")self.label_2 = QtWidgets.QLabel(self.centralwidget)self.label_2.setGeometry(QtCore.QRect(40, 188, 751, 501))self.label_2.setStyleSheet("background:rgba(255,255,255,1);")self.label_2.setAlignment(QtCore.Qt.AlignCenter)self.label_2.setObjectName("label_2")self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget)self.textBrowser.setGeometry(QtCore.QRect(73, 746, 851, 174))self.textBrowser.setStyleSheet("background:rgba(0,0,0,0);")self.textBrowser.setObjectName("textBrowser")self.pushButton = QtWidgets.QPushButton(self.centralwidget)self.pushButton.setGeometry(QtCore.QRect(1020, 750, 150, 40))self.pushButton.setStyleSheet("background:rgba(255,142,0,1);border-radius:10px;padding:2px 4px;")self.pushButton.setObjectName("pushButton")self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)self.pushButton_2.setGeometry(QtCore.QRect(1020, 810, 150, 40))self.pushButton_2.setStyleSheet("background:rgba(255,142,0,1);border-radius:10px;padding:2px 4px;")self.pushButton_2.setObjectName("pushButton_2")self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)self.pushButton_3.setGeometry(QtCore.QRect(1020, 870, 150, 40))self.pushButton_3.setStyleSheet("background:rgba(255,142,0,1);border-radius:10px;padding:2px 4px;")self.pushButton_3.setObjectName("pushButton_2")MainWindow.setCentralWidget(self.centralwidget)self.retranslateUi(MainWindow)QtCore.QMetaObject.connectSlotsByName(MainWindow)def retranslateUi(self, MainWindow):_translate = QtCore.QCoreApplication.translateMainWindow.setWindowTitle(_translate("MainWindow", "基于yolov5s的路面裂缝检测系统"))self.label.setText(_translate("MainWindow", "基于yolov5s的路面裂缝检测系统"))self.label_2.setText(_translate("MainWindow", "请点击以添加文件"))self.pushButton.setText(_translate("MainWindow", "添加文件"))self.pushButton_2.setText(_translate("MainWindow", "开始检测"))self.pushButton_3.setText(_translate("MainWindow", "退出系统"))# 点击文本框绑定槽事件self.pushButton.clicked.connect(self.openfile)self.pushButton_2.clicked.connect(self.click_1)self.pushButton_3.clicked.connect(self.handleCalc3)def openfile(self):global sname, filepathfname = QFileDialog()fname.setAcceptMode(QFileDialog.AcceptOpen)fname, _ = fname.getOpenFileName()if fname == '':returnfilepath = os.path.normpath(fname)sname = filepath.split(os.sep)ui.printf("当前选择的文件路径是:%s" % filepath)def handleCalc3(self):os._exit(0)def printf(self,text):self.textBrowser.append(text)self.cursor = self.textBrowser.textCursor()self.textBrowser.moveCursor(self.cursor.End)QtWidgets.QApplication.processEvents()def showimg(self,img):global vidimg2 = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)_image = QtGui.QImage(img2[:], img2.shape[1], img2.shape[0], img2.shape[1] * 3,QtGui.QImage.Format_RGB888)n_width = _image.width()n_height = _image.height()if n_width / 500 >= n_height / 400:ratio = n_width / 800else:ratio = n_height / 800new_width = int(n_width / ratio)new_height = int(n_height / ratio)new_img = _image.scaled(new_width, new_height, Qt.KeepAspectRatio)self.label_2.setPixmap(QPixmap.fromImage(new_img))def click_1(self):global filepathtry:self.thread_1.quit()except:passself.thread_1 = Thread_1(filepath)  # 创建线程self.thread_1.wait()self.thread_1.start()  # 开始线程if __name__ == "__main__":global model, stride, names, pt, jit, onnx, enginemodel, stride, names, pt, jit, onnx, engine = load_model()  # 加载模型app = QtWidgets.QApplication(sys.argv)MainWindow = QtWidgets.QMainWindow()ui = Ui_MainWindow()ui.setupUi(MainWindow)MainWindow.show()sys.exit(app.exec_())

为什么选择我:

我是程序员阿龙,专注于软件开发,拥有丰富的编程能力和实战经验。在过去的几年里,我辅导了上千名学生,帮助他们顺利完成毕业项目,同时我的技术分享也吸引了超过50W+的粉丝。我是CSDN特邀作者、博客专家、新星计划导师,并在Java领域内获得了多项荣誉,如博客之星。我的作品也被掘金、华为云、阿里云、InfoQ等多个平台推荐,成为各大平台的优质作者。

已经为上百名同学获得优秀毕业生!!

源码获取:
大家点赞、收藏、关注、评论啦 、查看👇🏻获取联系方式👇🏻

 精彩专栏推荐订阅:在下方专栏👇🏻

相关文章:

计算机毕业设计之:基于深度学习的路面检测系统(源码+部署文档+讲解)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…...

测试面试题:接口自动化测试流程?

1、测试用例编写:根据接口的需求和功能,编写相应的测试用例。测试用例应包括正常、边界和异常等各种情况下的测试。 2、准备测试数据:根据测试用例的要求,准备相应的测试数据。数据可以通过手动输入、数据库查询、文件导入等方式进…...

Golang面试题

在Golang(也称为Go语言)工程师的面试中,可能会遇到各种技术性和概念性的问题。 一、基础部分 Golang 中 make 和 new 的区别? 共同点:两者都用于分配内存。不同点: make 专为 slice、map 和 channel 设计,返回初始化后的(非零)值。new 分配内存并返回指向该内存的指针…...

《飞机大战游戏》实训项目(Java GUI实现)(设计模式)(简易)

目录 一、最终实现后,效果如下。 (1)简单介绍本游戏项目(待完善) (2)运行效果图(具体大家自己可以试) 初始运行情况。 手动更换背景图。 通过子弹攻击敌机,累…...

计算机毕业设计 基于 Hadoop平台的岗位推荐系统 SpringBoot+Vue 前后端分离 附源码 讲解 文档

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…...

【数据结构与算法】LeetCode:二分查找

文章目录 二分查找二分查找搜索插入位置 (Hot 100)x 的平方根搜索二维矩阵(Hot 100)在排序数组中查找元素的第一个和最后一个位置 (Hot 100)搜索旋转排序数组 (Hot 100)寻找旋转排序…...

专题·大模型安全 | 生成式人工智能的内容安全风险与应对策略

正如一枚硬币的两面,生成式人工智能大模型(以下简称“生成式大模型”)在助力内容生成的同时也潜藏风险,成为虚假信息传播、数据隐私泄露等问题的温床,加剧了认知域风险。与传统人工智能(AI)相比…...

CORS跨域+Nginx配置、Apache配置

CORS(Cross-Origin Resource Sharing,跨源资源共享)是一种机制,它使用额外的HTTP头部来告诉浏览器允许一个网页运行的脚本从不同于它自身来源的服务器上请求资源(例如字体、JavaScript、CSS等)。这是一种安…...

文件查找和打包压缩【1.7】

文件查找和打包压缩【1.7】 八、文件查找和打包压缩8.1 文件查找8.1.1 locate8.1.2 findfind8.1.2.1 指定搜索目录层级8.1.2.2 先处理文件再处理目录8.1.2.3 根据文件名和inode查找8.1.2.4 根据属主属组查找8.1.2.5 根据文件类型查找8.1.2.6 空文件或目录8.1.2.7 组合条件8.1.2…...

速盾:cdn一般多长时间清理下缓存?

CDN(Content Delivery Network)是一种网络加速技术,通过将网站的静态资源(如图片、视频、CSS、JavaScript等)分布到全球各地的服务器节点上,从而提高用户访问这些资源的速度和体验。CDN还具备缓存功能&…...

react hooks--useRef

基本用法 在类组件中获取一个dom元素实例,可以通过React.CreateRef或者回调函数的方式去获取。语法:const refContainer useRef(initialValue);使用场景:在 React 中进行 DOM 操作时,用来获取 DOM作用:返回一个带有 …...

GPT对话知识库——将寄存器中的一位数据读到变量中需要什么步骤?C语言中掩码的作用。

目录 1,问: 1,答: 1. 确定目标寄存器地址 2. 定位目标位 位操作的基本步骤: 3. 示例代码 示例步骤: 4. 详细解释步骤 5. 举例 6. 常见用法 总结 注: C语言中掩码的作用&#xff1a…...

【计算机网络】运输层协议解析

前言 运输层直接为应用进程间的逻辑通信提供服务。运输层向高层用户屏蔽了下面网络核心细节(如网络拓扑、路由选择协议等)它使应用进程看见的就好像是在两个运输层实体之间有一条端到端的逻辑通信信道。 UDP与TCP对比 UDP: 无连接 支持一对…...

Redis存储原理

前言 我们从redis服务谈起,redis是单reactor,命令在redis-server线程处理。还有若干读写IO线程负责IO操作(redis6.0之后,Redis之pipeline与事务)。此外还有一个内存池线程负责内存管理、一个后台文件线程负责大文件的关…...

PHP、Java等其他语言转Go时选择GoFly快速快速开发框架指南

概要 经过一年多的发展GoFly快速开发框架已被一千多家科技企业或开发者用于项目开发,它的简单易学得到其他语言转Go首选框架。且企业版的发展为GoFly社区提供资金,这使得GoFly快速框架得到良好的发展,GoFly技术团队加大投入反哺科技企业和开…...

【MySQL】获取最近7天和最近14天的订单数量,使用MySQL详细写出,使用不同的方法

1. 获取最近7天和最近14天的订单数量,使用MySQL详细写出,使用不同的方法 要获取最近7天和最近14天的订单数量,我们可以使用不同的方法来优化查询性能。以下是两种方法: 1.1 方法一:使用日期计算 SELECTSUM(CASE WHE…...

WebView2新增、修改、删除、禁用右键菜单相关操作。

参考链接:WebView2操作右键菜单...

使用vue创建项目

一、安装环境 二、创建vue框架(创建文件夹,摁shift鼠标右键 打开) 1、项目配置 2、新增目录 三、路径别名配置 输入/ ,VSCode会联想出src下的所有子目录和文件,统一文件路径访问时不容易出错 四、ElementPlus配置 1、组件分为…...

Apache CVE-2021-41773 漏洞攻略

漏洞简介 该漏洞是由于Apache HTTP Server 2.4.49版本存在⽬录穿越漏洞,在路径穿越⽬录 <Directory/>Require all granted</Directory>允许被访问的的情况下&#xff08;默认开启&#xff09;&#xff0c;攻击者可利⽤该路径穿越漏洞读取到Web⽬录之外的其他⽂件在…...

【redis-02】深入理解redis中RBD和AOF的持久化

redis系列整体栏目 内容链接地址【一】redis基本数据类型和使用场景https://zhenghuisheng.blog.csdn.net/article/details/142406325【二】redis的持久化机制和原理https://zhenghuisheng.blog.csdn.net/article/details/142441756 如需转载&#xff0c;请输入&#xff1a;htt…...

亚马逊IP关联揭秘:发生ip关联如何处理

在亚马逊这一全球领先的电商平台上&#xff0c;IP关联是一个不可忽视的问题&#xff0c;尤其是对于多账号运营的卖家而言。本文将深入解析亚马逊IP关联的含义、影响以及应对策略&#xff0c;帮助卖家更好地理解和应对这一问题。 什么是亚马逊IP关联&#xff1f; 亚马逊IP关联…...

jQuery Mobile 弹窗

jQuery Mobile 弹窗 引言 在移动设备上,弹窗是一种常见的用户界面元素,用于显示信息、获取用户输入或提供特定功能。jQuery Mobile 是一个流行的移动框架,它提供了丰富的组件来帮助开发者创建响应式的移动界面。本文将重点介绍如何在 jQuery Mobile 中使用弹窗(Popup)组…...

【macOS】【zsh报错】zsh: command not found: python

【macOS】【zsh Error】zsh: command not found: python 本地已经安装了Python&#xff0c;且能在Pycharm中编译Python程序并运行。 但是&#xff0c;在macOS终端&#xff0c;运行Python&#xff0c;报错。 首先要确认你在macOS系统下&#xff0c;是否安装了Python。 如果安…...

NoSql数据库Redis知识点

数据库的分类 关系型数据库 &#xff0c;是建立在关系模型基础上的数据库&#xff0c;其借助于集合代数等数学概念和方法来处理数据库 中的数据主流的 MySQL 、 Oracle 、 MS SQL Server 和 DB2 都属于这类传统数据库。 NoSQL 数据库 &#xff0c;全称为 Not Only SQL &a…...

Redis 使用指南

Redis 使用指南 概述 Redis 是一个开源的、基于内存的数据结构存储系统&#xff0c;可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构&#xff0c;如字符串&#xff08;strings&#xff09;、哈希&#xff08;hashes&#xff09;、列表&#xff08;lists&#xf…...

c++与cmake:完整的C++项目构建注意事项

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 最近常常使用cmake构建c项目有感,从创建项目到打包发布总结一下需要注意的事情. 项目组织方式 具体的项目组织方式因人而异,这里推荐一种,在src目录中创建模块目录,再在include目录中常见对应的同名目录包含头文件,…...

Linux自主学习篇

用户及权限管理 sudo 是 "superuser do" 的缩写&#xff0c;是一个在类 Unix 操作系统&#xff08;如 Linux 和 macOS&#xff09;中使用的命令。它允许普通用户以超级用户&#xff08;root 用户&#xff09;的身份执行命令&#xff0c;从而获得更高的权限。 useradd…...

MQ入门(4)

Erlang&#xff1a;面向高并发的 单机的吞吐量就是并发性&#xff1a;Rabbitmq是10w左右&#xff08;现实项目中已经足够用了&#xff09;&#xff0c;RocketMQ是10w到20w&#xff0c;Kafka是100w左右。 公司里的并发&#xff08;QPS&#xff09; 大部分的公司每天的QPS大概…...

linux下共享内存的3种使用方式

进程是资源封装的单位&#xff0c;内存就是进程所封装的资源的一种。一般情况下&#xff0c;进程间的内存是相互隔离的&#xff0c;也就是说一个进程不能访问另一个进程的内存。如果一个进程想要访问另一个进程的内存&#xff0c;那么必须要进过内核这个桥梁&#xff0c;这就是…...

伊丽莎白·赫莉为杂志拍摄一组素颜写真,庆祝自己荣膺全球最性感女人第一名

语录&#xff1a;女性应该做任何她们想做的事&#xff0c;批评她们的人都见鬼去吧。 伊丽莎白赫莉为《Maxim》杂志拍摄一组素颜写真&#xff0c;庆祝自己荣膺全球最性感女人第一名 伊丽莎白赫莉 (Elizabeth Hurley) 实在是太惊艳了&#xff0c;如今&#xff0c;《马克西姆》杂…...