Đề tài này tập trung vào ứng dụng Deep Learning để thực hiện nhiệm vụ quan trọng là nhận diện các ký tự trên mã container. Chúng em đã dành thời gian nghiên cứu và áp dụng những mô hình Deep Learning có sẵn trong lĩnh vực xử lý ảnh. Trong phạm vi báo cáo, chúng em đã lựa chọn một trong những mô hình Deep Learning đã được công bố và tiến hành huấn luyện chúng bằng dữ liệu gồm 36 ký tự, bao gồm chữ cái in và số. Mục tiêu của chúng tôi là sử dụng mô hình đã được huấn luyện để dự đoán và nhận diện các ký tự trên mã container một cách hiệu quả.
Giới thiệu
Yêu cầu và mục tiêu của đề tài
Về kiến thức o Nghiên cứu về mạng CNN o Phân tích các mô hình Deep Learning o Nắm vững kiến thức xử lí ảnh o Biết cách xây dựng mô hình bằng framework keras của python
Về kết quả o Lựa chọn mô hình hợp lý o Dự đoán ký tự ở mức độ chính xác khi ảnh đầu vào có chất tượng tốt.
Tìm hiểu mô hình deep learning dùng trong object detection và object Classification
Mô hình mạng nơ-ron tích chập (Convolutional Neural Network - CNN)
2.1.1 Tổng quan về mô hình neural network Ở con người, các nơ-ron thần kinh được liên kết với nhau thông qua synapse, khi một nơ-ron muốn gửi thông tin cho nơ-ron khác, nó sẽ sinh ra điện thế hoạt động và lan truyền qua synapse, giải phóng chất dẫn truyền thần kinh tạo ra phản ứng ở nơ-ron kia
Dựa vào đặc điểm này của não bộ con người, mô hình mạng nơ-ron thần kinh (neural network) đã được phát triển Một neural network sẽ có 3 lớp gồm: input, hidden và output Input layer nhận dữ liệu đầu vào như ảnh, video, giống như não nhận thông tin từ mắt, tai, Hidden layer sẽ phân tích dữ liệu ấy và Output layer sẽ cho ra kết quả,tương tự việc não phân tích và đưa ra đánh giá về thông tin mà tai, mắt, nhận được.Các đơn vị tính toán ở mỗi layer là một node
Mỗi node này tương đương một nơ-ron trong não bộ Chúng cũng được liên kết với nhau và có thể được kích hoạt bởi các hàm kích hoạt (activation function), tương tự việc synapse giải phóng chất dẫn truyền để gây ra phản ứng ở nơ-ron Được phát triển dựa trên cách nơ-ron hoạt động nhưng neural network cũng không hoàn toàn giống với não bộ con người Một đặc điểm khác là số lượng node không cố định, mỗi loại neural network sẽ sử dụng số lớp hidden khác nhau, từ đó có số node khác nhau, dẫn tới sự đa dạng trong quá trình phát triển mô hình
CNN là một mạng nơ-ron áp dụng phép tính convolution lên các pixel của frame để giảm kích thước dữ liệu, lấy ra các đặc điểm quan trọng của các pixel để phân tích.[5]
Kernel (hay filter) là một ma trận vuông kích thước k*k, trong đó k là số lẻ, k có thể bằng 1, 3, 5, 7, 9,
Ví dụ kernel kích thước 3*3 (Hình 1):
Kí hiệu phép tính convolution: ⓧ
Với mỗi phần tử x ij trong ma trận X lấy ra một ma trận có kích thước bằng kích thước của kernel W có phần tử x ij làm trung tâm (đây là vì sao kích thước của kernel thường lẻ) gọi là ma trận A Sau đó tính tổng các phần tử của phép tính element-wise của ma trận A và ma trận W, rồi viết vào ma trận kết quả Y
Tiếp theo lấy một phần tử khác cách phần tử ban đầu một đoạn khoảng cách bằng stride (sẽ trình bày ở mục sau) làm phần tử trung tâm và tính như trên Tiếp tục đến cuối ma trận đầu vào sẽ cho ra ma trận Y hoàn chỉnh.
Hình 2 - Phép tính convolution Ở hình 2, giá trị ở ô đầu tiên trong ma trận Y sẽ là 1*1 + 0*1 + 1*1 +0*0 + 1*1 + 1*0 + 0 *1 + 0*0 + 1*1 = 4
→ Kích thước ma trận Y sẽ nhỏ hơn ma trận X ban đầu một lượng bằng stride ở cả
2 chiều, giảm lượng dữ liệu nhưng vẫn giữ được các thông tin quan trọng
Ý nghĩa của phép tính convolution:
Với mỗi kernel khác nhau thì sẽ phép tính convolution sẽ có ý nghĩa khác nhau(2.3)
Hình 3 - Tác dụng một số loại kernel
Tuy convolution layer đã giúp giảm số lượng dữ liệu cần phân tích, tuy nhiên lượng dữ liệu giảm đi ở mỗi lần tính convolution là không nhiều Do đó nếu chỉ dùng convolution đến khi có được lượng dữ liệu mong muốn thì sẽ phải thực hiện rất nhiều lần.
Vì vậy, trong CNN có sử dụng thêm 1 loại layer khác giúp giảm lượng dữ liệu là pooling layer Pooling layer thường được đặt sau convolution layer Pooling layer với size = k*k sẽ có 1 cửa sổ kích thước k*k trượt trên ma trận đầu vào và chọn các giá trị phù hợp đưa vào ma trận đầu ra Khoảng cách mỗi lần trượt là stride
Có 2 loại pooling thường dùng là max pooling và average pooling Max pooing lấy giá trị lớn nhất trong cửa số k*k, còn avarage pooling thì lấy trung bình của các giá trị trong cửa sổ k*k
Ví dụ về max pooling và average pooling với size = 2*2 và stride = 2 (Hình 4).
Là các layer có các node liên kết với các node ở layer trước Mỗi node trong layer này sẽ:
• Có liên kết với tất cả các node ở layer trước, mỗi liên kết mang hệ số w riêng
• Có hệ số bias b riêng
• Diễn ra 2 bước: Tính tổng linear ở đầu vào và áp dụng activation function ở đầu ra
Tổng linear ở đầu vào 1 node là tổng các (node ở layer trước * hệ số liên kết w của từng liên kết) cộng với bias b Activation function sẽ áp dụng với tổng linear trên để đưa ra kết quả về thông tin của node
Vì fully connected layer cần tính toán rất nhiều nên không thể đặt ở đầu hidden layer khi dữ liệu còn quá nhiều Do đó fully connected layer thường đặt ở sau cùng khi dữ liệu đã trải qua 1 vài lớp convolution, pooling và làm phẳng thành 1 chiều.
Hình 5 là ví dụ về fully connected của một neural network Các node ở mỗi layer được liên kết với tât cả các node ở layer trước.
Với CNN thì fully connected layer cũng sẽ giống như vậy, chỉ khác là lớp input ở đây sẽ trở thành lớp hidden và thêm vào phía trước những lớp convolution và pooling
Một số hàm kích hoạt (Activation function)
Công thức: Đồ thị 6 cho thấy hàm sigmoid nhận đầu vào là tất cả các giá trị thực và kết quả là giá trị trong khoảng (0,1) Đây là hàm kích hoạt được dùng nhiều trong các mô hình CNN ở quá khứ vì nó có đạo hàm đẹp
Tuy nhiên, sigmoid có nhược điểm là khi đầu vào có giá trị quá lớn (quá âm hoặc quá dương) thì đạo hàm gần như bằng 0, không có giá trị trong việc cập nhật trọng số của node.
Hình 6 - Đồ thị hàm sigmoid
Công thức: Đồ thị 7 có dạng khá giống đồ thị hàm sigmoid Do đó hàm tanh cũng gặp vấn đề giống hàm sigmoid.
Hình 7 - Đồ thị hàm tanh
Hình 8 - Đồ thị hàm ReLU
Hàm ReLU đang được sử dụng rộng rãi trong các mô hình CNN hiện nay Nhìn vào hình 8 và công thức của hàm, có thể thấy được tính chất của ReLU khá đơn giản.
Một số mô hình đã tìm hiểu
Lenet-5 [3] Đây là mô hình được phát triển bởi Yann LeCunn (Director of AI Research Facebook) cùng với Léon Bottou, Yoshua Bengio (đồng tác giả với Ian Goodfellow của cuốn “Deep Learning”) và Patrick Haffner với mục tiêu là nhận dạng các chữ số viết tay. Hình 10 thể hiện kiến trúc của mô hình.
Hình 10 - Kiến trúc của Lenet Đầu vào của mô hình là ảnh với kích thước 32x32x1 Layer thứ nhất là convolutional layer với 6 kernel 5x5x1, stride = 1 pad = 0 Output của lớp này là feature map 28x28x6 Layer thứ 2 là pooling layer với phương pháp subsampling kích thước 2x2 Output của lớp này có kích thước 14x14x6
Lớp thứ 3 là lớp convolutional với 16 kernel size 5x5 Điểm đặc biệt ở layer này là nó không sử dụng tất cả các kernel cho input (output của S2) mà sử dụng theo một cách đặc biệt:
Hình 11 - Phương thức tích chập ở layer 3 Lenet
Lấy ví dụ với feature map 0 ở hình 11 Feature map này được tạo bởi 3 feature map 0,1,2 của layer 2 (14x14) với kernel thứ 0 Layer thứ 4 là pooling layer với phương pháp average 10window size = 2x2 Kết quả của layer này là feature map 5x5x16 Lớp thứ 5 là lớp convolutional với 120 kernel size 5x5x16 Sau lớp này có được feature map 1x1x120. Lớp cuối cùng là lớp fully connected Mô hình dùng tanh làm hàm kích hoạt
Lenet nhận input có kích thước khá nhỏ, số lượng layer và số lượng kernel ở những convolu-tion layer là không nhiều Do đó, mô hình có thể được training với tốc độ khá nhanh trên CPU với tập data MNIST
Tuy nhiên độ chính xác của mô hình với các ký tự in là không cao Mô hình có số lượng tham số ít và dùng tanh làm hàm kích hoạt Vì thế khi càng training về sau, các trọng số sẽ lớn dần và khi được kích hoạt bởi hàm tanh, giá trị kích hoạt sẽ không thay đổi nhiều dẫn đến khó khăn cho việc cập nhật lại trọng số
Hai tác giả Mingxing Tan và Quoc V Le đã nghiên cứu và nhận thấy rằng việc cân bằng giữa độ sâu, chiều rộng và độ phân giải (depth, width, and resolution) khi scaling mạng sẽ đem lại hiệu suất tốt hơn Hai người đã đề xuất một phương pháp scaling mới:
• d, w, r lần lượt là độ rộng, độ sâu và độ phân giải của mạng
• α, β, γ là các hằng số có thể được xác định bằng small grid search
Nhóm tác giả nhận ra rằng số lượng phép tính floating-point trên giây (FLOPS) sẽ tỷ lệ thuận với d, w2, r2 Khi scaling theo 1 chiều, nhân đôi chiều sâu sẽ nhân đôi FLOPS, còn nhân đôi chiều rộng hoặc độ phân giải sẽ nhân bốn FLOPS Do đó, họ dặt ràng buộc α.β2.γ2 ≈ 2 để mỗi khi scaling theo φ thì FLOPS sẽ tăng 2φ Nguyên văn như sau: Notably, the FLOPS of a regular convolution op is proportional to d, w2, r2, i.e., doubling network depth will double FLOPS, but doubling network width or resolution will increase FLOPS by four times Since convolution ops usually dominate the computation cost in ConvNets, scaling a ConvNet with equation 3 will approximately increase total FLOPS by (α β2 γ2) φ In this paper, we constraint α.β2.γ2 ≈ 2 such that for any new φ, the total FLOPS will approx-mately increase by 2φ
Và vì scaling sẽ không làm thay đổi phép tính ở mỗi layer nên việc chọn một baseline model làm gốc cũng rất quan trọng Vì thế nhóm tác giả đã phát triển một mô hình mới phù hợp với công thức của mình với tên gọi EfficientNetB0.
Hình 12 - Kiến trúc mạng EfficientNetB0
Các mạng EfficientNet từ B1 đến B7 sẽ được scale từ B0 theo công thức trên bằng cách thay đổi φ với α = 1.2, β = 1.1, γ = 1.15 được xác định bằng phương pháp grid- search
So với Lenet-5, EfficientNet có cấu trúc phức tạp hơn và khả năng phân tách các đặc điểm (feature) của đối tượng tót hơn, Do đó kết quả dự đoán của EfficientNet cũng khá chính xác ngay cả khi ảnh có chất lượng kém Đặc biệt với những mô hình EfficientNet được scaling lên từ B0 thì khả năng dự đoán càng tốt hơn nữa Tuy nhiên, mô hình lại có tốc độ training khá chậm khi so với Lenet trên cùng một GPU do batch size mà có thể load nhỏ hơn.
Pipeline và phương thức hiện thực
Pipeline
Pipeline xử lý vấn đề gồm các bước chính:
Hình 13 - Pipeline của báo cáo
Mỗi bước sẽ được hiện thực như một module có thể chạy độc lập với nhau Đầu tiên, ảnh cần nhận dạng sẽ dược đưa vào và chuyển về kích thước định trước Bước tiếp theo, ta sẽ tìm vùng nào là vùng chứa mã cần tìm và cắt ra bằng module thứ hai Sau đó, ảnh vừa cắt sẽ được đưa vào bước kế tiếp Ở bước này, ảnh sẽ được resize lại và áp dụng một các phương pháp xử lý ảnh để tìm và cắt từng ký tự Cuối cùng, những ký tự vừa cắt sẽ được nhận dạng bằng module thứ ba
Kết quả từ việc dự đoán sẽ được ghi lại lên ảnh đã xử lý ở bước trước đó Việc phát triển pipeline thành từng module như thế này giúp quá trình hiện thực có thể tiến hành song song, không phụ thuộc nhau Đồng thời có thể dễ dàng thay đổi, sửa chữa một module bất kỳ mà không cần thay đổi toàn bộ pipeline khiến cho quá trình xây dựng trở nên thuận lợi và dễ dàng
3.2 Phát hiện vùng mã container:
Mã container bao gồm 2 loại: mã sau (back code) và mã bên (side code) Thông thường, xung quanh vùng mã sẽ có rất nhiều nhiễu Ví dụ như container bị trầy xước, phai màu do ảnh hưởng của thời tiết, đặc biệt là với backcode được in trên trên cửa container luôn có những thông tin khác kèm theo Do đó việc phát hiện các vùng mã này sẽ rất khó nếu chỉ dùng các giải thuật xử lý ảnh đơn thuần Nên việc ứng dụng deep learning tại bước này sẽ giúp quá trình thực hiện báo cáo trở nên đơn giản hơn.
Tuy nhiên, điều này cũng có một số nhược điểm nhất định Đó là với các mô hình CNN, để phát hiện được một vật thể chính xác thì cần lượng dữ liệu (data) kèm theo khoảng thời gian lớn cho việc gán nhãn trong khi thời lượng thực hiện báo cáo lại hạn chế Vì vậy, chúng em sẽ tận dụng lại các model đã được huấn luyện sẵn (pretrained model) để hiện thực module này nhằm tiết kiệm thời gian
Nhờ dự án Container-code-regconition [1] mà anh Nguyễn Lâm Khoa đã thực hiện trước đó, chúng em sẽ sử dụng lại mô hình yolov4 mà anh đã huấn luyện trước đó để hiện thực bước phát hiện vùng mã container này
Hình 14 - Ảnh container đầu vào
Hình 15 - Output chứa vùng mã
Bước này có thể sử dụng các giải thuật xử lý ảnh để tách ký tự:
• Phát hiện cạnh bằng giải thuật Candy
• Sử dụng findCoutour để phát hiện đường viền
• Dùng các điều kiện phù hợp để lọc ra các đường ký tự
Sau khi tách được ký tự, một lớp padding sẽ được thêm vào ở mỗi ký tự để tăng độ chính xác của kết quả dự đoán
Lấy hình 3.3 làm đầu vào, kết quả sẽ là:
Hình 16 - Output phát hiện ký tự
Quá trình training sẽ được tiến hành trên tập data Chars74K Đây là tập data gồm đầy đủ 36 ký tự từ 0-9 và A-Z với xấp xỉ 32000 ảnh, phù hợp cho yêu cầu nhận dạng ký tự in của báo cáo.
3.4.2 Lựa chọn và xây dựng mô hình Deep Learning
Dựa trên tài nguyên sẵn có, yêu cầu về độ chính xác của dự án và thời gian cho việc hoàn thành báo cáo, sau nhiều lần thử nghiệm với các mô hình đã được nghiên cứu, chúng em sẽ lựa chọn và tiến hành một cuộc so sánh giữa hai mô hình: EfficientNetB0 và LeNet-5, để sử dụng làm mô hình cho nhiệm vụ nhận dạng ký tự trong phạm vi dự án này.
Mô hình LeNet-5 là một mạng nơ-ron sâu ban đầu được giới thiệu vào năm 1998.
Mô hình EfficientNetB0 là mô hình mới được phát triển gần đây, cụ thể là năm 2020.
EfficientNet được kỳ vọng có độ chính xác đáng kể cao hơn so với LeNet-5 theo lý thuyết Tuy nhiên, do tính chất của bài toán nhận dạng ký tự, việc huấn luyện mô hình yêu cầu sử dụng GPU mạnh và mất nhiều thời gian để hoàn thành một epoch.
Keras API đã hộ trợ mô hình này nên không cần phải xây dựng lại Chỉ thêm một lớp fully connected vào cuối cùng với 36 node để phân loại các ký tự
3.4.2.1 Kết quả xây dựng mô hình EfficientNetB0
Do mô hình có nhiều lớp và không thể hiển thị hoàn toàn trong một hình ảnh, dưới đây là kết quả của một số lớp cuối cùng để bạn có cái nhìn tổng quan về cấu trúc của mô hình.
Hình 17 - Kết quả xây dựng mô hình EfficientNetB0
Cuối cùng ta có 6,265,254 tham số có thể học
3.4.2.2 Kết quả xây dựng mô hình Lenet-5
Hình 18 - Kết quả xây dưng mô hình LeNet-5
Ta có 63,916 tham số có thể học
3.4.3 Quá trình training và kết quả training của mô hình EfficientNetB0
• Batch size: lượng dữ liệu sẽ load vào trong 1 lần train
• epoch: số lần train toàn bộ dữ liệu
• iteration: số lần để train hết toàn bộ dữ liệu trong 1 epoch
• loss function (hàm mất mát): hàm đo đạt độ lệch giữa giá trị dự đoán và thực tế
• optimizer (Thuật toán tối ưu): cơ sở để xây dựng mô hình neural network với mục đích "học " được các features của input, từ đó tìm ra các weights và bias phù hợp để tối ưu hóa
Thực hiện training trên tập dataset với training data = 0.8 dataset và validation data 0.2 dataset
Vì mô hình lớn và phức tạp nên lượng tính toán là khá nhiều Do đó không thể chọn batch size quá lớn, nếu không máy tính sẽ không thể load nổi dữ liệu Sau nhiều lần thử nghiệm, chúng em đã tìm thấy batch size phù hợp là 8
Vì không thể biết trước được cần bao nhiêu epoch để mô hình đạt độ chính xác cần thiết, chúng em sẽ chọn trước 10 epoch và sử dụng EarlyStopping của keras API để dừng training nếu mô hình đạt độ chính xác định trước
- Vì đã tách dataset thành hai phần và training data chiếm 0.8:
- Sử dụng hàm loss = categorical_crossentropy để tạo ra tensor cùng lớp với số lớp cần phân loại và tính độ sai lệch giữa các lớp với kết quả thực tế Mỗi lớp sẽ là xác suất đối tượng được phân loại co khả năng rơi vào Ở báo cáo này, có 36 lớp tương ứng với 36 ký tự, do đó tensor được tạo ra sẽ có 36 lớp Khi predict, chọn tensor có giá trị lớn nhất là kết quả dự đoán
– Hàm optimizer được dùng là "Adam" Đây là sự kết hợp giữa Momentum và RMSprop, có tốc độ tiến đến mức minimum nhanh hơn các hàm khác
Độ chính xác đạt được là 95%, độ chính xác khi validation cũng đạt 93,54%
Kết quả khi áp dụng vào ảnh (Dùng hình 16 làm input):
Hình 20 - Kết quả áp dụng
3.4.4 Quá trình training và kết quả training của mô hình Lenet-5
• Batch size: lượng dữ liệu sẽ load vào trong 1 lần train
• epoch: số lần train toàn bộ dữ liệu
• iteration: số lần để train hết toàn bộ dữ liệu trong 1 epoch
• loss function (hàm mất mát): hàm đo đạt độ lệch giữa giá trị dự đoán và thực tế
• optimizer (Thuật toán tối ưu): cơ sở để xây dựng mô hình neural network với mục đích "học " được các features của input, từ đó tìm ra các weights và bias phù hợp để tối ưu hóa
Lựa chọn training data, Batch size và Epochs
Thực hiện training trên tập dataset với training data = 0.8 dataset và validation data 0.2 dataset
Nhận diện ký tự
Quá trình training sẽ được tiến hành trên tập data Chars74K Đây là tập data gồm đầy đủ 36 ký tự từ 0-9 và A-Z với xấp xỉ 32000 ảnh, phù hợp cho yêu cầu nhận dạng ký tự in của báo cáo.
3.4.2 Lựa chọn và xây dựng mô hình Deep Learning
Dựa trên tài nguyên sẵn có, yêu cầu về độ chính xác của dự án và thời gian cho việc hoàn thành báo cáo, sau nhiều lần thử nghiệm với các mô hình đã được nghiên cứu, chúng em sẽ lựa chọn và tiến hành một cuộc so sánh giữa hai mô hình: EfficientNetB0 và LeNet-5, để sử dụng làm mô hình cho nhiệm vụ nhận dạng ký tự trong phạm vi dự án này.
Mô hình LeNet-5 là một mạng nơ-ron sâu ban đầu được giới thiệu vào năm 1998.
Mô hình EfficientNetB0 là mô hình mới được phát triển gần đây, cụ thể là năm 2020.
EfficientNet được kỳ vọng có độ chính xác đáng kể cao hơn so với LeNet-5 theo lý thuyết Tuy nhiên, do tính chất của bài toán nhận dạng ký tự, việc huấn luyện mô hình yêu cầu sử dụng GPU mạnh và mất nhiều thời gian để hoàn thành một epoch.
Keras API đã hộ trợ mô hình này nên không cần phải xây dựng lại Chỉ thêm một lớp fully connected vào cuối cùng với 36 node để phân loại các ký tự
3.4.2.1 Kết quả xây dựng mô hình EfficientNetB0
Do mô hình có nhiều lớp và không thể hiển thị hoàn toàn trong một hình ảnh, dưới đây là kết quả của một số lớp cuối cùng để bạn có cái nhìn tổng quan về cấu trúc của mô hình.
Hình 17 - Kết quả xây dựng mô hình EfficientNetB0
Cuối cùng ta có 6,265,254 tham số có thể học
3.4.2.2 Kết quả xây dựng mô hình Lenet-5
Hình 18 - Kết quả xây dưng mô hình LeNet-5
Ta có 63,916 tham số có thể học
3.4.3 Quá trình training và kết quả training của mô hình EfficientNetB0
• Batch size: lượng dữ liệu sẽ load vào trong 1 lần train
• epoch: số lần train toàn bộ dữ liệu
• iteration: số lần để train hết toàn bộ dữ liệu trong 1 epoch
• loss function (hàm mất mát): hàm đo đạt độ lệch giữa giá trị dự đoán và thực tế
• optimizer (Thuật toán tối ưu): cơ sở để xây dựng mô hình neural network với mục đích "học " được các features của input, từ đó tìm ra các weights và bias phù hợp để tối ưu hóa
Thực hiện training trên tập dataset với training data = 0.8 dataset và validation data 0.2 dataset
Vì mô hình lớn và phức tạp nên lượng tính toán là khá nhiều Do đó không thể chọn batch size quá lớn, nếu không máy tính sẽ không thể load nổi dữ liệu Sau nhiều lần thử nghiệm, chúng em đã tìm thấy batch size phù hợp là 8
Vì không thể biết trước được cần bao nhiêu epoch để mô hình đạt độ chính xác cần thiết, chúng em sẽ chọn trước 10 epoch và sử dụng EarlyStopping của keras API để dừng training nếu mô hình đạt độ chính xác định trước
- Vì đã tách dataset thành hai phần và training data chiếm 0.8:
- Sử dụng hàm loss = categorical_crossentropy để tạo ra tensor cùng lớp với số lớp cần phân loại và tính độ sai lệch giữa các lớp với kết quả thực tế Mỗi lớp sẽ là xác suất đối tượng được phân loại co khả năng rơi vào Ở báo cáo này, có 36 lớp tương ứng với 36 ký tự, do đó tensor được tạo ra sẽ có 36 lớp Khi predict, chọn tensor có giá trị lớn nhất là kết quả dự đoán
– Hàm optimizer được dùng là "Adam" Đây là sự kết hợp giữa Momentum và RMSprop, có tốc độ tiến đến mức minimum nhanh hơn các hàm khác
Độ chính xác đạt được là 95%, độ chính xác khi validation cũng đạt 93,54%
Kết quả khi áp dụng vào ảnh (Dùng hình 16 làm input):
Hình 20 - Kết quả áp dụng
3.4.4 Quá trình training và kết quả training của mô hình Lenet-5
• Batch size: lượng dữ liệu sẽ load vào trong 1 lần train
• epoch: số lần train toàn bộ dữ liệu
• iteration: số lần để train hết toàn bộ dữ liệu trong 1 epoch
• loss function (hàm mất mát): hàm đo đạt độ lệch giữa giá trị dự đoán và thực tế
• optimizer (Thuật toán tối ưu): cơ sở để xây dựng mô hình neural network với mục đích "học " được các features của input, từ đó tìm ra các weights và bias phù hợp để tối ưu hóa
Lựa chọn training data, Batch size và Epochs
Thực hiện training trên tập dataset với training data = 0.8 dataset và validation data 0.2 dataset
Vì mô hình lớn và phức tạp nên lượng tính toán là khá nhiều Do đó không thể chọn batch size quá lớn, nếu không máy tính sẽ không thể load nổi dữ liệu Sau nhiều lần thử nghiệm, chúng em đã tìm thấy batch size phù hợp là 8
Vì không thể biết trước được cần bao nhiêu epoch để mô hình đạt độ chính xác cần thiết, chúng em sẽ chọn trước 10 epoch và sử dụng EarlyStopping của keras API để dừng training nếu mô hình đạt độ chính xác định trước
- Vì đã tách dataset thành hai phần và training data chiếm 0.8:
- Sử dụng hàm loss = categorical_crossentropy để tạo ra tensor cùng lớp với số lớp cần phân loại và tính độ sai lệch giữa các lớp với kết quả thực tế Mỗi lớp sẽ là xác suất đối tượng được phân loại co khả năng rơi vào Ở báo cáo này, có 36 lớp tương ứng với 36 ký tự, do đó tensor được tạo ra sẽ có 36 lớp Khi predict, chọn tensor có giá trị lớn nhất là kết quả dự đoán
– Hàm optimizer được dùng là "Adam" Đây là sự kết hợp giữa Momentum và RMSprop, có tốc độ tiến đến mức minimum nhanh hơn các hàm khác
Hình 21 - Kết quả training mô hình Lenet-5
Độ chính xác đạt được là 97,57%, độ chính xác khi validation cũng đạt 93,56%
Kết quả khi áp dụng vào ảnh (Dùng hình 1 làm input):
Các thông tin chi tiết về mô hình LeNet-5 và quá trình huấn luyện sẽ phụ thuộc vào dữ liệu cụ thể và cài đặt, nhưng mô hình LeNet-5 sẽ được xây dựng và huấn luyện tương tự như EfficientNetB0.
Đánh giá hiệu quả
Test
Thực hiện test với 10 mẫu ảnh container khác nhau Số mẫu có kết quả chính xác là 2 (chiếm 20% số lượng) Các kết quả còn lại có nhiều vấn đề khác nhau như không phát hiện được mã, dự đoán sai, không phát hiện được ký tự, Dưới đây là một vài kết quả kiểm tra:
Hình 30 - Output 3 (EfficientNetB0) Output 3 (LeNet-5)
Đánh giá
Dựa vào những kết quả của mục 4.2, có thể đưa ra những đánh giá như sau
4.3.1 Phát hiện vùng mã container
Mô hình yolov4 được sử dụng ở bước này chưa được training nhiều Do đó có nhiều hạn chế trong việc tìm ra vùng chứa mã Module có thể phát hiện tốt những ảnh container được chụp từ cả bên cạnh và sau lưng nếu ảnh bao quát được cả container Tuy nhiên nếu ảnh chỉ có một phần của container thì sẽ không tìm ra được
Module hoạt động tốt nếu ảnh có chất lượng tốt, các ký tự sau khi được threshold tách rời rõ ràng, không dính nhau Vẫn còn một số hạn chế như điều kiện để lọc các bounding box là các thông số cứng, có thể sẽ không phù hợp cho mọi loại ảnh
Do vậy nên nếu các ký tự dính liền nhau, bounding box của những ký tự này sẽ lớn và bị loại ra (3 ký tự đầu ở hình 27, 28, 4 ký tự ở giữ 30, 31) Ở những 21 ảnh mờ, một ký tự có thể có nhiều bounding box đè lên nhau nhưng vẫn chưa lọc được, khiến cho khi nhận dạng sẽ có nhiều kết quả ở cùng một ký tự (giống ký tự số 4 ở hình 30, 31, 34,
Việc nhận dạng các ký tự được tách ra ở bước trước đó khá chính xác Tuy nhiên bởi vì số lần training của mô hình được sử dụng vẫn chưa nhiều (chỉ 10 epoch) nên những ký tự có hình dạng giống nhau đôi khi sẽ bị nhầm lẫn với nhau, như ký tự số 2 và chữ Z, số 0 và chữ O, số 4 và chữ Q (hình 23) Khi ảnh có chất lượng kém, những dự đoán sai sẽ xảy ra nhiều hơn (hình 24, 30, 31, 28, 27)
Hệ thống đã hoạt động được, đạt mục tiêu và một phần yêu cầu ở mục 1.2.1 của chương I là nhận dạng khá chính xác khi ảnh đầu vào có chất lượng tốt Tuy nhiên đây cũng là hạn chế lớn khiến hệ thống chưa thể dùng cho ứng dụng thực tế vì trong thực tế, không phải lúc nào ảnh cũng đạt chất lượng và những yêu cầu của các module trên Đồng thời, do hạn chế về mặt tài nguyên nên thời gian thực thi trên 1 ảnh là khá nhiều (khoảng 400ms cho toàn bộ quá trình từ Input đến Output) nên cũng không thể ứng dụng cho video Một số thông số như lựa chọn kích thước để resize ảnh đầu vào, padding, bouding box, là thông số cứng và chưa hợp lý
Với cùng một ảnh, khi hệ thống chạy trên các môi trường khác nhau thì có thể phải thay đổi các thông số đó để kết đạt được là như nhau.
Tổng kết
Quá trình thực hiện báo cáo đã mang lại cho chúng em cơ hội học hỏi và tích luỹ kiến thức quý báu Chúng em đã tiếp xúc với các khái niệm trong lĩnh vực xử lý ảnh và Deep Learning, đồng thời cũng đắn đo được kinh nghiệm về cách tiếp cận và giải quyết các vấn đề trong dự án và viết báo cáo.
Mặc dù kết quả của báo cáo hiện vẫn chưa thể áp dụng rộng rãi trong thực tế, nhưng chúng em tin rằng nó có tiềm năng để tiếp tục được cải thiện và phát triển trong tương lai.
Với sự tiến bộ liên tục trong nghiên cứu và phát triển về xử lý ảnh, sự ra đời của các mạng neural networks tiên tiến, và sự nâng cao của hiệu năng phần cứng máy tính,chúng tôi tin rằng việc tối ưu hóa và nâng cấp hệ thống nhận dạng trong tương lai hoàn toàn khả thi Khi đó, hệ thống của chúng tôi sẽ đóng góp một phần quan trọng trong việc quản lý vận tải trong ngành vận tải hàng hóa bằng container.
Tài liệu tham khảo
[1] Nguyễn Lâm Khoa container-code-regconition Jul 2021
[2] Alex Krizhevsky, Ilya Sutskever, and Geoffrey E Hinton Imagenet classification with deep convolutional neural networks 2012.