Tải bản đầy đủ (.docx) (43 trang)

Engineering document template

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.63 MB, 43 trang )

NHẬN DẠNG VÀ ĐẾM
SỐ LƯỢNG XE ĐANG LƯU THÔNG
DÙNG OPENCV , CÓ CODE


2

MỤC LỤC


3

DANH MỤC CÁC HÌNH VẼ


4

DANH MỤC CÁC TỪ VIẾT TẮT

CNN

Convolutional Neural Network

YOLO

You Only Look One

GUI

Graphical User Interface


IDE

Integrated Development Environment

VS Code

Visual Studio Code

GPU

Graphics Processing Unit

ROI
Region Of Interest


Trang 5/39

CHƯƠNG 1.

TỔNG QUAN VỀ ĐỀ TÀI

1.1 Giới thiệu
Ngày nay, camera dành cho giao thông công cộng đang được tất cả các nước trên
thế giới sử dụng phổ biến nhờ vào những giá trị hiệu quả của chúng. Nhờ có camera
giao thơng, chính phủ các nước đã tinh giản được rất nhiều biên chế, từ đó tận dụng
được tối đa năng suất lao động của nguồn nhân lực hiện có. Các lợi ích từ việc tận
dụng cơng nghệ camera tự động cũng rất đa dạng, có thể kể đến như sau:
-


Nâng cao ý thức chấp hành giao thông của người tham gia giao thơng
Lưu giữ chính xác và chi tiết về các dữ liệu tham gia giao thông
Giám sát, phân luồng giao thông từ xa
Phát hiện nhanh các tai nạn, sự cố và đưa ra hướng xử lý kịp thời
Hỗ trợ các vấn đề về an ninh trật tự trong khu vực
Có thể xem lại các vấn đề xảy ra trong q khứ để xử lý
Ghi hình, trích xuất dữ liệu về các trường hợp vi phạm quy định

Hình 1.0 Hệ thống giám sát camera giao thông của TP.HCM

Không chỉ dừng lại ở các lợi ích trên, cơng nghệ hiện nay đang phát triển mạnh mẽ,
đặc biệt là công nghệ xử lý ảnh. Từ đó đưa ra các hướng mới cho camera giao thông,
hướng tới việc xử lý tự động hố một phần cho việc phân luồng giao thơng. Các thuật
tốn cơng nghệ xử lý ảnh có thể trích xuất các dữ liệu về biển số, mật độ lưu thông,…
nhằm đưa ra các phương án phân luồng tự động, giảm thiểu nguy cơ gây ùn tắc và các
nguyên nhân khác gây ra tai nạn giao thông.


Trang 6/39

Đặc biệt hơn, với sự phát triển của công nghệ lái xe tự động trên các dịng xe ơ tơ
hiện đại ngày nay, nếu có sự hợp tác của các cơ quan chuyên ngành và của công ty sản
xuất, có thể cơng nghệ tự động lái sẽ có thể sử dụng được dữ liệu từ camera, từ đó đưa
ra các hướng đi ít ùn tắc và tiện lợi nhất cho người sử dụng.
Thuật toán được dùng trong đề tài này là YOLO phiên bản thứ 4 (YOLOv4) để hỗ
trợ tốt cho quá trình nhận dạng số lượng xe. Thuật toán này sẽ được giới thiệu chi tiết
hơn ở phần 2.
1.2 Mục đích nghiên cứu
Đề tài được đưa ra với mục tiêu nâng cao sự hiểu biết dựa trên những kiến thức đã
học, áp dụng ngơn ngữ lập trình python vào ứng dụng đề tài. Tìm hiểu về ngơn ngữ

python, cách hoạt động của xử lý ảnh, tìm hiểu và ứng dụng công nghệ máy học (AI).
Đồng thời, sử dụng các kiến thức logic để phân tích dự án, nghiên cứu và sử dụng các
phương thức hợp lý, đẩy mạnh phương pháp nghiên cứu và tham khảo từ cộng đồng.
Tuy rằng đề tài này đã được thực hiện nhiều bởi các chuyên gia xử lý ảnh dựa vào
đặc tính cấp thiết của nó, tuy nhiên đây là nền tảng để sinh viên có thể tìm hiểu thêm
về cách hoạt động của quá trình xử lý ành, và hiểu rõ hơn về định hướng của ngành
công nghiệp này. Đề tài này chủ yếu được sử dụng cho mục đích học tập và nghiên
cứu, ứng dụng các công nghệ mới hơn vào việc nhận dạng vật thể. Từ đó làm nền tảng
cho các đề tài khác, và sâu xa hơn là các dự án lớn hơn sau này.

