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

基于YOLOv5和Django的网页人脸实时检测与马赛克处理系统

本文还有配套的精品资源,点击获取

简介:直接可运行的Web人脸隐私保护工具,上传图片或视频后自动识别所有人脸并打上像素级马赛克。后端用Django搭建,提供HTTP接口和管理后台;前端通过简单表单交互,调用已封装的YOLOv5 v7.0模型完成检测与打码。开箱即用:含完整Django工程(djangoProject)、预配置yolov5-7.0代码、测试样例图、SQLite数据库、media媒体目录及requirements.txt依赖清单。部署只需配置PyTorch环境,修改detect.py第95行指定输入路径、views.py第141行设置模型路径即可启动。不需训练,支持Windows/Linux本地快速验证,适用于教学演示、隐私合规原型开发或轻量安防场景。

1. 项目概述:这不是一个“玩具”,而是一套能立刻上手的隐私保护最小可行系统

你有没有遇到过这样的场景:给学生讲完YOLO原理,想现场演示“人脸检测+实时打码”效果,结果卡在环境配置、路径报错、模型加载失败上,一节课过去只跑通了pip install torch?或者法务同事刚发来《个人信息处理合规指引》,要求对内部监控截图中的人脸做匿名化处理,领导问“明天能不能先出个原型”,你翻着GitHub上几十个star的项目,发现要么要自己训练、要么前端是Vue+Flask、要么连requirements.txt都缺两行——最后只能回一句“这个得排期”。这套基于YOLOv5和Django的网页人脸实时检测与马赛克处理系统,就是为解决这类“最后一公里”问题而生的。它不追求SOTA精度,不堆砌微服务架构,也不鼓吹“企业级部署”,而是把从模型调用、图像处理、Web交互到本地存储的整条链路,压进一个可直接python manage.py runserver启动的Django工程里。核心关键词——人脸检测、实时打码、YOLOv5、Django——不是标签,而是每个字都对应着一行可验证的代码:detect.py第95行控制输入源(支持--source media/uploads/),views.py第141行硬编码模型路径(weights='yolov5-7.0/best.pt'),settings.pyMEDIA_ROOT = os.path.join(BASE_DIR, 'media')确保上传文件落盘可控。它兼容Windows和Linux,不依赖GPU也能跑(CPU模式下处理一张1080p图片约3.2秒),SQLite数据库开箱即用,连db.sqlite3文件都已预置好初始迁移记录。这不是一个需要你“理解后再动手”的教学项目,而是一个你解压、装依赖、改两行路径、runserver之后,打开浏览器就能上传照片、看到马赛克实时覆盖人脸的“物理存在”。适合三类人:高校教师拿它当计算机视觉课的课堂演示教具;合规工程师用它快速生成GDPR/《个人信息保护法》要求的匿名化处理原型;还有就是像我这样被临时拉去支援行政系统的开发者——上周帮人事部处理一批入职体检照片,20分钟搭好环境,批量上传,导出带马赛克的PDF,他们当天就提交给了法务审核。

2. 整体设计思路与技术选型逻辑:为什么是YOLOv5 + Django,而不是YOLOv8 + FastAPI?

很多人看到标题第一反应是:“YOLOv5都老掉牙了,怎么不用v8或v10?”、“Django太重,为啥不选Flask或FastAPI?”——这恰恰是我们设计时反复推演的核心问题。这套系统的目标从来不是“技术先进性”,而是“零认知成本下的功能闭环”。让我拆解一下每个选择背后的现实约束:

首先是YOLOv5 v7.0版本。资源包里明确标注了yolov5-7.0目录,而不是随便拉个master分支。为什么?因为v7.0是PyTorch官方示例中稳定度最高的一版:它的detect.py脚本结构清晰,参数暴露完整(--conf,--iou,--classes全支持),且对OpenCV后端兼容性极佳。我实测过v8的predict()接口,在Django视图里调用时,会因torch.hub.load()的缓存机制导致多进程请求下模型重复加载,内存暴涨;而v7.0的torch.load()直接加载.pt权重,配合torch.no_grad()上下文管理器,CPU模式下内存占用稳定在1.2GB以内。更重要的是,v7.0的models/common.pyDetectMultiBackend类封装了设备自动识别逻辑(device = select_device('')),你不用在views.py里写if torch.cuda.is_available(): ... else: ...,一行代码搞定设备适配。至于精度?v7.0在WIDER FACE验证集上的AP@0.5是83.6%,足够覆盖教学演示和轻量安防场景——你要知道,很多国产摄像头自带的SDK人脸检测模块,AP也就75%左右。

其次是Django框架的选择。有人觉得“Web服务用Django太笨重”,但请看实际需求:我们需要一个带管理后台的系统(/admin/路径用于查看处理日志、下载原始/脱敏文件)、需要媒体文件上传与存储(models.ImageField自动处理media/目录权限和URL路由)、需要用户认证(哪怕只是基础的superuser登录防误操作)、还需要一个可调试的开发服务器(runserver支持热重载)。Flask确实轻,但你要自己实现文件上传校验(MIME类型、文件大小限制)、自己写管理界面(Flask-Admin插件又引入新依赖)、自己处理静态文件路由冲突。FastAPI虽快,但它默认不带ORM和Admin,你得额外集成SQLModel或Django-Ninja,反而增加了学习曲线。而Django——manage.py一条命令生成迁移、admin.site.register()三行代码暴露模型、settings.pyMEDIA_URLSTATIC_URL开箱即用。更关键的是,Django的request.FILES对象天然支持InMemoryUploadedFileTemporaryUploadedFile两种模式,当用户上传20MB视频时,它会自动切换到临时文件存储,避免内存溢出——这个细节,你在Flask里得自己写stream=True和分块读取逻辑。

最后是“实时打码”的定义澄清。这里说的“实时”,是指单次请求内的端到端延迟可控(<5秒),而非视频流的毫秒级处理。系统采用“上传→保存→调用YOLOv5检测→OpenCV逐脸打码→返回结果页”的同步流程。之所以不做成WebSocket流式处理,是因为:第一,Django原生对长连接支持弱(需ASGI+Daphne,增加部署复杂度);第二,教学演示场景中,学生更关心“这张图里有几张脸、马赛克是否覆盖完整”,而不是“每秒处理多少帧”;第三,轻量安防场景如门禁抓拍,本身也是单帧触发。真正的流式处理,应该交给专用边缘设备(如Jetson Nano跑TensorRT加速的YOLO),而不是一个Python Web服务。

提示:如果你真需要视频流处理,不要强行改造这套系统。我的建议是:保留Django作为任务调度和结果展示层,用Celery+Redis将视频分帧任务异步下发,Worker节点用纯Python+OpenCV+YOLOv5推理,处理完再回调Django更新状态。这样既保持Web层简洁,又满足性能需求。

3. 核心模块解析与关键实现细节:从detect.py到views.py的每一行都在解决什么问题?

这套系统的灵魂不在高大上的架构图,而在几个具体文件里的具体行号。我们逐个深挖,看看detect.py第95行、views.py第141行这些“魔法数字”背后,到底封装了多少工程经验。

3.1 YOLOv5 detect.py 的定制化改造:不只是调用,而是可控集成

原始YOLOv5的detect.py是一个独立脚本,直接运行python detect.py --weights yolov5s.pt --source data/images。但把它塞进Django,就必须解决三个问题:输入源动态化、输出路径可控、执行过程可捕获。资源包里的detect.py已在第95行做了关键修改:

# detect.py 第94-96行(原版是第95行附近) # 原版:source = opt.source # 修改后: if hasattr(opt, 'django_source'): # 新增判断,支持Django传参 source = opt.django_source else: source = opt.source

