پروژه تشخیص پلاک خودرو ها با مدل های Nvidia

پروژه تشخیص پلاک خودرو ها با مدل های Nvidia

تشخیص پلاک خودرو یا ANPR ، یکی از برنامه های کاربردی بسیار مهم پردازش تصویر و آنالیز هوشمند ویدیو ها برای شناسایی وسایل نقلیه ثابت و متحرک در شهرهای هوشمند است. از کاربرد های مهم این برنامه ها که به نام پلاک خوان نیز شناخته می شوند، می توان سیستم های مدیریت پارکینگ، باجه های عوارضی ، ثبت و شناسایی خودرو در ورودی پارکینگ های عمومی و خصوصی و انبار ها را نام برد.

اجرای چنین برنامه ای به صورت Real-Time برای ارائه سرویس های مناسب بازار امری حیاتی است. تکنیک های قدیمی استفاده شده در سیستم های پلاک خوان ، علاوه بر بهینه نبودن از نظر سرعت پردازش، به سخت افزار نسبتا بالایی نیاز داشته اند که از نظر هزینه تمام شده برای مشتریان، کار را دشوار می کند.

تشخیص پلاک

فرایند پلاک خوانی شامل مراحل شناسایی پلاک وسایل نقلیه با استفاده از یک مدل یادگیری عمیق تشخیص اشیا ، شناسایی محل پلاک با استفاده از یک مدل تشخیص پلاک و در نهایت شناسایی کاراکتر های پلاک است. برای تشخیص کارکتر ها در زبان های مختلف؛ از برنامه های نویسه خوان (OCR) استفاده می شود که می توان آن را نیز با استفاده از شبکه های عمیق پیاده سازی کرد.

در این پست ، ما به شما نحوه استفاده از مدل های هوش مصنوعی مانند مدل های شناسایی محل پلاک (LPD) و پلاک خوانی (LPR) را به همراه جعبه ابزار آموزش انتقالی NVIDIA (TLT) به شما آموزش می دهیم. استفاده از مدل های از پیش آماده به شما کمک می کند تا به سرعت پروژه پلاک خوان خود را راه اندازی کنید. مدل های بهینه سازی شده TLT می توانند به راحتی با استفاده از DeepStream SDK مستقر شده و مورد استفاده قرار بگیرند.

برای شروع کار ایجاد و استقرار مدل های بسیار دقیق از پیش آموزش دیده از TLT ، به منابع زیر از NGC نیاز دارید:

  • مدل TrafficCamNet یا DashCamNet برای شناسایی وسایل نقلیه
  • مدل شناسایی محل پلاک (LPD) برای تشخیص پلاک ها
  • مدل تشخیص پلاک (LPR) برای تبدیل تصویر به متن
  • DeepStream SDK

همه این مدل های از پیش آموزش دیده ، به صورت رایگان و به راحتی در NVIDIA NGC در دسترس هستند. TLT دو مدل LPD و دو مدل LPR را ارائه می دهد: یکی از آن ها برای پلاک های کشور آمریکا آموزش داده شده و دیگری برای تشخیص پلاک های چین آماده گردیده است. برای اطلاعات بیشتر، به توضیحات مدل های LPD و LPR مراجعه کنید.

تشخیص پلاک2
خط جریان برنامه ALPR برای یک برنامه شناسایی پلاک خودرو در زمان واقعی.

برای آموزش از TLT از دستور tlt-launcher استفاده کنید. برای اجرای لانچر TLT، آدرس ~/tlt-experiments موجود در سیستم لوکال را مشابه آدرس فایل ~/.tlt_mounts.json در کانتینر Docker قرار دهید. برای اطلاعات بیشتر، به لانچر TLT مراجعه کنید.

لانچر TLT را نصب کنید:

pip3 install nvidia-pyindex
pip3 install nvidia-tlt

فایل ~/.tlt_mounts.json را ایجاد کرده و محتوای زیر را به آن اضافه کنید:

{
    "Mounts": [
        {
            "source": "/home/<username>/tlt-experiments",
            "destination": "/workspace/tlt-experiments"
        },
        {
            "source": "/home/<username>/openalpr",
            "destination": "/workspace/openalpr"
        }

    ]
}