-

1.3 Đối tượng nghiên cứu
Phần mềm Visual Studio Code

-

Python

-

Thuật toán xử lý ảnh cơ bản

-

CNN

-

YoloV4


-

Tkinter

1.4 Phạm vi nghiên cứu
Đề tài hiện tại chỉ giới hạn ở dạng mô phỏng camera giao thông và đếm số lượng
xe trong một vùng xác định. Đề tài được thực hiện chủ yếu dựa trên các thuật toán của


Trang 7/39

python và thư viện OpenCV. Ứng dụng AI YoloV4 đã có dữ liệu trước để nhận dạng
vật thể trong video.
1.5 Dự kiến kết quả
Kết quả dự kiến sẽ được xây dựng thành công thông qua việc mô phỏng trên nền
ngôn ngữ python. Hệ thống sẽ mô phỏng phần nhận dạng, khoanh vùng xe và đếm xe.
Giao diện sẽ là một bảng thông tin được hiển thị đầy đủ về thông tin của sinh viên thực
hiện và số lượng xe được đếm.


Trang 8/39

CHƯƠNG 2.

CƠ SỞ LÝ THUYẾT

1.6 Phần mềm Visual Studio Code
Visual Studio Code là một trình biên dịch (IDE) miễn phí được phát triển bởi
Microsoft. Phần mềm này được xem như là một bảng rút gọn của Visual Studio, được

tối ưu tốt hơn về các tính năng cơ bản và hiệu năng. Tuy là bản rút gọn, nhưng Visual
Studio Code vẫn có thể đáp ứng hồn tồn tốt các u cầu về lập trình, kiểm tra và xử
lý lỗi trong quá trình code của lập trình viên, đặc biệt phần mềm cũng hỗ trợ rất lập
trình rất nhiều ngơn ngữ, trong đó có Python.
Visual Studio Code cũng sở hữu riêng một kho tiện ích mở rộng (extensions) được
đóng góp bởi cộng đồng lập trình viên trên tồn thế giới. Nhờ đó mà các chức năng,
giao diện, thư viện có thể được cài đặt tự do để phù hợp với dự án, ngơn ngữ lập trình
mà người dùng sử dụng.

Hình 2-0: Giao diện lập trình của Visual Studio Code

Giao diện cũng là một điều mà VS Code thiết kế rất tốt, các nút thiết kế đơn giản
phù hợp với những người mới, và bố cục của màn hình chính hỗ trợ tối đa sự tập trung
cho lập trình viên. Ngồi ra, lập trình viên có thể sử dụng Visual Studio Code cho một
dự án đồng nhất nhờ vào việc ứng dụng hỗ trợ đa nền tảng cho cả Windows, Linux và
MacOS.


Trang 9/39

1.7 Python
Python là một ngơn ngữ lập trình bậc cao được phát triển trong một dự án mã
nguồn mở và được tạo ra để phục vụ cho đa mục đích. Ngơn ngữ này được thiết kế với
các cấu trúc rõ ràng, từ khoá bằng tiếng anh giúp cho việc dễ đọc, dễ hiểu, và điều này
hỗ trợ tốt cho tất cả các lập trình viên dễ dàng tìm hiểu nó, đặc biệt là những người
mới tiếp xúc với ngơn ngữ lập trình. Hiện nay, Python được sử dụng phổ biến trong
giảng dạy, thử nghiệm thuật toán mới và phát triển trí tuệ nhân tạo. Tính ứng dụng của
python cũng hầu như khơng có giới hạn khi nó có thể lập trình ra mọi thứ theo ý muốn
của lập trình viên, tuy nhiên vì là ngơn ngữ lập trình bậc cao nên Python cũng sẽ sở
hữu những hạn chế nhất định khi lập trình với các phần cứng, ví dụ như lập trình với

các máy móc trong cơng nghiệp.

