BAITAPLON-TGMT-_1_

You might also like

Download as ppt, pdf, or txt
Download as ppt, pdf, or txt
You are on page 1of 25

BỘ GIÁO DỤC VÀ ĐÀO TẠO

TRƯỜNG ĐẠI HỌC PHENIKAA

BÁO CÁO BÀI TẬP LỚN HỌC PHẦN: THỊ


GIÁC MÁY TÍNH Đề tài: Phát hiện đối tượng
bằng YOLO v4

Sinh viên : Giàng Văn Lợi Mã số sinh viên: 18010143


Khóa: K12-KHMT Ngành: Khoa Học Máy Tính Hệ:
Chính quy
Giảng viên hướng dẫn: TS.Nguyễn Văn Tới

Hà Nội - 2024
MỤC LỤC
3
I. TỔNG QUAN........

II. CƠ SỞ LÝ THUYẾT............................................................................................................................3

1. YOLO là gì................................................................................................................................3
1.1. Lịch sử YOLO....................................................................................................................4
1.2. Yêu cầu về mạng YOLO.....................................................................................................4

2. Cách hoạt động của thuật toán YOLO......................................................................................5


2.1. Residual blocks...................................................................................................................5
2.2. Bounding box regression.....................................................................................................5
2.3. Hàm tính IOU.....................................................................................................................6
3. Kiến trúc mạng YOLO..............................................................................................................8

4. Output của YOLO...................................................................................................................10


4.1. Dự báo trên nhiều feature map.........................................................................................12

4.2. Anchor box.......................................................................................................................13


4.3. Dự báo bounding box........................................................................................................14
4.4. Non-max suppression ........................................................................................................16
5. Kiến trúc YOLO v4.................................................................................................................17
6. Những cải tiến của YOLO v4..................................................................................................17

7. Các tính năng nâng cao của YOLO v4.....................................................................................17


III. CODE CHƯƠNG TRÌNH................................................................................................................17

1. Khai báo thư viện được sử dụng trong chương trình...............................................................18


2. Sao chép và thiết lập Darknet cho YOLO v4...........................................................................18

3. Darknet cho python.................................................................................................................19


4. Ví dụ về YOLO v4 trên Hình ảnh Thử nghiệm........................................................................19

5. Chức năng trợ giúp.................................................................................................................20


6. YOLO trên webcam hình ảnh.................................................................................................20
7. YOLOv4 trên webcam videos..................................................................................................22
8. Chạy trên video webcam.........................................................................................................22
9. Kết quả....................................................................................................................................23
IV. TỔNG KẾT: ...................................................................................................................................24

V. LINK THAM KHẢO:.......................................................................................................................24

2
I. TỔNG QUAN.

Ngày nay, trí tuệ nhân tạo-Artificial Intelligence (AT) đang ngày càng phổ biến và góp
phần thay đổi sâu sắc nhiều khía cạnh trong cuộc sống hàng ngày. Trong đó thị giác máy
tính-Computer Vision (CV) là một lĩnh vực quan trọng của AI bao gồm các phương pháp
thu nhận, xử lý ảnh kỹ thuật số, phân tích và nhận dạng các hình ảnh.
Mạng Nơron học sâu (Deep learning Netaork) là lĩnh vực nghiên cứu các thuật toán,
chương trình máy tính để máy tính có thể học tập và đưa ra những dự đoán như con
người. Nó được ứng dụng vào nhiều ứng dụng khác nhau như khoa học, kỹ thuật, các lĩnh
phân loại và phát hiện đối tượng. Một ví dụ để nhận dạng tự động, tìm vực đời sống khác
cũng như các ứng điển hình là CNN (Convolutional Neural Netaork) áp dụ hiểu các mẫu
phân biệt từ ảnh bảng cách xếp chồng liên tiếp các lớp lên nhau và trong nhiễu ứng dụng,
CNN hiện nay được coi là trình phân loại ảnh mạnh và thúc đẩy các công nghệ trong lĩnh
vực thị giác máy tính, làm đòn bẩy cho quá trình học máy. Nhưng "bên cạnh đó, để phân
loại được một đối tượng thì công nghệ CNN tiêu tốn cực lớn về tài nguyên như bảng
thông, bộ nhớ và khả năng xử lý của phân cứng.
Object Detection (Nhận dạng vật thể) là một trong những hot của deep learning bởi khả
năng ứng dụng cao, dữ liệu dễ chuẩn bị và kết quả ứng dụng nhiều. Các thuật toán mới
của object detection như YOLO, có tốc độ khá nhanh và độ chính xác cao nên giúp cho
Object Detection có thể thực hiện được các tác vụ dường như là real time, thâm chí là
nhanh hơn so với con người mà độ chính xác không giảm. Chính vì tính ứng dụng rất cao,
dễ chuẩn bị dữ liệu và huấn luyện mô hình đơn giản nên nhóm sẽ giới thiệu tới một thuật
toán object detection chính là YOLO.
II.CƠ SỞ LÝ THUYẾT.

1. YOLO là gì.
YOLO là thuật toán object detection nên mục tiêu của mô hình không chỉ là dự báo nhãn
cho vật thể như các bài toán classification mà nó còn xác định location của vật thể. Do đó
YOLO có thể phát hiện được nhiều vật thể có nhãn khác nhau trong một bức ảnh thay vì
chỉ phân loại duy nhất một nhãn cho một bức ảnh. YOLO trong object detection có nghĩa
là “You only look once”. Tức là chúng ta chỉ cần nhìn 1 lần là có thể phát hiện ra vật thể.
Sở dĩ YOLO có thể phát hiện được nhiều vật thể trên một bức ảnh như vậy là vì thuật toán
có những cơ chế rất đặc biệt mà chúng ta sẽ tìm hiểu bên dưới.

3
1.1. Lịch sử YOLO.
Mô hình YOLO được mô tả lần đầu tiên bởi Joseph Redmon, và các cộng sự trong bài
viết năm 2015 có tiêu đề Bạn chỉ nhìn một lần: Phát đối tượng theo thời gian thực - You
Only Look Once: Unifned, Real-Time Object Detection. Trong công trình này thì một lần
nữa Ross Girshick, người phát triển mạng R-CNN, cũng là một tác giả và người đóng góp
khi ông chuyển qua Facebook AI Research.
Mô hình YOLOv2 được Joseph Redmon và Ali Farhadi nhằm cải thiện hiệu suất hơn nữa
trong bài báo năm 2016 có tựa đề là YOLO9000: Better, Faster, Stronger.
Mặc dù biến thể của VYOLO được gọi là YOLOv2, một instance của mô hình theo như
mô tả đã được đào tạo trên hai bộ dữ liệu nhận dạng đối tượng, và có khả năng dự đoán
lên tới 9000 loại đối tượng khác nhau, do đó được đặt tản là YOLO9000. Với con số này
thì mô hình này đã tiến xa hơn rất nhiều so với mọi mô hình trước đó về số lượng các loại
đối tượng có khả năng phát hiện.
YOLO v3 có một gia tăng trên YOLOv2. DarkNet-53 với cách kết nối ngắn gọn, tính
năng lấy mẫu cũng như phát hiện đối tượng và nguồn cấp dữ liệu trực tiếp hoặc hình ảnh
tốt hơn, triển khai và cập nhật bằng cách sử dụng thư viện học sâu Keras hoặc OpenCV.
1.2. Yêu cầu về mạng YOLO.
Chúng ta cần nắm vững lý thuyết:

• Nguyên lý hoạt động của mạng nơ ron tích chập (Convolutional Neural Network): Đây
là mạng nơ ron áp dụng các layer Convolutional kết hợp với Maxpooling để giúp trích
xuất đặc trưng của ảnh tốt hơn. Bạn đọc có thể tham khảo Lý thuyết về mạng tích chập
neural.
• Khái niệm về bounding box, anchor box: Bounding box là khung hình bao quanh vật
thể. Anchor box là những khung hình có kích thước xác định trước, có tác dụng dự đoán
bounding box.
• Feature map: Là một khối output mà ta sẽ chia nó thành một lưới ô vuông và áp dụng
tìm kiếm và phát hiện vật thể trên từng cell.
• Non-max suppression: Phương pháp giúp giảm thiểu nhiều bounding box overlap nhau
về 1 bounding box có xác suất lớn nhất.

4
2. Cách hoạt động của thuật toán YOLO.

Thuật toán YOLO hoạt động bảng cách sử dụng ba kỹ thuật sau:

• Residual blocks (Khối đư)


• Bounding box regression (Hỏi quy hộp giới hạn).
• Intersection Over Union (IOU).
2.1. Residual blocks.

Đầu tiên, hình ảnh được chia thành nhiều lưới khác nhau. Mỗi lưới có kích thước. là S x
S. Hình 2.1 cho thấy một hình ảnh đầu vào được chia thành các lưới, có nhiều ô lưới có
kích thước bảng nhau. Mỗi ô lưới sẽ phát hiện các vật thể xuất hiện bên trong chúng. Ví
dụ, nếu một tâm vật thể xuất hiện trong một ô cell nhất định, thì ô này sẽ chịu trách nhiệm
phát hiện nó.

Hình 2.1. Các ô dưới SxS

2.2. Bounding box regression

Bounding box regression là bài toán dự đoán khi output là biến liên tục. Vì bounding box
ở đây (x.y,w.h) là bồn biến liên tục niên ta gọi là bài toán regression.

Mỗi Bounding box trong hình ảnh bao gồm các thuộc tính sau:

- Chiều rộng (bu).

- Chiều cao (bh).

- Các lớp (ví dụ: người, ô tô, đèn giao thông, v.v.). Được thể hiện bằng chữ c.

5
- Đường viễn tâm hộp (bx, Đy).

YOLO sử dụng Bounding box regression duy nhất để dự đoán chiều cao, chiều. rộng,
tâm và lớp của đối tượng.

Hình 2.2. cho thấy một ví dụ về hộp giới hạn. Bounding box regression đã được thể
hiện bằng một đường viên màu vàng.

Hình 2.2. Bounding box regression

2.3. Hàm tính IOU


Trên ta có đề cập prediction được định Pr(Object)* IOU(pred,truth), ta sẽ làm rõ hơn
IOU(pred, truth) là gì. IOU (INTERSECTION OVER UNION) là hàm đánh giá độ
chính xác của object detector trên tập dữ liệu cụ thể. IOU được tính bằng:

6
Trong đó Area of Overlap là diện tích phần giao nhau giữa predicted bounding box với
grouth-truth bouding box , còn Area of Union là diện tích phần hợp giữa predicted
bounding box với grouth-truth bounding box. Những bounding box được đánh nhãn bằng
tay trong tập traing set và test set. Nếu IOU > 0.5 thì prediction được đánh giá là tốt.

Trong hình 2.4, có hai bounding box, một box màu xanh lá cây và box còn lại màu xanh
lam. Box màu xanh lam là box dự đoán trong khi box màu xanh lá cây là box thực.
YOLO đảm bảo rằng hai bounding box này bằng nhau.

7
Hình 2.4 hai boxing xanh lam và xanh lá cây
3. Kiến trúc mạng YOLO
Cũng tương tự như tôi đã giới thiệu, kiến trúc YOLO bao
gồm: base network là các mạng convolution làm nhiệm vụ
trích xuất đặc trưng. Phần phía sau là những Extra Layers
base network của YOLO sử đượcdụng chủ yếu
áp dụng là các
để phát hiệnconvolutional layer và
vật thể trên feature mapcáccủa
fully
base
conntected layer. Các kiến trúc YOLO
network. cũng khá đa dạng và có thể tùy biến thành các
version cho nhiều input shape khác nhau.

Hình 1: Sơ đồ kiến trúc mạng YOLO. Thành phần Darknet Architecture được gọi là base
network có tác dụng trích xuất đặc trưng. Output của base network là một feature map có
kích thước 7x7x1024 sẽ được sử dụng làm input cho các Extra layers có tác dụng dự
đoán nhãn và tọa độ bounding box của vật thể.
Trong YOLO version 3 tác giả áp dụng một mạng feature extractor là darknet-53. Mạng
này gồm 53 convolutional layers kết nối liên tiếp, mỗi layer được theo sau bởi một batch
normalization và một activation Leaky Relu. Để giảm kích thước của output sau mỗi
convolution layer, tác giả down sample bằng các filter với kích thước là 2. Mẹo này có
tác dụng giảm thiểu số lượng tham số cho mô hình.

8
Type Filters Size Output
Convolutional 32 3x3 256 x 256

Convolutional 64 3x3/2 128 X 128


1x Convolutional 32 1 X1
Convolutional 64 3x3
Residual 128 X 128
Convolutional 128 3x3/2 64 X 64
2x Convolutional 64 1 X 1
Convolutional 128 3x3
Residual 64x64
Convolutional 256 3x3/2 32 X 32
8x Convolutional 128 1 X 1
Convolutional 256 3x3
Residual 32 X 32
Convolutional 512 3x3/2 16 X 16
8x Convolutional 256 1 X 1
Convolutional 512 3x3
Residual 16 X 16
Convolutional 10243x3/2 8x8
4x Convolutional 512 1 X 1
Convolutional 10243x3
Residual
Avgpool Global 8x8
Connected 1000
Softmax
Hình 2: Các layer trong mạng darknet-53.
Các bức ảnh khi được đưa vào mô hình sẽ được scale để về chung một kích thước phù
hợp với input shape của mô hình và sau đó được gom lại thành batch đưa vào huấn luyện.
Hiện tại YOLO đang hỗ trợ 2 đầu vào chính là 416x416 và 608x608. Mỗi một đầu vào sẽ
có một thiết kế các layers riêng phù hợp với shape của input. Sau khi đi qua các layer
convolutional thì shape giảm dần theo cấp số nhân là 2. Cuối cùng ta thu được một
feature map có kích thước tương đối nhỏ để dự báo vật thể trên từng ô của feature map.
Kích thước của feature map sẽ phụ thuộc vào đầu vào. Đối với input 416x416 thì feature
map có các kích thước là 13x13, 26x26 và 52x52. Và khi input là 608x608 sẽ tạo ra
feature map 19x19, 38x38, 72x72.

9
4. Output của YOLO
Output của mô hình YOLO là một véc tơ sẽ bao gồm các thành phần: yT=[p0,
(tx,ty,tw,th bounding box),(p1,p2,...,pc scores of c classes)]
Trong đó

• p0 là xác suất dự báo vật thể xuất hiện trong bounding box.
• (tx,ty,tw,th bounding box) giúp xác định bounding box. Trong đó tx,ty là tọa độ tâm
và tw,th là kích thước rộng, dài của bounding box.
• (pi,p2,.. ,,pc scores of c classes) là véc tơ phân phối xác suất dự báo của các classes.
Việc hiểu output khá là quan trọng để chúng ta cấu hình tham số chuẩn xác khi huấn
luyện model qua các open source như darknet. Như vậy output sẽ được xác định theo số
lượng classes theo công thức (n_class+5). Nếu huấn luyện 80 classes thì bạn sẽ có
output là 85. Trường hợp bạn áp dụng 3 anchors/cell thì số lượng tham số output sẽ là:
(n_class+5)x3=85x3=255

10


/

/
#
I
I

Attributes of a bounding box


tx
ty tw
Po\P\ P2 .... Pc XB
1 _/ \_S l__ 1

Box Co-ordinates Objectness Class Scores


Score

Hình 3: Kiến trúc một output của model YOLO. Hình ảnh gốc là một feature map kích
thước 13x13. Trên mỗi một cell của feature map chúng ta lựa chọn ra 3 anchor boxes với
kích thước khác nhau lần lượt là Box 1, Box 2, Box 3 sao cho

11
tâm của các anchor boxes trùng với cell. Khi đó output của YOLO là một véc tơ
concatenate của 3 bounding boxes. Các attributes của một bounding box được mô tả như
dòng cuối cùng trong hình.

4.1. Dự báo trên nhiều feature map


Cũng tương tự như SSD, YOLOv3 dự báo trên nhiều feature map. Những feature map
ban đầu có kích thước nhỏ giúp dự báo được các object kích thước lớn. Những feature
map sau có kích thước lớn hơn trong khi anchor box được giữ cố định kích thước nên sẽ
giúp dự báo các vật thể kích thước nhỏ.

Hình 4: Các feature maps của mạng YOLOv3 với input shape là 416x416, output là 3
feature maps có kích thước lần lượt là 13x13, 26x26 và 52x52.
Trên mỗi một cell của các feature map chúng ta sẽ áp dụng 3 anchor box để dự đoán
vật thể. Như vậy số lượng các anchor box khác nhau trong một mô hình YOLO sẽ là
9 (3 featue map x 3 anchor box).
Đồng thời trên một feature map hình vuông S x S, mô hình YOLOv3 sinh ra một số
lượng anchor box là: S x S x 3. Như vậy số lượng anchor boxes trên một bức ảnh sẽ là:

(13x13+26x26+52x52)x3=10647(anchor boxes)
Đây là một số lượng rất lớn và là nguyên nhân khiến quá trình huấn luyện mô hình
YOLO vô cùng chậm bởi chúng ta cần dự báo đồng thời nhãn và bounding box trên đồng
thời 10647 bounding boxes.
Một số lưu ý khi huấn luyện YOLO:

• Khi huấn luyện YOLO sẽ cần phải có RAM dung lượng lớn hơn để save được
10647 bounding boxes như trong kiến trúc này.

12
• Không thể thiết lập các batch_size quá lớn như trong các mô hình classification vì
rất dễ Out of memory. Package darknet của YOLO đã chia nhỏ một batch thành
các subdivisions cho vừa với RAM.
• Thời gian xử lý của một step trên YOLO lâu hơn rất rất nhiều lần so với các mô
hình classification. Do đó nên thiết lập steps giới hạn huấn luyện chó YOLO nhỏ.
Đối với các tác vụ nhận diện dưới 5 classes, dưới 5000 steps là có thể thu được
nghiệm tạm chấp nhận được. Các mô hình có nhiều classes hơn có thể tăng số
lượng steps theo cấp số nhân tùy bạn.
4.2. Anchor box
Để tìm được bounding box cho vật thể, YOLO sẽ cần các anchor box làm cơ sở ước
lượng. Những anchor box này sẽ được xác định trước và sẽ bao quanh vật thể một
cách tương đối chính xác. Sau này thuật toán regression bounding box sẽ tinh
chỉnh lại anchor box để tạo ra bounding box dự đoán cho vật thể. Trong một mô
hình YOLO:
• Mỗi một vật thể trong hình ảnh huấn luyện được phân bố về một anchor box.
Trong trường hợp có từ 2 anchor boxes trở lên cùng bao quanh vật thể thì ta sẽ xác
định anchor box mà có IoU với ground truth bounding box là cao nhất.

Hình 5: Xác định anchor box cho một vật thể. Từ Cell i ta xác định được 3 anchor boxes
viền xanh như trong hình. Cả 3 anchor boxes này đều giao nhau với bounding box của
vật thể. Tuy nhiên chỉ anchor box có đường viền dày nhất màu

13
xanh được lựa chọn làm anchor box cho vật thể bởi nó có IoU so với ground truth
bounding box là cao nhất.

• Mỗi một vật thể trong hình ảnh huấn luyện được phân bố về một cell trên feature
map mà chứa điểm midpoint của vật thể. Chẳng hạn như hình chú chó trong hình
3 sẽ được phân về cho cell màu đỏ vì điểm midpoint của ảnh chú chó rơi vào
đúng cell này. Từ cell ta sẽ xác định các anchor boxes bao quanh hình ảnh chú
chó.

Như vậy khi xác định một vật thể ta sẽ cần xác định 2 thành phần gắn liền với nó là
(cell, anchor box). Không chỉ riêng mình cell hoặc chỉ mình anchor box.
Một số trường hợp 2 vật thể bị trùng mid point, mặc dù rất hiếm khi xảy ra, thuật toán
sẽ rất khó xác định được class cho chúng.
\?
Anchor box example
^*

A
by
bh ]g
bw v>u>
Ci
c2
c3
Pc l,
bx w

by s
bh A
bw
Anchor box 1: Anchor box 2: <Đ
Cl
c2 ĩ
c3- -o _ J
Andrew Ng

Hình 6: Khi 2 vật thể người và xe trùng midpoint và cùng thuộc một cell. Thuật toán
sẽ cần thêm những lượt tiebreak để quyết định đâu là class cho cell.

4.3. Dự báo bounding box


Để dự báo bounding box cho một vật thể chúng ta dựa trên một phép biến đổi từ anchor
box và cell.
YOLOv2 vả YOLOv3 dự đoán bounding box sao cho nó sẽ không lệch khỏi vị trí trung
tâm quá nhiều. Nếu bounding box dự đoán có thể đặt vào bất kỳ phần nào

14
của hình ảnh, như trong mạng regional proposal network, việc huấn luyện mô hình có thể
trở nên không ổn định.
Cho một anchor box có kích thước (pw,ph) tại cell nằm trên feature map với góc trên
cùng bên trái của nó là (cx,cy), mô hình dự đoán 4 tham số (tx,ty,tw,th) trong đó 2 tham
số đầu là độ lệch (offset) so với góc trên cùng bên trái của cell và 2 tham số sau là tỷ lệ so
với anchor box. Và các tham số này sẽ giúp xác định bounding box dự đoán b có tâm
(bx,by) và kích thước (bw,bh) thông qua hàm sigmoid và hàm exponential như các công
thức bên dưới:
bx=ơ(tx)+cxby=ơ(ty)+cybw=pwetwbh=pheth

Ngoài ra do các tọa độ đã được hiệu chỉnh theo width và height của bức ảnh nên luôn
có giá trị nằm trong ngưỡng [0, 1]. Do đó khi áp dụng hàm sigmoid giúp ta giới hạn
được tọa độ không vượt quá xa các ngưỡng này.

Hình 7: Công thức ước lượng bounding box từ anchor box. Hình chữ nhật nét đứt bên
ngoài là anchor box có kích thước là (pw,ph). Tọa độ của một bounding box sẽ

15
được xác định dựa trên đồng thời cả anchor box và cell mà nó thuộc về. Điều này giúp
kiểm soát vị trí của bounding box dự đoán đâu đó quanh vị trí của cell và bounding box
mà không vượt quá xa ra bên ngoài giới hạn này. Do đó quá trình huấn luyện sẽ ổn định
hơn rất nhiều so với YOLO version 1.

4.4. Non-max suppression


Do thuật toán YOLO dự báo ra rất nhiều bounding box trên một bức ảnh nên đối với
những cell có vị trí gần nhau, khả năng các khung hình bị overlap là rất cao. Trong trường
hợp đó YOLO sẽ cần đến non-max suppression để giảm bớt số lượng các khung hình
được sinh ra một cách đáng kể.

Before non-max suppression After non-max suppression

Non-Max
Suppression

Hình 8: non-max suppression. Từ 3 bounding box ban đầu cùng bao quanh chiếc xe đã
giảm xuống còn một bounding box cuối cùng.
Các bước của non-max suppression:
• Step 1: Đầu tiên chúng ta sẽ tìm cách giảm bớt số lượng các bounding box bằng cách
lọc bỏ toàn bộ những bounding box có xác suất chứa vật thể nhỏ hơn một ngưỡng
threshold nào đó, thường là 0.5.
• Step 2: Đối với các bounding box giao nhau, non-max suppression sẽ lựa chọn ra một
bounding box có xác xuất chứa vật thể là lớn nhất. Sau đó tính toán chỉ số giao thoa IoU
với các bounding box còn lại. Về chỉ số IoU, các bạn xem lại mục
Một số đính nghĩa - Bài 13 - Model SSD trong Object Detection
Nếu chỉ số này lớn hơn ngưỡng threshold thì điều đó chứng tỏ 2 bounding boxes đang
overlap nhau rất cao. Ta sẽ xóa các bounding có có xác xuất thấp hơn và giữ

16
lại bounding box có xác suất cao nhất. Cuối cùng, ta thu được một bounding box duy nhất
cho một vật thể.
5. Kiến trúc YOLO v4
Một thuật toán phát hiện đối tượng tối ưu yêu cầu các tính năng sau
- Kích thước mạng đầu vào lớn hơn để phát hiện nhiều đối tượng có kích thước nhỏ.
- Nhiều lớp hơn cho trường tiếp nhận cao hơn sẽ cho phép xem toàn bộ đối tượng, xem
bối cảnh xung quanh đối tượng và tăng số lượng kết nối giữa điểm hình ảnh và kích hoạt
cuối cùng.
- Nhiều thông số hơn - cho khả năng mô hình lớn hơn để phát hiện nhiều đối tượng có
kích thước khác nhau trong một hình ảnh duy nhất.
6. Những cải tiến của YOLO v4
YOLO v4 là một loạt các cải tiến về tốc độ so với YOLOv3 và được cài đặt từ một bản
fork của Darknet. Kiến trúc của YOLOv4 đã đưa bài toán object detection dễ tiếp cận hơn
với những người không có tài nguyên tính toán mạnh. Chúng ta hoàn toàn có thể huấn
luyện một mạng phát hiện vật với độ chính xác rất cao bằng YOLO v4 chỉ với GPU 1080ti
hoặc 2080ti. Trong tương lai, việc tối ưu lại các mạng hiện tại để phù hợp với tài nguyên
tính toán yếu hoặc tạo ra sự song song hóa cao ở các server chắc chắn phải được thực hiện
để có thể đưa các ứng dụng computer vision vào thực tế.
7. Các tính năng nâng cao của YOLO v4.

- Yolo v4 có tốc độ suy luận nhanh hơn đối với máy dò đối tượng trong hệ thống sản
xuất.
- Tối ưu hóa cho các tính toán song song

- Yolo v4 là một mô hình phát hiện đối tượng hiệu quả và mạnh mẽ sử dụng một GPU
duy nhất để cung cấp một máy phát hiện đối tượng chính xác một cách nhanh chóng.
III. CODE CHƯƠNG TRÌNH.

17
1. Khai báo thư viện được sử dụng trong chương trình.

# import dependencies
from rPython.display import display, Javascript,
Inage
from google.Í3lab.output import evaljs
from google.colab.patches import: cu2_iashow
from base64 import bS4decode, b64encode
inport CV2
inport numpy as np
irport RIL
irport id
irport html
irport time
inport martplot lib.pyplot as pit j&iatpLotlib
inline

2. Sao chép và thiết lập Darknet cho YOLO v4.


A, Sao chép dữ liệu từ kho lưu trữ Darknet
# clone darknet repo
Ịgit clone htt p s://gith ub.cog/AlexeyAB/darknet

Cloning into 'darknst'..,


remote: Enumerating objects: 14EE4, done.
remote: Total 14Ẽ54 (delta 0), reused 0 (delta 0), pack-reused 14654 Receiving
objects: 100% (14654/14654), 13.25 tea I 22.76 FliB/Sj done.
Resolving deltas: 130% (9973/9973)., done.

B, thay đổi makefile để bật GPU, OPENCV và LIBSO


# change makefile to have GPU, OPENCV and LIBSO enabled %cd darknet
sed -Ĩ ,s/OPE1-JCV=e/CPENCV=i/' Makefile . sed -i 'S/GFU=0/GPU=1/■ makefile sed -Ĩ 1 s/CUDMt^e/OJDWtl/' Makefile . sed -Ĩ 'S/CUDI#J_I-
IALF=0/C1JDI*I_I-IALF=1/' Make-lie . sed -Ĩ ' s/LIBSO=e^/LIBSO=l/■ Makefile
/cont ent/darknet

C, tạo darknet (xây dựng darknet để sau đó bạn có thể sử dụng tệp darknet.py và có các
phụ thuộc của nó)
ị # make darkrert (builds darknet so that you can then use the darknet.py file and have its dependencies)
Intake

D, nhận được tệp weights YOLO v4 được chia tỷ lệ bthe được đào tạo trước để phát
hiện 80 lớp (đối tượng) từ ổ đĩa google được chia sẻ

18
[13] 1 # get bthe scaled yolov4 weights file that is pre-tnained to detect 80 classes (objects) from shared google drive
2 !wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/

--2024-07-02 20:40:24-- https://docs .google ■ coiìi/uc?export=download&confirm=&id=lV3v5ĩaxAlGlA)vK4Aar9bAiK5U0OFttKwq


Resolvingdocs.google.com (docs.googleTcom)... 172.217.214.101, 172.217.214.113, 172.217.214.100, ...
Connecting to docs.google.com (docs.google.com)1172.217.214.101[:443... connected.
HTTP request sent, awaiting response... 303 See other
Location: https : //drive. usercontent .google. com/download?id=lV3vsĩaxAlGl>JvK4Aar9bAiK5LI0OFttKi'jq&export=download [following] --2024-07-02
20:40:24-- https://drive.usercontent■google■com/download?id=lV3vsIaxAlGWvK4Aar9bAiK5ư0OFttKwq&export=download Resolving
drive.usercontent.google.com (drive.usercontent.google.com)... 74.125.202.132, 2607:f8b0:4001:C06::84
Connecting to drive.usercontent.google.com (drive.usercontent.google.com)|74.125.202.1321:443___ connected.
HTTP request sent, awaiting response... 200 OK Length: 2430 (2.4K) [text/html]
Saving to: fyolov4-csp.weights*

yolov4-csp.weights 100%[===================>] 2.37K --.-KB/s in 0S

2024-07-02 20:40:24 (19.3 MB/s) - fyolov4-csp.weights’ saved [2430/2430]

3. Darknet cho python.


# import darkrvet functions to perform object detections from darkret irport *
# load in our YDL0V4 architecture network
network, class names, class colors = load_network("cfg/yolov4-csp.cfg", "cfg/coco.data", "yolov4-csp.weights") width =
network_width(network) height = network_height(network)

# darknet helper function to run detection on image def darknet_helper(img, width, height):
darkret_image = make_image(width, height, 3) img_rgb = cv2.cvtcolor(img, CV2.COLOR_BGR2RGB) img_resiied = cv2.resiie(img_rgb, (width,
height),
interpc lati ;n=cV2?: j ^_L INEAR) I

# get image ratios to convert bounding boxes to proper size img_height, img_width, = img.shape
width ratio = img_width/width height ratio = img_height/height

# run model or darknet style Image to get detections


copy image_from_bytes(darkret_image, img_resized.tobytes()) detections = detect_inage{network, class_nares, darknet image) free
inage(darknet image) return detections, width ratio, height ratio

4. Ví dụ về YOLO v4 trên Hình ảnh Thử nghiệm


# run test on person.jpg image that comes with repository inage = cv2.imread("data/person.jpg")
detections, width_ratio, height_ratic = darknet_helper(image, width, height)

for label, confidence, bbox in detections: left, top, right, bottom = bbox2points(bbox)
left, top, right, bottom = int(left * width ratio), int(tcp * height_ratio), int(right * width ratio), int(bottom * height_ratlo) cv2.rectangle(image, (left,
top), (right, bottom), class_colors[label], 2) cv2.putText(image, "{} [{:.2f}]".format(label, float(confidence)),
(left, top - 5), CV2.FONT_HERSHEY_SIMPLEX, 0.5, class_colors[label], 2)
cv2_imshow(image)

19
5. Chức năng trợ giúp.
# function to convert the JavaScript object into an OpenCV image def js to_image(js reply):

Params:
js reply: JavaScript object containing image from webcam
Returns:
img: opencv BGR image

# decode base64 image


image bytes » b64decode(js reply.split (', ■) [1])
# convert bytes to nunpy array
jpg_as_np = rp.frcmbuffer(image_bytes J dtype=np.uints)
# decode numpy array into OpenCV BGR image img * cv2.imdecode(jpg_as_np, flags*l)

retun Irg

# function to convert OpenCV Rectangle bounding box image into baseS4 byte string to be overlayed or video stream def
bbox_to_bytes(bbox_array):

Params:
bbox_array: Numpy array (pixels) containing rectangle to overlay on video stream.
Returns:
bytes: Base64 image byte string

# convert array into PIL image


bbox_PiL = PIL.image.fromarray(bbox_array, 'RGBA') iobuf « io.Bytesio()
# format bbox into png for return bbox_PIL.save(iobuf, format=’png')
# format return string

bbox_bytes = 'data:Ỉnage/png;base64,{}',format((str(b64encode(iobuf.getvalueO), 'utf-S'))) return bbox_bytes

6. YOLO trên webcam hình ảnh


A, hình ảnh đối tượng javascript thành opencv

20
đef take_photo(filenames'photo.jpg', qualỉty»e.8): js = Davascripte " async function
takePhoto(quality) ị const div = document.createElenent('div'); const capture =
document.createElement(’button'); capture.textcontent » ‘Capture’;
dỉv.appendchỉld(capture);

const video a document.createElement(’video'); video.style.display = ’block';


const stream = await navigator.nediaDevices.getUserMedia({videc: true});

docunent. bod1/. appendchild(div); div.appendchild(video); video.srcobject = stream; await


video.play0;
// Resize the output to fit the video element.

google.colab.output.setIframeHeight(document.documentElement.scrollHeight, true); // wait

for capture to be clicked.


await new Pro«ise((resolve) => capture.onclick = resolve);

const canvas = document.createElementCcanvas');


canvas.width a video.videowidth;
canvas.height s video.videcHeight;
canvas.getcontext(12d').drawlmage(video, 0, 0);
stream.getv ideoTrac ks()[0].stop();
div.removeO;

B.
return canvas.tooatauRL('inage/jpeg', quality);

"}
display(js)
# get photo data
data = eval_js('takePhoto({})‘.fomat(quality))

B, chuyển vào mô hình YOLOv4 của chúng tôi để phát hiện đối tượng.
try:
■filename = tafce_ptKito{Ị'photo .jpg') print('Saved to O' .format{filename))
# Show the inage which was just taken, display[Image(filename))
except Exception as err:
# Errors will be thrown if the user does not have a webcam or if they do not
# grant the page permission to access it. print(str(err))

21
7. YOLOv4 trên webcam videos
# Javascript to properly create our live video stream using our webcam as input def
video_stream(): js = Javascripte ■' var video; var div = null; var stream; var
captureCanvas; var imgElenent; var labelElement;

var pendingSesolve = null; var shutdown = false;

function removeoomO {
stream.getvideoTrac ks()[0].stop();
video.remove();
div.removeO;
video = null;
div = null;
stream m null;
imgElement = null;
capturecanvas = null;
labelElement = null;
J
function onAnimationframeO { if ('shutdown) {
window.requestAnimationFrame(onAnimationFrame);
}
if (pendingResolve) { var result =

8. Chạy trên video webcam.


# start streaming video from webcam video_stream()
# label for video label_html = 'capturing...'
# initialze bounding box to empty bbox * ''
count = 0 while True:
js reply = videc_frame(label_html. l bbcx) if not js_reply:
break

# convert DS response to opencv image frame » Ìs_to_inage(js_reply["img"])

# create transparent overlay for bounding box bbox_array = np.zeros([480,640,4], dtype=np.uint8)

# call our darknet helper on video frame


detections, width_ratio, height_ratio = darknet_helper(frame, width, height)

# loop through detections and draw them on transparent overlay image for label, confidence, bbox in detections:
left, top, right, bottom = bbox2points(bbox)
left, top, right, bottom = int(left * width_ratio), int(tcp * height_ratio), int(right * width_ratio), int(bottom x
height_ratio) bbox_array a
cv2.rectangle(bbox_array, (left, top), (right, bottom), class_colors[label], 2) bbox_array a cv2.putText(bbox_array, "{} [{:.2f}]".format(label,
float(confidence)),
(left, top - 5), CV2.F0NT_H6RSHEY_SIMPLEX, 0.5, class colors[label]j 2)

bbcx array[:,:,3] a (bbox array.nax(axis a 2) > 0 ).astype(int) * 255


# convert overlay of bbox into bytes bbcx_bytes a bbox_to_bytes(bbox_array)
# update bbox so next frame gets new overlay bbcx = bbox_bytes

22
9. Kết quả.
A, Thử nghiệm trên hình ảnh person.jpg.

B, YOLO v4 trên webcam hình ảnh.

23
IV.TỔNG KẾT:

Như vậy qua bài viết này tôi đã lý giải cho các bạn nguyên lý hoạt động mạng YOLO theo
một cách khái quát nhất. Đây là một thuật toán rất phức tạp và bên trong nó có rất nhiều
các xử lý tính toán mà không đơn giản để chúng ta hiểu hết được toàn bộ chúng.
Em xin gửi lời cảm ơn sâu sắc đến giảng viên Nguyễn Văn Tới đã truyền đạt những kiến
thức quý báu cho em trong suốt thời gian học tập vừa qua. Trong thời gian tham gia lớp
học Thị giác máy tính, em đã có thêm cho mình nhiều kiến thức bổ ích, tinh thần học tập
hiệu quả, nghiêm túc. Đây chắc chắn sẽ là những kiến thức quý báu, là hành trang để em
có thể vững bước sau này. Tuy nhiên, do vốn kiến thức còn nhiều hạn chế và khả năng
tiếp thu thực tế còn nhiều bỡ ngỡ. Mặc dù em đã cố gắng hết sức nhưng bài báo cáo còn
nhiều thiếu sót và nhiều chỗ còn chưa chính xác, kính mong thầy xem xét và góp ý để bài
báo cáo của em được hoàn thiện hơn.

V. LINK THAM KHẢO:

Tài liệu về YOLO:

https://viblo.asia/p/tim-hieu-ve-volo-trong-bai-toan-real-time-obiect-detection-
yMnKMdvr57P

24
Tài liêu PDF cùa YOLOv4:

https://arxiv.org/pdf/2004.10934.pdf Code github:


https: //github.com/AlexeyAB/darknet Tài liêu YOLOv4:
https://ichi.pro/vi/phat-hien-doi-tuong-yolo-v4-184744934641190
Google colab:
https://colab.research.google.com/drive/1NFH0vSMKFZdVV0l-
DTHw1fGlJdm5Y #scrollTo=TwfFDhs5TMhi

https://colab.research.google.com/drive/1xdivBiY75MAVRSigmiqI7pbRLn58Vrb E?
usp=sharing#scrollTo=M btEC1N-YkS

25

You might also like