인턴/LPR(번호판 인식)

[DoubangoTelecom] ultimateALPR SDK - Jetson.md 해석(Jetson과 Jetson_tftrt 차이)

용성군 2021. 7. 25. 00:51
728x90
반응형

이 문서는 일반적으로 NVIDIA TensorRT에 관한 것이지만 NVIDIA Jetson 장치 (TX1, TX2, Nano, Xavier AGX / NX ...)에 중점을 둡니다.

 

버전 3.1.0부터 NVIDIA TensorRT 및 TF-TRT를 사용하는 NVIDIA Jetson 장치에 대한 Full GPGPU 가속을 지원합니다.

  • SDK는 NVIDIA의 최신 버전 인 JetPack 4.4.1을 사용하여 테스트되었으며 다른 버전은 지원하지 않습니다.
  • 이 저장소에는 binaries / jetson 및 binaries / jetson_tftrt의 두 가지 바이너리 세트가 있습니다.

시작하기

위에서 설명한 대로 NVIDIA TensorRT와 TF-TRT를 모두 사용합니다.

 

  • NVIDIA TensorRT는 다음 용도로 사용됩니다.
    • 번호판 및 자동차 감지
    • 번호판 국가 식별(LPCI)
    • 차량 색상 인식(VCR)
    • 차량 제조사 모델 인식(VMMR)
    • 차체 스타일 인식(VBSR)
    • 차량 방향 추적(VDT)
    • 차량 속도 추정(VSE)
  •  TF-TRT는 다음 용도로 사용됩니다.
    • 번호판 인식(LPR)

NVIDIA TensorRT는 Jetpack으로 플래시된 모든 Jetson 장치에서 기본적으로 지원되는 반면 TF-TRT는 TensorRT를 지원하는 TensorFlow 바이너리가 필요합니다. TensorRT를 지원하는 Tensorflow를 직접 구축하는 것에 대해 걱정할 필요가 없습니다. 이 저장소에는 필요한 모든 바이너리가 포함되어 있습니다.

 

요구 사항

CUDA 10.2, cuDNN 8.0 및 TensorRT 7+가 필요합니다. 더 편리하게 사용하려면 JetPack 4.4.1을 설치하기만 하면됩니다. 오늘 (2020 년 11 월 16 일) 현재 버전 4.4.1이 최신 버전입니다.

 

Jetson에서 SDK를 사용하기 전에

이 저장소에는 최적화 된 TensorRT 모델이 포함되어 있지 않으며 이러한 모델을 생성하지 않으면 SDK를 사용할 수 없습니다. https://docs.nvidia.com/deeplearning/tensorrt/developer-guide/index.html에서 모델 최적화에 대한 자세한 정보를 확인하십시오. 다행히 우리는 TensorRT C ++를 사용하여 최적화 프로그램을 작성함으로써 이 작업을 매우 쉽게 만들었습니다.

 

최적화 된 모델 구축

