实验环境

(1)硬件环境

机械臂一台:具备视觉识别与交互功能的机械臂设备
摄像头:用于采集图像并进行目标识别的视觉设备
各类物体样本:多种可被识别的日常物品(如杯子、手机、书籍等)

(2)软件环境

Vmware虚拟环境:运行Ubuntu系统的虚拟化平台
Python 3.x 环境:支持OpenCV和深度学习库运行
OpenCV库:用于图像处理和目标检测的计算机视觉库
Jupyter Notebook:用于运行和调试目标识别代码的交互式环境
YOLOv4-tiny模型文件:yolov4-tiny.cfg(模型结构)和yolov4-tiny.weights(网络权重)
机械臂控制库:Arm_Lib(用于机械臂运动控制)

实验步骤

  1. 启动虚拟机,在Windows电脑中,使用Vmware运行Ubuntu系统。
  2. 找到路径 /home/Dofbot/6.AI_Visuall/8.Object recognition.ipynb,右击选择用Jupyter Notebook启动,输入密码 shujia
  3. 按照代码单元顺序执行程序,初始化机械臂和目标识别模型。
  4. 将待识别物体置于摄像头前方,系统将自动检测并识别物体。
  5. 观察识别效果,识别到的物体会被方框标记,并显示物体类别和置信度。
  6. 实验结束后,通过程序退出功能关闭摄像头和识别进程。

实验结果

YOLO物体识别

实验原理

概述:本实验基于YOLOv4-tiny目标检测算法实现物体识别功能。首先使用OpenCV的dnn模块构造CSPDarknet53网络结构,通过加载预训练的模型结构文件(.cfg)和网络权重文件(.weights)实现模型初始化。OpenCV的dnn模块提供了完整的目标检测支持,包括自动完成输入图像的预处理(缩放、归一化等)和检测结果的后处理。

1. 模型初始化

# 构造网络结构并加载权重
self.net = cv2.dnn.readNet('yolov4-tiny.cfg', 'yolov4-tiny.weights') 
# 创建目标检测模型
self.model = cv2.dnn_DetectionModel(self.net)

2. 目标检测方法

# 目标检测核心函数
classids, scores, bboxes = self.model.detect(image, confThreshold, numsThreshold)
参数/返回值 说明
image 输入的待检测图像
confThreshold 置信度阈值,用于过滤低置信度的检测框(本实验使用0.5)
numsThreshold 非极大值抑制阈值,用于去除重叠的检测框(本实验使用0.3)
classids 返回的类别索引列表,标识每个检测框的物体类别
scores 返回的置信度列表,表示每个检测框的可信度
bboxes 返回的边界框列表,每个框包含左上角坐标(x,y)和宽高(w,h)

3. 模型输入参数设置

# 设置模型输入参数
self.model.setInputParams(size=(320,320), scale=1/255)

参数说明:

  • size=(320,320):将输入图像缩放至320×320大小。尺寸越大检测效果越好,但速度越慢;尺寸越小速度越快,但可能影响检测精度。
  • scale=1/255:像素值归一化,将0-255的像素值缩放到0-1范围,符合神经网络输入要求。

主要代码

代码路径:/Home/Dofbot/6.AI_Visuall/8.Object recognition.ipynb

1. 导入头文件与初始化:

#!/usr/bin/env python
# coding: utf-8
import Arm_Lib
import cv2 as cv
import threading
from time import sleep
import ipywidgets as widgets
from IPython.display import display
from Object_recognition import Object_recognition_identify

# 初始化机械臂和识别实例(根据实际代码补充)
ob_re = Object_recognition_identify()
model = 'General'
# 创建图像控件等交互元素(根据实际代码补充)
button_layout = widgets.Layout(width='200px', height='50px', align_self='center')
exit_button = widgets.Button(description='Exit', button_style='danger', layout=button_layout)
imgbox = widgets.Image(format='jpg', height=480, width=640, layout=widgets.Layout(align_self='center'))
controls_box = widgets.VBox([imgbox, exit_button])

2. 物体识别函数:

def detect_image(self, image):
    # 目标检测,返回类别ID、置信度和边界框
    classids, scores, bboxes = self.model.detect(image, 0.5, 0.3)
    
    # 遍历所有检测结果
    for class_id, self.score, bbox in zip(classids, scores, bboxes):
        self.x, self.y, self.w, self.h = bbox
        # 获取类别名称
        self.class_name = self.classes[class_id]
        # 绘制边界框(青色)
        cv.rectangle(image, (self.x,self.y), (self.x+self.w,self.y+self.h),
                    (255,255,0), 2)
        # 绘制类别名称(绿色)
        cv.putText(image, self.class_name, (self.x,self.y+self.h+20),
                  cv.FONT_HERSHEY_COMPLEX, 1, (0,255,0), 2)
        # 绘制置信度(黄色)
        cv.putText(image, str(int(self.score*100))+'%', (self.x,self.y-5),
                  cv.FONT_HERSHEY_COMPLEX, 1, (0,255,255), 2)
    return image

3. 主线程:

def camera():
    # 打开摄像头
    capture = cv.VideoCapture(0)
    # 当摄像头正常打开的情况下循环执行
    while capture.isOpened():
        try:
            _, img = capture.read()
            # 调整图像大小
            img = cv.resize(img, (640, 480))
            # 调用物体识别函数
            img = ob_re.detect_image(img)
            
            # 退出条件
            if model == 'Exit':
                cv.destroyAllWindows()
                capture.release()
                break
                
            # 更新图像显示
            imgbox.value = cv.imencode('.jpg', img)[1].tobytes()
            
        except KeyboardInterrupt:
            capture.release()

# 退出按钮回调函数
def exit_button_Callback(value):
    global model
    model = 'Exit'
exit_button.on_click(exit_button_Callback)

# 显示控件并启动线程
display(controls_box)
threading.Thread(target=camera, ).start()
代码说明:本实验基于YOLOv4-tiny轻量级目标检测模型实现实时物体识别。系统通过OpenCV的dnn模块加载预训练模型,对摄像头采集的图像进行处理。核心流程为:摄像头采集图像→预处理(缩放至320×320)→模型推理检测→绘制检测结果(边界框、类别名称、置信度)→实时显示。代码中使用了IPython的交互控件实现图像显示和退出功能,通过多线程确保图像采集与处理的实时性。该方案兼顾了识别精度和速度,适合在机械臂平台上实现实时物体识别应用。