Hình 2.1 Biểu tượng nhận diện ngơn ngữ lập trình Python

Khác với các loại ngơn ngữ khác, Python có thể dễ dàng mở rộng bằng các module
bên ngồi, vì thế nó có thể phù hợp với từng loại dự án cụ thể khác nhau. Tầm nhìn
này đã được người sáng lập của Python – Van Rossum, thực hiện về một ngôn ngữ có
phần lõi nhỏ nhưng có được một thư viện chuẩn rộng lớn. Python hướng đến các lệnh
và cú pháp đơn giản, tinh gọn nhưng vẫn cho phép các lập trình viên lựa chọn ra
những phương pháp viết mã của riêng họ.
Python sử dụng phương thức thụt lề để phân biệt các khối lệnh. Với lệnh con trong
một hàm, lề sẽ được thụt vào sâu hơn một bậc, và để kết thúc khối lệnh, lệ sẽ được thụt


Trang 10/39

trở ra một bậc. Cách thức này giúp cho Python có được một cấu trúc trực quan, hỗ trợ
tốt cho nhà lập trình biết được dễ hơn các khối lệnh nào sẽ được phân tách trong cùng
một chương trình. Kích cỡ thụt lề của Python được quy định bằng 4 lần dấu cách.
1.8 CNN
1.1.1 Giới thiệu
Convolutional Neural Network (mạng neuron tích chập) là một mơ hình của Deep
Learning dùng để xử lý nhận dạng và phân loại hình ảnh. Mạng CNN được thiết kế với
mục đích xử lý các dữ liệu thông qua nhiều lớp mảng nhằm tạo nên một hệ thống có
độ thơng minh và phản ứng với tính chính xác cao.
Về mặt kỹ thuật, CNN sẽ hoạt động dựa vào dữ liệu đầu vào và các lớp bộ lọc. Khi
đưa hình ảnh đầu vào sẽ được chuyển qua các lớp tích chập có các bộ lọc để lọc ra
những pixels chứa vật thể, sau đó các lớp sẽ được tổng hợp lại (fully connected) và
được đưa qua hàm Softmax – là một hàm tính tốn xác xuất xảy ra trong một sự kiện,
để đưa ra kết quả phán đốn vật thể.


Hình 2.2 Tổng quan cách hoạt động của mạng CNN

1.1.2
Các lớp layer
1.1.1.1 Lớp Convolution Layer
Khi có được dữ liệu đầu vào là một tấm hình, thuật tốn sẽ tiến hành phân tích các
giá trị pixel thành các ma trận riêng biệt, sau đó nhân tích chập các ma trận đã có cũng
với ma trận của bộ lọc lại với nhau. Ví dụ được đưa ra là một ma trận ảnh có kích
thước 5x5 và một ma trận bộ lọc có kích thước 3x3. Ma trận ảnh 5x5 sẽ được chia ra
thành nhiều ma trận 3x3 nhỏ để có thể nhân với ma trận bộ lọc.


Trang 11/39

Hình 2.3 Nhân từng ma trận ảnh với ma trận bộ lọc

Sự kết hợp giữa 2 ma trận trên sẽ tạo ra một ma trận mới, và đây chính là lớp
Convolution Layer mà ta đang tìm kiếm. Với mỗi ma trận bộ lọc khác nhau sẽ cho ra
các kết quả ma trận ảnh khác nhau.

Hình 2.4 Các bộ lọc ma trận

1.1.1.2

Bước nhảy Stride


Trang 12/39


Stride sẽ bằng số lượng pixel thay đổi của ma trận đầu vào, khi stride bằng 1 thì
mỗi lượt nhân tích chập sẽ di chuyển sang 1 pixel. Và tương tự khi stride bằng 2 thì
mỗi lượt tính tốn xong, ma trận sẽ nhảy 2 pixel.
1.1.1.3 Hàm kích hoạt Relu
Đây là hàm được sử dụng phổ biến trong việc huấn luyện các mạng neuron ở các
năm gần đây. Mục đích chính của hàm Relu rất đơn giản, đó là được dùng để lọc ra các
giá trị < 0. Hàm Relu có ưu điểm vượt trội hơn các hàm khác nhờ vào việc cơng thức
đơn giản, từ đó khiến thời gian tính tốn được tối ưu rất tốt.
Cơng thức:
1.1.1.4 Lớp Pooling Layer
Lớp này còn được gọi là lớp gộp. Lớp này có nhiệm vụ giảm số lượng tham số
trong trường hợp ảnh quá lớn. Pooling Layer sẽ lấy mẫu con hoặc mẫu lớn tuỳ theo lựa
chọn để giảm kích thước của mỗi map trong khi vẫn giữ được các thông tin quan
trọng. Có 3 cách lấy Pooling như sau:
-