이 프로세스는 최적화된 모델 (aka. plans)을 로컬 디스크에 기록하므로 쓰기 권한이 필요합니다. 일반 사용자 ($) 대신 root (#)로 다음 명령을 실행하는 것이 좋습니다. 최적화 된 모델을 생성하려면 :

 

  • jetson 바이너리 폴더로 이동합니다 : cd ultimateALPR-SDK / binaries / jetson / aarch64
    또는 cd ultimateALPR-SDK / binaries / jetson_tftrt / aarch64
  • 최적화 된 모델 생성 : sudo chmod + x ./prepare.sh && sudo ./prepare.sh

그러면 CUDA 엔진을 사용하여 모델을 빌드하고 최적화된 모델을 assets / models.tensorrt / optimized로 직렬화합니다. 작업은 몇 분 동안 지속되며 인내심을 가지고 기다려야 합니다. 다음에 이 작업을 실행하면 최신 모델만 생성되므로 더 빠릅니다. 따라서 프로세스를 중단 할 수 있으며 다음에 마지막으로 종료 된 위치에서 계속됩니다.

 

바이너리/jetson_tftrt의 경우 prepare.sh 스크립트는 Tensorflow 라이브러리도 다운로드하므로 인터넷 연결이 필요합니다. 스크립트를 한 번만 실행하면 됩니다.

 

Compute Capabilities X 및 TensorRT 버전 Y가있는 Jetson 장치에서 생성 된 모델은이 구성과 일치하는 장치에서만 사용할 수 있습니다. 예를 들어 Jetson nano (Compute Capabilities 5.3)의 Jetson TX2 (Compute Capabilities 6.2)에서 생성 된 모델을 사용할 수 없습니다.

 

binaries / jetson VS binaries / jetson_tftrt

바이너리로 이동하면 2 개의 'jetson'폴더 (binaries / jetson 및 binaries / jetson_tftrt)가 있음을 알 수 있습니다.

 

간단히 말해서 : 두 버전 모두 감지 및 분류를 위해 NVIDIA TensorRT GPGPU 가속을 사용하는 반면 binaries / jetson_tftrt 만 LPR (License Plate Recognition) (일명 OCR)에 GPGPU 가속을 사용합니다.

binaries / jetson은 GPU에서 감지 및 분류를 수행하고 CPU에서 인식 / OCR을 수행하므로 병렬 모드가 활성화되면 매우 빠릅니다. binaries / jetson_tftrt는 모든 작업 (감지, 분류, OCR ...)이 GPU에서 수행되므로 더 빠릅니다.

현재 LPR (License Plate Recognition) 모델을 NVIDIA TensorRT로 변환하는 데 실패했으며, 이것이 큰 바이너리 크기, 높은 메모리 사용량, 느린로드 및 초기화와 같은 많은 문제를 가지고 있는 TF-TRT를 사용하는 이유입니다. 모든 모델에 대해 NVIDIA TensorRT를 사용하고 Tensorflow를 완전히 제거하기 위해 노력하고 있습니다.

 

장점과 단점

  • binaries/jetson
    • 장점 :
      낮은 메모리 사용량 (Jetson Nano에서 최대 20 %)
      빠른로드 및 초기화
    • 단점 :
      높은 CPU 사용량 (Jetson Nano 400 % 중 300 % 이상)
      이미지에 번호판이 있으면 프레임 속도를 낮춥니다. LPR (License Plate Recognition)은 GPGPU 가속이 되지 않습니다.
  •  binaries/jetson_tftrt
    • 장점 :
      • 낮은 CPU 사용량 (Jetson Nano 400 % 중 100 % 미만)
      • 이미지에 번호판이있을 때 더 높은 프레임 속도. LPR (License Plate Recognition)은 TF-TRT를 사용하여 GPGPU 가속화됩니다.
    •  단점 :
      • 높은 메모리 사용량 (Jetson Nano에서 최대 50 %). TF-TRT 바이너리는> 500Mo이며 이것은 도움이되지 않습니다.
      • 느린 로드 및 초기화. 현재로서는 TF-TRT를 사용하여 OCR 부품에 최적화 된 모델을 생성 할 수 없으며 모델은 추론 전에 런타임에 구축되고 최적화됩니다.

GPU 및 CPU 사용량을 확인하려면 : / usr / bin / tegrastats

Recommendation

매우 빠르게로드되고 프로덕션을 위해 binaries / jetson_tftrt로 전환하므로 개발자를 위해 binaries / jetson을 사용하는 것이 좋습니다. binaries / jetson_tftrt는로드 및 초기화 속도가 느릴 수 있지만 완료되면 프레임 속도가 더 높습니다.


Jetson Xavier AGX에서 binaries/jetson은 binaries / jetson_tftrt보다 빠를 수 있습니다. 이유는 issue #128을 확인하세요

binaries/jetson이 여전히 로드 및 초기화 속도가 느린 경우 Tensorflow Lite를 사용하는 매우 가벼운 바이너리 인 binaries/linux/aarch64를 사용하십시오 (총 크기가 13Mo 미만).

BenchMark

다음은 속도를 비교하기위한 몇 가지 벤치 마크 수치입니다. 긍정적 인 비율에 대한 자세한 내용은 https://www.doubango.org/SDKs/anpr/docs/Benchmark.html을 확인하십시오. 벤치 마크 애플리케이션은 오픈 소스이며 samples / c ++ / benchmark에서 찾을 수 있습니다.

벤치 마크 애플리케이션을 실행하기 전에 :

- Jetson nano의 경우 microUSB 포트 (5V-2A) 대신 배럴 잭 (5V-4A) 전원 공급 장치를 사용하고 있는지 확인하십시오.
- 장치를 최대 성능 모드로 설정 : sudo nvpmodel -m 0 && sudo jetson_clocks.

 

100 루프에 대해 0.2 양의 비율로 binaries / jetson에 대한 벤치 마크 애플리케이션을 실행하려면 다음을 수행하십시오.

cd ulatimateALPR-SDK/binaries/jetson/aarch64
chmod +x benchmark
LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ./benchmark \
    --positive ../../../assets/images/lic_us_1280x720.jpg \
    --negative ../../../assets/images/london_traffic.jpg \
    --assets ../../../assets \
    --charset latin \
    --loops 100 \
    --rate 0.2 \
    --parallel true

 

binaries / jetson 및 binaries / jetson_tftrt는 양수 속도가 0.0 (스트림에 번호 없음) 일 때 동일한 fps를 갖지만 속도가 증가하면 간격이 넓어집니다 (스트림에 번호판이 더 많음). 이는 둘 다 NVIDIA TensorRT를 사용하여 번호판과 자동차 감지를 가속화하지만 binaries / jetson_tftrt 만 LPR (License Plate Recognition)에 GPGPU 가속을 사용한다는 사실로 설명 할 수 있습니다 (TF-TRT 덕분에).

binaries / linux / aarch64에는 AArch64 (a.k.a ARM64) 장치 용 일반 Linux 바이너리가 포함되어 있습니다. 모든 작업은 CPU에서 수행됩니다. 이 CPU 전용 버전과 Jetson 기반 버전 간의 성능 향상은 인상적이지 않을 수 있지만 좋은 이유가 있습니다. binaries / linux / aarch64는 INT8 추론을 사용하는 반면 Jetson 기반 버전은 더 정확한 FP32와 FP16을 혼합하여 사용합니다. Jetson 장치 용 INT8 모델을 제공하는 것은 ETA가없는 로드맵에 있습니다.

Jetson nano 대 Raspberry Pi 4

평균적으로 SDK는 Raspberry Pi 4에 비해 Jetson nano에서 3 배 더 빠르며 이는 인상적이지 않지만 좋은 이유가 있습니다. binaries / raspbian / armv7l은 INT8 추론을 사용하는 반면 Jetson 기반 바이너리 (binaries / jetson 및 binaries / jetson_tftrt)는 FP32와 FP16을 혼합하여 사용하므로 더 정확합니다. Jetson 장치 용 INT8 모델을 제공하는 것은 ETA가없는 로드맵에 있습니다.

Jetson Xavier NX 대 Jetson TX2

Jetson Xavier NX와 Jetson TX2는 같은 가격 (399 달러)으로 제안되지만 NX는 FP16 용 TX2보다 4.6 배 더 많은 컴퓨팅 성능을 제공합니다. 1.3TFLOPS에 비해 6TFLOPS입니다.

TX2 대신 Xavier NX를 사용하는 것이 좋습니다.

전처리 작업

binaries / jetson_tftrt를 사용하는 경우에도 일부 전처리 작업이 CPU에서 수행되므로 CPU 사용량이 1/5입니다. 이러한 작업에 대해 걱정할 필요가 없습니다. 대규모 다중 스레드이며 SIMD NEON 가속을 사용하는 어셈블러로 완전히 작성되었습니다. 이러한 기능은 오픈 소스이며 다음에서 찾을 수 있습니다.

 

  • Normalization : compv_math_op_sub_arm64_neon.S
  • Chroma Conversion (YUV-> RGB) : compv_image_conv_to_rgbx_arm64_neon.S
  • Type conversion (UINT8-> FLOAT32) : compv_math_cast_arm64_neon.S
  • Packing / Unpacking : compv_mem_arm64_neon.S
  • Scaling : compv_image_scale_bilinear_arm64_neon.S
  • ...

다음 업데이트 예정

버전 3.1.0은 NVIDIA Jetson을 지원하는 첫 번째 배포이며 최적화의 여지가 있습니다. Full INT8 추론에 대한 지원을 추가하면 속도가 최대 700% 향상될 수 있습니다. 또한 NMS 계층을 GPU에서 CPU로 이동하고 NEON SIMD를 사용하여 어셈블러에서 코드를 다시 작성할 계획입니다.

알려진 문제 및 가능한 수정 사항

파일을 열지 못하는 문제

로컬 디스크에 쓰는 데 실패하면 ./prepare.sh 스크립트를 실행한 후 [UltAlprSdkTRT] 파일을 열지 못했습니다 오류가 표시될 수 있습니다. 일반 사용자($) 대신 root(#)로 스크립트를 실행하는 것을 권장합니다.

느린 로드 및 초기화

바이너리/jetson_tftrt를 사용하는 경우 추론을 실행하기 전에 런타임에 CUDA 엔진을 사용하여 OCR 모델을 빌드합니다. 모델 구축은 매우 느리고 개발 단계에서는 적합하지 않습니다. 매우 빠르게 로드되고 프로덕션을 위해 binaries/jetson_tftrt로 전환하므로 개발자용 바이너리/jetson을 사용하는 것이 좋습니다. binaries/jetson_tftrt는 로드 및 초기화 속도가 느릴 수 있지만 완료되면 프레임 속도가 더 높아집니다.

높은 메모리 사용량

병렬 모드만 비활성화하면 메모리 사용량을 50%까지 줄일 수 있습니다. 물론 병렬 모드를 비활성화하면 프레임 속도가 최대 60%까지 느려집니다.

binaries/jetson_tftrt는 더 빠른 버전이지만 매우 큰(>500Mo) TF-TRT에 따라 다릅니다. 매우 작은(총 크기가 13Mo 미만인) 바이너리/jetson으로 시도하십시오.

높은 CPU 사용량

binaries/jetson은 OCR 부분에 CPU를 사용합니다. CPU 사용량을 크게 줄이려면 완전한 GPGPU 가속을 위해 binaries/jetson_tftrt를 사용하십시오.

기술적인 질문

토론 그룹이나 트위터 계정을 확인하세요.

 

원문

https://github.com/DoubangoTelecom/ultimateALPR-SDK/blob/master/Jetson.md#getting-started_jetson-versus-jetsontftrt

 

GitHub - DoubangoTelecom/ultimateALPR-SDK: World's fastest ANPR / ALPR implementation for CPUs, GPUs, VPUs and FPGAs using deep

World's fastest ANPR / ALPR implementation for CPUs, GPUs, VPUs and FPGAs using deep learning (Tensorflow, Tensorflow lite, TensorRT & OpenVINO). Multi-OS (NVIDIA Jetson, Android, Raspberry...

github.com

 

728x90
반응형