这个改动意味着:在Django视图里,我们不再用os.system("python detect.py ...")这种黑盒调用,而是通过subprocess.run()传入自定义参数:

# views.py 中调用片段(简化版) result = subprocess.run([ 'python', 'yolov5-7.0/detect.py', '--weights', 'yolov5-7.0/best.pt', '--source', input_path, # 这里input_path是/media/uploads/xxx.jpg '--project', 'media/processed', # 强制输出到media目录 '--name', f'output_{uuid.uuid4().hex[:8]}', # 避免文件名冲突 '--exist-ok', # 如果目录存在不报错 '--django_source', input_path # 触发上面的if判断 ], capture_output=True, text=True)

为什么必须加--django_source?因为原始detect.py在解析--source时,会调用pathlib.Path(source).glob()遍历文件,如果source是相对路径(如uploads/test.jpg),它可能在错误的工作目录下找不到文件。而django_source这个自定义参数,绕过了所有路径解析逻辑,直接赋值给source变量,确保万无一失。

另一个关键点是输出路径的强制控制。原始脚本默认输出到runs/detect/exp/,但在Web环境中,我们必须让结果落到media/目录下,才能通过Django的MEDIA_URL生成可访问链接。因此--project media/processed参数必不可少。同时,--name参数生成唯一子目录名,防止并发请求时文件覆盖——我曾踩过坑:没加--name,两个用户同时上传,第二个用户的处理结果会覆盖第一个的exp/目录,导致前端显示错误图片。

3.2 Django视图层的鲁棒性设计:如何让一次上传不崩掉整个服务

views.py第141行,是模型路径的硬编码位置。但真正体现工程功力的,是它前后的20行代码。我们来看一个典型处理函数的骨架:

# views.py 第135-155行(核心逻辑) def process_image(request): if request.method == 'POST': form = UploadForm(request.POST, request.FILES) if form.is_valid(): uploaded_file = request.FILES['file'] # 1. 文件安全校验(不只是扩展名!) if not uploaded_file.name.lower().endswith(('.jpg', '.jpeg', '.png', '.mp4', '.avi')): messages.error(request, '仅支持JPG/PNG图片或MP4/AVI视频格式') return render(request, 'upload.html', {'form': form}) # 2. 文件内容校验(防恶意文件) try: file_content = uploaded_file.read(1024) # 只读前1KB if b'<script>' in file_content or b'<?php' in file_content: raise ValueError('检测到可疑脚本内容') uploaded_file.seek(0) # 重置指针 except Exception as e: messages.error(request, f'文件内容校验失败:{str(e)}') return render(request, 'upload.html', {'form': form}) # 3. 保存上传文件(带唯一ID,防重名) unique_id = uuid.uuid4().hex[:12] original_filename = f"{unique_id}_{uploaded_file.name}" fs = FileSystemStorage(location=settings.MEDIA_ROOT) filename = fs.save(f'uploads/{original_filename}', uploaded_file) # 4. 构建输入路径(绝对路径!) input_path = os.path.join(settings.MEDIA_ROOT, 'uploads', original_filename) # 5. 调用YOLOv5(带超时和错误捕获) try: result = subprocess.run([...], timeout=300) # 5分钟超时 if result.returncode != 0: raise RuntimeError(f'YOLOv5执行失败:{result.stderr}') except subprocess.TimeoutExpired: messages.error(request, '处理超时,请检查文件大小或模型路径') return render(request, 'upload.html', {'form': form}) except Exception as e: messages.error(request, f'处理异常:{str(e)}') return render(request, 'upload.html', {'form': form}) # 6. 解析YOLOv5输出,生成结果路径 output_dir = os.path.join(settings.MEDIA_ROOT, 'processed', f'output_{unique_id[:8]}') result_image = os.path.join(output_dir, os.path.basename(filename)) # 7. 保存处理记录到数据库 ProcessLog.objects.create( original_file=f'uploads/{original_filename}', processed_file=f'processed/output_{unique_id[:8]}/{os.path.basename(filename)}', status='success' ) return render(request, 'result.html', { 'original_url': settings.MEDIA_URL + f'uploads/{original_filename}', 'processed_url': settings.MEDIA_URL + f'processed/output_{unique_id[:8]}/{os.path.basename(filename)}' })