Max Pooling (giá trị lớn nhất)
Average Pooling (giá trị trung bình)
Sum Pooling (giá trị tổng)

Hình 2.5 Max Pooling

1.1.1.5 Full Connected Layer
Sau khi đã có được các kết quả từ các lớp Convolution và Pooling, lớp Full
Connected Layer sẽ liên kết chúng lại dựa vào các đặc điểm đã được tính tốn và đưa
ra giá trị đầu ra cho Model để đọc các thơng tin về hình ảnh đầu vào.


Trang 13/39


1.1.1.6 Hàm Softmax
Như đã giới thiệu ở phần đầu CNN, hàm Softmax được sử dụng để tính tốn các
giá trị và xác suất xảy ra của một sự kiện. Hàm Softmax sẽ thực hiện chuyển đổi các
vector có giá trị bất kỳ trở thành các vector có tổng là 1. Giá trị nhập có thể là một số
tuỳ ý nhưng qua hàm Softmax sẽ có giá trị nằm trong khoảng [0;1]
Cơng thức:
1.1.1.7 Phân loại CNN
Thuật tốn CNN hiện tại đã được cải tiến qua nhiều phiên bản để tăng khả năng
nhận diện và hiệu năng trong quá trình sử dụng. Hiện nay, CNN được chia ra thành 4
loại:
-

R-CNN
Fast R-CNN
Faster R-CNN
YOLO

Hình 2.6 Hiệu năng giữa các phiên bản CNN

1.9 YOLO
1.1.3 Giới thiệu
YOLO (You Only Look One) cũng là một thuật toán được cải tiến từ CNN. Tuy
nhiên điểm khác biệt là YOLO không nhận và xem xét từng vùng như các CNN, mà là
nhận toàn bộ bức ảnh một lần, sau đó tiến hành dự đốn các class, bounding box của
từng vật thể trong hình.
1.1.4 Các phiên bản YOLO


Trang 14/39


Kể từ khi phiên bản đầu tiên được ra mắt cho đến hiện tại, YOLO đã trải qua 5
phiên bản cập nhật cải tiến lớn: YOLOv1, YOLOv2 (YOLO9000), YOLOv3,
YOLOv4, YOLOv5. Và mỗi phiên bản YOLO sở hữu một loại cấu trúc khác nhau.
-

YOLOv1 là phiên bản đầu tiên của thuật toán YOLO, sử dụng thuật toán để dự
đoán những vùng có thể chứa vật, sau đó phân loại vật đó thuộc lớp nào, từ đó
đưa ra kết quả dự đoán. Cách tiếp cận này sẽ làm cho các vật thể nhỏ khó nhận
dạng, đồng thời u cầu cấu hình phần cứng lớn do lượng tính tốn lớn, do đó

-

khó có thể tối ưu được tốc độ xử lý.
YOLOv2 hay còn được gọi là YOLO9000, được cải tiến về tốc độ xử lý ngang
với faster R-CNN. Về mặt cấu trúc, YOLOv2 được cải tiến thêm các kỹ thuật
mới như batch normalization, anchorbox, light-weight backbone, direct location
prediction,.. Điều này giúp giảm thời gian huấn luyện của Model, tăng tính phổ

-

quát, độ ổn định cho phiên bản này.
YOLOv3 có cấu trúc gần giống với YOLOv2, tuy nhiên được cải tiến về các
hàm xử lý như sử dụng logistic regression thay cho confidence score, logistic
classifier rời rạc thay cho softmax, kiến trúc backbone mới (darknet-53),… giúp
cho phiên bản này tăng chủ yếu về độ chính xác dự đốn các vật thể nhỏ mà các

-

