TÓM TÁT KHÓA LUẬN
Chương 3. PHƯƠNG PHÁP THUC HIỆN
3.1. Thiết kế mô hình Custom Tinier YOLO
Mô hình Custom Tinier YOLO được lấy cảm hứng từ mô hình Tinier YOLO. Tinier YOLO bao gồm 68 lớp với ảnh đầu có kích thước 416x416. Tuy nhiên, với phan cứng bị giới han tài nguyên như board DE1-SoC, kích thước của Tinier YOLO vẫn là quá lớn, rất khó dé đảm bảo tốc độ xử lý cũng như dung lượng bộ nhớ cho việc tính toán. Vì vậy, việc điều chỉnh mô hình dé phù hợp với phần cứng là cần thiết. Điều chỉnh mô hình không chỉ thỏa mãn giới hạn tài nguyên của phần cứng mà còn rút ngắn thời gian xử lí của mô hình. Do đó, nhóm quyết định chỉ giữ lại một số lớp đặc trưng của mô hình như ba cặp lớp tích chập - max pool ở phần đầu, hai fire module của phan thân, một số lớp passthrough (route) và phan fine-grained feature. Như vậy, tổng số lớp của mô hình Custom Tinier YOLO chỉ còn lại 18 lớp (Bảng 3.1).
Bảng 3.1. Bảng thông số mô hình Custom Tinier YOLO.
Size/Strik
e
224x224x1 | 224x 224x 16
224 x 224x 16 | 112x 112x 16
2 Conv 64 3x3/1 112x112x16 | 112x 112x64
3 Max 4x4/4 112x112x64 | 28x 28x64
4 Conv | 256 3x 3/1 28 x 28 x 64 28 x 28 x 256
5 Max 4x4/4 28 x 28 x 256 7x 7x 256
37
6 Conv 64 Ix 1/1 7x7x 256 7x7x 64
7 Conv | 256 1x11 7x7x 64 7x7x 256
8 Route 6
9 Conv | 256 3x3/1 7x7x 64 7x7x256
17 Conv 24 1x1 7x7x5l12 7x7x24
| 18 Yolo |
3.2. Chuẩn bị và huấn luyện mô hình
Dữ liệu huấn luyện mô hình bao gồm hình ảnh của ba loại phương tiện giao thông
- xe hơi, xe tải và xe máy. Mỗi ảnh thuộc tập dữ liệu sẽ đi kèm với một file coordinates. File này chứa thông tin mô tả ground truth của các đối tượng có trong
ảnh và có dạng (c, x, y, w, h) hay còn gọi là annotations. Trong đó, c là lớp ma đối
tượng thuộc về, x và y là tọa độ tâm của bounding box, w và h là chiều rộng và chiều
cao của box. Tọa độ tâm và kích thước của box đều ở dạng chuẩn hóa, tức là giá trị thuộc khoảng [0, 1]. Giá trị c là số nguyên tương ứng với chỉ số của lớp đối tượng được định nghĩa, giá trị này tăng dần bắt đầu từ 0.
38
Dữ liệu được sưu tập từ nhiều nguồn khác nhau, chẳng hạn từ các cộng đồng khoa
học dữ liệu như Kaggle, Roboflow và từ dự án của đại học Stanford có tên là Stanford car dataset.
Roboflow, Kaggle là các nền tang thị giác máy tinh cho phép người dùng xây dựng mô hình máy học, cung cấp tài nguyên huấn luyện và các công cụ xử lí dé liệu,
xây dựng dataset như tạo annotation cho dữ liệu của các mô hình YOLO. Ngoài ra,
các dataset của người ding có thé chia sẻ với cộng đồng, giúp tiết kiệm thời gian thu
thập, xử lí.
Stanford car dataset chứa hơn 16000 ảnh về xe hơi phục vụ cho các dự án thị giác máy tính nhằm phân loại các mẫu xe, được xây dựng bởi phòng nghiên cứu AI của đại học Stanford. Tập dữ liệu đa dạng về hãng và màu sắc, ngoài cung cấp annotation, tập dữ liệu này còn cung cấp thông tin cơ bản về chiếc xe trong ảnh như tên hãng,
mâu xe, năm sản xuât.
Nhóm đã thu thập nhiều dataset từ nhiều người dùng khác nhau trên hai nền tảng trên kết hợp với tập dữ liệu của Stanford. Các tập này chỉ bao gồm ảnh và file annotation. Tuy nhiên, nhiều người dùng sử dụng lại dataset của nhau nên dữ liệu bị trùng lặp khá nhiều, do đó, nhóm phải tìm lọc các ảnh trùng đề giảm kích thước của tập dữ liệu. Ngoài ra, vì từ nhiều nguôn nên chỉ số class của các bounding box không đồng nhất, do đó nhóm phải đồng bộ các chỉ số này trước khi đưa vào tập dữ liệu cuối
39
cùng. Ngoài ra, để giảm dữ liệu đầu vào cho mô hình, nhóm đã đưa dữ liệu huấn luyện về dạng ảnh xám.
Mặt khác, hiện nay có rất nhiều loại phương tiện giao thông đang được lưu hành, trong đó, ba loại xe hơi, xe máy, xe tải cũng được phân chia thành nhiều nhóm nhỏ khác nhau, được phân loại dựa trên mục đích sử dụng, phân khối, cấu trúc xe, kích thước... vì vậy, mỗi loại đều có đặc điểm, hình dáng riêng. Việc xây dựng một bộ dữ liệu bao gồm tất các loại xe thuộc ba nhóm rất phức tạp và cần đầu tư rất nhiều thời gian,nên đối với mỗi loại, nhóm chỉ chọn ra những loại xe có những đặc trưng phổ biến. Đặc điểm của mỗi đối tượng được liệt kê ở Bảng 3.2.
Kết quả nhóm thu thập được tập dữ liệu hơn 30000 ảnh. Trong đó, đối tượng xe hơi chiếm 40%, xe máy chiếm 40%, còn lại là xe máy.
Bang 3.2. Liệt kê đặc trưng các loại xe trong tập huấn luyện.
Đối tượng Đặc trưng Ảnh minh họa
| Cau tạo: 4 bánh, loại 4/7/14 chỗ ngồi
- Góc chụp: chính diện, ittr phía sau, từ man
trái/phải.
Xe hoi - Phan lớn xuất hiện độc
lập ảnh (không có phương
tiện khác hay cùng loại).
Phần lớn được chụp thực tế
co bối cảnh, chất lượng ảnh không đồng đều.
-Cấu tạo: Xe chia làm hai phần chính: phần đầu là buồng lái và phần sau dành
cho khoang chứa hàng hóa.
(Tập dữ liệu có ba loại là đầu
Xe tai xe kéo container, xe tai
thùng va xe tai lửng.
- Góc chụp: chính diện,
từ man trai/phai.
Phan lớn xuất hiện độc lập
trong ảnh.
- Cấu tạo: 2 bánh, loại phân khối lớn >175cc.
- Góc chụp: chính diện,
từ mạn trái/phải. x
- Phan lớn xuất hiện độc
lập trong ảnh.
Phan lớn được chụp thực tế
co bối cảnh, chất lượng ảnh không đồng đều.
Xe máy
3.3. Chuẩn bị và huấn luyện
Mô hình được huấn luyện dựa trên framework Darknet. Nhóm sử dụng GPU runtime có cấu hình Intel Xeon CPU @2.20 GHz, 13 GB RAM, Tesla K80 accelerator, 12 GB GDDR5 VRAM cấp bởi Google Colab dé huấn luyện mô hình.
3.3.1. Cấu hình mô hình trên framework darknet
Bước 1: Tạo các file cấu hình cần thiết, bao gồm:
- File config mô hình tinier_yolo.cfg: file này khai báo các lớp và cau hình của mỗi lớp trong mô hình.
- File train.txt, valid.txt: 2 file này chứa đường dẫn đến ảnh trong dataset, phục vụ cho việc huấn luyện mô hình.
- File yolo.names: file này chứa tên của các lớp đối tượng nhận diện, mỗi hàng
chứa tên của một lớp.
- File yolo.data: file này tổng hợp đường dẫn của các file ké trên, được dùng làm tham số cho lệnh huấn luyện của darknet. Ngoài ra, file chứa đường dẫn của folder back-up - dung dé lưu lại các file weights trong quá trình huấn luyện sau một số vòng lặp nhất định.
Bước 2: Thêm dữ liệu huấn luyện vào folder data của framework. Ảnh và annotation có thé dé chung với nhau.
4I
3.3.2. Huấn luyện mô hình
Nhóm sử dung framework darknet của tác giả AlexeyAB - một phiên bản cải tiễn
từ framework của pjreddie(Redmon). AlexeyAB đã khắc phục một số bat cập khi huấn luyện như thông tin huấn luyện thiếu rõ ràng, thời điểm lưu file weight chưa hiệu quả... Tác giả cũng thêm một số hàm hỗ trợ vẽ đồ thị, phân cụm anchor box,
tính mAP...
Để huấn luyện nhóm dùng lệnh:
!/darknet detector train yolo.data cfg/0_tinier.cfg backup/0_tinier_last.weights -
map
Trong đó, cờ -map sẽ tính mAP sau một số vòng lặp giúp nhằm kịp thời điều chỉnh cấu hình cho phù hợp.
3.4. Xây dựng hệ điều hành Linux trên board DE1-SoC
Hệ điều hành Linux trên board sẽ giúp ích rất nhiều cho việc thực thi chương trình host (host program) trên HPS và kernel trên FPGA. Điều nay làm giảm thiểu bớt độ phức tạp khi lập trình dé nhúng vào board.
Sơ lược về hệ điều hành trên board:
- Hệ điều hành armhf ubuntu 18.04 với nhân linux-socfpga phiên bản 3.18.
- Intel® FPGA Runtime Environment (RTE) for OpenCL phiên ban 18.1.
- Có tích hợp thêm thư viện OpenBLAS phục vụ cho việc tính toán.
- Dé dé dàng kiểm tra được kết quả thi ding VNC (Virtual Network Computing).
Dé có được hệ điều hành Linux chạy trên board DE1-SoC thì nhóm tạo ra một SD image dé boot lên board với layout như sau:
42
address
Hình 3.2. Layout của SD card image [16]
Bang 3.3. Chỉ tiết của mỗi partition.
Vị trí Tên file Mô tả
Partition | zlmage Compressed Linux kernel image
file
soc_system.dtb Linux Device Tree Blob file
opencl.rbf Compressed FPGA configuration
file
uboot.img Uboot Image
uboot.scr Uboot Script
Partition 2 rootfs Linux root filesystem
Partition 3 preloader- preloader image
mkpimage.bin
43
3.4.1. Luồng boot linux [17]
Hình 3.3 giải thích về luồng boot Linux trên board, điều này giải đáp được lý do cần có những file đã liệt kê ở trên. Sau khi reset thì phần đầu tiên được thực hiện sẽ
là Boot ROM, khi đó Boot ROM sẽ phải tìm trên thẻ SD xem preloader ở đâu bằng cách kiểm tra pin BSEL đã được người dùng đặt. Từ đó preloader sẽ được load đề setup môi trường để chạy u-boot, và cuối cùng u-boot sẽ boot linux lên board.
+ Starts Running code at reset exception address + Normal operation, BootROM is mapped to reset address
7 + Hardcoded by Altera into device
+ Read Boot source from BSEL pins + Setup minimal configuration to read flash
= + Load Preloader from Flash or execute from FPGA
wr+ Jumps to Preloader
+ U-Boot SPL + Setup HPS |Os and pinmuxing
—_ * Setup PLLs and clocking
* Initialize SDRAM
* Load subsequent stage from Flash into SDRAM + Jump to subsequent stage (typically U-Boot)
* Load Linux
Hình 3.3. Luồng boot Linux. [17]
Khi Linux kernel được boot lên, một số thao tác sẽ được thực hiện như setup các thanh ghi xử lý, bộ quản lý bộ nhớ, bộ điều khiển ngit,.. va driver giao tiếp với may tính sẽ phải được load lên càng sớm càng tốt để người dùng có thể biết được việc boot có thành công hay có lỗi sai gì nhằm sửa chữa kịp thời.
Tiếp đến, nó sẽ khởi tạo các kernel (những kernel có chức năng khác như hỗ trợ board giao tiếp với USB camera, ...) và các driver đã được biên dịch vào kernel. Root filesystem (filesystem chứa các file shell và các chương trình cần chạy trên board) được mount ở bước cuối cùng như được mô tả ở Hình 3.4
44
Hình 3.4. Các bước chạy sau khi Linux kernel được boot
3.4.2. Các công cụ cần thiết
Dé tạo các file cần thiết cho hệ thống linux nhúng trên board DE1-SoC cần phải
có các công cụ sau của Intel:
e_ Intel® Quartus® Prime Standard Edition hỗ trợ các thiết bi Cyclone V [15]
e Intel® FPGA SDK for OpenCLTM [15]
e@ Intel® SoC FPGA Embedded Development Suite [18]
e@ Intel® FPGA Runtime Environment for OpenCLTM [15]
Đồng thời quá trình tạo các file hệ thống được nhóm làm trên hệ điều hành Ubuntu
và các bước thực hiện tương ứng với các mục dưới đây. Các mục sau nhóm dùng ví
dụ hello_world để mô tả các bước thực hiện. Ví dụ này được Terasic cung cấp trong
45
các BSPs (Board support packages) dành cho Intel® FPGA SDK for OpenCLTM 18.1 trén trang web cua ho [19]:
BSP(Board Support Package) for Altera SDK OpenCL 18.1
Pte __rersion size] Date |Downioad|
2020- EA
DE1-SoC OpenCL BSP(.zi 10penCL BSP(zip) cool nữa
zoao. [Ẹ]
DE1-SoC OpenCL BSP(targz) 1.0
0803 cà
DE1-SoC OpenCL User Manual 05 ane.. ser Manu
men 08-03
Hình 3.5. Board package support của Terasic.
3.4.3. Tao file FPGA programmable bitstream (.aocx) va file raw binary
file (.rbf) [15]
Thuật toán GEMM sé được dùng lam kernel dé load vào FPGA. Dé tạo ra được file bitstream, trước hết cần phải cài đặt bién môi trường đề có thể chạy được các lệnh
aoc của Intel.
Nội dung của file setup biến môi trường của nhóm:
#!/bin/bash
export ALTERAOCLSDKROOT=/home/tram/intelF PGA/18.1/hld
export INTELFPGAOCLSDKROOT=/home/tram/intelF PGA/18.1/hld
export QSYS_ROOTDIR=/home/tram/intelF PGA/18. 1/quartus/sopc_builder/bin export SOCEDS_DEST_ROOT=/home/tram/intelF PGA/18. 1/embedded
export QUARTUS_ROOTDIR=/home/tram/intelF PGA/18.1/quartus
export QUARTUS_ROOTDIR_OVERRIDE=$QUARTUS_ROOTDIR
46
export
AOCL_BOARD_PACKAGE_ROOT=$INTELF PGAOCLSDKROOT/board/terasic/ lel_soc
export
IPATH=$INTELFPGAOCLSDKROOT/bin:$INTELFPGAOCLSDKROOT/linux64/b in:/usr/local/bin:$AOCL_BOARD_PACKAGE_ROOT/arm32/bin:$PATH
export
ILD_LIBRARY_PATH=$INTELF PGAOCLSDKROOT/host/linux64/lib:/opt/OpenBL| AS64/ib/:$AOCL_BOARD_PACKAGE_ROOT/arm32Nib/
export QUARTUS_64BIT=1
Raw binary file là file chứa dữ liệu cau hình của kernel dé dùng bên ngoài công
cụ Quartus.
Chạy câu lệnh sau để tạo ra bitstream chạy trên FPGA, chi tiết hướng dẫn cách thực thi và thiết lập lệnh của aoc(Altera OpenCL Compiler) có trong hướng dẫn của
Intel [15]:
aoc device/hello_world.cl -o bm/ hello worldlaocx -reporI -no-
imterleaving=default
Sau khi biên dịch xong sẽ cho ra các file cần thiết cho việc boot linux bao gồm
top.rbf, hello_world.aocx và thư mục hps_isw_handoff (thư mục này sẽ chứa các
thông tin liên quan đến hệ thống SoC được tạo ra bởi Qsys, các thông tin đó sẽ được preloader dung dé setup hệ thống).
3.4.4. Tạo file preloader (preloader-mkpimage.bin) [15]
Chức năng của file preloader chủ yếu là dé setup hệ thống đề bootloader (hay u- boot) có thể chạy được. Cụ thể hơn là nó sẽ setup các PLL, clock, khởi tạo giao tiếp
SDRAM, ...
Để tạo ra được file preloader, công cụ embedded command shell của Intel®
SoC FPGA Embedded Development Suite (SoC EDS) với câu lệnh sau:
bsp-create-settings \
47
--type sp
--bsp-dir software/spl_bsp \
--preloader-settings-dir "hps_isw_handoff/system_acl_iface_hps"\
--settings software/spl_bsp/settings.bsp
Kết quả thực thi của câu lệnh sẽ là file preloader và thư mục software/spl_bsp.
3.4.5. Tạo file u-boot (uboot.img) [15]
Uboot chịu trách nhiệm cho các công đoạn truyền đi một dãy các tham số đến
kernel được gọi là “tham số boot” để các kernel low-level biết cách để boot(bao gồm
cả việc in ra các đoạn thông báo hay nơi tìm ra được root filesystem). Ngoài ra u-boot
còn năm vai trò quan trọng đối với các thiết bị SoC ở việc lập trình FPGA fabric.
Để tạo ra được uboot.img, trong thư mục spl_bsp được tạo ra ở bước trên sẽ có Makefile hỗ trợ tạo ra uboot nên chỉ cần thực thi câu lệnh sau:
make uboot
3.4.6. Tao file zImage và file device tree blob(.dtb)
Linux kernel sẽ được nén lại dưới dang zimage có thể tự giải nén khi kernel được
boot lên.
Altera có nguồn mở hỗ trợ việc tạo ra linux kernel có bao gồm những driver và những khởi tạo cần thiết cho các thiết bị SoC. Các bước thực hiện dé tạo ra được zImage được hướng dẫn chỉ tiết trên trang web của rocketboard và trên nguồn github
của Altera [20].
Device tree blob có những dữ liệu của phan cứng, những dữ liệu này sẽ được kernel sử dụng đề điều khién các thành phần của phần cứng. Cách thức tạo ra file device tree blob cũng được hướng dẫn tại github của Altera.
3.4.7. Tao root filesystem [17]
Đúng với tên gọi của nó, root filesystem chứa những dữ liệu cần thiết của hệ thống
để chạy linux với những ứng dụng cần thiết cho chương trình:
48
e Hệ thống khởi tạo: đây sẽ là chương trình đầu tiên được chạy sau khi linux
kernel được boot, chương trình này sẽ cài đặt không gian sử dụng cho người dùng và khởi động cả những ứng dụng cho người dùng như shell và chức
năng đăng nhập.
e Thư mục /dev: thư mục chứa các node của thiết bị giúp cho không gian người
dùng có thé truyền nhận dữ liệu qua lại với không gian kernel.
© Các kernel module: các driver cần thiết (như OpenCL driver).
Các bước thực hiện việc tạo root filesystem của nhóm được dé cập trong trang
web rocketboard[5].
3.4.8. Tạo u-boot script [I7]
Boot script có những câu lệnh được tự động chạy ngay khi thiết bị được boot.
Script này sẽ lập trình FPGA, load device tree, kernel và chạy kernel đó với bộ tham
số boot.
Nội dung của script như sau:
fatload mmc 0:1 $fpgadata top.rbf;
Jpga load 0 §ƒpgadata $filesize;
setenv fdtimage soc_ system.dtb;
setenv mmcroot /dev/mmcblk0p2;
setenv mmcload 'mmc_ rescan;${mmcloademd} mmc 0:${mmcloadpart}
${loadaddr} ${bootimage};${mmcloadcmd} mmc_ 0:${mmcloadpart} ${fdtaddr}|
${fdtimage};';
setenv mmcboot ‘setenv bootargs console=ttyS0,115200 root=${mmcroot} rw| rootwait; bootz ${loadaddr} - ${fdtaddr}';
run bridge_enable_handoff;
run mmcload;
run mmcboot;
49
Seript bắt đầu bằng việc load bitstream khởi tạo FPGA ở partition đầu tiên của thẻ
SD và đưa vào địa chỉ $fpgadata trong RAM. Sau đó nó sẽ lập trình FPGA và cho
phép cầu nối giữa HPS va FPGA bằng các lệnh của Altera.
Tiếp theo, script set tên của device tree binary và set biến dé kernel tim ra được
nơi lưu trữ root filesystem.
Sau đó, hai câu lệnh quan trọng nhất trong script là chạy mmcload và mmcboot.
mmcload sẽ load kernel image va device tree binary từ thẻ SD và đưa vào RAM vào
dia chỉ đã được định. mmcboot sẽ là lệnh chính để khởi động Linux kernel. Với các tham số boot được cài đặt bởi câu lệnh này, kernel ở cấp thấp sẽ biết được nên boot thế nào. Thư mục /dev/mmcblkOp2 (6 partition 2 của thẻ SD) được set sẽ là nơi chứa rootfilesystem. Tham số “rw” biểu thị rootfilesystem sẽ được mount theo kiểu Tead/Write, “rootwait” bắt kernel phải đợi đến khi thẻ SD được khởi tạo xong. Khi đã hồn thành việc cài đặt các tham s6, câu lệnh “bòrz” được dùng dé khởi động kernel.
Đê biên dịch và tạo thành file u-boot.src, dùng embedded command shell và sử dụng lệnh sau:
mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n "U-boot script" -d oot.script u-boot.scr
3.4.9. Tao OpenCL driver
Can phải có OpenCL driver để hỗ trợ cho việc thực thi chương trình trên board, đặc biệt là việc lập trình kernel vào FPGA. Nhóm sử dụng driver được cung cấp bởi
Intel trong package Intel® FPGA Runtime Environment for OpenCLTM Linux Intel®
Cyclone® V SoC TGZ [15]. Sau khi giải nén sẽ thu được các thư mục gồm thư mục /board/c5soc với các file tạo ra OpenCL driver trong /arm32/driver, chỉ cần thực thi câu lệnh “make” để biên dịch ra được file aclsoc_ drv.ko, chính là file driver cần thiết.
3.4.10. Tạo SD image [21]
Day là bước cuối cùng dé tạo ra image dé flash vào thẻ SD. Nhóm sử dung script python được phát triển bởi rocketboard.
50