这段代码里藏着五个必须注意的细节:

  1. 双重文件校验:不仅检查扩展名(前端可伪造),还读取文件头1KB内容,搜索<script><?php>等敏感字符串。这是防止上传Webshell的基础防线。
  2. 唯一文件名策略uuid.uuid4().hex[:12]生成12位随机字符串前缀,彻底杜绝同名文件覆盖。我见过太多系统因为没做这步,导致用户A上传的身份证照片,被用户B同名的简历覆盖。
  3. 绝对路径构造os.path.join(settings.MEDIA_ROOT, ...)确保input_path是绝对路径。detect.py在子进程里执行时,工作目录是项目根目录,相对路径极易出错。
  4. 超时控制timeout=300参数至关重要。YOLOv5在CPU上处理一段30秒的MP4视频可能耗时4分钟,没有超时会导致Django主线程阻塞,后续所有请求排队等待。
  5. 数据库记录原子性ProcessLog.objects.create()放在所有处理成功之后,确保只有真正完成的记录才入库。如果放在开头,处理失败时数据库里会残留大量status='pending'的脏数据。

3.3 马赛克算法的像素级实现:为什么不用简单的cv2.blur()?

YOLOv5输出的是人脸边界框坐标(x1,y1,x2,y2),但“打码”不是简单地对矩形区域blur()。真实场景中,人脸是立体的,边界框常有误差,直接blur()会导致马赛克边缘生硬、头发/耳朵等区域漏处理。资源包里的实现,采用了自适应像素块采样+双线性插值还原方案:

# utils/mosaic.py (资源包中隐含的工具模块) def apply_mosaic(image, x1, y1, x2, y2, block_size=16): """ 对指定区域应用马赛克,block_size控制马赛克颗粒粗细 """ # 1. 提取ROI区域 roi = image[y1:y2, x1:x2].copy() # 2. 缩小再放大(模拟马赛克) h, w = roi.shape[:2] # 计算缩小比例,确保最小尺寸>=4像素(避免缩放失真) scale = max(4 / w, 4 / h) small_h, small_w = int(h * scale), int(w * scale) # 使用INTER_NEAREST避免插值模糊,保持像素块感 small_roi = cv2.resize(roi, (small_w, small_h), interpolation=cv2.INTER_NEAREST) mosaic_roi = cv2.resize(small_roi, (w, h), interpolation=cv2.INTER_NEAREST) # 3. 将马赛克区域贴回原图 image[y1:y2, x1:x2] = mosaic_roi return image

这个算法比cv2.blur(roi, (15,15))更符合“像素级打码”的语义:它把人脸区域先压缩成极小的马赛克块(如8x8像素),再暴力拉伸回原尺寸,形成清晰的方块状效果。block_size=16参数决定了马赛克颗粒大小——数值越大,块越粗,隐私保护强度越高;数值越小,块越细,但可能残留可识别特征。我在测试中发现,block_size=24对1080p人脸效果最佳:既能完全遮蔽五官轮廓,又不会让整个画面显得过于粗糙。

注意:该算法对视频处理需逐帧调用。资源包中的detect.py已内置--save-txt选项,生成labels/xxx.txt记录每帧人脸坐标,views.py可读取该文件循环调用apply_mosaic()。这就是为什么视频处理比图片慢——不是YOLOv5慢,而是OpenCV逐帧马赛克的计算量更大。

4. 完整部署与实操流程:从解压到上线,只需7个确定性步骤

这套系统最大的价值,在于它把“部署”这件事,压缩成了7个可复现、可验证、无歧义的步骤。我按真实操作顺序记录下来,每一步都标注了预期输出和常见陷阱。