مسیر /home/<username>/tlt-experiments بر روی ماشین میزبان را به مسیر /workspace/tlt-experiments داخل کانتینر منتقل کنید. شما همچنین باید مسیر /home/<username>/openalpr بر روی ماشین میزبان را به مسیر /workspace/openalpr انتقال دهید.

شناسایی محل پلاک (LPD)

در این بخش، ما چگونگی راه اندازی مدل LPD از پیش آموزش دیده برای پلاک های آمریکا و تنظیم دقیق مدل با استفاده از مجموعه داده OpenALPR را بررسی می کنیم.

دیتاست

از داده های بنچمارک OpenALPR به عنوان مجموعه داده آزمایشی خود استفاده کنید. مدل از پیش آموزش دیده ی LPD را از NGC گرفته و روی مجموعه داده OpenALPR  تنظیم دقیق (Fine-Tune) کنید.

معرفی الگوریتم

مدل LPD بر اساس شبکه ی Detectnet_v2 از TLT آماده گردیده است. الگوریتم آموزش باعث می شود تا میزان دقت مرحله یافتن محل پلاک افزایش و میزان ضرر شناسایی اشیا کاهش یابد.

آموزش در دو مرحله انجام می شود. در فاز اول ، شبکه با منظم سازی ( Regularization ) آموزش داده می شود تا فرآیند حذف سازی ( Pruning ) را تسهیل کند. پس از این کار ، شما کانال هایی را که میزان کرنل آنها کمتر از آستانه است را حذف می کنید. در مرحله دوم ، شبکه Pruning دوباره آموزش می بیند. در مرحله دوم منظم سازی انجام نمی شود.

آموزش مدل LPD

در NVIDIA NGC ثبت نام کرده و لانچر TLT را نصب کنید. برای تنظیم دقیق مدل LPD ، نوت بوک LPD را از NGC دانلود کنید. سپس، مدل از پیش آموزش دیده NGC LPD یعنی usa_unpruned.tlt را دانلود کنید.

دیتاست را آماده کنید

ابتدا داده های بنچمارک OpenALPR را همگام سازی کنید:

$ git clone https://github.com/openalpr/benchmarks benchmarks

سپس، دستور زیر را برای دانلود مجموعه داده و تغییر اندازه تصاویر/برچسب ها اجرا کنید. lpd_prepare_data.py را دانلود کنید:

$ python lpd_prepare_data.py --input_dir benchmarks/endtoend/us --output_dir  lpd  --target_width  640 --target_height 480

داده ها را به دو قسمت تقسیم کنید: ۸۰٪ برای آموزش و ۲۰٪ برای اعتبار سنجی. دستور زیر را برای تقسیم مجموعه داده به صورت تصادفی و تولید tfrecords اجرا کنید. این دستور از یک فایل مشخصات به نام SPECS_tfrecord.txt استفاده می کند.

$ tlt detectnet_v2 dataset_convert -d /workspace/openalpr/SPECS_tfrecord.txt -o /workspace/openalpr/lpd_tfrecord/lpd

فایل مشخصات را پیکربندی کنید

پس از تهیه دیتاست، با دانلود مشخصات آموزش، پارامتر های مربوط به آموزش را پیکربندی کنید. با استفاده از پارامتر pretrained_model_file در فایل مشخصات، مدل از پیش آموزش دیده NGC را برای LPD تعیین می کنید. اندازه دسته را روی ۴ تنظیم کنید و ۱۲۰ دوره را برای آموزش اجرا کنید. مدل در حال آموزش ذر هر ۱۰ دوره با مجموعه اعتبارسنجی ارزیابی می شود.

آموزش

برای شروع تنظیم دقیق داده های OpenALPR ، دستور زیر را اجرا کنید:

$ tlt detectnet_v2 train -e /workspace/openalpr/SPECS_train.txt -r /workspace/openalpr/exp_unpruned -k nvidia_tlt

پس از اتمام آموزش، گزارش زیر را مشاهده می کنید که میانگین دقت (AP) را در مجموعه اعتبار سنجی نشان می دهد:

class name      average precision (in %)
------------  --------------------------
lpd                     82.2808

بعد از آموزش می توانید مدل از پیش آموزش دیده خود را نیز برای کاهش اندازه مدل اصلاح کنید. نحوه اصلاح در این پست نشان داده نشده است. برای کسب اطلاعات بیشتر، به اصلاح مدل یا آموزش با مدل های سفارشی از پیش آموزش دیده با استفاده از جعبه ابزار یادگیری انتقال NVIDIA مراجعه کنید.