phiên bản trước có thể bỏ qua.
YOLOv4 là phiên bản chính mà sẽ được ứng dụng trong dự án này, vì thế sẽ


-

được giới thiệu chi tiết ở phần sau.
YOLOv5 là phiên bản mới nhất vừa mới được ra mắt, tuy nhiên việc nhận định
về mặt cấu trúc và hiệu quả tại thời điểm này được cho là vẫn còn quá sớm do
việc mới ra mắt nên số mẫu dự án sử dụng YOLOv5 vẫn cịn nhỏ, cũng như
chưa có các nghiên cứu sâu về phiên bản này.

1.1.5 YOLOv4
1.1.1.8 Giới thiệu
Như đã được đề cập ở các mục trên, YOLOv4 là phiên bản được sử dụng cho dự án
này. Lý do cho việc chọn lựa YOLOv4 cho dự án là vì phiên bản này có những cải tiến
rất tích cực về mặt hiệu năng lẫn nhận dạng so với các phiên bản trước, cũng như vì đã
ra mắt một thời gian đủ lâu để chứng minh được sự ổn định của nó.


Trang 15/39

Bảng dữ liệu về kết quả so sánh hiệu năng giữa YOLOv4 với bản tiền nhiệm và các
thuật toán khác, sử dụng tệp dữ liệu Microsoft COCO để so sánh:

Hình 2.6 So sánh hiệu năng của YOLOv4

1.1.1.9 Cấu trúc
YOLOv4 sở hữu các cải tiến đáng kể so với phiên bản tiền nhiệm của nó. Trong bài
báo khoa học về YOLOv4 của tác giả Alexey Bochkovskiy cùng các cộng sự của ông
tại đây, ông đã chia phiên bản này thành 3 phần chính, bao gồm: Backbones, Neck và
Heads. Trong đó, phần Heads được chia thành 2 phần nhỏ tiếp theo bao gồm: Dense
Prediction (one-stage) và Sparse Prediction (two-stage).


Hình 2.7 Cấu trúc tổng thể YOLOv4


Trang 16/39

Backbones (phần xương sống) – trích xuất
Để chọn ra mạng xương sống cho việc nhận dạng vật thể, tác giả đã tiến hành chọn
và cho kiểm tra chạy thử loại 3 mạng xương sống bao gồm:
-

CSPResNext50
CSPDarknet53
EfficientNet-B3

Hình 2.8 So sánh Backbone model

Kết quả thu được như hình trên cho thấy, mạng CSPDarknet53 cho ra được các
thông số (Parameters) và FPS (Frame Per Second) cao nhất. Chính vì thế, tác giả đã
lựa chọn CSPDarknet53 cho YOLOv4.
CSPDarknet53 được cấu tạo từ 2 thành phần là CSP và Darknet53.

Hình 2.9 Cấu trúc CSPDarknet53

CSP sử dụng nguồn gốc kiến trúc từ DenseNet (Dense connected convolutional
network) sử dụng đầu vào trước để nối nó với đầu vào hiện tại khi chuyển vào Dense
Layer. Nhiệm vụ của nó là chia dữ liệu đầu vào thành 2 phần, một phần sẽ đi thẳng tới
cuối khối, phần còn lại sẽ qua các khối chập. Điều này nhằm mục đích loại bỏ các nút
thắt trong tính tốn và cải thiện việc học của model.



Trang 17/39

Hình 2.10 Cấu trúc CSP

DenseNet bao gồm các dense block và các transition layers được xếp chồng lại với
nhau tạo thành các lớp để dự đốn như hình.

Hình 2.11 Cấu trúc DenseNet

Theo tác giả, thêm 1 lý do nữa được đưa ra khi chọn Darknet53 làm backbone cho
YOLOv4 là vì độ chính xác của Darknet53 cao hơn ResNext50 trong phần nhận diện
vật thể, mặc dù ResNext50 thì thể hiện tốt hơn ở phần phân loại. Tuy nhiên điều này
có thể được cải thiện dựa vào hàm kích hoạt Mish và một vài kỹ thuật khác.
Neck (phần cổ) – tổng hợp
Nhiệm vụ của Neck là kết hợp các dữ liệu về feature map đã được học thơng qua
việc trích xuất các đặc trưng của backbone và quá trình nhận dạng dense prediction.
Để giúp lớp nhận dạng được phong phú hơn, tác giả cho phép lập trình viên tuỳ chọn
và tuỳ biến các cấu trúc cho phần Neck, bao gồm các cấu trúc sau:
-