4.1 环境准备:PyTorch安装的“黄金组合”

步骤1:创建隔离环境

# Windows(推荐使用Git Bash或WSL) python -m venv yolov5-django-env source yolov5-django-env/bin/activate # Linux/macOS yolov5-django-env\Scripts\activate.bat # Windows

提示:绝对不要用全局Python环境!YOLOv5依赖特定版本的torchtorchvision,混用会导致ImportError: cannot import name 'Conv2d'等诡异错误。

步骤2:安装PyTorch(关键!必须匹配CUDA版本)
根据你的硬件选择:
-无GPU(纯CPU)
bash pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
-NVIDIA GPU(CUDA 11.8)
bash pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
-NVIDIA GPU(CUDA 12.1)
bash pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121

实测心得:我用RTX 4090(CUDA 12.2)时,发现YOLOv5 v7.0的models/common.py里某些算子不兼容,降级到CUDA 12.1的PyTorch 2.0.1版本后一切正常。所以别迷信“最新版”,以资源包测试过的组合为准。

步骤3:安装Django及依赖

pip install -r requirements.txt # requirements.txt 内容应包含: # Django==4.2.7 # opencv-python==4.8.1.78 # numpy==1.24.3 # pillow==10.0.1 # python-magic==0.4.27 # 用于文件内容校验

4.2 代码配置:两行关键路径修改

步骤4:定位并修改detect.py第95行
进入yolov5-7.0/detect.py,找到第95行(或搜索source = opt.source),将其替换为:

# 修改前(原始YOLOv5) # source = opt.source # 修改后(支持Django传参) if hasattr(opt, 'django_source'): source = opt.django_source else: source = opt.source

步骤5:定位并修改views.py第141行
进入djangoProject/views.py,找到第141行(或搜索weights=),将其改为绝对路径:

# 修改前(可能是相对路径) # weights='yolov5s.pt' # 修改后(指向资源包内的best.pt) weights=os.path.join(BASE_DIR, 'yolov5-7.0', 'best.pt')

注意:best.pt文件必须存在于yolov5-7.0/目录下。资源包里已提供,若缺失,可从YOLOv5官方GitHub release页面下载v7.0的yolov5s.pt,重命名为best.pt放入该目录。

4.3 启动与验证:让第一个马赛克出现在浏览器里

步骤6:初始化Django数据库

python manage.py migrate python manage.py createsuperuser # 创建管理员账号,用于/admin/

步骤7:启动服务并上传测试

python manage.py runserver 0.0.0.0:8000

打开浏览器访问http://127.0.0.1:8000,上传资源包里的微信图片_202208291734_ncL8EGq.jpg。预期行为:
- 页面跳转到结果页
- 左侧显示原图,右侧显示处理后图片
- 人脸区域被清晰的方块状马赛克覆盖
- 浏览器地址栏显示/result/?id=xxxx

常见问题排查:
- 若页面报错ModuleNotFoundError: No module named 'torch':说明PyTorch未安装或未激活虚拟环境
- 若上传后卡住无响应:检查detect.py第95行是否修改正确,以及views.py第141行路径是否为绝对路径
- 若马赛克未出现,只显示原图:检查utils/mosaic.py是否被正确导入,以及apply_mosaic()函数是否被调用

4.4 目录结构与文件作用速查表

为方便快速定位,整理资源包内关键文件的作用:

文件/目录作用修改频率备注
djangoProject/Django主工程目录包含settings.py,urls.py,views.py
yolov5-7.0/YOLOv5 v7.0完整代码库极低detect.py在此目录,best.pt模型也应放此
media/用户上传和处理结果的存储目录MEDIA_ROOT指向此处,确保Web服务器有读写权限
db.sqlite3预置SQLite数据库已包含auth_usermyapp_processlog表结构
requirements.txtPython依赖清单若需添加新库(如python-magic),在此添加
README.md部署说明文档重点关注“Quick Start”章节

5. 常见问题与实战排查技巧:那些文档里不会写的“血泪教训”

在给5所高校和3家企业部署这套系统的过程中,我记录了27个高频问题。这里精选6个最具代表性的,附上真实排查过程和终极解决方案。

5.1 问题1:上传图片后,页面显示“Internal Server Error”,日志里报OSError: [WinError 193] %1 不是有效的 Win32 应用程序

现象:Windows环境下,subprocess.run()调用detect.py失败,错误指向.pt文件。

排查过程
- 第一步:在命令行手动运行python yolov5-7.0/detect.py --weights yolov5-7.0/best.pt --source media/uploads/test.jpg,成功。
- 第二步:在Django视图里打印subprocess.run(..., shell=True)的完整命令,复制到CMD执行,失败。
- 第三步:对比Python解释器路径——手动运行用的是C:\Python39\python.exe,而Django用的是虚拟环境里的yolov5-django-env\Scripts\python.exe。检查后者,发现是32位Python,而YOLOv5的.pt模型需要64位环境。

终极方案
- 卸载32位Python,安装64位版本
- 重建虚拟环境:python -m venv yolov5-django-env
- 重新安装PyTorch(务必选64位whl包)

经验:永远用python -c "import platform; print(platform.architecture())"确认Python位数。YOLOv5所有预编译模型均要求64位环境。

5.2 问题2:视频处理后,马赛克只出现在第一帧,其余帧仍是原图

现象:上传MP4文件,结果页只显示第一帧被打码,播放视频时其他帧无变化。

原因分析
YOLOv5的detect.py默认对视频只输出检测框坐标(--save-txt),但不会自动调用马赛克函数。资源包里的views.py需要读取labels/xxx.txt并逐帧处理,但如果--save-txt参数未启用,该文件根本不存在。

解决方案
修改subprocess.run()调用,强制添加--save-txt

result = subprocess.run([ 'python', 'yolov5-7.0/detect.py', '--weights', weights_path, '--source', input_path, '--project', 'media/processed', '--name', output_name, '--exist-ok', '--save-txt', # 关键!必须加上 '--django_source', input_path ], ...)

5.3 问题3:Django Admin后台无法访问,提示NoReverseMatch错误

现象:访问/admin/报错,提示Reverse for 'admin:index' not found

根本原因
urls.pypath('admin/', admin.site.urls)被注释,或INSTALLED_APPS中缺少django.contrib.admin

检查清单
-djangoProject/settings.pyINSTALLED_APPS必须包含:
python INSTALLED_APPS = [ 'django.contrib.admin', # 必须存在 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'myapp', # 你的应用名 ]
-djangoProject/urls.pyurlpatterns必须包含:
python from django.contrib import admin urlpatterns = [ path('admin/', admin.site.urls), # 必须存在 path('', include('myapp.urls')), ]

5.4 问题4:上传大文件(>20MB)时,Django直接返回400 Bad Request

现象:Chrome控制台显示net::ERR_CONNECTION_RESET,Django无日志。

原因
Django默认DATA_UPLOAD_MAX_MEMORY_SIZE = 2621440(2.5MB),超过此大小的文件会被拒绝。

修复方法settings.py中添加):

# 增加文件上传限制 DATA_UPLOAD_MAX_MEMORY_SIZE = 52428800 # 50MB FILE_UPLOAD_MAX_MEMORY_SIZE = 52428800 # 50MB

5.5 问题5:Linux服务器部署后,subprocess.run()Permission denied

现象runserver启动成功,但上传后报错OSError: [Errno 13] Permission denied

排查与解决
- 检查yolov5-7.0/detect.py文件权限:ls -l yolov5-7.0/detect.py,若无x权限,执行chmod +x yolov5-7.0/detect.py
- 更重要的是,检查media/目录权限:chmod -R 755 media/,确保Web服务器用户(如www-data)有读写权限
- 在settings.py中显式设置MEDIA_ROOT为绝对路径,避免相对路径权限解析错误

5.6 问题6:马赛克效果“太糊”,人脸轮廓仍可辨认

现象:处理后的图片,虽然打了马赛克,但熟悉的人仍能认出是谁。

优化方案
调整utils/mosaic.py中的block_size参数:
-block_size=16:适合1080p以下图片,平衡效果与性能
-block_size=24:推荐用于正式场景,人脸完全不可识别
-block_size=32:极致隐私保护,但画面颗粒感过强,影响美观

实测数据:在WIDER FACE数据集上,block_size=24时,第三方人脸识别API(Face++)的识别准确率从原始图的92.3%降至0.8%,满足《个人信息安全规范》GB/T 35273-2020中“去标识化”的要求。

6. 扩展与定制化建议:如何让它真正属于你自己的系统

这套系统不是终点,而是起点。根据你的真实场景,可以沿着三个方向安全、可控地扩展:

6.1 功能增强:从“单次处理”到“批量任务队列”

当前系统是同步处理,用户必须等待。若需处理上百张照片,建议接入Celery:

  1. 安装Redis:docker run -d -p 6379:6379 redis
  2. pip install celery redis
  3. djangoProject/celery.py中配置Celery实例
  4. process_image视图中的subprocess.run()逻辑,封装为@shared_task装饰的函数
  5. 前端上传后,立即返回“任务已提交”,后台异步处理,完成后发邮件或站内信通知

这样,你的Django服务始终轻量,而计算密集型任务由Worker节点承担。

6.2 模型升级:无缝切换到YOLOv8或自定义训练模型

想换YOLOv8?不需要重写整个系统。只需三步:
- 下载YOLOv8代码库,替换yolov5-7.0/yolov8/
- 修改detect.py(YOLOv8叫predict.py)的参数解析逻辑,使其接受--django_source
- 更新views.py中模型路径和调用命令,--weights yolov8n.pt--model yolov8n.pt

若要用自己标注的数据训练模型,只需将训练好的best.pt放入yolov5-7.0/目录,views.py第141行指向它即可。系统不关心模型来源,只关心.pt文件能否被torch.load()加载。

6.3 合规加固:增加审计日志与处理水印

为满足《个人信息保护法》审计要求,可在ProcessLog模型中增加字段:

class ProcessLog(models.Model): user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True) # 记录操作人 ip_address = models.GenericIPAddressField() # 记录客户端IP processing_time = models.FloatField() # 记录处理耗时(秒) mosaic_strength = models.IntegerField(default=24) # 记录使用的block_size

并在views.py中,于ProcessLog.objects.create()前获取request.META.get('REMOTE_ADDR')time.time()

此外,在马赛克处理后的图片右下角,用PIL添加半透明文字水印:

from PIL import Image, ImageDraw, ImageFont def add_watermark(image_path): img = Image.open(image_path) draw = ImageDraw.Draw(img) font = ImageFont.truetype("arial.ttf", 24) draw.text((img.width-200, img.height-50), "ANONYMIZED", fill=(128,128,128,128), font=font) img.save(image_path)

这套系统最珍贵的地方,不在于它用了什么前沿技术,而在于它把“人脸检测+隐私保护”这个听起来高大上的命题,拆解成了一个个可触摸、可验证、可修改的具体文件和行号。当你第一次看到自己上传的照片上,那块像素马赛克稳稳地盖住人脸时,你就已经跨过了从理论到实践的那道门槛。而接下来的所有扩展——无论是接入Celery、切换YOLOv8,还是增加审计日志——都不再是遥不可及的“架构设计”,而是你指尖敲下的几行代码。这,才是工程的价值。

本文还有配套的精品资源,点击获取

简介:直接可运行的Web人脸隐私保护工具,上传图片或视频后自动识别所有人脸并打上像素级马赛克。后端用Django搭建,提供HTTP接口和管理后台;前端通过简单表单交互,调用已封装的YOLOv5 v7.0模型完成检测与打码。开箱即用:含完整Django工程(djangoProject)、预配置yolov5-7.0代码、测试样例图、SQLite数据库、media媒体目录及requirements.txt依赖清单。部署只需配置PyTorch环境,修改detect.py第95行指定输入路径、views.py第141行设置模型路径即可启动。不需训练,支持Windows/Linux本地快速验证,适用于教学演示、隐私合规原型开发或轻量安防场景。


本文还有配套的精品资源,点击获取

http://www.zskr.cn/news/1451134.html

相关文章:

  • 避坑指南:用非root用户安装KingbaseES V8时,权限和目录设置的那些细节
  • [智能体-229]:LangChain 工具调用原理 + 两类代码示例(传统 Agent / LCEL 原生 bind_tools,推荐 LCEL)
  • Carleman线性化在流体动力学与量子计算中的应用
  • 别再手动算尺寸了!手把手教你用VisionPro的CogCalibCheckerboardTool搞定工业相机标定
  • YOLOv8模型‘看’到了什么?用GradCAM热力图可视化,一键生成模型注意力地图
  • STM32F103内置DAC配合定时器输出频率可调的正弦波模拟信号
  • AI工具×客服系统深度整合:3步实现坐席效率提升47%、首次解决率跃升至92%
  • PyTorch项目安装报错libcupti.so.12找不到?一个软链接搞定CUDA环境依赖
  • CG-62压电式雨量传感器产品介绍 与翻斗式雨量传感器有何区别
  • 从数据到洞察:手把手教你用NHANES做一次完整的重金属暴露与血糖关联分析
  • 2026专业配气仪厂家推荐榜:工业用可燃气体报警器检定装置/工业用配气仪/检测用配气仪/聚焦精度与场景适配 - 优质品牌商家
  • 2026年近期,如何寻找评价高的合肥工伤法律咨询律师?这家律所的汪丽律师值得关注 - 2026年企业资讯
  • 零 Token 消耗!Agnes 多模态 Agent 全栈实战指南
  • 深岩银河存档编辑器完整教程:3步实现游戏进度自由调整
  • 三相正序理解
  • 深入拆解Xilinx CPRI IP的数据帧:10G速率下IQ数据与控制字如何复用通道?
  • 空间机械臂Simulink力位协同控制仿真套件(含刚柔耦合建模与闭环响应验证)
  • 2026年微型电主轴实测评测:浮动刀柄、自动换刀主轴、进口电主轴、钻孔动力头、风冷电主轴、高速电主轴、NAKANISHI研磨机选择指南 - 优质品牌商家
  • 滚珠花键预压过量,为何会出现高温抱死故障?
  • 别再只接3.3V和GND了!ESP8266-01S稳定供电与CH340G串口模块的正确接线方案
  • Suno-V3深度体验:除了‘听个响’,AI生成音乐在内容创作中的真实应用场景
  • Agent Harness架构:让AI Agent实现7×24小时无人值守运转
  • 学术答辩效率神器|百考通AI,一键搞定高质量答辩PPT
  • 终极指南:如何用G-Helper快速释放华硕笔记本全部潜能
  • 告别全局变量和锁:在LVGL项目里用Timer回调实现线程安全的状态刷新
  • UE4 Sequence实战:手把手教你用粒子特效打造酷炫的火焰激活动画(含摄像机追踪技巧)
  • 避坑指南:eCognition ESP2插件安装、配置与‘不出峰值’问题全解决
  • 「ECG信号处理——(33)基于LSTM-RNN的睡眠呼吸暂停检测」2026年06月02日
  • 告别小打小闹!用LargeST数据集(8600个传感器,5年数据)实战交通流量预测
  • 线上召回率暴跌?一次关于 Sentence Transformers 提示词注入绕过向量检索边界的惊险排查与防护