استخراج مدل

پس از آموزش ، باید مدل را برای استقرار ، استخراج کنید. فرمت استقرار .etlt یا TLT رمزگذاری شده است. مدل استخراج شده را با یک کلید رمزگذاری کنید و از آن کلید برای رمزگشایی مدل در هنگام استقرار استفاده کنید.

برای اجرای مدل نهایی با دقت INT8 ، می توانید یک جدول کالیبراسیون INT8 نیز در مرحله استخراج مدل ایجاد کنید. TLT رمزگذاری شده می تواند به طور مستقیم در DeepStream SDK استفاده شود.

برای استخراج مدل LPD در INT8 ، از دستور زیر استفاده کنید. این دستور ابتدا مدل را برای INT8 با استفاده از تصاویر کالیبراسیون مشخص شده با گزینه –cal_image_dir کالیبره می کند. کلید رمزگذاری برای این مدل با گزینه -k مشخص شده است. این کلید می تواند هر رشته ای باشد. پرونده .etlt استخراج شده و حافظه پنهان کالیبراسیون به ترتیب با گزینه -o و – –cal_cache_file مشخص می شوند. برای کسب اطلاعات بیشتر در مورد همه گزینه های استخراج مدل ، به اسناد TLT DetectNet_v2 مراجعه کنید.

$ tlt detectnet_v2 export -m /workspace/openalpr/exp_unpruned/weights/model.tlt -o /workspace/openalpr/export/unpruned_model.etlt --cal_cache_file /workspace/openalpr/export/calibration.bin -e /workspace/openalpr/SPECS_train.txt -k nvidia_tlt --cal_image_dir /workspace/openalpr/lpd/data/image --data_type int8 --batch_size 4 --batches 10 –-engine_file /workspace/openalpr/export/unpruned_int8.trt

دقت مدل LPD آموزش دیده

مدل از پیش آموزش دیده نقطه شروع بسیار خوبی برای آموزش و تنظیم دقیق مجموعه داده های شما است. برای مقایسه، ما دو مدل آموزش داده ایم: یکی با استفاده از مدل از پیش آموزش دیده LPD آماده شده و دیگری از صفر آموزش دیده است. جدول زیر میانگین مقایسه متوسط میانگین دقت (mAP) دو مدل را نشان می دهد. با استفاده از مدل از پیش آموزش دیده، با مجموعه داده کوچک تر می توانید خیلی سریع تر به دقت هدف خود برسید. اگر می خواهید از ابتدا مدل را آموزش دهید، به یک مجموعه داده بسیار بزرگتر احتیاج دارید و برای دستیابی به دقت مشابه باید آن را با دیتاستی طولانی تر اجرا کنید.

می توانید از دستور زیر در TLT Docker برای اجرای ارزیابی از مجموعه اعتبار سنجی مشخص شده در پرونده پیکربندی آزمایش استفاده کنید:

$ tlt detectnet_v2 evaluate -m /workspace/openalpr/exp_unpruned/weights/model.tlt -k nvidia_tlt -e /workspace/openalpr/SPECS_train.txt
مدلتعداد دوره هااندازه دستهmAP
مدل LPD آموزش دیده از صفر۱۲۰۴۵۳٫۱۱%
مدل LPD از پیش آموزش دیده با تنظیم دقیق۱۲۰۴۸۲٫۲۸%
مقایسه دقت مدل های از پیش آموزش دیده و مدل آموزش دیده از صفر

پلاک خوانی (LPR)

در این بخش، ما به جزئیات آموزش مدل LPR می پردازیم. NVIDIA مدل های LPRNet آموزش داده شده روی پلاک های آمریکا و پلاک های چینی را ارائه می دهد. جزئیات این مدل ها را می توانید در مستندات مدل مشاهده کنید. ما در ادامه از LPRNet آموزش داده شده برای شناسایی پلاک های آمریکا به عنوان نقطه شروع برای تنظیم دقیق استفاده می کنید.

مجموعه داده

مانند مرحله قبل LPRNet را روی مجموعه داده های تصاویر OpenALPR آمریکا آموزش داده و ارزیابی کنید. برای این کار مجموعه داده را به ۸۰٪ (۱۷۷ تصویر) آموزش و ۲۰٪ (۴۴ تصویر) اعتبار سنجی تقسیم کنید.

