Joshua Alexander Heriyanto, Sarah Hasna Azzahra

1. Overview YOLOv5

YOLOv5 adalah versi ke-5 dari algoritma YOLO. YOLO sendiri adalah sebuah algoritma real-time object detection yang pertama kali muncul pada paper tahun 2016 oleh Redmon. Saat ini, skenario object detection sangat banyak digunakan dan kategori objek dalam gambar, seperti orang, kendaraan, dan hewan, dapat dideteksi dengan mudah. Meskipun akurasi YOLOv4 lebih baik daripada YOLOv5 dalam beberapa skenario, namun YOLOv5 memiliki beberapa keunggulan yang lebih menarik. Sebagai contoh, YOLOv5 memiliki karakteristik ukuran inference model yang lebih kecil, waktu training lebih pendek, dan kecepatan inference tinggi. Oleh karena itu, jika persyaratan untuk presisi tidak perlu tinggi maka YOLOv5 akan lebih baik dalam model construction maupun model deployment.

Source code dari website resmi dapat dilihat pada link di bawah:

https://github.com/ultralytics/YOLOv5

Kecepatan analisis dan diagram perbandingan antar model YOLOv5s, YOLOv5m, dan YOLOv5n yang semuanya adalah varian YOLOv5(versi 6.0) juga diberikan di website reminya. Detailnya dapat dilihat sebagai berikut :


Pada website resmi juga terdapat versi yang berbeda-beda. Anda dapat melihatnya pada link berikut:

https://github.com/ultralytics/YOLOv5/releases

Versi terbaru yaitu Versi 6.0. Versi yang dapat digunakan pada Atlas 500 smart station adalah versi 4.0 ke bawah. Gambar berikut menunjukkan analisis dan perbandingan dari weight files versi 5.0.

2.jpg
Seperti pada gambar di atas, weight file / params pada YOLOv5s hanya sebesar 7.3 MB, inference speed-nya mencapai 2.2 ms, dan memiliki akurasi yang terburuk. YOLOv5m memiliki weight file sebesar 21.4 MB dan inference speed 2.0 ms. Sedangkan, akurasi inference yang paling baik dimiliki YOLOv5x, namun weight file-nya mencapai 87.7 MB. Sehingga, YOLOv5s lebih cocok digunakan untuk perangkat mobile. Pemilihan weight file dianalisa berdasarkan deployment environtment dan kebutuhan akurasinya.

2. Atlas 500 Smart Small Site Overview

Untuk mengembangkan aplikasi AI dengan prosesor Huawei Ascend, Anda perlu mengatur delopment environment dan running environment. Development environment bisa dibuat di perangkat Ascend maupun non-Ascend. Namun, operating/running environment harus dibuat di perangkat Ascend. Atlas 500 adalah sebuah perangkat edge ringan yang didesain untuk berbagai macam skenario aplikasi. Atlas 500 memiliki kemampuan komputasi yang sangat baik, kapasitas penyimpanan besar, konfigurasi fleksibel, tahan suhu dingin/panas, dapat digunakan disegala medan, serta maintenance dan management yang mudah. Atlas 500 terutama diterapkan untuk pengawasan video cerdas, analisis, dan penyimpanan data. Atlas 500 dapat dipasang pada berbagai ruang baik edge maupun central pada lingkungan kompleks seperti komunitas, kampus, pusat perbelanjaan, dan supermarket. Untuk penjelasan lebih detail mengenai hardware dapat dilihat melalui link berikut :

https://www.hiascend.com/document?tag=hardware

Official Webiste Huawei Atlas 500:

https://support-it.huawei.com/server-3d/res/server/atlas500/index.html

Gambar berikut ini menunjukkan diagram dari Huawei Atlas 500 micro base station.

Daftar spesifik produk yang disediakan oleh situs resmi:

Kemudahan penggunaan di skenario tepi
Real-time: Ia memproses data secara lokal dan menyediakan respon real-time.
Bandwidth rendah: Hanya informasi yang diperlukan yang ditransfer ke cloud.
Perlindungan privasi: Customer bisa memutuskan untuk mengirim informasi ke awan dan menyimpannya di tempat. Semua informasi yang dikirim ke cloud dapat dienkripsi.
Analisis video dan penyimpanan 16 saluran

