【Jetson-Nano学习笔记】Jetson_Inference
Published in:2024-09-24 | category: Jetson Nano
Words: 2.7k | Reading time: 11min | reading:

人体姿态检测的网络模型加载脚本

posenet.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#!/usr/bin/env python3
#
# Copyright (c) 2021, NVIDIA CORPORATION. All rights reserved.
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
#

import sys
import argparse

from jetson_inference import poseNet
from jetson_utils import videoSource, videoOutput, Log

# parse the command line
parser = argparse.ArgumentParser(description="Run pose estimation DNN on a video/image stream.",
formatter_class=argparse.RawTextHelpFormatter,
epilog=poseNet.Usage() + videoSource.Usage() + videoOutput.Usage() + Log.Usage())

parser.add_argument("input", type=str, default="", nargs='?', help="URI of the input stream")
parser.add_argument("output", type=str, default="", nargs='?', help="URI of the output stream")
parser.add_argument("--network", type=str, default="resnet18-body", help="pre-trained model to load (see below for options)")
parser.add_argument("--overlay", type=str, default="links,keypoints", help="pose overlay flags (e.g. --overlay=links,keypoints)\nvalid combinations are: 'links', 'keypoints', 'boxes', 'none'")
parser.add_argument("--threshold", type=float, default=0.15, help="minimum detection threshold to use")

try:
args = parser.parse_known_args()[0]
except:
print("")
parser.print_help()
sys.exit(0)

# load the pose estimation model
net = poseNet(args.network, sys.argv, args.threshold)

# create video sources & outputs
input = videoSource(args.input, argv=sys.argv)
output = videoOutput(args.output, argv=sys.argv)

# process frames until EOS or the user exits
while True:
# capture the next image
img = input.Capture()

if img is None: # timeout
continue

# perform pose estimation (with overlay)
poses = net.Process(img, overlay=args.overlay)

# print the pose results
print("detected {:d} objects in image".format(len(poses)))

for pose in poses:
print(pose)
print(pose.Keypoints)
print('Links', pose.Links)

# render the image
output.Render(img)

# update the title bar
output.SetStatus("{:s} | Network {:.0f} FPS".format(args.network, net.GetNetworkFPS()))

# print out performance info
net.PrintProfilerTimes()

# exit on input/output EOS
if not input.IsStreaming() or not output.IsStreaming():
break

sys

当然,以下是关于 sys 模块以及 sys.exit(0)sys.argv 的详细解释:

sys 模块