معرفی الگوریتم

برای کار پلاک خوانی ، شما رشته کاراکتر ها های هر کلاس را پیش بینی می کنید. دقیقاً مانند سایر پروژه های بینایی رایانه ، ابتدا ویژگی های تصویر را استخراج می کنیم. برای این کار از معماری های پر کاربرد شبکه های عصبی عمیق مانند ResNet 10/18 به عنوان پایه و اساس LPRNet استفاده می کنیم. گام اصلی شبکه ResNet برابر ۳۲ است، اما برای تناسب بهتر با اندازه کوچک تصویر پلاک، گام را از ۳۲ به ۴ تنظیم کنید ، سپس ویژگی تصویر را در یک کلاسه بند وارد کنید. بر خلاف کار کلاسه بند های معمول که در آن ها مدل فقط به هر تصویر یک شناسه کلاس اختصاص می دهد، مدل LPRNet توالی ای از شناسه های کلاس را تولید می کند. ویژگی تصویر در طول بعد افقی به برش ها تقسیم می شود و به هر برش یک شناسه کاراکتر پیش بینی شده اختصاص می یابد.

سرانجام از ضرر کلاسه بندی زمانی پیوسته (CTC) برای آموزش این توالی کلاسه بند استفاده کنید. الگوریتم آموزش بهینه سازی شبکه برای به حداقل رساندن از ضرر CTC بین توالی کاراکتر های واقعی یک پلاک و توالی کاراکتر های پیش بینی شده است.

به طور کلی، LPRNet یک مدل کلاسه بندی توالی است که بر مبنای ResNet تنظیم شده است و تصویر را به عنوان ورودی شبکه می گیرد و خروجی را در فرمت توالی تولید می کند. سپس، حروف پلاک از خروجی توالی با استفاده از رمزگشایی CTC ، بر اساس یک روش رمزگشایی با دقت بالا بدست می آید.

تشخیص پلاک3
معماری مدل تشخیص پلاک

آموزش مدل LPR

آموزش LPRNet با استفاده از TLT نیازی به کدنویسی از طرف شما ندارد. شما یک مجموعه داده آماده می کنید، پیکربندی آزمایش را تنظیم کرده و سپس کد ها را اجرا کنید.

آماده سازی داده ها

داده ها را در مسیر /home/<username>/tlt-experiments/ ماشین محلی پردازش کنید و از مسیر نقشه برداری در Docker برای راه انداز tlt استفاده کنید. ابتدا بنچ مارک OpenALPR را از openalpr/benchmarks کپی برداری کنید:

$ git clone https://github.com/openalpr/benchmarks benchmarks

در مرحله بعد، مجموعه داده دانلود شده را پیش پردازش کرده و با استفاده از اسکریپت preprocess_openalpr_benchmark.py آن را به train و val تقسیم کنید.

$ python preprocess_openalpr_benchmark.py --input_dir=./benchmarks/endtoend/us --output_dir=./data/openalpr

پس از پیش پردازش، مجموعه داده OpenALPR به فرمتی است که TLT به آن نیاز دارد. هر تصویر پلاک برش خورده حاوی متن و دارای برچسب مربوطه است که در واقع کاراکتر های حقیقی تصویر پلاک است. همچنین یک فایل characters_list.txt ایجاد کنید که مرجع تمام کاراکتر های موجود در پلاک های آمریکا می باشد.

پیکربندی آزمایشات

فایل پیکربندی آزمایش ها، ابرپارامتر ها را برای معماری، آموزش و ارزیابی مدل LPRNet تعریف می کند.  فایل پیکربندی نمونه آموزش LPR را دانلود کرده و در مسیر /home/<username>/tlt-experiments/lprnet قرار دهید. از این پیکربندی برای تنظیم دقیق LPRNet آمریکا استفاده کنید.

در این پیکربندی، یک مدل LPRNet تنظیم شده بر مبنای ResNet18 تعریف کنید که در واقع پایه کار شماست. این مدل را برای ۲۴ دوره با اندازه دسته ۳۲، تنظیم L2 به میزان ۰٫۰۰۰۵ و soft_start_annealing_schedule آموزش دهید تا میزان یادگیری متغیر در حین آموزش اعمال شود. برای کسب اطلاعات بیشتر در مورد پارامتر های موجود در پرونده پیکربندی آزمایش، به راهنمای کاربری جعبه ابزار یادگیری انتقالی مراجعه کنید.

