感谢恩培大佬对项目进行了完整的实现,并将代码进行开源,供大家交流学习。
一、项目简介
本项目最终达到的效果为手势控制虚拟点读机。如下所示
项目用python实现,调用opencv等库,使用SVM对字体进行分类,由以下步骤组成:
1、使用OpenCV读取摄像头视频流;
2、mediapipe手势识别定位手部位置;
3、使用Paddle detection进行物体检测。
4、使用paddleocr进行文字检测。
二、安装流程
硬件:
Windows11、GPU:nvdia GTX 1060 、普通RBG相机
软件:
- conda
- Python 3.7
- CUDA 10.2
- cuDNN7.6.5
- mediapipe 0.8.9
- Paddlepaddle 2.2
使用步骤:
- 满足硬件条件(需要GPU)和软件条件
- 安装PaddleDetection:根据官网安装
- 安装PaddleOCR:根据官网安装
- 下载PaddleDetection 识别模型,并deploy后(查看官网教程:Python端预测部署),将生成的
infer_cfg.yml, model.pdiparams, model.pdiparams.info, model.pdmodel
文件放到baidu_pp_detection/models
下,类似这样:
推荐下载cascade_rcnn_dcn_r101_vd_fpn_gen_server_side
模型,它支持676个类别识别(详情查看这里),且经过我的测试,速度较好。
- 下载OCR推理模型,解压后分别放到
baidu_pp_ocr/models/
文件夹下,类似这样:
文本检测模型推荐下载ch_PP-OCRv2_det_infer
,文本识别模型推荐下载ch_PP-OCRv2_rec_infer
- 运行
python demo.py
即可实时离线识别和OCR。
三、代码详解
# 更多问题,欢迎私信交流。
# 导入OpenCV
import cv2
# 导入mediapipe
import mediapipe as mp
# 导入PIL
from PIL import Image, ImageDraw, ImageFont
# 导入其他依赖包
import time
import math
import numpy as np
from baidu_pp_wrap import Baidu_PP_Detection,Baidu_PP_OCR
# 画图类
class DrawSomeInfo:
def __init__(self):
# 模式,double: 双手,right,single:右手
self.hand_mode = 'None'
self.hand_num = 0
# 记录左右手的相关信息
# 坐标
self.last_finger_cord_x = {'Left': 0, 'Right': 0}
self.last_finger_cord_y = {'Left': 0, 'Right': 0}
# 圆环度数
self.last_finger_arc_degree = {'Left': 0, 'Right': 0}
# 右手模式
self.right_hand_circle_list = []
# 初始化停留时间
now = time.time()
self.stop_time = {'Left': now, 'Right': now}
# 圆环配色
self.handedness_color = {'Left': (255, 0, 0), 'Right': (255, 0, 255)}
# 手指浮动允许范围,需要自己根据相机校准
self.float_distance = 10
# 触发时间
self.activate_duration = 0.3
# 单手触发识别时间
self.sin