使用 OpenCV 检测和跟踪人手
Detecting and tracking the human hand with OpenCV
我是 OpenCV 和 Tensorflow 的新手。我使用 Tensorflow 2.0 创建了一个分类器来检测美国手语的 26 个字母。
这是 CNN 代码。
# Designing our CNN
i = Input(shape=(IMAGE_SIZE[0],IMAGE_SIZE[0],3))
x = Conv2D(32, (3, 3), activation='relu', padding='same')(i)
x = BatchNormalization()(x)
x = Conv2D(32, (3, 3), activation='relu', padding='same')(x)
x = BatchNormalization()(x)
x = MaxPooling2D((2, 2))(x)
# x = Dropout(0.2)(x)
x = Conv2D(64, (3, 3), activation='relu', padding='same')(x)
x = BatchNormalization()(x)
x = Conv2D(64, (3, 3), activation='relu', padding='same')(x)
x = BatchNormalization()(x)
x = MaxPooling2D((2, 2))(x)
# x = Dropout(0.2)(x)
x = Conv2D(128, (3, 3), activation='relu', padding='same')(x)
x = BatchNormalization()(x)
x = Conv2D(128, (3, 3), activation='relu', padding='same')(x)
x = BatchNormalization()(x)
x = MaxPooling2D((2, 2))(x)
# x = Dropout(0.2)(x)
# x = GlobalMaxPooling2D()(x)
x = Flatten()(x)
x = Dropout(0.2)(x)
x = Dense(1024, activation='relu')(x)
x = Dropout(0.2)(x)
x = Dense(1024, activation='relu')(x)
x = Dropout(0.2)(x)
x = Dense(K, activation='softmax')(x)
model = Model(i, x)
这是完整代码的 link。
https://colab.research.google.com/drive/1_9MVqaRpk5UnZxc8l4OC78JaHlXkAwrL
这是图片分类预览。
它能够以不错的准确度检测所有 26 个字母。
这是混淆矩阵。
我能够保存能够对仅包含手的 100 x 100 图像进行分类的 h5 文件。
后来我能够使用 OpenCV 从网络摄像头获取提要,但我不确定如何使用我的模型来检测手并在其上创建一个边界框以提取手并将其提供给 ASL CNN分类器。我确实尝试使用一些 Haar 级联来检测手,但它似乎检测得不太好。
如何从视频源中检测到像这张图片中的手一样的手?
我正在考虑使用 YOLO,但我不确定如何针对自定义手部图像训练它或将我的 h5 文件提供给 YOLO 分类器并使用它在实时视频提要上创建手部边界框网络摄像头。
欢迎任何 link 资源。先感谢您。
对于 yolov3 或 yolov4 的检测,你可以试试这个:
https://github.com/cansik/yolo-hand-detection
至于数据集:
一般有两种类型的数据集:
- 从自我中心的角度来看,像 Egohand:http://vision.soic.indiana.edu/projects/egohands/
- 第三人称视角,如牛津之手:https://www.robots.ox.ac.uk/~vgg/data/hands/
来检查如何训练它们或您自己的数据
我是 OpenCV 和 Tensorflow 的新手。我使用 Tensorflow 2.0 创建了一个分类器来检测美国手语的 26 个字母。
这是 CNN 代码。
# Designing our CNN
i = Input(shape=(IMAGE_SIZE[0],IMAGE_SIZE[0],3))
x = Conv2D(32, (3, 3), activation='relu', padding='same')(i)
x = BatchNormalization()(x)
x = Conv2D(32, (3, 3), activation='relu', padding='same')(x)
x = BatchNormalization()(x)
x = MaxPooling2D((2, 2))(x)
# x = Dropout(0.2)(x)
x = Conv2D(64, (3, 3), activation='relu', padding='same')(x)
x = BatchNormalization()(x)
x = Conv2D(64, (3, 3), activation='relu', padding='same')(x)
x = BatchNormalization()(x)
x = MaxPooling2D((2, 2))(x)
# x = Dropout(0.2)(x)
x = Conv2D(128, (3, 3), activation='relu', padding='same')(x)
x = BatchNormalization()(x)
x = Conv2D(128, (3, 3), activation='relu', padding='same')(x)
x = BatchNormalization()(x)
x = MaxPooling2D((2, 2))(x)
# x = Dropout(0.2)(x)
# x = GlobalMaxPooling2D()(x)
x = Flatten()(x)
x = Dropout(0.2)(x)
x = Dense(1024, activation='relu')(x)
x = Dropout(0.2)(x)
x = Dense(1024, activation='relu')(x)
x = Dropout(0.2)(x)
x = Dense(K, activation='softmax')(x)
model = Model(i, x)
这是完整代码的 link。 https://colab.research.google.com/drive/1_9MVqaRpk5UnZxc8l4OC78JaHlXkAwrL
这是图片分类预览。
它能够以不错的准确度检测所有 26 个字母。
这是混淆矩阵。
我能够保存能够对仅包含手的 100 x 100 图像进行分类的 h5 文件。
后来我能够使用 OpenCV 从网络摄像头获取提要,但我不确定如何使用我的模型来检测手并在其上创建一个边界框以提取手并将其提供给 ASL CNN分类器。我确实尝试使用一些 Haar 级联来检测手,但它似乎检测得不太好。
如何从视频源中检测到像这张图片中的手一样的手?
我正在考虑使用 YOLO,但我不确定如何针对自定义手部图像训练它或将我的 h5 文件提供给 YOLO 分类器并使用它在实时视频提要上创建手部边界框网络摄像头。
欢迎任何 link 资源。先感谢您。
对于 yolov3 或 yolov4 的检测,你可以试试这个:
https://github.com/cansik/yolo-hand-detection
至于数据集:
一般有两种类型的数据集:
- 从自我中心的角度来看,像 Egohand:http://vision.soic.indiana.edu/projects/egohands/
- 第三人称视角,如牛津之手:https://www.robots.ox.ac.uk/~vgg/data/hands/