همچنین یک فایل مخصوص برای آموزش از ابتدا ارائه کرده ایم. در مقایسه با تنظیم دقیق، باید تعداد دوره و میزان یادگیری را بزرگتر کنید. اگرچه این یک روش توصیه شده برای آموزش نیست، ما آن را برای مقایسه ارائه داده ایم.

آموزش

هنگامی که مجموعه داده و مشخصات آزمایش آماده شد، آموزش خود را در TLT شروع کنید. از دستور زیر برای آموزش LPRNet با یک GPU واحد و مدل LPRNet آمریکا به عنوان وزن های آموزش دیده استفاده کنید:

$ tlt lprnet train -e /workspace/tlt-experiments/lprnet/tutorial_spec.txt -r /workspace/tlt-experiments/lprnet/ -k nvidia_tlt -m /workspace/tlt-experiments/lprnet/us_lprnet_baseline18_trainable.tlt

TLT همچنین از آموزش چند GPU (موازی سازی داده ها) و دقت ترکیبی اتوماتیک (AMP) پشتیبانی می کند. برای افزایش سرعت آموزش، می توانید چند GPU را با گزینه <gpus <num_gpus– و آموزش دقت ترکیبی را با گزینه use_amp– اجرا کنید. گزارش آموزش، که شامل دقت در مجموعه داده های اعتبار سنجی، ضرر آموزش و میزان یادگیری است ، به فرمت .csv در مسیر <results_dir> ذخیره می شود. مثال زیر، گزارش آموزش به همراه وزن های آموزش دیده را نشان می دهد:

epoch,accuracy,loss,lr
۰,nan,1.085993747589952,1e-05
۱,nan,0.9726232198503731,1e-05
۲,nan,0.9452087508756563,1e-05
۳,nan,0.7897920507495686,1e-05
۴,۰٫۸۴۰۹۰۹۰۹۰۹۰۹۰۹۰۹,۰٫۵۷۵۳۷۷۱۶۳۵۷۷۲۱۴۵,۱e-05               
…….

استخراج مدل

برای استقرار مدل LPR در DeepStream یا سایر برنامه ها، آن را به فرمت .etlt استخراج کنید. در حال حاضر، LPR فقط از دقت FP32 و FP16 پشتیبانی می کند. در مقایسه با دستور استخراج مدل LPD ، استخراج LPR بسیار ساده تر است:

$ tlt lprnet export -m /workspace/tlt-experiments/lprnet/weights/lprnet_epoch-24.tlt -k nvidia_tlt -e /workspace/tlt-experiments/lprnet/tutorial_spec.txt

مدل .etlt خروجی در همان دایرکتوری که مدل .tlt آموزش دیده ذخیره می شود.

دقت مدل LPR آموزش دیده

معیار ارزیابی LPR دقت تشخیص پلاک است. اگر همه کاراکتر ها و توالی پلاک صحیح باشند، تشخیص درست تلقی می شود. برای اجرای ارزیابی از مجموعه اعتبار سنجی مشخص شده در فایل پیکربندی آزمایشات ، می توانید از دستور زیر در TLT Docker استفاده کنید:

$ tlt lprnet evaluate -m /workspace/tlt-experiments/lprnet/weights/lprnet_epoch-24.tlt -k nvidia_tlt -e /workspace/tlt-experiments/lprnet/tutorial_spec.txt

جدول زیر مقایسه دقت مدل آموزش دیده از ابتدا و مدل از پیش آموزش دیده با مدل آموزش دیده LPRNet را نشان می دهد.

مدلتعداد دوره هادقت آموزشدقت ارزیابی
baseline18_unpruned_from_scratch1000%0%
baseline18_unpruned_from_pretrained2498.87%90.90%
مقایسه دقت مدل از پیش آموزش دیده در مقابل مدل آموزش دیده از ابتدا

