Skip to content

Latest commit

 

History

History

license_area_intrusion

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 

license_area_intrusion Demo

English | 简体中文

目录

1. 简介

本例程用于说明如何使用 sophon-stream 快速构建基于 yolov5 的车牌检测和基于 lprnet 的车牌识别,可以设置区域。

LPRNET 车牌检测源代码(https://github.com/sirius-ai/LPRNet_Pytorch)

本例程中,yolov5、lprnet 算法的前处理、推理、后处理均分别在三个 element 上进行运算,element 内部可以开启多个线程,保证了一定的检测效率。

2. 特性

  • 支持 BM1684X、BM1684(x86 PCIe、SoC)、BM1688(SoC)
  • 支持多路视频流
  • 支持多线程

3. 准备模型与数据

​ 在scripts目录下提供了相关模型和数据的下载脚本 download.sh

# 安装7z、unzip,若已安装请跳过,非ubuntu系统视情况使用yum或其他方式安装
sudo apt install p7zip
sudo apt install p7zip-full
sudo apt install unzip
chmod -R +x scripts/
./scripts/download.sh

脚本执行完毕后,会在当前目录下生成datasetmodels目录,其中,dataset存放车辆数据集,models存放 yolov5 和 lprnet 的模型文件。

下载的模型包括:

./models/
├── lprnet
│   ├── BM1684
│   │   ├── lprnet_fp32_1b.bmodel
│   │   ├── lprnet_int8_1b.bmodel
│   │   └── lprnet_int8_4b.bmodel
│   ├── BM1684X
│   │   ├── lprnet_fp16_1b.bmodel
│   │   ├── lprnet_fp32_1b.bmodel
│   │   ├── lprnet_int8_1b.bmodel
│   │   └── lprnet_int8_4b.bmodel
│   ├── BM1688
│   │   ├── lprnet_fp32_1b.bmodel
│   │   ├── lprnet_int8_1b.bmodel
│   │   └── lprnet_new_int8_4b_2core.bmodel
│   ├── onnx
│   │   ├── lprnet_1b.onnx
│   │   └── lprnet_4b.onnx
│   └── torch
│       ├── Final_LPRNet_model.pth
│       └── LPRNet_model.torchscript
└── yolov5s-licensePLate
    ├── BM1684
    │   ├── yolov5s_v6.1_license_3output_fp32_1b.bmodel
    │   ├── yolov5s_v6.1_license_3output_fp32_4b.bmodel
    │   └── yolov5s_v6.1_license_3output_int8_1b.bmodel
    ├── BM1684X
    │   ├── yolov5s_v6.1_license_3output_fp32_1b.bmodel
    │   ├── yolov5s_v6.1_license_3output_fp32_4b.bmodel
    │   └── yolov5s_v6.1_license_3output_int8_1b.bmodel
    └── BM1688
        ├── yolov5s_v6.1_license_3output_fp32_1b_2core.bmodel
        ├── yolov5s_v6.1_license_3output_fp32_1b.bmodel
        ├── yolov5s_v6.1_license_3output_fp32_4b_2core.bmodel
        ├── yolov5s_v6.1_license_3output_fp32_4b.bmodel
        ├── yolov5s_v6.1_license_3output_int8_1b_2core.bmodel
        ├── yolov5s_v6.1_license_3output_int8_1b.bmodel
        ├── yolov5s_v6.1_license_3output_int8_4b_2core.bmodel
        └── yolov5s_v6.1_license_3output_int8_4b.bmodel

模型说明:

以上 lprnet 模型移植于LNRNet_Pytorch , yolov5s-licensePLate 模型基于绿色车牌数据集训练。

下载的数据包括:

./datasets
├── coco.names
└── 1080_1920_5s.mp4 // 用于测试的车辆视频

4. 环境准备

4.1 x86/arm PCIe 平台

如果您在 x86/arm 平台安装了 PCIe 加速卡(如 SC 系列加速卡),可以直接使用它作为开发环境和运行环境。您需要安装 libsophon、sophon-opencv 和 sophon-ffmpeg,具体步骤可参考x86-pcie 平台的开发和运行环境搭建arm-pcie 平台的开发和运行环境搭建

4.2 SoC 平台

如果您使用 SoC 平台(如 SE、SM 系列边缘设备),刷机后在/opt/sophon/下已经预装了相应的 libsophon、sophon-opencv 和 sophon-ffmpeg 运行库包,可直接使用它作为运行环境。通常还需要一台 x86 主机作为开发环境,用于交叉编译 C++程序。

5. 程序编译

5.1 x86/arm PCIe 平台

可以直接在 PCIe 平台上编译程序,具体请参考sophon-stream 编译

5.2 SoC 平台

通常在 x86 主机上交叉编译程序,您需要在 x86 主机上使用 SOPHON SDK 搭建交叉编译环境,将程序所依赖的头文件和库文件打包至 sophon_sdk_soc 目录中,具体请参考sophon-stream 编译。本例程主要依赖 libsophon、sophon-opencv 和 sophon-ffmpeg 运行库包。

6. 程序运行

6.1 Json 配置说明

license_area_intrusion demo 中各部分参数位于 config 目录,结构如下所示:

./config
├── converger.json
├── decode.json
├── distributor_time_class.json
├── engine_group.json
├── engine.json
├── license_area_intrusion_demo.json
├── lprnet_group.json
└── yolov5_group.json

其中,license_area_intrusion.json是例程的整体配置文件,管理输入码流等信息。在一张图上可以支持多路数据的输入,channels 参数配置输入的路数,sample_interval 设置跳帧数,loop_num 设置循环播放次数,channel 中包含码流 url 等信息。

配置文件中不指定channel_id属性的情况,会在 demo 中对每一路数据的channel_id从 0 开始默认赋值。

{
    "channels": [
      {
        "channel_id": 0,
        "url": "../license_area_intrusion/data/test",
        "source_type": "IMG_DIR",
        "loop_num": 1,
        "fps": -1
      },
      {
        "channel_id": 1,
        "url": "../license_area_intrusion/data/test",
        "source_type": "IMG_DIR",
        "loop_num": 1,
        "fps": -1
      },
      {
        "channel_id": 2,
        "url": "../license_area_intrusion/data/test",
        "source_type": "IMG_DIR",
        "loop_num": 1,
        "fps": -1
      },
      {
        "channel_id": 3,
        "url": "../license_area_intrusion/data/test",
        "source_type": "IMG_DIR",
        "loop_num": 1,
        "fps": -1
      }
    ],
    "class_names": "../license_area_intrusion/data/coco.names",
    "download_image": true,
    "draw_func_name": "draw_license_area_intrusion_results",
    "engine_config_path": "../license_area_intrusion/config/engine_group.json"
}

engine.json包含对 graph 的配置信息,这部分配置确定之后基本不会发生更改。

需要注意,部署环境下的NPU等设备内存大小会显著影响例程运行的路数。如果默认的输入路数运行中出现了申请内存失败等错误,可以考虑把输入路数减少,即删除channels的部分元素,再进行测试。

在该文件内,需要初始化每个 element 的信息和 element 之间的连接方式。element_id 是唯一的,起到标识身份的作用。element_config 指向该 element 的详细配置文件地址,port_id 是该 element 的输入输出端口编号,多输入或多输出的情况下,输入/输出编号也不可以重复。is_src 标志当前端口是否是整张图的输入端口,is_sink 标识当前端口是否是整张图的输出端口。 connection 是所有 element 之间的连接方式,通过 element_id 和 port_id 确定。

lprnet_pre.json等配置文件是对具体某个 element 的配置细节,设置了模型参数、动态库路径、阈值等信息。该配置文件不需要指定id字段和device_id字段,例程会将engine.json中指定的element_iddevice_id传入。其中,thread_numberelement内部的工作线程数量,一个线程会对应一个数据队列,多路输入情况下,需要合理设置数据队列数目,来保证线程工作压力均匀且合理。

{
    "configure": {
        "model_path": "../license_area_intrusion/models/lprnet/BM1684X/lprnet_fp32_1b.bmodel",
        "stage": [
            "pre"
        ]
    },
    "shared_object": "../../build/lib/liblprnet.so",
    "name": "lprnet",
    "side": "sophgo",
    "thread_number": 1
}

filter.json等配置文件是对具体某个element的配置细节,设置了模型参数、动态库路径、阈值等信息。该配置文件不需要指定id字段和device_id字段,例程会将engine.json中指定的element_iddevice_id传入。 其中,thread_number是element内部的工作线程数量,一个线程会对应一个数据队列,多路输入情况下,需要合理设置数据队列数目,来保证线程工作压力均匀且合理。 具体请参考filter.json

{
  "configure": {
    "rules": [
      {
        "channel_id": 0,
        "filters": [
          {
            "alert_first_frames": 0,
            "alert_frame_skip_nums": 10000,
            "areas": [
              [
                {
                  "left": 1000,
                  "top": 0
                },
                {
                  "left": 1000,
                  "top": 1080
                }
              ]
            ],
            "classes": [
              0
            ],
            "times": [
              {
                "time_start": "00 00 00",
                "time_end": "23 59 59"
              }
            ],
            "type": 1
          }
        ]
      }
    ]
  },
  "shared_object": "../../build/lib/libfilter.so",
  "name": "filter",
  "side": "sophgo",
  "thread_number": 1
}

6.2 运行

对于 PCIe 平台,可以直接在 PCIe 平台上运行测试;对于 SoC 平台,需将交叉编译生成的动态链接库、可执行文件、所需的模型和测试数据拷贝到 SoC 平台中测试。

SoC 平台上,动态库、可执行文件、配置文件、模型、视频数据的目录结构关系应与原始 sophon-stream 仓库中的关系保持一致。

测试的参数及运行方式是一致的,下面主要以 PCIe 模式进行介绍。

  1. 运行可执行文件,注意给出区域
./main --demo_config_path=../license_area_intrusion/config/license_area_intrusion_demo.json

推理结果保存在/build/results路径下。

关闭图片保存时,1684X PCIe上推理 1 路图片运行结果如下,PCIe上的性能由于CPU的不同可能存在较大差异:

 total time cost 24724501 us.
frame count is 5007 | fps is 202.512 fps.

7. 性能测试

本例程只供流程参考,暂无最佳性能数据。

8. 使用application-web可视化

1.克隆 https://github.com/sophgo/application-web

2.根据application-web/README.md将application-web部署

3.参考web_server搭建应用层程序

cd ../../tools/web_server
bash start_server.sh

5.通过application-web下发任务,启动任务