最近在做一个很有意思的计算机视觉项目 - 基于YOLOv12的手机检测系统。这个系统能够精准识别图片、视频和实时摄像头画面中的手机设备,准确率相当不错。作为一个专注单一类别的目标检测应用,它在安防监控、智能零售等场景下特别实用。
我花了两个月时间完成了这个项目的开发,从数据集准备、模型训练到UI界面设计都亲力亲为。最终效果让我很满意:系统不仅检测精度高,还配备了完整的用户管理系统和美观的交互界面。下面我就把这个项目的完整实现过程分享给大家,包括所有技术细节和踩过的坑。
在目标检测领域,YOLO系列一直以速度快、精度高著称。最新发布的YOLOv12在保持实时性的基础上,进一步提升了小目标检测能力。经过测试对比,我发现YOLOv12在手机这类小型电子设备的检测上表现尤为突出。
几个关键优势:
整个系统采用模块化设计,主要分为三个核心模块:
这种分层架构使得系统维护和功能扩展都很方便。比如要新增检测类别,只需修改检测引擎部分,其他模块基本不用动。
为了训练出鲁棒性强的模型,我收集了3500张包含手机的图片,覆盖了各种场景:
这种多样性确保了模型在实际应用中的泛化能力。
使用LabelImg工具进行标注时,我制定了严格的标注标准:
标注文件采用YOLO格式,每个图片对应一个.txt文件,内容格式为:
code复制<class_id> <x_center> <y_center> <width> <height>
其中class_id为0(因为我们只有手机一个类别)。
我使用Anaconda创建了独立的Python环境:
bash复制conda create -n yolov12 python=3.9
conda activate yolov12
pip install torch torchvision torchaudio
pip install ultralytics
硬件配置:
经过多次实验,最终确定的训练参数如下:
python复制model = YOLO('yolov12s.pt') # 使用预训练权重
results = model.train(
data='data.yaml',
epochs=100,
batch=8,
imgsz=640,
device='0',
workers=4,
optimizer='AdamW',
lr0=0.001,
weight_decay=0.0005
)
关键参数说明:
训练过程中我主要关注三个指标:
通过Ultralytics提供的可视化工具,可以清晰看到各项指标的变化趋势。在100个epoch后,验证集mAP@0.5达到了0.92,效果相当不错。
检测核心采用多线程设计,避免阻塞UI主线程:
python复制class DetectionThread(QThread):
frame_received = pyqtSignal(np.ndarray, np.ndarray, list)
def run(self):
while self.running:
results = self.model(frame, conf=self.conf, iou=self.iou)
annotated_frame = results[0].plot()
detections = self.parse_results(results)
self.frame_received.emit(original_frame, annotated_frame, detections)
关键点:
UI采用PyQt5实现,主要特点:
核心UI代码结构:
python复制class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setup_ui()
self.setup_connections()
def setup_ui(self):
# 创建各种控件
self.original_image_label = QLabel()
self.result_image_label = QLabel()
self.results_table = QTableWidget()
def setup_connections(self):
# 连接信号与槽
self.image_btn.clicked.connect(self.detect_image)
self.confidence_slider.valueChanged.connect(self.update_confidence)
账户系统实现了完整的登录/注册功能:
python复制class LoginWindow(QDialog):
def handle_login(self):
username = self.username_input.text()
password = self.password_input.text()
if username in self.accounts and self.accounts[username] == password:
self.accept() # 登录成功
else:
QMessageBox.warning(self, "错误", "用户名或密码错误")
def handle_register(self):
if len(password) < 6:
QMessageBox.warning(self, "警告", "密码至少6位")
return
self.accounts[username] = password
self.save_accounts()
安全措施:
图片检测:
视频检测:
实时摄像头:
用户可调节的关键参数:
参数调节采用双向绑定设计,滑块和输入框实时同步:
python复制def update_confidence(self, value):
confidence = value / 100.0
self.confidence_spinbox.setValue(confidence)
self.confidence_label.setText(f"置信度: {confidence:.2f}")
系统提供多种结果展示方式:
表格更新实现:
python复制def update_results_table(self, detections):
self.results_table.setRowCount(0)
for i, (class_name, conf, x, y) in enumerate(detections):
self.results_table.insertRow(i)
self.results_table.setItem(i, 0, QTableWidgetItem(class_name))
self.results_table.setItem(i, 1, QTableWidgetItem(f"{conf:.2f}"))
self.results_table.setItem(i, 2, QTableWidgetItem(f"{x:.1f}"))
self.results_table.setItem(i, 3, QTableWidgetItem(f"{y:.1f}"))
为了提升推理速度,我对模型进行了FP16量化:
python复制model.export(format='onnx', half=True) # 导出为FP16精度的ONNX模型
量化后模型大小减少约40%,推理速度提升20%,而精度损失不到1%。
检测线程采用生产者-消费者模式:
这种设计在i7处理器上可以实现30FPS的稳定检测。
针对长时间运行的内存泄漏问题,我做了以下优化:
可能原因及解决方法:
优化策略:
性能优化建议:
这个系统还有很大的改进空间:
目前该系统已经在几个场景中成功应用:
在某个学校的试点中,系统识别准确率达到95%,误报率低于3%,完全满足实际使用需求。