با مدل از پیش آموزش دیده می توانید با تعداد دوره کمتری به دقت بالایی دست پیدا کنید. برعکس، هنگام آموزش از ابتدا، مدل شما حتی با افزایش ۴ برابر تعداد دوره ها همگرا نمی شود. این بدان معنی است که شما باید مجموعه داده ها را به میزان قابل توجهی افزایش دهید که این باعث افزایش زمان و هزینه آموزش می شود.

استقرار LPD و LPR با استفاده از DeepStream SDK

در این بخش، ما مراحل لازم برای استقرار مدل های LPD و LPR در DeepStream را مرور می کنیم. ما برنامه نمونه ای از DeepStream را ارائه داده ایم. برنامه نمونه LPD و LPR جریانی را برای ورودی های تصاویر ویدئویی متعدد ایجاد کرده و ویدیو ها را با مدل های آبشاری استنباط می کند تا خودرو ها و پلاک آن ها را شناسایی کند و شخصیت ها را تشخیص دهد.

تشخیص پلاک4
پایپ لاین DeepStream از برنامه نمونه LPD / LPR.

کد منبع این برنامه نمونه به دو بخش تقسیم می شود :

دستور lpr-test-sample – برنامه اصلی نمونه LPD / LPR ، پایپ لاین Gstreamer را با پلاگین های DeepStream می سازد.

دستور nvinfer_custom_lpr_parser – کتابخانه تجزیه کننده کلاسه بند پلاگین سفارشی nvinfer در DeepStream برای مدل LPR. کلاسه بند پیش فرض DeepStream nvinfer فقط می تواند از تجزیه و تحلیل در حالت اطمینان پشتیبانی کند و از فایل برچسبی که توسط پارامتر labelfile-path در فایل پیکربندی nvinfer مشخص شده است، برچسب دریافت کند. از آنجا که مدل LPR با دو لایه argmax و اطمینان را تولید می کند، برای تجزیه لایه های خروجی LPR و تولید برچسب های صحیح برای رشته های پلاک اتومبیل، به تابع تجزیه خروجی سفارشی نیاز است. تابع تجزیه کننده سفارشی باید مسیر تعیین شده را جستجو کند تا نویسه هایی با مقادیر argmax و اطمینان پیدا کند و سپس کاراکتر ها را به عنوان برچسب در رشته پلاک خودرو ترکیب کند.

مدل ها را دانلود و آماده کنید

برای این برنامه، شما به سه مدل از TLT نیاز دارید:

  • TrafficCamNet وسایل نقلیه را تشخیص می دهد.
  • LPD پلاک ها را تشخیص می دهد.
  • LPR کاراکتر ها را تشخیص می دهد.

همه مدل ها را می توان از NVIDIA NGC دانلود کرد. همچنین ، اگر مراحل آموزش را در دو بخش قبلی دنبال می کردید ، می توانید از مدل LPD و LPR آموزش دیده خود نیز استفاده کنید.

مدل TrafficCamNet را دانلود کنید:

mkdir -p /opt/nvidia/deepstream/deepstream-5.0/samples/models/tlt_pretrained_models/trafficcamnet
cd /opt/nvidia/deepstream/deepstream-5.0/samples/models/tlt_pretrained_models/trafficcamnet
wget https://api.ngc.nvidia.com/v2/models/nvidia/tlt_trafficcamnet/versions/pruned_v1.0/files/trafficnet_int8.txt
wget https://api.ngc.nvidia.com/v2/models/nvidia/tlt_trafficcamnet/versions/pruned_v1.0/files/resnet18_trafficcamnet_pruned.etlt

مدل LPD را دانلود کنید:

mkdir -p /opt/nvidia/deepstream/deepstream-5.0/samples/models/LP/LPD
cd /opt/nvidia/deepstream/deepstream-5.0/samples/models/LP/LPD
wget https://api.ngc.nvidia.com/v2/models/nvidia/tlt_lpdnet/versions/pruned_v1.0/files/usa_pruned.etlt
wget https://api.ngc.nvidia.com/v2/models/nvidia/tlt_lpdnet/versions/pruned_v1.0/files/usa_lpd_cal.bin
wget https://api.ngc.nvidia.com/v2/models/nvidia/tlt_lpdnet/versions/pruned_v1.0/files/usa_lpd_label.txt

مدل LPR را دانلود کنید:

mkdir -p /opt/nvidia/deepstream/deepstream-5.0/samples/models/LP/LPR
cd /opt/nvidia/deepstream/deepstream-5.0/samples/models/LP/LPR
wget https://api.ngc.nvidia.com/v2/models/nvidia/tlt_lprnet/versions/deployable_v1.0/files/us_lprnet_baseline18_deployable.etlt
#create an empty label file
echo > labels_us.txt

با DeepStreamSDK 5.x ، پلاگین gst-nvinfer نمی تواند به طور خودکار موتور TensorRT را از فرمت ONNX از TLT تولید کند. مدل LPR در فرمت رمزگذاری شده ONNX از TLT استخراج می شود و این یک محدودیت برای مدل LPR محسوب می شود. مدل LPD در فرمت UFF رمزگذاری شده قدیمی است و به طور خودکار با DeepStream کار می کند. پرونده های موتور برای مدل LPR باید با استفاده از ابزار مبدل tlt تولید شوند. جدیدترین مبدل tlt را برای سخت افزار مناسب خود و نسخه CUDA یا cuDNN از صفحه شروع TLT دانلود کنید.

پلتفرممحاسبه گر
x86 + GPUCUDA 10.2 / cuDNN 8.0 / TensorRT 7.1
x86 + GPUCUDA 10.2 / cuDNN 8.0 / TensorRT 7.2
x86 + GPUCUDA 11.0 / cuDNN 8.0 / TensorRT 7.1
x86 + GPUCUDA 11.0 / cuDNN 8.0 / TensorRT 7.2
JetsonJetPack 4.4
JetsonJetPack 4.4
آدرس دانلود پکیج بر حسب پلتفرم و سخت افزار

مدل رمزگذاری شده LPR ONNX را به موتور TLT تبدیل کنید:

tlt-converter -k nvidia_tlt -p image_input,1x3x48x96,4x3x48x96,16x3x48x96 ./us_lprnet_baseline18_deployable.etltunpruned.etlt -t fp16 -e /opt/nvidia/deepstream/deepstream-5.0/samples/models/LP/LPR/lpr_us_onnx_b16.engine

برنامه نمونه را بسازید و اجرا کنید

کد نمونه را از مخزن گیت هاب NVIDIA-AI-IOT/deepstream_lpr_app دانلود کرده و برنامه را بسازید.

پوشه nvinfer_custom_lpr_parser را روی برد کپی کرده و کد را بیلد کنید:

cd  nvinfer_custom_lpr_parser
make

فایل libnvdsinfer_custom_impl_lpr.so تولید شده را در آدرس /opt/nvidia/deepstream/deepstream-5.0/lib/ کپی کنید.

پوشه lpr-test-sample را در دستگاه خود کپی کرده و کد را بسازید. نمونه برنامه lpt-test-app تولید می شود.

cd lpr-test-sample
make

فایا های پیکربندی شده nvinfer را برای TrafficCamNet ، LPD و LPR با مسیر و نام مدل واقعی تغییر دهید. فایل پیکربندی TrafficCamNet در DeepStream SDK در مسیر زیر ارائه شده است:

/opt/nvidia/deepstream/deepstream-5.0/samples/configs/tlt_pretrained_models/deepstream_app_source1_trafficcamnet.txt

فایل های نمونه lpd_config.txt و lpr_config_sgie_us.txt را می توان در lpd_config.txt و lpr_config_sgie_us.txt یافت. به parse-classifier-func-name و custom-lib-path توجه داشته باشید. این از کتابخانه جدید nvinfer LPR از مرحله ۱ استفاده می کند.

فایل مرجع OCR را مطابق با مدل آموزش دیده TLT LPR آماده کنید. نام فایل مرجع باید dict.txt باشد. با استفاده از نسخه آمریکا dict.txt ایجاد کنید.

$ cp dict_us.txt dict.txt

برنامه نمونه را اجرا کنید.

lpr-test-app [language mode:1-us 2-chinese]
  [sink mode:1-output as 264 stream file 2-no output 3-display on screen]
  [ROI enable:0-disable ROI 1-enable ROI]
  [input mp4 file path and name] [input mp4 file path and name] ... [input mp4 file path and name]
  [output 264 file path and name]

برای مثال:

$ lpr-test-app 1 3 0 file1.mp4 file2.mp4 output.264

عملکرد

