跳转至

进阶使用技巧

本文档提供了AIToolkit Base的进阶使用技巧,帮助您更高效地使用这个工具包。

多检测器协同工作

在实际应用中,我们可能需要多个检测器协同工作,例如同时进行人脸检测和手势识别:

from aitoolkit_base import Camera, FaceDetector, GestureRecognizer
import cv2

# 同时使用多个检测器
with Camera(0) as camera, FaceDetector() as face_detector, GestureRecognizer() as gesture_detector:
    for frame in camera:
        # 运行人脸检测
        faces = face_detector.run(frame)

        # 运行手势识别
        gestures = gesture_detector.run(frame)

        # 绘制人脸检测结果
        result = face_detector.draw(frame, faces)

        # 在同一个图像上叠加手势识别结果
        result = gesture_detector.draw(result, gestures)

        # 显示结果
        cv2.imshow("多检测器结果", result)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

性能优化技巧

降低分辨率

处理高分辨率图像会降低检测速度,可以考虑降低输入图像的分辨率:

from aitoolkit_base import Camera, FaceDetector, ImageUtils
import cv2

with Camera(0) as camera, FaceDetector() as detector:
    for frame in camera:
        # 降低分辨率以提高速度
        small_frame = ImageUtils.resize_image(frame, width=640)

        # 运行检测
        faces = detector.run(small_frame)

        # 绘制结果
        result = detector.draw(small_frame, faces)

        # 显示结果
        cv2.imshow("低分辨率检测", result)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

减少检测频率

对于实时视频流,可以通过减少检测频率来提高性能:

from aitoolkit_base import Camera, FaceDetector
import cv2

with Camera(0) as camera, FaceDetector() as detector:
    frame_count = 0
    last_faces = None

    for frame in camera:
        # 每3帧检测一次
        if frame_count % 3 == 0:
            faces = detector.run(frame)
            last_faces = faces
        else:
            faces = last_faces

        # 绘制结果
        if faces:
            result = detector.draw(frame, faces)
        else:
            result = frame

        # 显示结果    
        cv2.imshow("减少检测频率", result)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

        frame_count += 1

调整检测参数

适当调整检测参数也可以提高性能:

from aitoolkit_base import Camera, FaceDetector
import cv2

# 通过降低检测置信度阈值和最大检测数量来提高性能
with Camera(0) as camera, FaceDetector(min_detection_confidence=0.3, max_num_faces=1) as detector:
    for frame in camera:
        faces = detector.run(frame)
        result = detector.draw(frame, faces)
        cv2.imshow("优化参数", result)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

错误处理与异常恢复

在实际应用中,良好的错误处理非常重要:

from aitoolkit_base import Camera, FaceDetector
import cv2
import time

# 启动摄像头和检测器
try:
    camera = Camera(0, auto_reconnect=True)
    detector = FaceDetector()

    while True:
        try:
            # 读取帧
            ret, frame = camera.read()
            if not ret:
                print("无法读取帧,等待...")
                time.sleep(0.5)
                continue

            # 运行检测
            try:
                faces = detector.run(frame)
                result = detector.draw(frame, faces)
            except Exception as e:
                print(f"检测失败: {str(e)}")
                result = frame

            # 显示结果
            cv2.imshow("错误处理", result)
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break

        except Exception as e:
            print(f"处理异常: {str(e)}")
            time.sleep(1)  # 出错时暂停一秒再继续

except Exception as e:
    print(f"严重错误: {str(e)}")
finally:
    # 确保资源被释放
    if 'camera' in locals():
        camera.release()
    if 'detector' in locals():
        detector.close()
    cv2.destroyAllWindows()

自定义检测结果处理

您可以自定义如何处理检测结果:

from aitoolkit_base import Camera, FaceDetector
import cv2
import time

# 自定义人脸信息处理
def process_face_info(faces):
    if not faces:
        return "未检测到人脸"

    result = []
    for i, face in enumerate(faces):
        confidence = face["score"] * 100
        box = face["bounding_box"]
        size = box["width"] * box["height"]

        result.append(f"人脸{i+1}: 置信度={confidence:.1f}%, 大小={size}像素")

    return "\n".join(result)

# 使用自定义处理
with Camera(0) as camera, FaceDetector() as detector:
    for frame in camera:
        # 运行检测
        faces = detector.run(frame)

        # 绘制基本结果
        result = detector.draw(frame, faces)

        # 处理并显示自定义信息
        info = process_face_info(faces)
        y_offset = 30
        for line in info.split("\n"):
            cv2.putText(result, line, (10, y_offset), 
                        cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
            y_offset += 30

        # 显示结果
        cv2.imshow("自定义处理", result)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

录制视频

将检测结果保存为视频文件:

from aitoolkit_base import Camera, FaceDetector
import cv2

# 设置视频录制参数
camera = Camera(0, width=1280, height=720)
detector = FaceDetector()

# 创建视频写入器
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (1280, 720))

try:
    for frame in camera:
        # 运行检测
        faces = detector.run(frame)
        result = detector.draw(frame, faces)

        # 显示结果
        cv2.imshow("录制中", result)

        # 写入视频
        out.write(result)

        # 按q退出
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
finally:
    # 释放资源
    camera.release()
    detector.close()
    out.release()
    cv2.destroyAllWindows()

使用异步模式

异步模式可以提高处理效率:

from aitoolkit_base import Camera, FaceDetector
import cv2
import threading
import queue
import time

# 创建队列用于存储处理结果
result_queue = queue.Queue(maxsize=5)

# 异步处理线程
def process_frames(camera, detector, result_queue):
    for frame in camera:
        # 运行检测
        faces = detector.run(frame)
        result = detector.draw(frame, faces)

        # 将结果放入队列,如果队列满则等待
        try:
            result_queue.put((result, time.time()), block=False)
        except queue.Full:
            # 队列满,丢弃当前帧
            pass

# 主程序
with Camera(0) as camera, FaceDetector() as detector:
    # 启动处理线程
    processing_thread = threading.Thread(
        target=process_frames, 
        args=(camera, detector, result_queue)
    )
    processing_thread.daemon = True
    processing_thread.start()

    # 主线程负责显示
    while True:
        try:
            # 获取处理结果,超时1秒
            result, timestamp = result_queue.get(timeout=1)

            # 计算延迟
            delay = time.time() - timestamp

            # 显示结果和延迟
            cv2.putText(result, f"Delay: {delay*1000:.1f}ms", (10, 30), 
                        cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
            cv2.imshow("异步处理", result)

            if cv2.waitKey(1) & 0xFF == ord('q'):
                break

        except queue.Empty:
            continue

组合多种机器视觉功能

将不同的机器视觉功能组合使用:

from aitoolkit_base import Camera, FaceDetector, HandLandmarker
import cv2
import numpy as np

# 在同一帧上组合多种视觉功能
with Camera(0) as camera, FaceDetector() as face_detector, HandLandmarker() as hand_detector:
    for frame in camera:
        # 创建一个原始帧的副本
        display = frame.copy()

        # 添加人脸检测
        faces = face_detector.run(frame)
        if faces:
            display = face_detector.draw(display, faces)

        # 添加手部关键点检测
        hands = hand_detector.run(frame)
        if hands:
            display = hand_detector.draw(display, hands)

        # 显示结果
        cv2.imshow("视觉功能组合", display)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

以上就是AIToolkit Base的一些进阶使用技巧,通过这些技巧,您可以更高效地使用这个工具包来实现复杂的应用。