You are on page 1of 42

1.1.1.

``Tổng quan về mạng thị giác máy tính


Thị giác máy tính (computer vision) là một lĩnh vực 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 và, nói chung là dữ liệu đa chiều từ thế giới
thực để cho ra các thông tin số hoặc biểu tượng, ví dụ trong các dạng quyết định. Việc phát triển
lĩnh vực này có bối cảnh từ việc sao chép các khả năng thị giác con người bởi sự nhận diện và hiểu
biết một hình ảnh mang tính điện tử. Sự nhận diện hình ảnh có thể xem là việc giải quyết vấn đề
của các biểu tượng thông tin từ dữ liệu hình ảnh qua cách dùng các mô hình được xây dựng với sự
giúp đỡ của các ngành lý thuyết học, thống kê, vật lý và hình học. Thị giác máy tính cũng được mô
tả là sự tổng thể của một dải rộng các quá trình tự động và tích hợp và các thể hiện cho các nhận
thức thị giác.
Thị giác máy tính là một môn học khoa học liên quan đến lý thuyết đằng sau các hệ thống nhân tạo
có trích xuất các thông tin từ các hình ảnh. Dữ liệu hình ảnh có thể nhiều dạng, chẳng hạn như
chuỗi video, các cảnh từ đa camera, hay dữ liệu đa chiều từ máy quét y học. Thị giác máy tính còn
là một môn học kỹ thuật, trong đó tìm kiếm việc áp dụng các mô hình và các lý thuyết cho việc xây
dựng các hệ thống thị giác máy tính.
Các lĩnh vực con của thị giác máy tính bao gồm tái cấu trúc cảnh, dò tìm sự kiện, theo dõi
video, nhận diện bố cục đối tượng, học, chỉ mục, đánh giá chuyển động và phục hồi ảnh.

1.2. Các lĩnh vực liên


Các lĩnh vực liên quan của trí tuệ nhân tạo giải quyết các vấn đề như lên kế hoạch tự động hay các
suy tính cho các hệ thống robot để dò đường ở một môi trường nào đó. Sự hiểu biết chi tiết của các
môi trường này được yêu cầu để dò đường thông qua chúng. Thông tin về môi trường có thể được
cung cấp bởi một hệ thống thị giác máy tính, hoạt động như các cảm biến và cung cấp thông tin
mức độ cao về môi trường và robot.
Trí tuệ nhân tạo và thị giác máy tính chia sẻ các chủ đề như nhận dạng mẫu và các kỹ thuật học.
Kết quả là thị giác máy tính đôi khi được xem là một phần của lĩnh vực trí tuệ nhân tạo hay lĩnh
vực khoa học máy tính nói chung.
Thị giác máy tính theo một cách nào đó là sự đảo ngược của đồ họa máy tính. Trong khi đồ họa
máy tính sản sinh hình ảnh từ mô hình 3D, thì thị giác máy tính lại thường sản sinh ra các mô hình
3D từ dữ liệu hình ảnh. Có một khuynh hướng kết hợp 2 môn học này, ví dụ như khám phá
trong tăng cường thực tế.

1.2.1. Tổng quan về mạng Nơ-ron

1.2.1.1. Khái niệm


Mạng nơ ron (hay mạng nơ ron nhân tạo - Artificial Neural network (ANN) ) [5] là
một mô hình tính toán phi tuyến tính lấy cảm hứng xây dựng dựa trên các mạng nơ ron
sinh học. Nó có khả năng học cách thực hiện các bài toán như phân loại, dự đoán,... Một
mạng nơ ron nhân tạo gồm một nhóm các nơ ron (nút) hoặc các yếu tố xử lý được kết nối
với nhau và được tổ chức thành 3 lớp: lớp đầu vào (input layer), lớp ẩn (hidden layer) và
lớp đầu ra (output layer).

Hình 2.1: Mạng nơ ron nhân tạo


Mạng nơ ron nhân tạo mô phỏng lại mạng nơ ron sinh học là một cấu trúc khối gồm
các đơn vị tính toán đơn giản được liên kết chặt chẽ với nhau, trong đó các liên kết giữa
các nơ ron quyết định chức năng của mạng.

1.2.1.2. Các đặc trưng cơ bản của mạng Nơ ron


Các đặc trưng cơ bản của mạng Nơ ron gồm:
 Gồm một tập các đơn vị xử lý (các noron nhân tạo)
 Trạng thái kích hoạt hay đầu ra của đơn vị xử lý
 Liên kết giữa các đơn vị. Xét tổng quát, mỗi liên kết được định nghĩa bởi một
trọng số Wjk cho ta biết hiệu ứng mà tín hiệu của đơn vị j có trên đơn vị k
 Một luật lan truyền quyết định cách tính tín hiệu ra của từng đơn vị từ đầu vào
của nó
 Một hàm kích hoạt, hay hàm chuyển (activation function, transfer function),
xác định mức độ kích hoạt khác dựa trên mức độ kích hoạt hiện tại
 Một đơn vị điều chỉnh (độ lệch) (bias, offset) của mỗi đơn vị
 Phương pháp thu thập thông tin (luật học - learning rule)
 Môi trường hệ thống có thể hoạt động

1.2.1.3. Các thành phần cơ bản của mạng Nơ ron nhân tạo
 Đơn vị xử lý:
Đơn vị xử lý còn được gọi là một nơron hay một nút (node), thực hiện một công việc
rất đơn giản: nó nhận tín hiệu vào từ các đơn vị phía trước hay một nguồn bên ngoài và
sử dụng chúng để tính tín hiệu ra sẽ được lan truyền sang các đơn vị khác.

Hình 2.2: Đơn vị xử lý (Processing Unit)


Trong đó:
 x i : các đầu vào
 w ij : các trọng số tương ứng với các đầu vào
 θ j : độ lệch (bias)
 a j: đầu vào mạng (net-input)
 z j : đầu ra của nơron
 g(x): hàm chuyển (hàm kích hoạt).

Trong một mạng nơron có ba kiểu đơn vị:


 Các đơn vị đầu vào (Input units), nhận tín hiệu từ bên ngoài.
 Các đơn vị đầu ra (Output units), gửi dữ liệu ra bên ngoài.
 Các đơn vị ẩn (Hidden units), tín hiệu vào (input) và ra (output) của nó nằm
trong mạng.
Mỗi đơn vị j có thể có một hoặc nhiều đầu vào: x0, x1, x2, … xn, nhưng chỉ có một
đầu ra zj. Một đầu vào tới một đơn vị có thể là dữ liệu từ bên ngoài mạng, hoặc đầu ra
của một đơn vị khác, hoặc là đầu ra của chính nó.
 Hàm kết hợp:
Mỗi một đơn vị trong một mạng kết hợp các giá trị đưa vào nó thông qua các liên kết
với các đơn vị khác, sinh ra một giá trị gọi là net input. Hàm thực hiện nhiệm vụ này gọi
là hàm kết hợp (combination function), được định nghĩa bởi một luật lan truyền cụ thể.
Trong phần lớn các mạng nơron, chúng ta giả sử rằng mỗi một đơn vị cung cấp một bộ
cộng như là đầu vào cho đơn vị mà nó có liên kết. Tổng đầu vào đơn vị j đơn giản chỉ là
tổng trọng số của các đầu ra riêng lẻ từ các đơn vị kết nối cộng thêm ngưỡng hay độ lệch
(bias) θ j:
n
aj = ∑ w ji xi +θ j
i=1

Trường hợp w ji > 0, nơron được coi là đang ở trong trạng thái kích thích. Tương tự,
nếu như w ji < 0, nơ ron ở trạng thái kiềm chế. Chúng ta gọi các đơn vị với luật lan truyền
như trên là các sigma units. Trong một vài trường hợp người ta cũng có thể sử dụng các
luật lan truyền phức tạp hơn. Một trong số đó là luật sigma-pi, có dạng như sau:
n m
aj = ∑ w ji ∏ x ik + θ j
i=1 k

Rất nhiều hàm kết hợp sử dụng một "độ lệch" hay "ngưỡng" để tính net input tới đơn
vị. Đối với một đơn vị đầu ra tuyến tính, thông thường, θ j được chọn là hằng số và trong
bài toán xấp xỉ đa thức θ j = 1.
 Hàm kích hoạt:
Phần lớn các đơn vị trong mạng nơron chuyển net input bằng cách sử dụng một hàm
vô hướng (scalar-to-scalar function) gọi là hàm kích hoạt, kết quả của hàm này là một giá
trị gọi là mức độ kích hoạt của đơn vị (unit's activation). Loại trừ khả năng đơn vị đó
thuộc lớp ra, giá trị kích hoạt được đưa vào một hay nhiều đơn vị khác. Các hàm kích
hoạt thường bị ép vào một khoảng giá trị xác định, do đó thường được gọi là các hàm bẹp
(squashing). Các hàm kích hoạt hay được sử dụng là:

 Hàm đồng nhất (Linear function, Identity function ): g(x) = x


Nếu coi các đầu vào là một đơn vị thì chúng sẽ sử dụng hàm này. Đôi khi một
hằng số được nhân với net-input để tạo ra một hàm đồng nhất.

Hình 2.3: Hàm đồng nhất (Identity function)


 Hàm bước nhị phân (Binary step function, Hard limit function)
Hàm này cũng được biết đến với tên "Hàm ngưỡng" (Threshold function hay
Heaviside function). Đầu ra của hàm này được giới hạn vào một trong hai giá trị:

{
g(x)= 1 , nếu x ≥ θ
0 ,nếu x <θ

Dạng hàm này được sử dụng trong các mạng chỉ có một lớp. Trong hình vẽ sau, θ
được chọn bằng 1.

Hình 2.4: Hàm bước nhị phân (Binary step function)


1
 Hàm sigmoid (Sigmoid function (logsig)): g(x) = 1+ e
−x

Hàm này đặc biệt thuận lợi khi sử dụng cho các mạng được huấn luyện (trained)
bởi thuật toán Lan truyền ngược (back-propagation), bởi vì nó dễ lấy đạo hàm, do đó
có thể giảm đáng kể tính toán trong quá trình huấn luyện. Hàm này được ứng dụng
cho các chương trình ứng dụng mà các đầu ra mong muốn rơi vào khoảng [0,1].

Hình 2.5: Hàm Sigmoid


1−e− x
 Hàm sigmoid lưỡng cực (Bipolar sigmoid function (tansig)): g(x) = 1+e−x

Hàm này có các thuộc tính tương tự hàm sigmoid. Nó làm việc tốt đối với các ứng
dụng có đầu ra yêu cầu trong khoảng [-1,1].
Hình 2.6: Hàm sigmoid lưỡng cực
Các hàm chuyển của các đơn vị ẩn (hidden units) là cần thiết để biểu diễn sự phi
tuyến vào trong mạng. Lý do là hợp thành của các hàm đồng nhất là một hàm đồng nhất.
Mặc dù vậy nhưng nó mang tính chất phi tuyến (nghĩa là, khả năng biểu diễn các hàm phi
tuyến) làm cho các mạng nhiều tầng có khả năng rất tốt trong biểu diễn các ánh xạ phi
tuyến. Tuy nhiên, đối với luật học lan truyền ngược, hàm phải khả vi (differentiable) và
sẽ có ích nếu như hàm được gắn trong một khoảng nào đó. Do vậy, hàm sigmoid là lựa
chọn thông dụng nhất.
Đối với các đơn vị đầu ra (output units), các hàm chuyển cần được chọn sao cho phù
hợp với sự phân phối của các giá trị đích mong muốn. Chúng ta đã thấy rằng đối với các
giá trị ra trong khoảng [0,1], hàm sigmoid là có ích; đối với các giá trị đích mong muốn là
liên tục trong khoảng đó thì hàm này cũng vẫn có ích, nó có thể cho ta các giá trị ra hay
giá trị đích được căn trong một khoảng của hàm kích hoạt đầu ra. Nhưng nếu các giá trị
đích không được biết trước khoảng xác định thì hàm hay được sử dụng nhất là hàm đồng
nhất (identity function). Nếu giá trị mong muốn là dương nhưng không biết cận trên thì
nên sử dụng một hàm kích hoạt dạng mũ (exponential output activation function).

1.2.2. Mạng nơ ron truyền thẳng (Feed-forward neural network)

1.2.2.1. Đặc điểm, kiến trúc của mạng Nơ ron truyền thẳng:
Mạng nơ ron truyền thẳng [9] là mạng nơ ron nhân tạo mà các liên kết giữa các nơ
ron (nút) không tạo thành chu kì. Đây là kiến trúc đơn giản nhất của mạng nơ ron vì
thông tin chỉ được truyền đi theo một hướng và không bao giờ ngược lại.
Mạng nơ ron truyền thẳng ở dạng lớp đơn ( có 1 lớp hidden layer): Trong mô hình
này, một loạt các đầu vào được nhân với trọng số. Mỗi giá trị sau đó được cộng lại với
nhau để có được tổng các giá trị vào có trọng số. Nếu tổng này nằm trên một ngưỡng cụ
thể, thưởng đặt là 0, thì giá trị được tạo ra thường là 1, ngược lại thì giá trị tạo ra là -1.
Mô hình dạng lớp đơn này thường được sử dụng trong các nhiệm vụ phân loại. Thêm
nữa, nếu sử dụng phương thức gọi là quy tắc delta, mạng nơ ron này có thể so sánh kết
quả đầu ra của các nút với giá trị trong tập dữ liệu kiểm tra (trong phương pháp học có
giám sát) sau đó điều chỉnh trọng số để thu được giá trị đầu ra chính xác hơn. Quá trình
này là một hình thức của giảm độ dốc (gradient descent).

Hình 2.7: Mạng Nơ ron truyền thẳng


Trong mô hình truyền thẳng nhiều lớp (có nhiều hidden layer), quá trình điều chỉnh
trọng số cũng diễn ra tương tự như trong mô hình lớp đơn bên trên, tuy nhiên nó được
định nghĩa cụ thể hơn và được gọi là lan truyền ngược (backpropagation). Trong đó, mỗi
lớp ẩn trong mạng được điều chỉnh theo các giá trị đầu ra do lớp cuối cùng tạo ra. Mặc dù
mạng nơ ron truyền thẳng khá đơn giản nhưng chính kiến trúc đơn giản của chúng lại
được sử dụng như một lợi thế trong các ứng dụng học máy cụ thể.
Hình 2.8: Mạng truyền thẳng nhiều lớp
Luồng thông tin trong mạng nơron truyền thẳng sẽ đi từ trái qua phải, các giá trị đầu
vào x được truyền tới các nơron lớp ẩn thông qua trọng số kết nối sau đó đưa tới lớp ra.
Trọng số kết nối từ phần tử vào thứ i tới nơron ẩn thứ j đƣợc ký hiệu là w ij, trọng số kết
nối từ nơron ẩn thứ j tới các nơron ra thứ k được ký hiệu là v jk .
Với lớp nơron ẩn thứ j:
n
aj = ∑ w ji xi +θ j, yi = f (a )
j
i=1

Với nơron ra thứ k:


k
ak = ∑ wkj y i +θk , z k = f (a )k
j=1

1
Hàm kích hoạt: f ( x) = 1+ e
−x

Hàm f đơn điệu tăng, khả vi và cho giá trị thuộc [0; 1]. Với một mẫu đầu vào được
cho trước, mạng sẽ tạo ra giá trị đầu ra thực tế z k , giá trị này được so sánh với giá trị mẫu
mong muốn ở đầu ra d k . Các trọng số của mạng sau đó được hiệu chỉnh để giảm lỗi và
đưa ra các mẫu tiếp theo. Sau đó trọng số sẽ tiếp tục được hiệu chỉnh tới khi tổng lỗi qua
tất cả các mẫu học được giảm tới mức cho phép. Thuật toán học này được hiểu như thuật
toán lan truyền ngược.
1.2.2.2. Cách sử dụng:
Giải thuật lan truyền ngược tìm kiếm một vector các trọng số (weights vectori) giúp
cực tiểu hóa lỗi tổng thể của hệ thống đối lập với tập học.
Giải thuật lan truyền ngược bao gồm hai giai đoạn:
 Giai đoạn lan truyền tiến tín hiệu (Signal Forward). Các tín hiệu đầu vào (vector
các giá trị đầu vào) được lan truyền tiến từ tầng đầu vào đến tầng đầu ra (đi qua
các tầng ẩn).
 Giai đoạn lan truyền ngược lỗi (Error Backward):
o Căn cứ vào giá trị đầu ra mong muốn của vector đầu vào, hệ thống sẽ
tính toán giá trị lỗi.
o Giá trị lỗi được lan truyền ngược từ tầng đầu ra đến tầng đầu vào.
o Các trọng sẽ được cập nhật đến khi lỗi có thể chấp nhận được
Thuật toán lan truyền ngược được mô tả lại như sau:
 Input:
 Mạng feed-forward với ni đầu vào, n k nút ẩn vào nơron đầu ra.
 Hệ số học .

 Tập dữ liệu huấn luyện X {( )


r r ∨r = x , x , … x
x t x
( 1 2 n)
} là vector đầu vào
r
=( t 1 , t 2 , … t m )là vector đầu ra mong muốn
t
 Output:
r
 Các vector trọng số w j
 Thuật toán:
 Bước 1: Khởi tạo trọng số bởi các giá trị ngẫu nhiên nhỏ.
 Bước 2: Lặp lại cho tới khi thỏa mãn điều kiện kết thúc.

(r r)
Với mỗi mẫu x t  X thực hiện các bước sau:
1. Tính đầu ra o j cho mỗi nốt j
2. Với mỗi nút k thuộc tầng ra, tính ❑k theo công thức:
❑k =( t k −ok ) (1−o k ) o k
3. Với mỗi nút h thuộc tầng ẩn, tính ❑h theo công thức:
❑h=o h (1−oh ) ∑ ❑k . wkh
k ∈ D(h)

4. Cập nhật: w ji = w ji + ∆ w ji. Trong đó ∆ w ji = ❑k x ji


1.2.2.3. Ứng dụng của mạng Nơ ron truyền thẳng:
 Ưu điểm:
 Hỗ trợ tính toán song song ở mức rất cao.
 Có khả năng chịu nhiều lỗi, nhờ các tính toán song song.
 Có thể được thiết kế để tự thích nghi (Các trọng số, cấu trúc mạng).
 Nhược điểm:
 Không có quy tắc tổng quát để xác định cấu trúc mạng và các tham số học tối
ưu cho một lớp, một bài toán xác định.
 Không có phương pháp tổng quát để đánh giá hoạt động bên trong của ANN (vì
vậy hệ thống ANN được xem như là một “hộp đen”).
 Rất khó (không thể) để giải thích cho người dùng.
 Rất khó để dự đoán hiệu năng của hệ thống trong tương lai (khả năng khái quát
hóa của hệ thống học)
 Ứng dụng của mạng Nơ ron truyền thẳng
 Ứng dụng mạng nơron truyền thẳng trong dự báo dữ liệu
 Ứng dụng mạng nơron truyền thẳng trong dự báo thời tiết
 Ứng dụng mạng nơron truyền thẳng trong xử lý tín hiệu

1.2.3. Tổng quan về mạng Nơ-ron CNN 


Convolutional Neural Network (CNN hoặc ConvNet) được tạm dịch là: Mạng
nơ ron tích tụ. Đây được xem là một trong những mô hình của Deep Learning
– tập hợp các thuật toán để có mô hình dữ liệu trừu tượng hóa ở mức cao
bằng cách sử dụng nhiều lớp xử lý cấu trúc phức tạp. Hiểu đơn giản, CNN là
một lớp của mạng nơ-ron sâu, được áp dụng phổ biến nhất để phân tích hình
ảnh trực quan. CNN là một trong những mô hình deep learning phổ biến nhất
và có ảnh hưởng nhiều nhất trong cộng đồng Computer Vision. CNN được
dùng trong trong nhiều bài toán như nhân dạng ảnh, phân tích video, ảnh
MRI, hoặc cho bài các bài của lĩnh vự xử lý ngôn ngữ tự nhiên,và hầu hết đều
giải quyết tốt các bài toán này.

CNN cũng có lịch sử khá lâu đời. Kiến trúc gốc của mô hình CNN được giới
thiệu bởi một nhà khoa học máy tính người Nhật vào năm 1980. Sau đó, năm
1998, Yan LeCun lần đầu huấn luyện mô hình CNN với thuật toán
backpropagation cho bài toán nhận dạng chữ viết tay. Tuy nhiên, mãi đến
năm 2012, khi một nhà khoa học máy tính người Ukraine Alex Krizhevsky (đệ
của Geoffrey Hinton) xây dựng mô hình CNN (AlexNet) và sử dụng GPU để
tăng tốc quá trình huấn luyện deep nets để đạt được top 1 trong cuộc thi
Computer Vision thường niên ImageNet với độ lỗi phân lớp top 5 giảm hơn
10% so với những mô hình truyền thống trước đó, đã tạo nên làn sóng mãnh
mẽ sử dụng deep CNN với sự hỗ trợ của GPU để giải quyết càng nhiều các
vấn đề trong Computer Vision.

Hiện tại, tất cả chúng ta chưa có định nghĩa một cách đúng mực nhất về thuật
toán CNN. Mạng CNN được phong cách thiết kế với mục tiêu giải quyết và xử
lý tài liệu trải qua nhiều lớp mảng. Ngoài ra, CNN hoàn toàn có thể giúp bạn
tạo ra được mạng lưới hệ thống mưu trí, phản ứng với độ đúng chuẩn khá
cao.

Ví dụ: Bạn có thể sử dụng loại mạng thần kinh này trong các ứng dụng như:
nhận dạng hình ảnh, nhận dạng khuôn mặt và hiện tại đã được đưa vào các
nền tảng Facebook, Google,…

So với những mạng nơ ron thường thì, mạng CNN nhận nguồn vào là một
mảng hai chiều và hoạt động giải trí trực tiếp trên hình ảnh thay vì tập trung
chuyên sâu trích xuất tính năng mà bạn thường thấy ở những mạng nơ ron
khác .

1.3. Cấu trúc CNN


Tích chập được ứng dụng phổ biến trong lĩnh vực thị giác máy tính. Thông qua các phép tích chập,
các đặc trưng chính từ ảnh được trích xuất và truyền vào các tầng tích chập (layer convolution). Mỗi
một tầng tích chập sẽ bao gồm nhiều đơn vị mà kết quả ở mỗi đơn vị là một phép biến đổi tích chập
từ layer trước đó thông qua phép nhân tích chập với bộ lọc.
Về cơ bản thiết kế của một mạng nơ ron tích chập 2 chiều có dạng như sau:
INPUT -> [[CONV -> RELU]*N -> POOL?]*M -> [FC -> RELU]*K -> FC

Trong đó:
 INPUT: Tầng đầu vào
 CONV: Tầng tích chập
 RELU: Tầng kích hoạt. Thông qua hàm kích hoạt (activation function), thường là ReLU hoặc
LeakyReLU để kích hoạt phi tuyến
 POOL: Tầng tổng hợp, thông thường là Max pooling hoặc có thể là Average pooling dùng để
giảm chiều của ma trận đầu vào.
 FC: Tầng kết nối hoàn toàn. Thông thường tầng này nằm ở sau cùng và kết nối với các đơn
vị đại diện cho nhóm phân loại.
Các kí hiệu []N, []M hoặc []*K ám chỉ các khối bên trong [] có thể lặp lại nhiều lần liên tiếp nhau. M, K
là số lần lặp lại. Kí hiệu -> đại diện cho các tầng liền kề nhau mà tầng đứng trước sẽ làm đầu vào
cho tầng đứng sau. Dấu ? sau POOL để thể hiện tầng POOL có thể có hoặc không sau các khối tích
chập.
Như vậy ta có thể thấy một mạng nơ ron tích chập về cơ bản có 3 quá trình khác nhau:
 Quá trình tích chập (convolution): Thông qua các tích chập giữa ma trận đầu vào với bộ lọc
để tạo thành các đơn vị trong một tầng mới. Quá trình này có thể diễn ra liên tục ở phần đầu
của mạng và thường sử dụng kèm với hàm kích hoạt ReLU. Mục tiêu của tầng này là trích
suất đặc trưng hai chiều.
 Quá trình tổng hợp (max pooling): Các tầng càng về sau khi trích xuất đặc trưng sẽ cần số
lượng tham số lớn do chiều sâu được qui định bởi số lượng các kênh ở các tầng sau
thường tăng tiến theo cấp số nhân. Điều đó làm tăng số lượng tham số và khối lượng tính
toán trong mạng nơ ron. Do đó để giảm tải tính toán chúng ta sẽ cần giảm kích thước các
chiều của khối ma trận đầu vào hoặc giảm số đơn vị của tầng. Vì mỗi một đơn vị sẽ là kết
quả đại diện của việc áp dụng 1 bộ lọc để tìm ra một đặc trưng cụ thể nên việc giảm số đơn
vị sẽ không khả thi. Giảm kích thước khối ma trận đầu vào thông qua việc tìm ra 1 giá trị đại
diện cho mỗi một vùng không gian mà bộ lọc đi qua sẽ không làm thay đổi các đường nét
chính của bức ảnh nhưng lại giảm được kích thước của ảnh. Do đó quá trình giảm chiều ma
trận được áp dụng. Quá trình này gọi là tổng hợp nhằm mục đích giảm kích thước dài, rộng.
 Quá trình kết nối hoàn toàn (fully connected): Sau khi đã giảm kích thước đến một mức độ
hợp lý, ma trận cần được trải phẳng (flatten) thành một vector và sử dụng các kết nối hoàn
toàn giữa các tầng. Quá trình này sẽ diễn ra cuối mạng CNN và sử dụng hàm kích hoạt là
ReLU. Tầng kết nối hoàn toàn cuối cùng (fully connected layer) sẽ có số lượng đơn vị bằng
với số classes và áp dụng hàm kích hoạt là softmax nhằm mục đích tính phân phối xác xuất.
1.3.1. Convolution Layer

Convolution layer là lớp quan trọng nhất và cũng là lớp đầu tiên của của mô
hình CNN. Lớp này có chức năng chính là phát hiện các đặc trưng có tính
không gian hiệu quả. Trong tầng này có 4 đối tượng chính là: ma trận đầu
vào, bộ filters, và receptive field, feature map. Conv layer nhận đầu vào là một
ma trận 3 chiều và một bộ filters cần phải học. Bộ filters này sẽ trượt qua từng
vị trí trên bức ảnh để tính tích chập (convolution) giữa bộ filter và phần tương
ứng trên bức ảnh. Phần tưng ứng này trên bức ảnh gọi là receptive field, tức
là vùng mà một neuron có thể nhìn thấy để đưa ra quyết định, và mà trận cho
ra bới quá trình này được gọi là feature map. Để hình dung, các bạn có thể
tưởng tượng, bộ filters giống như các tháp canh trong nhà tù quét lần lượt
qua không gian xung quanh để tìm kiếm tên tù nhân bỏ trốn. Khi phát hiện tên
tù nhân bỏ trốn, thì chuông báo động sẽ reo lên, giống như các bộ filters tìm
kiếm được đặc trưng nhất định thì tích chập đó sẽ cho giá trị lớn.

1.3.2. Convolution Layer

Convolution layer là lớp quan trọng nhất và cũng là lớp đầu tiên của của mô
hình CNN. Lớp này có chức năng chính là phát hiện các đặc trưng có tính
không gian hiệu quả. Trong tầng này có 4 đối tượng chính là: ma trận đầu
vào, bộ filters, và receptive field, feature map. Conv layer nhận đầu vào là một
ma trận 3 chiều và một bộ filters cần phải học. Bộ filters này sẽ trượt qua từng
vị trí trên bức ảnh để tính tích chập (convolution) giữa bộ filter và phần tương
ứng trên bức ảnh. Phần tưng ứng này trên bức ảnh gọi là receptive field, tức
là vùng mà một neuron có thể nhìn thấy để đưa ra quyết định, và mà trận cho
ra bới quá trình này được gọi là feature map. Để hình dung, các bạn có thể
tưởng tượng, bộ filters giống như các tháp canh trong nhà tù quét lần lượt
qua không gian xung quanh để tìm kiếm tên tù nhân bỏ trốn. Khi phát hiện tên
tù nhân bỏ trốn, thì chuông báo động sẽ reo lên, giống như các bộ filters tìm
kiếm được đặc trưng nhất định thì tích chập đó sẽ cho giá trị lớn.
Với ví dụ ở bên dưới, dữ liệu đầu vào ở là ma trận có kích thước 8x8x1, một
bộ filter có kích thước 2x2x1, feature map có kích thước 7x7x1. Mỗi giá trị ở
feature map được tính bằng tổng của tích các phần tử tương ứng của bộ filter
2x2x1 với receptive field trên ảnh. Và để tính tất cả các giá trị cho feature
map, các bạn cần trượt filter từ trái sáng phải, từ trên xuống dưới. Do đó, các
bạn có thể thấy rằng phép convolution bảo toàn thứ tự không gian của các
điểm ảnh. ví dụ điểm góc gái của dữ liệu đầu vào sẽ tương ứng với bên một
điểm bên góc trái của feature map.
1.3.2.1. Tầng convolution như là feature detector

Tầng convolution có chức năng chính là phát hiện đặc trưng cụ thể của bức
ảnh. Những đặc trưng này bao gồm đặc trưng cơ bản là góc,cạnh, màu sắc,
hoặc đặc trưng phức tạp hơn như texture của ảnh. Vì bộ filter quét qua toàn
bộ bức ảnh, nên những đặc trưng này có thể nằm ở vị trí bất kì trong bức
ảnh, cho dù ảnh bị xoáy trái/phải thì những đặc trưng này vẫn bị phát hiện.
Ở minh họa dưới, các bạn có một filter 5x5 dùng để phát hiện góc/cạnh với,
filter này chỉ có giá trị một tại các điểm tương ứng một góc cong.

Dùng filter ở trên trược qua ảnh của nhân vật Olaf trong trong bộ phim
Frozen. Chúng ta thấy rằng, chỉ ở những vị trí trên bức ảnh có dạng góc như
đặc trưng ở filter thì mới có giá trị lớn trên feature map, những vị trí còn lại sẽ
cho giá trị thấp hơn. Điều này có nghĩa là, filter đã phát hiện thành công một
dạng góc/cạnh trên dự liệu đầu vào. Tập hơn nhiều bộ filters sẽ cho phép các
bạn phát hiện được nhiều loại đặc trưng khác nhau,và giúp định danh được
đối tượng.
1.3.2.2. Các tham số của tầng convolution: Kích thước bộ filter, stride và
padding

Kích thước bộ filter là một trong những tham số quan trọng nhất của tầng
convolution. Kích thước này tỉ lệ thuận với số tham số cần học tại mỗi tầng
convolution và là tham số quyết định receptive field của tầng này. Kích thước
phổ biến nhất của bộ filter là 3x3.
Kích thước filter nhỏ được ưu tiên lựa chọn thay kích thước lớn vì những lý
do sau đây.

Filter Nhỏ Filter Lớn

Kích thước nhỏ thì mỗi lần nhìn được một vùng nhỏ các pixel Receptive field lớn

Rút trích được đặc trưng có tính cục bộ cao Các đặc trưng có tính tổng quát

Phát hiện được các đặc trưng nhỏ hơn Bắt được những phần cơ bản của

Đặc trưng rút trích được sẽ đa dạng, hữu ích hơn ở tầng sau Thông ít rút trích được ít đa dạn
Filter Nhỏ Filter Lớn

Giảm kích thước ảnh chậm hơn, do đó cho phép mạng sâu hơn Giảm kích thước ảnh nhanh, do

Ít trọng số hơn, chia sẻ trọng số tốt hơn Chia sẽ trọng số ít ý nghĩa hơn

Kích thước filter của tầng convolution hầu hết đều là số lẻ, ví dụ như 3x3 hay
5x5. Với kích thước filter lẻ, các giá trị của feature map sẽ xác định một tâm
điểm ở tầng phía trước. Nếu các bạn chọn filter có kích thước 2x2, 4x4 thì
chúng ta sẽ gặp khó khăn khi muốn tìm vị trí tương ứng của các giá trị feature
map trên không gian ảnh.
Ở những trường hợp đặt biệt như filter có kích thước 1x1, hay có kích thước
bằng với ma trận đầu vào, tầng convolution có ý nghĩa rất thú vị. Khi có kích
thước 1x1, tầng convolution xem mỗi điểm như một đặc trưng riêng biệt, có
chức năng giảm chiều (tăng chiều) khi số lượt feature map ở tầng sau nhỏ
hơn (lớn hơn) tầng trước. Filter 1x1 đã được sử dụng trong kiến trúc mạng
phổ biến như Inception networks. Trong khi đó, filter với kích thước bằng ảnh
đầu vào, tầng convolution có chức năng y hệt fully connected layer.
Khi các bạn áp dụng phép convolution thì ma trận đầu vào sẽ có nhỏ dần đi,
do đó số layer của mô hình CNN sẽ bị giới hạn, và không thể xậy đựng deep
nets mong muốn. Để giải quyết tình trạng này, các bạn cần padding vào ma
trận đầu vào để đảm bảo kích thước đầu ra sau mỗi tầng convolution là
không đổi. Do đó có thể xậy dựng được mô hình với số tầng convolution lớn
tùy ý. Một cách đơn giản và phổ biến nhất để padding là sử dụng hàng số 0,
ngoài ra các bạn cũng có thể sử dụng reflection padding hay là symmetric
padding.
1.3.3. Nonlinear Layer

ReLU (Rectified Linear Units, f = max(0, x)) là hàm kích hoạt phổ biến nhất
cho CNN tại thời điểm của bài viết, được giới thiệu bởi Geoffrey E. Hinton
năm 2010. Trước khi hàm ReLU được áp dụng thì những hàm như sigmoid
hay tanh mới là những hàm được sử dụng phổ biến. Hàm ReLU được ưa
chuộng vì tính toán đơn giản, giúp hạn chế tình trạng vanishing gradient, và
cũng cho kết quả tốt hơn. ReLU cũng như những hàm kích hoạt khác, được
đặt ngay sau tầng convolution, ReLU sẽ gán những giá trị âm bằng 0 và giữ
nguyên giá trị của đầu vào khi lớn hơn 0.
ReLU cũng có một số vấn đề tiềm ẩn như không có đạo hàm tại điểm 0, giá trị
của hàm ReLU có thể lớn đến vô cùng và nếu chúng ta không khởi tạo trọng
số cẩn thận, hoặc khởi tạo learning rate quá lớn thì những neuron ở tầng này
sẽ rơi vào trạng thái chết, tức là luôn có giá trị < 0.
1.3.4. Pooling Layer

Sau hàm kích hoạt, thông thường chúng ta sử dụng tầng pooling. Một số loại
pooling layer phổ biến như là max-pooling, average pooling, với chức năng
chính là giảm chiều của tầng trước đó. Với một pooling có kích thước 2x2,
các bạn cần phải trược filter 2x2 này trên những vùng ảnh có kích thước
tương tự rồi sau đó tính max, hay average cho vùng ảnh đó.

Ý tương đằng sau tầng pooling là vị trí tuyết đối của những đặc trưng trong
không gian ảnh không còn cần cần thiết, thay vào đó vị trí tương đối giữ các
đặc trưng đã đủ để phân loại đối tượng. Hơn giảm tầng pooling có khả năng
giảm chiều cực kì nhiều, làm hạn chế overfit, và giảm thời gian huấn luyện tốt.

1.3.5. Fully Connected Layer

Tầng cuối cùng của mô hình CNN trong bài toán phân loại ảnh là tầng fully
connected layer. Tầng này có chức năng chuyển ma trận đặc trưng ở tầng
trước thành vector chứa xác suất của các đối tượng cần được dự đoán. Ví
dụ, trong bài toán phân loại số viết tay MNIST có 10 lớp tương ứng 10 số từ
0-1, tầng fully connected layer sẽ chuyển ma trận đặc trưng của tầng trước
thành vector có 10 chiều thể hiện xác suất của 10 lớp tương ứng.
Và cuối cùng, quá trình huấn luyện mô hình CNN cho bài toán phân loại ảnh
cũng tương tự như huấn luyện các mô hình khác. Chúng ta cần có hàm độ lỗi
để tính sai số giữ dự đoán của mô hình và nhãn chính xác, cũng như sử dụng
thuật toán backpropagation cho quá trình cập nhật trọng số.

1.1. Mạng YOLO là gì?


Có nhiều bạn thắc mắc câu hỏi này. YOLO nghe khá giống slogan “You only live once” phải không?
Nhưng 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ể. Rất nhanh và mạnh phải không nào?
Thật vậy, về độ chính xác thì YOLO có thể không phải là thuật toán tốt nhất nhưng nó là thuật toán
nhanh nhất trong các lớp mô hình object detection. Nó có thể đạt được tốc độ gần như real time mà
độ chính xác không quá giảm so với các model thuộc top đầu.
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.
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.

1.2. Yêu cầu


Trước khi đọc bài viết này 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.

CHƯƠNG 2. 2. KIẾN TRÚC MẠNG YOLO


Cũng tương tự như Bài 13 - thuật toán SSD 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 được áp dụng để phát hiện vật thể trên feature map của base network.
base network của YOLO sử dụng chủ yếu là các convolutional layer và các fully conntected layer.
Các kiến trúc YOLO 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 Architechture được gọi là base network
có tác dụng trích suấ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.
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.

3. 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.
 ⟨p1,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)×3=85×3=255
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 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.

CHƯƠNG 3. 4. 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à:

(13×13+26×26+52×52)×3=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.
 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 cho 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.

CHƯƠNG 4. 5. 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 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 mid point 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 mid point 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.
Hình 6: Khi 2 vật thể người và xe trùng mid point 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.

7. 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 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:

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ẽ đượ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.

CHƯƠNG 5. 8. 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ể.
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 bouding 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.
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ữ lại bouding box có xác xuất cao
nhất. Cuối cùng, ta thu được một bounding box duy nhất cho một vật thể.
2.3. Các bước nhận dạng biển số xe
2.3.1. Khái quát về hệ thống nhận dạng biển số xe
Hệ thống tự động nhận diện biển số xe là hệ thống sử dụng camera để thực
hiện việc kiếm tra, xác định biển số của phương tiện một cách tự động, từ đó có
khả năng hỗ trợ truy vấn các thông tin chi tiết cấp cao hơn như tên chủ phương
tiện, thông tin đăng ký, … Hệ thống này nhằm giải quyết các vấn đề liên quan đến
an ninh, thống kê khảo sát, giám sát và theo vết…
Có rất nhiều giải pháp, thiết kế hệ thống, thiết bị khác nhau để giải quyết
các yêu cầu liên quan tới lĩnh vực này tùy theo từng điều kiện áp dụng: ban đêm
hay ban ngày, không gian mở hay đóng, ứng dụng chuyên trách (bãi giữ xe,…),
hay ứng dụng kết hợp (giám sát giao thông, hệ thống theo dõi an ninh, …), ứng
dụng cục bộ hay diện rộng trên phạm vi công cộng, tính địa phương…

H.1: Minh họa một hệ thống nhận dạng biển số xe

2.3.2. Những yêu cầu đối với hệ thống tự động nhận dạng biển
số xe
Từ những yêu cầu phân loại cụ thể phong phú trên ta có thể rút ra những
khó khăn mà một hệ thống nhận dạng biển số xe thông thường phải vượt qua để
đạt được độ chính xác chấp nhận được là :

 Điều kiện tự nhiên của không gian và thời gian áp dụng hệ thống:
ánh sáng, thời tiết, ...Điều này rất dễ hiểu vì rỏ ràng nhận diện biển số của một
chiếc xe khi trời đang mưa bao giờ cũng khó khăn hơn khi trời nắng ráo. 

 Điều kiện bối cảnh: Trong một nơi mà phông nền đơn giản chỉ với
các mặt phẳng thì bao giờ việc nhận diện cũng dễ hơn là một nơi mà khung cảnh
hỗn độn, người xe tấp nập.

 Điều kiện quy định định dạng của biển số: cái này khác nhau tùy
theo quy định mỗi quốc gia, khu vực, nơi thì dùng hệ thống chử tượng hình, nơi thì
chử alphabet, nơi chỉ toàn số, nơi áp dụng cả số lẫn chử, và nơi thì biển số hình
chử nhật 1 hàng, nơi 2 hàng, rồi màu sắc của biển số ...

 Điều kiện hiện trạng của biển số: bạn nên nhớ rằng không phải mọi
biển số đều có hiện trạng mới ra lò, chúng có thể cong vênh, sơn có thể tróc, bạc
màu...

 Điều kiện về cách thức bố trí thiết bị: cách lắp đặt camera sẽ cho bạn
một cơ hội hay thách thức trong quá trình chạy thuật toán. Tốc độ di chuyển của
xe, tốc độ bắt hình của camera cũng tạo ra những vấn đề không nhỏ.

2.3.3. Phương pháp giải quyết bài toán


2.3.3.1. Các bài toán đặt ra trong hệ thống nhận dạng biển số xe
* Bài toán 1: Chọn lựa các khung và trích chọn ảnh từ dãy tín hiệu đầu vào là
đoạn phim, camera kỹ thuật số hay thiết bị ghi hình khác. Ảnh thu được sẽ truyền
vào máy tính.

* Bài toán 2: Từ ảnh đầu vào(kết quả từ Bài toán 1) thực hiện việc dò tìm và
phát hiện ra vùng con có khả năng chứa biển số xe.

* Bài toán 3: Từ các vùng con (kết quả có được từ Bài toán 2)thực hiện một số
thao tác để xác định chính xác vùng con nào là vùng chứa biển số xe. Kết quả của
bài toán này là một hay một tập các ảnh con chứa biển số xe.

* Bài toán 4: Giải quyết bài toán nhận dạng ký tự cho tập kết quả từ Bài toán 3.
Bằng cách áp dụng các phương pháp và kỹ thuật của nhận dạng ký tự.
Thu thập và chuẩn bị dữ liệu training
5.1.1. Gán nhãn dữ liệu

Tool labelImg để gán nhãn khu vự c có chứ a biển số xe 

LabelImg hỗ trợ gán nhãn trên cả 2 định dạ ng PASCAL VOC và YOLO vớ i phầ n mở rộ ng
file annotation tương ứ ng là .xml và .txt.

Trong bài toán sử dụ ng mô hình YOLO, mình lưu file annotation dướ i dạ ng .txt.

Nộ i dung trong mộ t file annotation

Mỗ i dòng trong mộ t file annotation bao gồ m: <object-class> <x> <y> <width> <height>.
Trong đó: <x> <y> <width> <height> tương ứ ng là tọ a độ trung tâm và kích thướ c củ a đố i
tượ ng. Các giá trị này đã đượ c chuẩ n hóa lạ i, do vậ y giá trị luôn nằ m trong đoạ n [0,1].
object-class là chỉ số đánh dấ u các classes.

Lưu ý: Vớ i bài toán có nhiều nhãn, nhiều ngườ i cùng gán nhãn thì cầ n thố ng nhấ t vớ i
nhau trướ c về thứ tự nhãn. Nguyên nhân do trong file annotation chỉ lưu chỉ số (0,1,3,4,
…) củ a nhãn chứ không lưu tên nhãn.

Sau khi gán nhãn xong các bạ n để file annotation và ả nh tương ứ ng vào cùng mộ t thư
mụ c.

Ả nh biển số xe đượ c trong bộ dữ liệu đượ c chụ p từ mộ t camera tạ i vị trí kiểm soát xe ra
vào trong hầ m. Do vậ y:

 Kích thướ c các biể n số xe không có sự đa dạ ng, do khoả ng cách từ camera


đế n biể n số xe xấ p xỉ gầ n bằ ng nhau giữ a các ả nh.
 Ả nh có độ sáng thấ p và gầ n giố ng nhau do ả nh đượ c chụ p trong hầ m chung
cư.

=> Cầ n làm đa dạ ng bộ dữ liệu.

5.1.2. Các phương pháp tăng sự đa dạng của bộ dữ liệu


5.1.2.1. Đa dạng kích thước của biển số

Đa dạ ng kích thướ c bằ ng 2 cách:

 Cách 1: Thu nhỏ kích thướ c biể n bằ ng cách thêm biên kích thướ c ngẫ u
nhiên vào ả nh gố c, sau đó resize ả nh bằ ng kích thướ c ả nh ban đầ u.
 Cách 2: Crop ả nh chứ a biển số vớ i kích thướ c ngẫ u nhiên, sau đó resize ả nh
bằ ng kích thướ c ả nh ban đầ u.
Ả nh thu đượ c (bên phả i) sau khi chạ y hàm trên

Ả nh thu đượ c (bên phả i) sau khi chạ y hàm trên

5.1.2.2. Thay đổi độ sáng của ảnh

Độ sáng thay đổ i (bên phả i)


5.1.2.3. Xoay ảnh

Ả nh đượ c xoay (bên phả i)


Training data colab

Sau khi thu thập được bộ dữ liệu gồm khoảng 7000 ảnh được dán nhãn, ta tiến hành
huyến luyện cho mô hình nhận diện biển số bằng bộ dữ liệu trên.
Tiến hành huấn luyện bộ dữ liệu bằng mô hình YOLOv4. Sử dụng Google Colab để
training dữ liệu trên. Yêu cầu đầu vào dữ liệu là ảnh và file .txt chứa các vị trí mà có chứa
biển số. Quá trình huấn luyện mô hình sẽ mất thời gian từ 3-5 giờ. Sau khi huấn luyện mô
hình xong, ta thu được một thư mục chứa các file .weights là dữ liệu đã được huấn
luyện. Thư mục này sẽ được lưu trữ và sử dụng để tiến hành nhận diện khu vực có chứa
biển số.

Để huấn luyện cho việc nhận diện biển số, ta thực hiện quá trình training như sau:
 Bước 1: Truy cập trang web Google Colab và tiến hành đăng nhập Google bằng
đường link: https://colab.research.google.com/

Hình 3.9: Trang web Google Colab


Sau khi đăng nhập tài khoản Google, ta có giao diện như dưới đây:
Hình 3.10: Giao diện Google Colab
 Bước 2: Thay đổi trình tăng tốc phần cứng thành GPU bằng cách tại thanh công cụ
của Google Colab chọn “Thời gian chạy” => “Thay đổi loại thời gian chạy”

Hình 3.11: Thay đổi trình tăng tốc phần cứng


 Bước 3: Tải file dữ liệu đã thu thập được lên Google Colab bằng cách chọn “Tệp”
và chọn “Tải lên bộ nhớ phiên” ở thanh bên trái của trang web, tìm tới địa chỉ file
dữ liệu và tiến hành tải lên.
Hình 3.12: Tải dữ liệu đã thu thập được lên Google Colab

5.2. i) Cfg File


