Skip to content

Commit

Permalink
Merge pull request #9 from gakki2019/main
Browse files Browse the repository at this point in the history
Add more example description
  • Loading branch information
gakki2019 authored Feb 7, 2025
2 parents 0441a5a + 165bf6b commit d81b13f
Showing 1 changed file with 244 additions and 33 deletions.
277 changes: 244 additions & 33 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,16 +65,16 @@ Python >= 3.9 64bit

### 推理

模型推理示例 sample_engine.py ,命令参数说明如下:
模型推理示例 [sample_engine.py](./sample/engine/sample_engine.py) ,命令参数说明如下:

| 命令参数 | 参数说明 | 是否强制 |
| -------------- | -------------------------------------------------- | -------- |
| -m, --model | 模型文件路径 | |
| -v, --vnpu | VNPU类型,默认0 | |
| -w, --warmup | 模型warmup次数,默认1 | |
| -r, --repeat | 模型运行次数,默认5 | |
| ---d, --device | 选择设备号,可选。不指定则默认选择连接的第一个设备 | |
| --json | 指定`axcl.json`配置文件,默认不指定 | |
| 命令参数 | 参数说明 | 必选 |
| -------------- | -------------------------------------------------- | ---- |
| -m, --model | 模型文件路径 ||
| -v, --vnpu | VNPU类型,默认0 | |
| -w, --warmup | 模型warmup次数,默认1 | |
| -r, --repeat | 模型运行次数,默认5 | |
| ---d, --device | 选择设备号,可选。不指定则默认选择连接的第一个设备 | |
| --json | 指定`axcl.json`配置文件,默认不指定 | |

```bash
[axera@localhost]$ python sample/engine/sample_engine.py -m yolov5s.axmodel -r 100
Expand All @@ -99,18 +99,27 @@ Python >= 3.9 64bit

### 解码

sample_vdec.py 示例程序将H264和H265码流解码输出NV12图片,命令参数说明如下:

| 命令参数 | 参数说明 | 是否强制 |
| ------------- | ------------------------------------------------------------ | -------- |
| -i, --input | 仅支持AnnexB格式H264和H265 raw码流,**不支持封装格式,比如mp4等** ||
| --width | 输入视频码流的宽度 ||
| --height | 输入视频码流的高度 ||
| --fps | 输入视频码流的帧率 ||
| h264, h265 | 码流格式 ||
| --d, --device | 选择设备号,可选。不指定则默认选择连接的第一个设备 | |
| --dump | 将解码后的NV12图片保存到本地。0(默认): 仅解码不保存,-1: 全部保存, > 0: 指定保存的图片帧数 | |
| --json | 指定`axcl.json`配置文件,默认不指定 | |
[sample_vdec.py](./sample/vdec/sample_vdec.py) 示例程序将H264和H265码流解码输出NV12图片,命令参数说明如下:

| 命令参数 | 参数说明 | 必选 |
| ------------- | ------------------------------------------------------------ | ---- |
| -i, --input | 仅支持**Annex B**格式H264和H265 **raw**码流,**不支持封装格式,比如mp4等** ||
| --width | 输入视频码流的宽度 ||
| --height | 输入视频码流的高度 ||
| --fps | 输入视频码流的帧率 ||
| h264, h265 | 码流格式 ||
| --d, --device | 选择设备号,可选。不指定则默认选择连接的第一个设备 | |
| --dump | 将解码后的NV12图片保存到本地。0(默认): 仅解码不保存,-1: 全部保存, > 0: 指定保存的图片帧数 | |
| --json | 指定`axcl.json`配置文件,默认不指定 | |

> [!NOTE]
>
> sample_vdec.py不支持mp4等格式解封装,只支持简单的Annex B格式码流的帧边界解析,因此若mp4封装格式,建议用ffmpeg解封装并转成Annex B格式码流,参考如下:
>
> ```bash
> ffmpeg -i input.mp4 -c:v copy -bsf:v h264_mp4toannexb -an output.h264
> ffmpeg -i input.mp4 -c:v copy -bsf:v hevc_mp4toannexb -an output.h265
> ```

**示例** : 解码`bangkok_30952_1920x1080_30fps_gop60_4Mbps.264`并保存前10帧图像。

Expand All @@ -133,18 +142,18 @@ device 05: /tmp/axcl/dump_chn1_decoded_2048x1080.nv12.yuv is saved

### 编码

sample_venc.py 示例程序将NV12图片编码成码流,命令参数说明如下:
[sample_venc.py](./sample/venc/sample_venc.py) 示例程序将NV12图片编码成码流,命令参数说明如下:

| 命令参数 | 参数说明 | 是否强制 |
| ------------- | ------------------------------------------------------ | -------- |
| -i, --input | 输入待编码的NV12图片 | |
| --width | 输入图片宽度 | |
| --height | 输入图片高度 | |
| --fps | 码流帧率 | |
| h264, h265 | 输出码流格式 | |
| --d, --device | 选择设备号,可选。不指定则默认选择连接的第一个设备 | |
| --dump | 将编码后的码流保存到本地,0(默认):不保存, 1: 保存 | |
| --json | 指定`axcl.json`配置文件,默认不指定 | |
| 命令参数 | 参数说明 | 必选 |
| ------------- | ------------------------------------------------------------ | ---- |
| -i, --input | 输入待编码的图像文件,该文件包含若干帧相同尺寸的NV12格式图像 ||
| --width | 输入图片宽度 | |
| --height | 输入图片高度 | |
| --fps | 码流帧率 | |
| h264, h265 | 输出码流格式 | |
| --d, --device | 选择设备号,可选。不指定则默认选择连接的第一个设备 | |
| --dump | 将编码后的码流保存到本地,0(默认):不保存, 1: 保存 | |
| --json | 指定`axcl.json`配置文件,默认不指定 | |

**示例** : 将100NV12图片编码成H265码流。

Expand All @@ -153,13 +162,215 @@ sample_venc.py 示例程序将NV12图片编码成码流,命令参数说明如
============== sample venc started ==============
device 05: set venc buf size to 3317760
device 05: veChn 0 is created
device 05: veChn 0 is started
device 05: veChn 0 is started 8
device 05: veChn 0 is stopped
device 05: veChn 0 is destroyed
device 05: /tmp/axcl/dump_encoded.h265 is saved
============== sample venc exited ==============
```