sys 是 Python 的一个内置模块,它提供了对解释器使用或维护的某些变量的访问,以及与解释器强烈相关的函数。这个模块包含了与 Python 解释器及其环境操作相关的功能。
以下是一些 sys 模块提供的常见功能:

  • 访问命令行参数 (sys.argv)
  • 控制解释器行为(例如,sys.exit()
  • 访问系统特定的参数和函数(例如,sys.platform
  • 捕获和处理异常(例如,sys.exc_info()

sys.exit([arg])

sys.exit() 是一个函数,用于从 Python 程序中退出。当你调用 sys.exit() 时,它会引发一个 SystemExit 异常。这个异常可以通过代码捕获,如果不被捕获,则会终止程序。
参数 arg 可以是以下之一:

  • 如果没有提供参数或参数为 None,则退出代码默认为 0,表示正常退出。
  • 如果提供了整数,则该整数将用作退出代码返回给调用环境。通常,退出代码 0 表示成功,非零值表示错误或特定类型的错误。
    在示例代码中,sys.exit(0) 用于在解析命令行参数失败时退出程序,返回代码 0 表示正常退出。

sys.argv

sys.argv 是一个列表,包含了命令行传递给 Python 脚本的参数。argv 是 “argument vector” 的缩写,它通常包含以下内容:

  • sys.argv[0]:脚本的名称(作为执行命令的一部分)。
  • sys.argv[1]:第一个命令行参数。
  • sys.argv[2]:第二个命令行参数。
  • …以此类推。
    例如,如果你从命令行运行以下命令:
    1
    python script.py arg1 arg2 arg3
    那么 sys.argv 将会是这样的列表:
    1
    ['script.py', 'arg1', 'arg2', 'arg3']
    在示例代码中,sys.argv 被传递给 argparse 解析器,以便它可以解析脚本名称后面的所有命令行参数。此外,sys.argv 也被传递给 videoSourcevideoOutput,这样它们就可以处理传递给它们的任何额外参数。

argparse

argparse 是 Python 标准库中的一个模块,它提供了一个方便的方式来解析命令行参数。这个模块使得编写用户友好的命令行接口变得简单。下面是关于 argparse 的详细解释:

为什么要使用 argparse

在命令行工具和脚本中,经常需要处理用户输入的参数。在没有 argparse 之前,开发者通常会使用 sys.argv 直接处理这些参数,但这种方法在参数类型多样、参数数量较多或者需要帮助信息和错误处理时变得复杂。argparse 模块提供以下功能:

  • 自动生成帮助信息和使用说明。
  • 支持不同类型的参数(如整数、浮点数、布尔值等)。
  • 支持默认值。
  • 生成错误信息并处理非法输入。

argparse 基础使用

以下是使用 argparse 的基本步骤:

  1. 导入模块
    1
    import argparse
  2. 创建解析器
    1
    parser = argparse.ArgumentParser(description='Process some integers.')
    这里 description 参数是可选的,但建议提供,因为它会在帮助信息中显示。
  3. 添加参数
    使用 add_argument() 方法添加参数。例如:
    1
    2
    3
    4
    5
    parser.add_argument('integers', metavar='N', type=int, nargs='+',
    help='an integer for the accumulator')
    parser.add_argument('--sum', dest='accumulate', action='store_const',
    const=sum, default=max,
    help='sum the integers (default: find the max)')
    • 'integers' 是参数的名字,它在命令行中使用。
    • metavar='N' 定义了在帮助信息中显示的参数名。
    • type=int 指定了参数应该被转换为整数。
    • nargs='+' 表示这个参数可以接收一个或多个值。
    • help='...' 提供了关于参数的简要说明。
  4. 解析参数
    1
    args = parser.parse_args()
    这将处理命令行参数并返回一个包含所有参数值的 Namespace 对象。
  5. 使用参数
    1
    print(args.accumulate(args.integers))
    在这个例子中,args.integers 包含了所有提供的整数,args.accumulate 是一个函数(summax),它将被应用到这些整数上。

高级功能

argparse 还提供了许多高级功能,比如:

  • 子命令:可以为程序定义多个子命令,每个子命令有自己的参数。
  • 互斥组:使用 argparseadd_mutually_exclusive_group() 方法可以创建一组参数,它们之间是互斥的。
  • 自定义动作:可以定义自定义动作来处理特定的参数。

示例

下面是一个简单的 argparse 使用示例:

1
2
3
4
5
6
7
8
9
10
11
import argparse
# 创建解析器
parser = argparse.ArgumentParser(description='示例脚本')
# 添加参数
parser.add_argument('filename', help='文件名')
parser.add_argument('--verbose', '-v', action='store_true', help='详细输出')
# 解析参数
args = parser.parse_args()
# 使用参数
if args.verbose:
print(f'处理文件:{args.filename}')

在命令行中,你可以这样调用这个脚本:

1
python script.py example.txt --verbose

或者使用简写形式:

1
python script.py example.txt -v

argparse 模块功能强大,能够帮助开发者快速构建出健壮、用户友好的命令行工具。

argparse 解析器配置

以下是对提供的 argparse 解析器配置的详细中文解释:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# 创建一个 ArgumentParser 对象,用于解析命令行参数。
# ArgumentParser 的参数描述如下:
parser = argparse.ArgumentParser(
description="Run pose estimation DNN on a video/image stream.", # 描述:这个脚本运行在视频/图像流上的姿态估计深度神经网络。
formatter_class=argparse.RawTextHelpFormatter, # 格式化类:使用 RawTextHelpFormatter 以保持帮助信息的原始文本格式。
epilog=poseNet.Usage() + videoSource.Usage() + videoOutput.Usage() + Log.Usage() # 结尾信息:显示 poseNet、videoSource、videoOutput 和 Log 的使用说明。
)
# 添加命令行参数,每个 add_argument 方法的参数解释如下:
# 输入流参数
parser.add_argument(
"input", # 参数名:input
type=str, # 参数类型:字符串
default="", # 默认值:空字符串
nargs='?', # 参数数量:0或1个,即这个参数是可选的
help="URI of the input stream" # 帮助信息:输入流的统一资源标识符(URI)
)
# 输出流参数
parser.add_argument(
"output", # 参数名:output
type=str, # 参数类型:字符串
default="", # 默认值:空字符串
nargs='?', # 参数数量:0或1个,即这个参数是可选的
help="URI of the output stream" # 帮助信息:输出流的统一资源标识符(URI)
)
# 网络模型参数
parser.add_argument(
"--network", # 参数名:network,前缀 '--' 表示这是一个可选参数
type=str, # 参数类型:字符串
default="resnet18-body", # 默认值:"resnet18-body"
help="pre-trained model to load (see below for options)" # 帮助信息:要加载的预训练模型(请参阅下面的选项)
)
# 覆盖层参数
parser.add_argument(
"--overlay", # 参数名:overlay
type=str, # 参数类型:字符串
default="links,keypoints", # 默认值:"links,keypoints"
help="""pose overlay flags (e.g. --overlay=links,keypoints)
valid combinations are: 'links', 'keypoints', 'boxes', 'none'""" # 帮助信息:姿态覆盖标志(例如:--overlay=links,keypoints)
# 合法的组合有:'links', 'keypoints', 'boxes', 'none'
)
# 阈值参数
parser.add_argument(
"--threshold", # 参数名:threshold
type=float, # 参数类型:浮点数
default=0.15, # 默认值:0.15
help="minimum detection threshold to use" # 帮助信息:要使用的最小检测阈值
)

这个配置为脚本定义了一系列命令行参数,用户可以通过这些参数来控制脚本的运行行为。以下是对每个参数的详细解释:

  • input:这是一个位置参数,用户必须提供输入流的URI,如果没有提供,则默认为空字符串。这个参数用于指定要处理的视频或图像流的来源。
  • output:这也是一个位置参数,用户可以提供输出流的URI,如果没有提供,则默认为空字符串。这个参数用于指定处理后的视频或图像流的目的地。
  • --network:这是一个可选参数,用于指定要加载的预训练模型。用户可以通过这个参数选择不同的网络模型来执行姿态估计。
  • --overlay:这是一个可选参数,用于指定在输出流上要显示的姿态覆盖层。用户可以选择显示链接、关键点、边界框或者不显示任何覆盖层。
  • --threshold:这是一个可选参数,用于设置检测姿态的最小阈值。只有当检测置信度高于这个阈值时,姿态才会被识别和显示。
    用户可以在命令行中按照以下格式提供这些参数:
    1
    python script.py input_stream_uri output_stream_uri --network model_name --overlay type --threshold value
    其中 input_stream_urioutput_stream_uri 是必须提供的,其他参数根据需要选择性地提供。
Prev:
用OpenCV写UI界面
Next:
Linux嵌入式QT开发