Mendukung analisis video saluran 16. (Maximum 16-channel 1080p decoding, 22 TOPS Daya komputasi INT8)
Mendukung kapasitas penyimpanan TB 12, 16-kanal 1080p@4 Mbit/s cache video selama 7 hari, dan 8-kanal 1080p@4 Mbit/s untuk cache video selama 30 hari.
Strong environment adaptability dan edge environment deployment

Rating perlindungan industri, IP40.
Desain yang lebih bagus, mendukung suhu -40 +70 ASIC.
Konfigurasi dan backhaul nirkabel dapat dibelkan
Modul 3G atau 4G (backhaul tanpa kabel) dapat dikonfigurasi.
Keandalan tinggi
Semua perusahaan di sistem memiliki cadangan cermin ganda. Jika terjadi kesalahan, switchover aktif/siap akan otomatis dilakukan.
Mendukung deteksi perangkat lunak dan kesalahan perangkat keras dan pelaporan alarm.
Menyediakan solusi dua sistem dengan perangkat lunak cadangan ganda dalam sistem bawaan. Dua Atlas 500 mini-sites cerdas dapat membentuk sistem cadangan ganda. Ketika satu Atlas 500 intelligent mini-site rusak, switchover otomatis dipicu.

2. Atlas 500 YOV5 Proses Adaptasi

Operating System Euler bawaan Atlas 500 intelligent station cukup kompleks dalam hal model migration dan library installation. Oleh karena itu, Anda dapat membuat sebuah Docker image. Silahkan Log in pada Atlas 500 dengan SSH. Lalu setelah berhasil, cek image file yang sudah dibuat. Berikut contohnya :

Euler:/opt/mount/docker05 # docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEworkload-image v1.0 5533b1d161d8 4 weeks ago 585 MBubuntu 18.04 7266638574fb 2 months ago 56.6 MBk8s.gcr.io/pause latest 3df7a9f2d9f8 16 months ago 1.57 MB

Dalam perintah sebelumnya, anda telah membuat workload-image. Start image file dan ketikkan parameter -v untuk melakukan mount host machine directory ke Docker container. Dengan cara ini, keduanya dapat saling berbagi directory dan penyimpanan. /home/data/miniD/driver/lib64 adalah driver NPU dari Atlas 500. Npu-smi tool dapat digunakan untuk melakukan cek apakah chip NPU ada atau tidak. Command untuk memulai Docker container adalah sebagai berikut :

docker run --device=/dev/davinci0 \--device=/dev/davinci_manager \--device=/dev/hisi_hdc \--device /dev/devmm_svm \-v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \-v /home/data/miniD/driver/lib64:/home/data/miniD/driver/lib64 \-v /run/board_cfg.ini:/run/board_cfg.ini \-v /opt/mount/docker05:/opt/mount/docker05 \-it workload-image:v1.0 bash

Setelah NPU sudah berjalan, sistem akan berganti ke Docker container. Lalu jalankan command berikut untuk melakukan cek status NPU ::

root@c25e51b32a55:-# npu-smi info

Bila informasi berikut ditampilkan, itu berarti NPU dapat digunakan. Anda dapat melanjutkan ke langkah berikutnya. Setelah operation, ditemukan bahwa hanya satu docker container yang dapat menggunakan resource NPU di Atlas 500. Output dari command npu-smi info:

NPU Chip menunjukkan NPU Chip, Device ID 0, dan Name Device 310 mengindikasikan Huawei Ascend 310. Jika Health Bus-Id OK, layanan normal. Jalankan command berikut untuk install dependency items yang berkaitan dengan PyACL:

#Updateapt-get update#Install pip3apt-get install python3-pip# Only python 3.6 can be used to install the python dependent librariespython3.6 -m pip install --upgrade pip --user -i https://mirrors.huaweicloud.com/repository/pypi/simplepython3.6 -m pip install Cython numpy tornado==5.1.0 protobuf --user \-i https://mirrors.huaweicloud.com/repository/pypi/simple# Install wgetapt-get install wget# Install vimapt-get install  vim# Install opencv-pythonpython3.6 -m pip install opencv-python==4.5.4.60 --user -i https://mirrors.huaweicloud.com/repository/pypi/simple# fix ImportError: libGL.so.1apt install libgl1-mesa-glx