### 转码

[sample_transcode.py](./sample/ppl/transcode/sample_transcode.py) 示例下图转码业务场景:

![](https://axcl-docs.readthedocs.io/zh-cn/latest/_images/transcode_ppl.png)

> [!NOTE]
>
> - sample仅包含解码,缩放和编码流程,不包含拉流和推流;
> - sample编码固定输出和源视频相同宽高的H265码流。

| 命令参数 | 参数说明 | 必选 |
| ------------- | ------------------------------------------------------------ | ---- |
| -i, --input | 仅支持**Annex B**格式H264和H265 **raw**码流,**不支持封装格式,比如mp4等** ||
| --width | 输入视频码流的宽度 ||
| --height | 输入视频码流的高度 ||
| --fps | 输入视频码流的帧率 ||
| h264, h265 | 码流格式 ||
| --d, --device | 选择设备号,可选。不指定则默认选择连接的第一个设备 | |
| --dump | 将编码后的码流保存到本地,0(默认):不保存, 1: 保存 | |
| --json | 指定`axcl.json`配置文件,默认不指定 | |

**示例** : 解码`bangkok_30952_1920x1080_30fps_gop60_4Mbps.264`转码输出1920x1080@30fps H265码流。

```bash
[axera@localhost]$ python sample/ppl/transcode/sample_transcode.py -i ./bangkok_30952_1920x1080_30fps_gop60_4Mbps.264 --width 1920 --height 1080 h264 --fps 30 --dump 1
============== sample transcode started ==============
device 05: vdGrp 0 vdChn 0 is disabled
device 05: vdGrp 0 vdChn 1 is enabled
device 05: vdGrp 0 vdChn 2 is disabled
device 05: vdGrp 0 is created
device 05: set venc buf size to 3110400
device 05: veChn 0 is created
device 05: ivGrp 0 is created
device 05: veChn 0 is started
device 05: ivGrp 0 is started
device 05: vdGrp 0 is started
device 05: reach annexB stream eof
device 05: dispatch NAL end
device 05: total recv frames 470, decoded 470
device 05: vdGrp 0 is stopped
device 05: ivGrp 0 is stopped
device 05: veChn 0 is stopped
device 05: ivGrp 0 is destroyed
device 05: veChn 0 is destroyed
device 05: vdGrp 0 is destroyed
device 05: /tmp/axcl/dump_transcode.h265 is saved
```



### IVPS

[sample_ivps.py](./sample/sample_ivps.py) 示例对单帧图像进行裁剪缩放和颜色空间转换功能。

| 命令参数 | 参数说明 | 必选 |
| -------------- | ------------------------------------------------------------ | ---- |
| -i, --input | 输入NV12单帧图像 ||
| -c, --case | 功能选项:`crop_resize``csc` ||
| --width | 输入图像宽度 ||
| --height | 输入图像高度 ||
| -s, --src_type | 输入图像格式,可选项:nv12/nv21/rgb888/bgr888/rgb565/argb8888/rgba8888, 默认nv12 | |
| -t, --dst_type | 输出图像格式,可选项:nv12/nv21/rgb888/bgr888/rgb565/argb8888/rgba8888, 默认nv12 | |
| -e, --engine | 指定硬件引擎,可选项:vgp/vpp/tdp, 默认vgp | |
| -v, --version | 指定接口版本,可选项:1/2/3/4, 默认1 | |
| -o, --output | 输出图像路径,默认:*/tmp/axcl/data/output* | |
| --d, --device | 选择设备号,可选。不指定则默认选择连接的第一个设备 | |
| --json | 指定`axcl.json`配置文件,默认不指定 | |

#### 示例1 - 裁剪缩放

```
[axera@localhost]$ python sample/ivps/sample_ivps.py -i ./1920x1080.nv12.yuv -c crop_resize --width 1920 --height 1080 -e vgp -v 1
============== sample ivps started ==============
cmd args: device id=0, json=/usr/bin/axcl/axcl.json
crop_resize_vgp operation completed successfully
store file '/tmp/axcl/data/output/crop_resize_vgp_output_image_960x540.nv12' successfully.
============== sample ivps exited ==============
```

#### 示例2 - NV12转换成RGB888

```
[axera@localhost]$ python sample/ivps/sample_ivps.py -i ./1920x1080.nv12.yuv -c csc --width 1920 --height 1080 -e vgp --src_type nv12 --dst_type bgr888
============== sample ivps started ==============
cmd args: device id=0, json=/usr/bin/axcl/axcl.json
csc_vgp operation completed successfully
store file '/tmp/axcl/data/output/csc_vgp_output_image_1920x1080.bgr888' successfully.
```

> [!NOTE]
>
> IVPS硬件RGB的字节序定义参考SDK的头文件`ax_global_type.h`说明,若输出RGB图像,--dst_type配置bgr888
>
> ```c
> AX_FORMAT_RGB888 = 0xA1, /* BGRBGR..., RGB888 24bpp */
> AX_FORMAT_BGR888 = 0xA5, /* RGBRGB..., BGR888 32bpp */
> ```



### IVE

[sample_ive.py](./sample/ive/sample_ive.py) 示例部分IVE算子:

- dma:DMA拷贝实现灰度图的拷贝
- filter: 滤波
- gmm2:背景建模,输出前景和背景图像
- cropresize:对输入图像裁剪放大

#### 示例1 - DMA实现灰度图拷贝

```bash
[axera@localhost]$ python sample/ive/sample_ive.py -c 0 -i ./1280x720_u8c1_gray.yuv --width 1280 --height 720
============== sample ive started ==============
cmd args: device id=0, json=/usr/bin/axcl/axcl.json
dma operation completed successfully.
return handle: 1
dst: {'phy_addr': 5523177472, 'vir_addr': 0, 'stride': 1280, 'width': 1280, 'height': 720, 'reserved': 0}
store file '/tmp/axcl/data/output/out_dma_1280x720_u8c1_gray.yuv' successfully.
============== sample ive exited ==============
```

#### 示例2 - 灰度图滤波

```bash
[axera@localhost]$ python sample/ive/sample_ive.py -c 1 -i ./1280x720_u8c1_gray.yuv --width 1280 --height 720
============== sample ive started ==============
cmd args: device id=0, json=/usr/bin/axcl/axcl.json
dma operation completed successfully.
return handle: 1
dst: {'phy_addr': [5523177472, 0, 0], 'vir_addr': [0, 0, 0], 'stride': [1280, 1280, 0], 'width': 1280, 'height': 720, 'type': 0}
store file '/tmp/axcl/data/output/out_filter_1280x720_u8c1_gray.yuv' successfully.
============== sample ive exited ==============
```

#### 示例3 - GMM2背景建模

```
[axera@localhost]$ python sample/ive/sample_ive.py -c 2 -i ./1280x720_u8c1_gray.yuv --width 1280 --height 720 --model ./gmm_gray_1280x720_model.bin
============== sample ive started ==============
cmd args: device id=0, json=/usr/bin/axcl/axcl.json
dma operation completed successfully.
return handle: 1
dst_fg: {'phy_addr': [5567414272, 0, 0], 'vir_addr': [0, 0, 0], 'stride': [1280, 1280, 0], 'width': 1280, 'height': 720, 'type': 0}
dst_bg: {'phy_addr': [5568335872, 0, 0], 'vir_addr': [0, 0, 0], 'stride': [1280, 1280, 0], 'width': 1280, 'height': 720, 'type': 0}
store file '/tmp/axcl/data/output/out_gmm2_fg_1280x720_u8c1_gray.yuv' successfully.
store file '/tmp/axcl/data/output/out_gmm2_bg_1280x720_u8c1_gray.yuv' successfully.
============== sample ive exited ==============
```

#### 示例4 - NV12图像裁剪[0, 0, 640, 360]区域并放大

```bash
[axera@localhost]$ python sample/ive/sample_ive.py -c 3 -e 2 -t 3 -i ./1280x720_nv12.yuv --width 1280 --height 720
============== sample ive started ==============
cmd args: device id=0, json=/usr/bin/axcl/axcl.json
dma operation completed successfully.
return handle: 65535
dst: [{'phy_addr': [5523640320, 0, 0], 'vir_addr': [0, 0, 0], 'stride': [1280, 1280, 0], 'width': 1280, 'height': 720, 'glb_type': 3}]
store file '/tmp/axcl/data/output/out_crop_resize_1280x720_nv12.yuv' successfully.
============== sample ive exited ==============
```



### DMA

[sample_dmadim.py](./sample/dmadim/sample_dmadim.py) 示例如下子功能:

- copy:设备侧4M物理内存拷贝
- memset:将设备侧4M内存初始化为0xAA
- checksum:计算checksum
- crop:使用DMA 2D拷贝功能实现裁剪NV12图像的[x = 0, y = 0, w = 1/2, h = 1/2] 区域

| 命令参数 | 参数说明 | 必选 |
| ------------- | --------------------------------------------------- | ---- |
| -i, --input | 输入1NV12图像 ||
| --width | NV12图像宽度 ||
| --height | NV12图像高度 ||
| -o, --output | 指定裁剪图像保存路径,默认:*/tmp/axcl/data/output* | |
| --d, --device | 选择设备号,可选。不指定则默认选择连接的第一个设备 | |
| --json | 指定`axcl.json`配置文件,默认不指定 | |

**示例:**

```bash
[axera@localhost]$ python sample/dmadim/sample_dmadim.py -i 1920x1080.nv12.yuv --width 1920 --height 1080
============== sample dmadim started ==============
cmd args: device id=0, json=/usr/bin/axcl/axcl.json
memory [0]: device 0x14926f000
memory [1]: device 0x14966f000
dma_copy: compare dev memory[0] 0x14926f000 and dev memory[1] 0x14966f000 successfully
memory : device 0x14926f000
dma_memset: memset 0x14926f000 operation completed successfully.
memory : device 0x14926f000
dma_checksum: checksum: 0xaaa00000 successfully
dma_copy2d: mem_copy_xd operation completed successfully
store file '/tmp/axcl/data/output/dma2d_output_image_960x540.nv12' successfully.
============== sample dmadim exited ==============
```



## 关联项目
Expand Down

0 comments on commit d81b13f

Please sign in to comment.