распознавание пальцев рук
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,288 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "h2q27gKz1H20"
|
||||
},
|
||||
"source": [
|
||||
"##### Copyright 2023 The MediaPipe Authors. All Rights Reserved."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"id": "TUfAcER1oUS6"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n",
|
||||
"# you may not use this file except in compliance with the License.\n",
|
||||
"# You may obtain a copy of the License at\n",
|
||||
"#\n",
|
||||
"# https://www.apache.org/licenses/LICENSE-2.0\n",
|
||||
"#\n",
|
||||
"# Unless required by applicable law or agreed to in writing, software\n",
|
||||
"# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
|
||||
"# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
|
||||
"# See the License for the specific language governing permissions and\n",
|
||||
"# limitations under the License."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "L_cQX8dWu4Dv"
|
||||
},
|
||||
"source": [
|
||||
"# Hand Landmarks Detection with MediaPipe Tasks\n",
|
||||
"\n",
|
||||
"This notebook shows you how to use MediaPipe Tasks Python API to detect hand landmarks from images."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "O6PN9FvIx614"
|
||||
},
|
||||
"source": [
|
||||
"## Preparation\n",
|
||||
"\n",
|
||||
"Let's start with installing MediaPipe."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"id": "gxbHBsF-8Y_l"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"!pip install -q mediapipe"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "a49D7h4TVmru"
|
||||
},
|
||||
"source": [
|
||||
"Then download an off-the-shelf model bundle. Check out the [MediaPipe documentation](https://developers.google.com/mediapipe/solutions/vision/hand_landmarker#models) for more information about this model bundle."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"id": "OMjuVQiDYJKF"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"!wget -q https://storage.googleapis.com/mediapipe-models/hand_landmarker/hand_landmarker/float16/1/hand_landmarker.task"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "YYKAJ5nDU8-I"
|
||||
},
|
||||
"source": [
|
||||
"## Visualization utilities"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"cellView": "form",
|
||||
"id": "s3E6NFV-00Qt"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"#@markdown We implemented some functions to visualize the hand landmark detection results. <br/> Run the following cell to activate the functions.\n",
|
||||
"import mediapipe as mp\n",
|
||||
"import numpy as np\n",
|
||||
"\n",
|
||||
"mp_hands = mp.tasks.vision.HandLandmarksConnections\n",
|
||||
"mp_drawing = mp.tasks.vision.drawing_utils\n",
|
||||
"mp_drawing_styles = mp.tasks.vision.drawing_styles\n",
|
||||
"\n",
|
||||
"MARGIN = 10 # pixels\n",
|
||||
"FONT_SIZE = 1\n",
|
||||
"FONT_THICKNESS = 1\n",
|
||||
"HANDEDNESS_TEXT_COLOR = (88, 205, 54) # vibrant green\n",
|
||||
"\n",
|
||||
"def draw_landmarks_on_image(rgb_image, detection_result):\n",
|
||||
" hand_landmarks_list = detection_result.hand_landmarks\n",
|
||||
" handedness_list = detection_result.handedness\n",
|
||||
" annotated_image = np.copy(rgb_image)\n",
|
||||
"\n",
|
||||
" # Loop through the detected hands to visualize.\n",
|
||||
" for idx in range(len(hand_landmarks_list)):\n",
|
||||
" hand_landmarks = hand_landmarks_list[idx]\n",
|
||||
" handedness = handedness_list[idx]\n",
|
||||
"\n",
|
||||
" # Draw the hand landmarks.\n",
|
||||
" mp_drawing.draw_landmarks(\n",
|
||||
" annotated_image,\n",
|
||||
" hand_landmarks,\n",
|
||||
" mp_hands.HAND_CONNECTIONS,\n",
|
||||
" mp_drawing_styles.get_default_hand_landmarks_style(),\n",
|
||||
" mp_drawing_styles.get_default_hand_connections_style())\n",
|
||||
"\n",
|
||||
" # Get the top left corner of the detected hand's bounding box.\n",
|
||||
" height, width, _ = annotated_image.shape\n",
|
||||
" x_coordinates = [landmark.x for landmark in hand_landmarks]\n",
|
||||
" y_coordinates = [landmark.y for landmark in hand_landmarks]\n",
|
||||
" text_x = int(min(x_coordinates) * width)\n",
|
||||
" text_y = int(min(y_coordinates) * height) - MARGIN\n",
|
||||
"\n",
|
||||
" # Draw handedness (left or right hand) on the image.\n",
|
||||
" cv2.putText(annotated_image, f\"{handedness[0].category_name}\",\n",
|
||||
" (text_x, text_y), cv2.FONT_HERSHEY_DUPLEX,\n",
|
||||
" FONT_SIZE, HANDEDNESS_TEXT_COLOR, FONT_THICKNESS, cv2.LINE_AA)\n",
|
||||
"\n",
|
||||
" return annotated_image"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "83PEJNp9yPBU"
|
||||
},
|
||||
"source": [
|
||||
"## Download test image\n",
|
||||
"\n",
|
||||
"Let's grab a test image that we'll use later. The image is from [Unsplash](https://unsplash.com/photos/mt2fyrdXxzk)."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"id": "tzXuqyIBlXer"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"!wget -q -O image.jpg https://storage.googleapis.com/mediapipe-tasks/hand_landmarker/woman_hands.jpg\n",
|
||||
"\n",
|
||||
"import cv2\n",
|
||||
"from google.colab.patches import cv2_imshow\n",
|
||||
"\n",
|
||||
"img = cv2.imread(\"image.jpg\")\n",
|
||||
"cv2_imshow(img)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "u-skLwMBmMN_"
|
||||
},
|
||||
"source": [
|
||||
"Optionally, you can upload your own image. If you want to do so, uncomment and run the cell below."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"id": "etBjSdwImQPw"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# from google.colab import files\n",
|
||||
"# uploaded = files.upload()\n",
|
||||
"\n",
|
||||
"# for filename in uploaded:\n",
|
||||
"# content = uploaded[filename]\n",
|
||||
"# with open(filename, 'wb') as f:\n",
|
||||
"# f.write(content)\n",
|
||||
"\n",
|
||||
"# if len(uploaded.keys()):\n",
|
||||
"# IMAGE_FILE = next(iter(uploaded))\n",
|
||||
"# print('Uploaded file:', IMAGE_FILE)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {
|
||||
"id": "Iy4r2_ePylIa"
|
||||
},
|
||||
"source": [
|
||||
"## Running inference and visualizing the results\n",
|
||||
"\n",
|
||||
"Here are the steps to run hand landmark detection using MediaPipe.\n",
|
||||
"\n",
|
||||
"Check out the [MediaPipe documentation](https://developers.google.com/mediapipe/solutions/vision/hand_landmarker/python) to learn more about configuration options that this solution supports.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"id": "_JVO3rvPD4RN"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# STEP 1: Import the necessary modules.\n",
|
||||
"import mediapipe as mp\n",
|
||||
"from mediapipe.tasks import python\n",
|
||||
"from mediapipe.tasks.python import vision\n",
|
||||
"\n",
|
||||
"# STEP 2: Create an HandLandmarker object.\n",
|
||||
"base_options = python.BaseOptions(model_asset_path='hand_landmarker.task')\n",
|
||||
"options = vision.HandLandmarkerOptions(base_options=base_options,\n",
|
||||
" num_hands=2)\n",
|
||||
"detector = vision.HandLandmarker.create_from_options(options)\n",
|
||||
"\n",
|
||||
"# STEP 3: Load the input image.\n",
|
||||
"image = mp.Image.create_from_file(\"image.jpg\")\n",
|
||||
"\n",
|
||||
"# STEP 4: Detect hand landmarks from the input image.\n",
|
||||
"detection_result = detector.detect(image)\n",
|
||||
"\n",
|
||||
"# STEP 5: Process the classification result. In this case, visualize it.\n",
|
||||
"annotated_image = draw_landmarks_on_image(image.numpy_view(), detection_result)\n",
|
||||
"cv2_imshow(cv2.cvtColor(annotated_image, cv2.COLOR_RGB2BGR))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"id": "SE6_sPCXaX3g"
|
||||
},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"colab": {
|
||||
"collapsed_sections": [
|
||||
"h2q27gKz1H20"
|
||||
],
|
||||
"provenance": []
|
||||
},
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3 (ipykernel)",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.8.10"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 0
|
||||
}
|
||||
Reference in New Issue
Block a user