Setelah instalasi berhasil, jalankan command berikut untuk memverifikasi instalasi. Jika import cv2 dapat dilakukan dengan sukses dalam Python interaction environment, instalasi dependency OpenCV berhasil. Berikut hasilnya.

root@c25e51b32a55:-# python3Python 3.6.9 (default, Jan 26 2021, 15:33:00)[GCC 8.4.0] on linuxType "help", "copyright", "credits" or "license" for more information.>>> import cv2>>> print(cv2.__version__)4.5.4> > >

Jalankan command berikut untuk menginstal ffmpeg dan dependencies-nya:

apt-get install -y libavformat-dev libavcodec-dev libavdevice-dev libavutil-dev libswscale-devapt-get install pkg-config libxcb-shm0-dev libxcb-xfixes0-dev#Install av librariespython3.6 -m pip install av==6.2.0 -i https://mirrors.huaweicloud.com/repository/pypi/simpleapt-get install libtiff5-dev libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev python-tk# Install x264 x265apt-get install x264 x265# Install PIL and requestspython3.6 -m pip install Pillow requests -i https://mirrors.huaweicloud.com/repository/pypi/simple# Install numpypython3.6 -m pip install numpy -i https://mirrors.huaweicloud.com/repository/pypi/simple# Install ffmpegapt-get install ffmpeg

Run the following command to configure environment variables:

Jalankan command berikut untuk mengkonfigurasi environtment variables:

vi -/.bashrc

Tambahkan konfigurasi berikut di akhir:

export LD_LIBRARY_PATH=/usr/local/Ascend/ascend-toolkit/latest/atc/lib64:/usr/local/Ascend/nnrt/latest/acllib/lib64:/home/data/miniD/driver/lib64:$LD_LIBRARY_PATHexport PATH=/usr/local/Ascend/ascend-toolkit/latest/atc/bin:/usr/local/Ascend/ascend-toolkit/latest/atc/ccec_compiler/bin:$PATHexport PYTHONPATH=/usr/local/Ascend/ascend-toolkit/latest/toolkit/python/site-packages:/usr/local/Ascend/ascend-toolkit/latest/atc/python/site-packages:/usr/local/Ascend/nnrt/latest/pyACL/python/site-packages/acl:$PYTHONPATHexport ASCEND_AICPU_PATH=/usr/local/Ascend/nnrt/latest:$ASCEND_AICPU_PATHexport ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/oppexport TOOLCHAIN_HOME=/usr/local/Ascend/ascend-toolkit/latest/toolkit:${TOOLCHAIN_HOME}

Path sebelumnya harus disesuaikan sesuai dengan situasi sebenarnya. Untuk memfasilitasi deployment selanjutnya, jangan mengkonfigurasi ulang enviroment. Anda dapat meng-export container image sebagai file cadangan dan me-restore container image dari file yang di export sebelumnya. Jalankan command berikut:

# Commit the container whose ID is c25e51b32a55 to the atlas500-python:v2.0 imagedocker commit c25e51b32a55 atlas500-python:v2.0# Exporting an atlas500-python:v2.0 Image to a atlas500-python-opencv4.5-ffmepg.tar Filedocker save -o atlas500-python-opencv4.5-ffmepg.tar atlas500-python:v2.0

Dengan cara ini, anda dapat menjalankan command untuk meng-copy file ke environment lain melalui temporary file directory (sekitar 2 GB) dari Atlas 500. Untuk rincianyna, lihat command berikut:

# Copy to a temporary directoryEuler:/opt/mount/docker05 # cp atlas500-workload-image.tar /tmp# Modify the permission so that the download can be performed through SFTPEuler:/opt/mount/docker05 # chmod 777 /tmp/*# Starting the Docker ContainerEuler:/opt/mount/docker05 # docker start c25e51b32a55# Entering the Docker ContainerEuler:/opt/mount/docker05 # docker attach c25e51b32a55root@c25e51b32a55:-#

Sebagai tambahan, Anda perlu menjalankan command berikut dalam Docker container untuk menginstal beberapa auxiliary tools:

vi /etc/vim/vimrc################ Add the following configuration #########set fileencodings=utf-8,gb2312,gbk,gb18030set termencoding=utf-8set encoding=prc###################################### Install ping toolsapt-get install -y inetutils-ping

Berikut penjelasan bagaimana mempersiapkan software yang diperlukan. Tool ATC dipakai untuk mengkonversi model. Untuk rincian prosesnya dapat dilihat pada link berikut :

Atlas 500 Docker ATC model conversion image building

Beralih ke environment Ubuntu dimana terdapat tool ATC. Peforma CPU Atlas 500 tidak begitu baik. Oleh karena itu, Anda dapat melakukan konversi model dengan ATC di server x86. Berikut ini operasi adaptasi berdasarkan Yolov4 4.0. Login ke sistem operasi dimana ATC berada dan lakukan operasi sebagai root. Jalankan command berikut:

su rootcd mysoft# Download YOLOv5-4.0wet https://github.com/ultralytics/YOLOv5/archive/v4.0.tar.gz# Renamemv v4.0.tar.gz YOLOv5-4.0.tar.gz# Decompresstar -xzf YOLOv5-4.0.tar.gz# Switching Directorycd YOLOv5-4.0# Download the weight filewget https://github.com/ultralytics/YOLOv5/releases/download/v4.0/YOLOv5s.ptwget https://github.com/ultralytics/YOLOv5/releases/download/v4.0/YOLOv5m.pt

Ubah source code dalam export.py pada official website dari opset_version=12 menjadi opset_version =11. Jalankan command berikut:

vi models/export.py

Modifikasinya sebagai berikut:

Eksport model dari YOLOv5m.pt ke YOLOv5m.onnx. Command-nya sebagai berikut:

#onnx >= 1.9 & numpy >= 1.17python3 -m pip install onnxpython3.6 models/export.py --weights ./YOLOv5m.pt --img 640 --batch 1

Bila command dijalankan dengan sukses, Anda dapat melihat nama file yang dihasilkan. Jalankan command ls untuk melihat daftar file, seperti yang ditampilkan dalam gambar berikut.

Jalankan command berikut untuk memodifikasi model YOLOv5m.onnx:

python3 modify_YOLOv5.py YOLOv5m.onnx YOLOv5m###########################################root@jackpc:/home/jack/mysoft/YOLOv5-4.0# lsdata models train.py YOLOv5_modified.onnxdetect.py modify_YOLOv5.py tutorial.ipynb YOLOv5m.onnxDockerfile README.md utils YOLOv5m.pthubconf.py requirements.txt weights YOLOv5m.torchscript.ptLICENSE test.py YOLOv5m.mlmodel

YOLOv5_modified.onnx adalah model onnx yang telah dimodifikasi. Jalankan vi untuk membuat view_onnx.py dan jalankan python3 -m pip install netron untuk menginstal netron tool. Isi dari view_onnx.py sebagai berikut:

# python3 -m pip install netronimport netronnetron.start('./YOLOv5-4.0/YOLOv5_modified.onnx')

Jalankan command berikut untuk memulai netron untuk melihat struktur jaringan dari model:

root@jackpc:/home/jack/mysoft# python3.6 view_onnx.pyServing'./YOLOv5-4.0/YOLOv5_modified.onnx' at http://localhost:8080Running Firefox as root in a regular user's session is not supported....

Buka browser dan masukkan http://localhost:8080/ untuk mengaksenya. Di sini, kita harus menemukan tiga node dari gambar dan mengingat nama mereka. Di sini, nama-nama setiap model mungkin berbeda, jadi kita perlu menentukan nama melalui gambar. Gambar berikut menunjukkan tiga out node.

Nama out node dalam tiga gambar sebelumnya adalah Conv_324. Conv_340 dan Conv_356. Kode konversi ATC adalah sebagai berikut:

# ATC Environment Variablessource /usr/local/Ascend/ascend-toolkit/set_env.sh# ATC conversion, note the Conv name of –out_nodesatc --model=YOLOv5_modified.onnx --framework=5 --output=YOLOv5m_b1--soc_version=Ascend310 --insert_op_conf=aipp_rgb.cfg--input_format=NCHW --input_shape="images:1,3,640,640"--out_nodes="Conv_324:0;Conv_340:0;Conv_356:0"--output_type="Conv_324:0:FP32;Conv_340:0:FP32;Conv_356:0:FP32"--log=info