Copy over the yolov4.cfg to your Google Drive by running the cell below. This will allow us to
edit it in a text editor.

# download cfg to google drive and change its name
!cp cfg/yolov4-custom.cfg /mydrive/yolov4/yolov4-obj.cfg

# to download to local machine (change its name to yolov4-obj.cfg once you download)
download('cfg/yolov4-custom.cfg')

Now you need to edit the .cfg to fit your needs based on your object detector. Open it up in a
code or text editor to do so.
If you downloaded cfg to google drive you can use the built in Text Editor by going to your
google drive and double clicking on yolov4-obj.cfg and then clicking on the Open with drop
down and selectin Text Editor.
(Image from previous tutorial so don't mind different file name)

Tôi khuyên bạn nên có batch = 64 và subdivisions = 16 để có kết quả cuối cùng. Nếu bạn gặp
phải bất kỳ sự cố nào, hãy tăng các subdivisions lên 32.
Thực hiện phần còn lại của các thay đổi đối với cfg dựa trên số lớp bạn đang đào tạo máy dò của
mình.
Lưu ý: Tôi đặt max_batches = 6000, step = 4800, 5400, tôi đã thay đổi các classes = 1 trong ba
lớp YOLO và filters = 18 trong ba lớp chập trước các lớp YOLO.
Cách định cấu hình các biến của bạn:
width = 416
height = 416 (đây có thể là bội số bất kỳ của 32, 416 là tiêu chuẩn, đôi khi bạn có thể cải thiện
kết quả bằng cách đặt giá trị lớn hơn như 608 nhưng sẽ làm chậm quá trình đào tạo)
max_batches = (# of classes) * 2000 (nhưng không ít hơn 6000, vì vậy nếu bạn đang đào tạo cho
1, 2 hoặc 3 classes thì sẽ là 6000, tuy nhiên bộ dò cho 5 classes sẽ có max_batches = 10000)
step = (80% max_batches), (90% max_batches) (vì vậy nếu max_batches = 10000, thì số steps =
8000, 9000)
filters = (# of classes+ 5) * 3 (vì vậy nếu bạn đang đào tạo cho một lớp filters = 18, nhưng nếu
bạn đang đào tạo cho 4 classes thì filters = 27)
Tùy chọn: Nếu bạn gặp vấn đề về bộ nhớ hoặc thấy quá trình đào tạo mất nhiều thời gian. Trong
mỗi lớp trong số ba lớp yolo trong cfg, thay đổi một dòng từ random = 1 thành random = 0 để
tăng tốc độ đào tạo nhưng làm giảm một chút độ chính xác của mô hình. Cũng sẽ giúp tiết kiệm
bộ nhớ nếu bạn gặp phải bất kỳ sự cố nào về bộ nhớ.

# upload the custom .cfg back to cloud VM from Google Drive
!cp /mydrive/yolov4/yolov4-obj.cfg ./cfg
5.3. ii) obj.names and obj.data
Tạo một tệp mới trong mã hoặc trình soạn thảo văn bản được gọi là obj.names, nơi bạn sẽ có một
tên lớp trên mỗi dòng theo thứ tự giống như các lớp.txt của bạn từ bước tạo tập dữ liệu.

Bạn cũng sẽ tạo một tệp obj.data và điền vào nó như thế này (thay đổi số lượng lớp của bạn cho
phù hợp, cũng như vị trí sao lưu của bạn)

Đường dẫn dự phòng này là nơi chúng tôi sẽ lưu các trọng số của mô hình của chúng tôi trong
suốt quá trình đào tạo. Tạo một thư mục backup trong ổ google drive của bạn và đặt đường dẫn
chính xác của nó vào tệp này.

# upload the obj.names and obj.data files to cloud VM from Google Drive
!cp /mydrive/yolov4/obj.names ./data
!cp /mydrive/yolov4/obj.data  ./data

train custom YOLOv4 object detector

!./darknet detector train <path to obj.data> <path to custom config> yolov4.conv.1
37 -dont_show -map

TIP:  Việc đào tạ o này có thể mấ t vài giờ tùy thuộ c vào số lầ n lặ p lạ i bạ n đã chọ n trong
tệp .cfg. Bạ n sẽ muố n để điều này chạ y khi bạ n ngủ hoặ c đi làm trong ngày, v.v. Tuy
nhiên, Colab Cloud Service sẽ khở i độ ng bạ n khỏ i máy ả o nếu bạ n không sử dụ ng quá
lâu (30-90 phút).
Giố ng như hình bên dướ i, nó sẽ nhấ p vào màn hình 10 phút mộ t lầ n để bạ n không bị khở i
độ ng vì nhàn rỗ i!
Implement lên trên Pi4

You might also like