FPN
NAS-FPN
BiFPN
PAN
ASFF
SSP
SFAM



Trang 18/39

Hình 2.12 Một số cấu trúc cho phần Neck

Head (phần đầu) – nhận dạng
YOLOv4 có phần head giống với YOLOv3, sử dụng mạng liên kết FPN cho phép
học các vật thể với kích thước khác nhau. Tại đây, thuật toán này phân chia ra anchor
box ra thành 3 khối lưới có kích thước khác nhau, bao gồm: 13 x 13, 26 x 26 và 52 x
52.
Anchor box là những khung hình được định sẵn kích thước được dùng để dự đốn
bounding box (khung bao quanh vật thể).

Hình 2.13 Nhận dạng vật thể ở các kích thước khác nhau

Ở lưới 13x13 có bối cảnh rộng hơn và độ phân giải yêu cầu cũng thấp hơn so với 2
khối lưới còn lại. Lưới 52x52 thì ngược với khối 13x13, được dùng để nhận diện các
vật thể nhỏ, còn với lưới 38x38 được dùng để nhận diện các vật thể có kích thước vừa
phải. Nhìn chung mỗi khối sẽ có một tỉ lệ nhận dạng riêng biệt nhau. Cần lưu ý rằng 2


Trang 19/39

khối 26x26 và 52x52 cần có độ phân giải cao để có thể kích hoạt q trình xử lý nhận
dạng.

Hình 2.14 Chia kích thước lưới để nhận dạng vật thể

Hình 2.15 Dùng anchor box để dự đốn

1.10 Tkinter

1.1.6 Giới thiệu
Tkinter là một gói được tích hợp sẵn trong Python nhằm mục đích lập trình GUI
nhanh chóng và dễ dàng. Tkinter chứa module Tk cung cấp nhiều công cụ hỗ trợ trong
quá trình lập trình giao diện hướng đối tượng.


Trang 20/39

Hình 2.16 Python Tkinter

Tkinter cung cấp sẵn các tuỳ chọn giao diện được cung cấp dưới dạng widget hỗ
trợ lập trình viên trong việc điều chỉnh giao diện. Vì được tích hợp sẵn trong python,
thế nên cộng đồng sử dụng Tkinter cũng rất lớn, giúp lập trình viên dễ dàng tìm thấy
các hướng dẫn nhanh chóng. Hơn thế nữa hiện nay cũng có một số cơng cụ hỗ trợ tạo
giao diện Python bằng Tkinter mà không cần code, lập trình viên chỉ cần kéo thả và
các cơng cụ này sẽ tự tạo ra đoạn code của Tkinter theo đúng giao diện đó.
1.1.7 Cấu trúc và widget
Cấu trúc của một chương trình Tkinter sẽ gồm 4 phần theo thứ tự:
-

Nhập thư viện Tkinter
Tạo cửa số chính
Tạo widget
Gọi vịng lặp Tkinter


Trang 21/39

Hình 2.17 Cấu trúc Tkinter


Bố cục chia vị trí của Tkinter được cung cấp 3 phương thức như sau:
-

Phương thức pack() – quản lý bố cục theo dạng khối
Phương thức grid() – quản lý bố cục theo dạng bảng
Phương thức place() – quản lý bộ cục theo toạ độ pixel

Đối với các widgets của Tkinter được phân chia ra thành nhiều mục. Đây là các
thành phần chính tạo nên giao diện GUI. Với mỗi mục khác nhau sẽ có các widgets
mang chức năng khác nhau. Các widgets chính được chia thành 19 mục như sau:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.