Isi app_rgb.cfg adalah sebagai berikut. Anda dapat menjalankan perintah vi untuk membuat file.

root@jackpc:/home/jack/mysoft/YOLOv5-4.0# vi aipp_rgb.cfg###########################aipp_op {aipp_mode: staticrelated_input_rank: 0input_format: RGB888_U8csc_switch: falserbuv_swap_switch: truesrc_image_size_w: 640src_image_size_h: 640crop: falsemin_chn_0: 0min_chn_1: 0min_chn_2: 0var_reci_chn_0: 0.0039216var_reci_chn_1: 0.0039216var_reci_chn_2: 0.0039216}

Setelah ATC berhasil dijalankan, akan terdapat YOLOv5m_b1.om. Gambar berikut menunjukkan proses operasi.

Copy YOLOv5m_b1.om yang dihasilkan lalu upload ke Atlas 500 untuk dipakai nanti. Pergi ke Docker container dan jalankan command berikut untuk dekompresi built test project:

root@c25e51b32a55:-# mkdir myairoot@c25e51b32a55:-# cd myairoot@c25e51b32a55:-/myai# cp /opt/mount/docker05/pyacl_YOLOv5.tar.root@c25e51b32a55:-/myai# lspyacl_YOLOv5.tarroot@c25e51b32a55:-/myai# tar -xvf pyacl_YOLOv5.tarroot@c25e51b32a55:-/myai# cd pyacl_YOLOv5root@c25e51b32a55:-/myai/pyacl_YOLOv5# lsacl_demo.py aclnet data model readme.md result.jpg scriptsroot@c25e51b32a55:-/myai/pyacl_YOLOv5#

YOLOv5m_b1.m ada di dalam model direktori, dan acl_demo.py adalah startup file dari inference program. Isinya sebagai berikut:

import cv2from time import *from aclnet.net import Netfrom aclnet.common import AscendResourcefrom aclnet.utils import YOLOv5PostProcess, letterboxfrom aclnet.coco128 import *import sysclasses = 80img_width = 640img_height = 640device_id = 0anchors = [[(10, 13), (16, 30), (33, 23)], # stride_32[(30, 61), (62, 45), (59, 119)], # stride_16[(116, 90), (156, 198), (373, 326)]] # stride_8if __name__ == "__main__":with AscendResource(device_id) as aclres:model = Net(aclres, sys.argv[1])image = cv2.imread(sys.argv[2])image = letterbox(image, (img_width, img_height))begin_time = time()result = model.run([image])rects = YOLOv5PostProcess(result, anchors, img_width, classes)for rect in rects:name = get_name_bycls(rect[2])print("[x1, y1, x2, y2]:", rect[0][0], rect[0][1], rect[1][0], rect[1][1], rect[2], name, rect[3])cv2.rectangle(image, (rect[0][0], rect[0][1]), (rect[1][0], rect[1][1]), (0, 255, 0), 1)cv2.putText(image, name, (rect[0][0], rect[0][1] - 20), cv2.FONT_HERSHEY_SIMPLEX, 1.5, (255, 0, 0), 2)cv2.imwrite('result.jpg', image)end_time = time()print('run total time:', end_time - begin_time)

Jalankan command berikut untuk melakukan inference:

python3 acl_demo.py ./model/YOLOv5m_b1.om ./data/test1.jpg

Gambar berikut menunjukkan hasil dari command.

Setelah input test1.jpg diinferensi, hasilnya akan diletakkan pada reult.jpg dan di-copy untuk ditampilkan.

root@c25e51b32a55:-/myai/pyacl_YOLOv5# cp result.jpg /opt/mount/docker05/Euler:/opt/mount/docker05 # cp /opt/mount/docker05/result.jpg /tmp/Euler:/opt/mount/docker05 # chmod 777 /tmp/result.jpg

Result.jpg yang dihasilkan sebagai berikut:

Berikut beberapa link dari Huawei official website yang dapat digunakan sebagai referensi:
https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=118598
https://gitee.com/ascend/samples/tree/master/python/environment
https://www.hiascend.com/zh/software/modelzoo/detail/1/f7338e43cf024ea1851fb46041be1dea