
点击蓝字,关注我们
前言
很多人在家里都安装了家用摄像头,摄像头有个提醒功能很有意思,比如陌生人、小孩、宠物进入摄像范围,可以设置提醒功能。今天我们介绍的 Python 程序,实际基于的就是这种目标检测功能,通过 Python 开源的模型 YOLO 可以精准的抓取目标对象,而我们进一步可以将其运用到识别和统计图像中的人车,还可以进一步运用到流量统计、智能监测等交通工程中去。
1.程序目标效果
2.目标检测模型——YOLO 模型
3.Python 标准 GUI 设计模块——Tkinter
4.程序代码实现及关键点
5.总结
- 1 -
程序目标效果
一张照片中有大量的信息元素,有时候我们需要提取某些固定元素的信息,比如行人、车辆、动物、物品的位置、数量、运动轨迹等。今天我们尝试完成一个可以运用到自己日常中的简单程序,能够统计固定画面中的行人和车辆数量。
程序执行效果:
- 2 -
目标检测模型 YOLO
YOLO(You Only Look Once)是目前最主流的目标检测模型,具备目标检测、实例分割、 物体追踪等多项功能。YOLO有v1到v12多个版本,最新版本已经更新到 YOLO2026 。
在 YOLO 出现之前,主流算法通常需要先在图像中寻找可能存在物体的区域,再对这些区域进行分类,过程繁琐缓慢。而 YOLO 将目标检测视作一个单一的回归问题,直接通过一次神经网络计算,就能同时得到图像中所有物体的类别和位置坐标。
YOLO 在极低计算开销下即可实现高精度检测。其系列模型针对 CPU/GPU 算力差异进行了深度优化(我们本次使用CPU运算的效率就很高),并提供从轻量化到高性能的多尺度版本( Nano/Small/Large 等)。
在 Python 中,通过 ultralytics 库调用 YOLO 非常简单。你可以根据需求选择不同的模型及规格,以下是一个简单示例:
# 安装 Ultralytics 公司的工具箱,包含YOLO各个版本模型pip install ultralyticsfrom ultralytics import YOLO# 1. 加载模型(会自动从官网下载权重文件)model = YOLO('yolov8n.pt') # 本次使用yolov8n模型,纯CPU跑小模型,没有GPU啊/(ㄒoㄒ)/~~# 2. 执行预测results = model.predict(source="image.jpg", conf=0.3)# 3. 查看结果results[0].show()- 3 -
Python 标准GUI设计模块 Tkinter
前面我也提到过,程序完成后最好将代码封装成 exe 程序并设计交互界面,以方便 Python 程序后期的使用、保存和维护。Python 最常用的 GUI 设计库有:
✓ Tkinter:
是 Python 标准库的一部分,无需安装即可使用。简单窗口+常用控件,就是 Tkinter 的全部功能。所以它主要用来开发一些小工具,主打方便实用,也是作为工程人员我最常使用的GUI工具。
✓PyQt/PySide:
基于大名鼎鼎的Qt框架,Qt这个编程人员都知道。专业级功能,几乎能实现任何你想要的效果,因此常用于商业级开发。目前PyQt5/PySide5在网上的资料非常多,最新版本为PyQt6/PySide6。PySide6 是 Qt 官方维护,开源免费,PyQt6 商用需授权。
✓wxPython:
wxPython 是 C++ 编写的 wxWidgets 库的 Python 绑定。它与其他库最大的区别在于:它不通过代码“模拟”按钮,而是直接调用操作系统底层的 API,让你的程序在 Win11 上看起来就像一个 Win11 原生软件,在 macOS 上看起来就像一个苹果原生软件,完全没有跨平台开发的“外来感”。这个在使用 Tkinter 开发的时候就能明显体会到差异感,对操作系统适配性一般,高分屏需要调试。
虽然 Python 可供选择的高级 GUI 工具众多,但出于使用的便捷性,我们以功能为主美观为辅,仍然采用 Python 原生的 Tkinter,后面我也会选择一期着重介绍 Tkinter 的模块和控件,以方便大家快速掌握 GUI 的运用。当然如果你的电脑使用的高分屏,为了界面清晰务必加入以下代码进行适配:
# 高分屏存在“高 DPI 缩放”问题导致界面模糊,告诉 Windows 使用程序自身的缩放比例解决模糊问题,但注意高分屏会让窗口尺寸变小import ctypestry: ctypes.windll.shcore.SetProcessDpiAwareness(1)except Exception: ctypes.windll.user32.SetProcessDPIAware()- 4 -
程序代码实现及关键点
程序的设计与 GUI 的设计是同步进行的,这个我们目前也不必使用太专业的软件,在 AutoCAD 或者 PPT 里就可以把窗口简单画出来,然后按模块去完成代码:
✓ 读取图片模块:
使用 Listbox 装载图片,并给它配了一个“添加图片”的按钮 Button,以下是加载图片代码:
defadd_images(self): files = filedialog.askopenfilenames(filetypes=[("Image files", "*.jpg *.jpeg *.png *.bmp")])if files:for f in files:if f notin self.image_paths: self.image_paths.append(f) self.listbox.insert(tk.END, os.path.basename(f))✓ 图片预览模块:
使用 Label 控件,当然 Label 通常都是用来显示文本。这里我们使用“选择列表中的图片”触发预览,预览时将图片加载到 Label 中显示:
defon_image_select(self, event):"""当点击列表中的文件名时,更新预览图""" selection = self.listbox.curselection()if selection: idx = selection[0] self.current_image_path = self.image_paths[idx] self.show_preview(self.current_image_path)defshow_preview(self, path): img = Image.open(path)# 等比例缩放以适应显示区域 img.thumbnail((900, 600)) img_tk = ImageTk.PhotoImage(img) self.preview_label.config(image=img_tk, text="") self.preview_label.image = img_tk✓人车识别模块:
这里我们首先设置了一个下拉列表 OptionMenu ,以限定用户选择识别的对象人/车,避免返回错误值:
#控件设置self.target_var = tk.StringVar(value="-人-")dropdown = tk.OptionMenu(right_frame, self.target_var, "-人-", "-车-")以上配合一个“点击识别”的按钮 Button 和“显示识别结果”的 Label ,下面是点击按钮后执行的代码,相当“傻瓜式”的操作要求:
defrun_recognition(self):ifnot self.current_image_path: messagebox.showwarning("提示", "请先从左侧列表选择一张图片")return# YOLO COCO 数据集中: 'person' 是 0, 'car' 是 2 target_map = {"-人-": 0, "-车-": 2} target_cls = target_map[self.target_var.get()] results = self.model.predict(source=self.current_image_path, conf=0.3, save=False) count = 0for r in results: classes = r.boxes.cls.tolist() count = classes.count(target_cls) self.result_var.set(f"识别结果: 检测到 {self.target_var.get()} 的数量为 {count}") results[0].show()- 5 -
总结
本期主要是使用“目标检测模型”——YOLO 模型,识别并统计图片中的人车数量,并捎带介绍了如何使用 Python 的 GUI 设计。这个程序简单实用,其实 YOLO 模型功能强大,不仅可以识别图片还可以识别视频中的目标,但逐帧识别需要消耗大量运算资源,因此对硬件配置的要求比较高,感兴趣的朋友可以去尝试下,我们可以继续研究讨论。
这一期内容就到此为止,如果你也对 Python 编程技巧和应用实例感兴趣,欢迎点赞,收藏,关注,我将以应用案例为基础持续更新公众号文章。你也可以在公众号后台,获取 Python 编程的经典资料,也可以与我私信交流想法和需求,我们下期再见~
求点赞

求分享

求喜欢
