Professional Documents
Culture Documents
Tổng quan về mạng thị giác máy tính
Tổng quan về mạng thị giác máy tính
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.
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à:
{
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à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à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.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).
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 .
(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)
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 .
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.
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.
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.
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ố.
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.
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.
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.
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.
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.
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ỏ.
* 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
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.
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:
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
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/
# 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
!./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