Button – khởi tạo nút nhấn
Canvas – sử dụng để vẽ các hình lên trên cửa sổ
Checkbutton – hiển thị ơ chọn giá trị có/khơng
Entry – nhập văn bản
Frame – dùng để chứa các widgets khác
Label – hiển thị văn bản
ListBox – hiển thị danh sách chọn
Menubutton – hiển thị danh mục menu
Menu – thêm các danh mục menu
Message – hiển thị hộp tin nhắn
Radiobutton – chọn các lựa chọn giới hạn được cài sẵn
Scale – khởi tạo thanh trượt
Scrollbar – khởi tạo thanh cuộn lên/xuống
Text – cung cấp văn bản nhiều dịng, có thể viết và chỉnh sửa bên trong
Toplevel – tạo vùng chứa cửa sổ đặc biệt
Spinbox – khởi tạo mục nhập từ các giá trị dạng số
PanedWindow – vùng chứa widget chứa các ô ngang và dọc
LabelFrame – vùng widget hoạt động như một ô chứa
MessageBox – hiển thị hộp thông báo của các ứng dụng desktop


Trang 22/39

Hình 2.18 Giao diện được thiết kế bằng Tkinter

CHƯƠNG 3.
1.11

Lưu đồ giải thuật


GIẢI THUẬT VÀ ĐIỀU KHIỂN


Trang 23/39

Hình 3.0 Lưu đồ giải thuật

1.12 Phần code
import tkinter
from tkinter import *
from tkinter.font import BOLD, ITALIC


Trang 24/39
import cv2 as cv
import PIL
from PIL import Image,ImageTk
from datetime import date
import time
import math
import cv2
import numpy as np
path = r"D:\OneDrive\Desktop\dacn\cliptest\roadtraffic13.mp4"
class ObjectDetection:
def __init__(self, weights_path="dnn_model/yolov4.weights",
cfg_path="dnn_model/yolov4.cfg"):
print("Loading Object Detection")
print("Running opencv dnn with YOLOv4")
self.nmsThreshold = 0.4
self.confThreshold = 0.5

self.image_size = 320 #do nhay
# Load Network
net = cv2.dnn.readNet(weights_path, cfg_path)
# Enable GPU CUDA
net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)
net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA)
self.model = cv2.dnn_DetectionModel(net)
self.classes = []
self.load_class_names()
self.colors = np.random.uniform(0, 255, size=(80, 3))
self.model.setInputParams(size=(self.image_size, self.image_size), scale=1/255)
def load_class_names(self, classes_path="dnn_model/classes.txt"):
with open(classes_path, "r") as file_object:
for class_name in file_object.readlines():
class_name = class_name.strip()
self.classes.append(class_name)
self.colors = np.random.uniform(0, 255, size=(80, 3))
return self.classes
def detect(self, frame):
return self.model.detect(frame, nmsThreshold=self.nmsThreshold,
confThreshold=self.confThreshold)


Trang 25/39
root = Tk()
root.geometry("1280x720")
root.title("GUI đếm số lượng xe")
count = 0
center_points_prev_frame = []
tracking_objects = {}

track_id = 0
starting_time=time.time()
object_id = 0
frame_id = 0
frame_idx = 0
od=ObjectDetection()
#Tao area
area_1a=[(410,410),(1060,410),(1060,690),(410,690)]
def visualizer():
global cap, frame_id, track_id, count, tracking_objects, object_id,frame_idx
start_time = time.time()
if cap != None:
ret, frame = cap.read()
cv2.polylines(frame,[np.array(area_1a,np.int32)],True,(0,0,255),2)
roi = frame[410:690,410:1060]
frame_id += 1
count += 1
center_points_cur_frame = []
frame_idx += 1
# Nhận diện vật thể trên khung hình
(class_ids, scores, boxes) = od.detect(roi)
if frame_idx != 20:
#sau 20 khung hình sẽ nhận diện 1 lần
for box in boxes:
(x, y, w, h) = box
cx = int((x + x + w) / 2)
cy = int((y + y + h) / 2)
center_points_cur_frame.append((cx, cy))
cv2.rectangle(roi, (x, y), (x + w, y + h), (0, 255, 0), 2)
# Khi bắt đầu, so sánh khung trước với khung hiện tại

if count <= 2:
for pt in center_points_cur_frame:
for pt2 in center_points_prev_frame:
distance = math.hypot(pt2[0] - pt[0], pt2[1] - pt[1]) #Hàm hypot =
sqrt((x*x)+(y*y))
if distance < 20:
tracking_objects[track_id] = pt
track_id += 1
else:
tracking_objects_copy = tracking_objects.copy()
center_points_cur_frame_copy = center_points_cur_frame.copy()


Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×