جدول زیر فقط میزان استنتاج در فریم بر ثانیه (FPS) مدل اصلاح شده LPD آمریکا را نشان می دهد، که بر روی یک مجموعه داده اختصاصی با بیش از ۴۵۰۰۰ تصویر ماشین آمریکایی آموزش داده شده است. عملکرد با اندازه ورودی متفاوت، نسبت اصلاح، دستگاه ها و غیره متفاوت است. عملکرد مربوط به نسخه اصلاح شده مدل است که در NGC موجود است و نه در مدل آموزش داده شده در بخش های قبلی.

دستگاهاندازه ورودی (CHW)دقتاندازه دستهفریم بر ثانیه
Jetson Nano3x480x640FP16166
Jetson NX3x480x640INT81461
Jetson Xavier3x480x640INT81913
T43x480x640INT812748
عملکرد دستگاه های مختلف در تشخیص پلاک

عملکرد مستقل LPR

جدول زیر عملکرد استنباط LPR آموزش دیده در پلاک های آمریکا در دستگاه های مختلف را نشان می دهد. ما استنتاج مدل را با دستور trtexec از TensorRT نمایه کردیم.

دستگاهاندازه ورودی (CHW)دقتاندازه دستهفریم بر ثانیه
Jetson Nano3x48x96FP163216
Jetson NX3x48x96FP1632600
Jetson Xavier3x48x96FP16641021
T43x48x96FP161283821
عملکرد دستگاه های مختلف در تشخیص پلاک

عملکرد برنامه نمونه

پایپ لاین کامل این برنامه کاربردی سه مدل مختلف DNN را اجرا می کند. برای شناسایی خودرو از TrafficCamNet از پیش آموزش دیده در TLT استفاده کنید. LPD و LPR با مجموعه آموزش NVIDIA پلاک های آمریکا آموزش دیده اند.

تست زیر با فیلم های با وضوح ۱۰۸۰p (1080 × ۱۹۲۰) با استفاده از نمونه برنامه LPR انجام می شود. جدول زیر عملکرد پردازش کل پایپ لاین تجزیه و تحلیل ویدئو با سه مدل DNN را نشان می دهد ، از استفاده از داده های ویدیویی تا ارائه فراداده روی فریم ها. داده ها در دستگاه های مختلف جمع آوری می شوند.

دستگاهتعداد رشته هااندازه دستهفریم بر ثانیه کلی
Jetson Nano119.2
Jetson NX3380.31
Jetson Xavier55146.43
T41414447.15
عملکرد دستگاه های مختلف در اجرا نرم افزار نمونه

جمع بندی

در این مقاله، ما یک راه حل مبتنی بر هوش مصنوعی برای تشخیص خودکار پلاک خودرو معرفی کردیم. این راهکار همه جنبه های توسعه پایپ لاین هوشمند تجزیه و تحلیل فیلم را پوشش می دهد؛ یعنی آموزش مدل های شبکه عصبی عمیق با جعبه ابزار آموزش انتقال برای استقرار مدل های آموزش دیده در DeepStream SDK.

در مرحله آموزش ، شما برای ساخت DNN خود و بهینه سازی مدل نیازی به تخصص ندارید. TLT یک روش ساده برای آموزش مدل شما ارائه می دهد. تمام کاری که شما باید انجام دهید تهیه مجموعه داده و تنظیم فایل های پیکربندی است. علاوه بر این ، شما می توانید به جای مقداردهی اولیه تصادفی ، از مدل های بسیار دقیق آموزش دیده در TLT بهره ببرید.

برای استقرار، DeepStream منابع سیستم را برای رمزگشایی ویدئو ، پیش پردازش تصویر و استنتاج بهینه می کند و بالاترین تراکم کانال را برای تجزیه و تحلیل ویدئو در زمان واقعی ارائه می دهد. با کمترین زحمت می توانید به سرعت مدل های آموزش دیده خود را در یک پایپ لاین تجزیه و تحلیل ویدیوی چند جریانه با DeepStream مستقر کنید.

منبع Nvidia

درباره‌ی علی قلی زاده

همچنین ببینید

آموزش Keras تنظیم دقیق با استفاده از مدل های از پیش آموزش دیده

آموزش Keras : تنظیم دقیق با استفاده از مدل های از پیش آموزش دیده

در دو پست قبلی ، نحوه استفاده از مدل های از پیش آموزش دیده و …

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *