3.2.1. Chuẩn bị tập dữ liệu
Dữ liệu huấn luyện cho YOLOv4 là các ảnh từ các trang trại chăn nuôi lợn, và ảnh bao gồm ảnh chụp trực tiếp và ảnh cắt từ video camera:
Số lượng ảnh: 1000 ảnh Nhãn: “pig”
Đỗ Đình Nam – D17HTTT1 35
Gán nhãn toàn bộ thân của lợn và không gán nhãn lợn bị che khuất quá 60%. Một số dữ liệu cho tập training
Hình 3.1. Một số hỉnh ảnh của dataset cho tập training
3.2.2. Gán nhãn
Hiện nay có một vài công cụ phổ biến cho việc gán nhãn cho mạng YOLOv4 như LabelImg tool. Nhưng nhận thấy LabelImg chỉ cho ra output của một định dạng duy nhất với YOLOv4 mà không thể trả về các định dạng cho tập file huấn luyện khác: XML cho Pascal VOC, TXT cho YOLO Darknet hay Tensorflow TFRecord,..
Đỗ Đình Nam – D17HTTT1 36
Hình 3.2. Các định dạng tập training cho mỗi mạng Roboflow cho phép
Đầu tiên chúng ta thêm dataset vào project tương ứng trên Roboflow. Giới hạn của Roboflow là tối đa 1000 ảnh cho mỗi project với bản không tính phí. Với mỗi ảnh ở dataset ta tiến hành gán nhãn.
Mỗi project ta có thể tạo nhiều bộ dataset đa dạng với mục đích chia nhỏ những bộ dataset có chung thuộc tính với nhau. Tạo mới dataset với các option chọn ảnh đưa vào dataset, chia dataset thành 3 bộ Training Set, Validation Set, Testing Set. Roboflow cho phép tiền xử lý ảnh với các thao tác: Auto-Orient hay Resize ảnh và rất nhiều lựa chọn Augmentation cho ảnh để tăng sự phong phú trong bộ dataset huấn luyện mà không cần dùng đến phần mềm thứ 3 nào khác.
Đỗ Đình Nam – D17HTTT1 37
Hình 3.3. Tạo dataset mới trên Roboflow
Đỗ Đình Nam – D17HTTT1 38
Hình 3.5. Chia tập ảnh Train/Test
Hình 3.6. Lựa chọn tiền xử lý ảnh và Augmentation cho ảnh
Tiếp đến ta tiến hành gán nhãn cho mỗi ảnh trong dataset:
Đỗ Đình Nam – D17HTTT1 39 Với bộ dataset với các ảnh đã được gán nhãn, chọn Export để download bộ dataset với Format tương ứng với mạng huấn luyện đã chọn. Ở đây em chọn mạng YOLOv4 với backbone Darknet nên format sẽ là YOLO Darknet dạng file TXT.
Hình 3.8. Exported Dataset được gán nhãn theo YOLO Darknet format
Output cho định dạng YOLO Darknet bao gồm: 1 file .labels chứa các class được gán nhãn
Ảnh và file txt tương ứng trùng tên và chỉ khác đuôi file File _darknet.labels chứa các class đã được gán nhãn:
Hình 3.9. Nội dung file _darknet.labels
Mỗi dòng trong file .txt là thông tin của mỗi bounding box sẽ có dạng:
𝑐𝑙𝑎𝑠𝑠𝐼𝑑𝑖 𝑥𝐶𝑒𝑛𝑡𝑒𝑟𝑖 𝑦𝐶𝑒𝑛𝑡𝑒𝑟𝑖 𝑤𝑖𝑑𝑡ℎ𝑖 ℎ𝑒𝑖𝑔ℎ𝑡𝑖 Trong đó:
Đỗ Đình Nam – D17HTTT1 40
𝑐𝑙𝑎𝑠𝑠𝐼𝑑𝑖 : id của class
𝑥𝐶𝑒𝑛𝑡𝑒𝑟𝑖 : tọa độ x tâm O của bounding box 𝑦𝐶𝑒𝑛𝑡𝑒𝑟𝑖 : tọa độ y tâm O của bounding box 𝑤𝑖𝑑𝑡ℎ𝑖 : độ rộng của bounding box
ℎ𝑒𝑖𝑔ℎ𝑡𝑖 : chiều cao của bounding box Tất cả thông số đều chia tỉ lệ tương ứng với ảnh.
Hình 3.10. Nội dung file .txt của một ảnh trong dataset
Ví dụ với dòng 1 có nội dung:
0 0.6225961538461539 0.33413461538461536 0.16826923076923078 0.1622596153846154 0 : class có id là 0, ở đây em sử dụng 1 class duy nhất là pig nên classId của nó = 0
4 số tiếp theo lần lượt là xCenter, yCenter, width và height của bounding box.
3.3. Tiến hành Training trên Google Colab 3.3.1. Chuẩn bị dữ liệu 3.3.1. Chuẩn bị dữ liệu
Ta nén bộ dữ liệu Export về từ Roboflow thành file zip có dạng tên: data.zip Tiếp theo ta tải file yolov4-custom.cfg từ source của tác giả về máy tại đây. Mở và sửa cho thích hợp với bài toán của mình (chỉ có 1 class “pig”).
Cập nhật các tham số trong file config:
Tham số class = 1: do chỉ cần huấn luyện detection duy nhất một đối tượng “pig”.
Tham số max_batches = 6000
Đỗ Đình Nam – D17HTTT1 41
Tham số filters = 18, thay toàn bộ các dòng có “filters=255” thành “filters=<(số class+5)*3>”. Ví dụ với bài này số class = 1 thì sẽ sửa thành (1+5)*3 = 18, có nghĩa là filters=18
Chuẩn bị MakeFile Tải Makefile về tại đây
Sửa các tham số sau: GPU = 1
CUDNN = 1
OPENCV = 1
Lưu lại và save Makefile cùng chỗ với data.zip
3.3.2. Bắt đầu train mô hình YOLOv4 với dataset nhãn lợn với Google Colab
Bước 1. Tạo notebook trên Google Colab
Truy cập địa chỉ chức thức của colab https://colab.research.google.com/ và chọn New Notebook.
Chọn Runtime cho Notebook, có 3 lựa Runtime Type cho Notebook, ở đây chúng ta chọn option GPU để huấn luyện:
None: Không sử dụng hardware accelerator, chỉ dùng CPU
GPU(Graphic Processing Unit): Sử dụng bộ xử lý đồ họa, giúp tăng tốc huấn luyện
TPU: bộ xử lý được tùy chỉnh mạnh mẽ để chạy trên một khuôn cụ thể - Tensorflow
Đỗ Đình Nam – D17HTTT1 42
Hình 3.11. Lựa chọn RuntimeType trên Google Colab
Bước 2. Kết nối Google Drive
Lưu ý với mỗi Notebook Colab sau 10 tiếng sẽ bị xóa nên không nên để file trên Notebook. Giải pháp là chúng ta sẽ liên kết tới tài khoản Google Drive.
# Step 1. Kết nối với GoogleDrive
from google.colab import drive drive.mount('/content/gdrive')
Hình 3.12. Kết nối với Google Drive
Bước 3. Tải mã nguồn YOLOv4 về Drive
Mã nguồn YOLOv4 được public tại github của tác giá AlexeyAB. Ta sẽ tải mã nguồn về Drive mà Notebook đã được kết nối trước đó.
Đỗ Đình Nam – D17HTTT1 43
Hình 3.13. Pull mã nguồn YOLOv4 từ git của tác giả
Hình 3.14. Mã nguồn được thêm thành công vào GDrive
Bước 4. Upload dữ liệu training lên Google Drive
Ta up load 3 file: data.zip, Makefile và yolov4-custom.cfg. Tìm đến thư mục darknet của Google Drive và thực hiện:
Đỗ Đình Nam – D17HTTT1 44
Hình 3.15. Thư mục Darknet
Upload file data.zip vào trong thư mục data Upload file yolov4-custom.cfg vào thư mục cfg Upload file Makefile vào thư mục darknet
Bước 5. Giải nén file data.zip để lấy dữ liệu train
Tạo một code block mới trên Notebook và chạy lệnh dưới đây:
Hình 3.16. Giải nén file data.zip
Bước 6. Tạo file yolo.names chứa tên các class
Tạo file yolo.names với class pig:
Hình 3.17. Chuỗi lệnh tạo file yolo.names
Bước 7. Tạo hai file train.txt và val.txt chứa danh sách các file ảnh
Đỗ Đình Nam – D17HTTT1 45
File val.txt: danh sách file dùng để validate (kiểm chứng)
Danh sách cần chọn ngẫu nhiên để đảm bảo tính phân phối dữ liệu # Step 6. Tạo file train.txt và val.txt
%cd /content/gdrive/My\ Drive/darknet import glob2 import math import os import numpy as np files = []
for ext in ["*.png", "*.jpeg", "*.jpg"]:
image_files = glob2.glob(os.path.join("data/data/", ext)) files += image_files
nb_val = math.floor(len(files)*0.2)
rand_idx = np.random.randint(0, len(files), nb_val)
# Tạo file train.txt
with open("train.txt", "w") as f: for idx in np.arange(len(files)):
if (os.path.exists(files[idx][:-3] + "txt")): f.write(files[idx]+'\n')
# Tạo file vali.txt
with open("val.txt", "w") as f: for idx in np.arange(len(files)):
if (idx in rand_idx) and (os.path.exists(files[idx][:- 3] + "txt")):
f.write(files[idx]+'\n')
Chạy xong sẽ thấy trong thư mục darknet xuất hiện 2 file train.txt và val.txt.
Bước 8. Tạo file yolo.data chứa tham số huấn luyện mô hình
Đỗ Đình Nam – D17HTTT1 46
Bước 9. Biên dịch mã nguồn Darknet
Hình 3.19. Biên dịch mã nguồn Darknet bằng lệnh
Bước 10. Tải pretrain weight
Pretrain weight là file weight đã được huấn luyện trước đó bởi một bộ dataset của tác giả.
Hình 3.20. Tải pretrain weight
Bước 11. Thực hiện huấn luyện mô hình
Quá trình thực hiện huấn luyện mất rất nhiều thời gian. Với tốc độ của GPU tốt thời gian huấn luyện với khoảng 1000 ảnh là xấp xỉ 8 tiếng.
Đỗ Đình Nam – D17HTTT1 47
Hình 3.21. Thực hiện train YOLOv4
Sau khi huấn luyện mô hình thành công, tại thư mục darknet/backup các file weight được tạo bao gồm:
yolov4-custom_1000.weights yolov4-custom_last.weights
Với yolov4-custom_1000.weights hay yolov4-custom_2000.weights là các file weights được tạo ở vòng thứ 1000, 2000, ..
Các file yolov4-custom_last.weights là file weights cuối cùng sau khi huấn luyện.
Đỗ Đình Nam – D17HTTT1 48
Đỗ Đình Nam – D17HTTT1 49
CHƯƠNG IV. HỆ THỐNG TỰ ĐỘNG NHẬN DIỆN VÀ GIÁM SÁT LỢN QUA CAMERA SỬ DỤNG YOLOV4, DEEPSORT
4.1. PHÂN TÍCH THIẾT KẾ HỆ THỐNG
Như đã đề cập ở phần Giới thiệu bài toán, hệ thống tập trung giải quyết vấn đề quản lý tự động các thao tác nghiệp vụ liên quan đến trang trại và chuồng nuôi lợn, quan sát và theo dõi lợn bằng camera từ chuồng.
4.1.1. Đặc tả yêu cầu hệ thống
4.1.1.1. Xác định tác nhân nghiệp vụ
Hệ thống cung cấp các chức năng tiện lợi sát với nhu cầu thực tế của các trang trại chăn nuôi lợn, nơi người nông dân tốn nhiều công sức để theo dõi và kiểm soát các cá thể lợn trong chuồng. Người chủ trang trại cũng là người dùng trực tiếp sẽ có tất cả các hành động sau:
Đăng ký Đăng nhập
Quản lý danh sách trang trại (Farm) Quản lý danh sách các chuồng nuôi (Pen) Quản lý thông tin các thể thể lợn (Pig)
Quản lý các sự kiện liên quan đến mỗi chuồng nuôi
Xem trực tiếp video từ camera của chuồng tích hợp nhận diện và theo dõi Xem thông tin lợn qua thao tác với video trực tiếp
Các tác nhân tham gia:
Đỗ Đình Nam – D17HTTT1 50
4.1.1.2. Sơ đồ Use case tổng quát của hệ thống
Hình 4.1. Use case tổng quan
4.1.1.3. Xây dựng các kịch bản
4.1.1.3.1. Chức năng Xem video từ camera tích hợp nhận diện lợn
Đỗ Đình Nam – D17HTTT1 51
Mô tả: Người quản lý trang trại đăng nhập vào hệ thống -> Chọn chức năng Quản lý danh sách chuồng nuôi-> Hệ thống hiển thị danh sách các chuồng nuôi, các tùy chọn (thêm, sửa, xóa chuồng nuôi, xem camera tại chuồng nuôi) -> Người quản lý trang trại chọn mục tùy ý (ví dụ xem camera tại chuồng nuôi) Kịch bản Xem video từ camera tích hợp nhận diện lợn tại chuồng nuôi:
Use case Xem video từ camera tích hợp nhận diện lợn
Actor Người quản lý trang trại
Tiền điều kiện Người quản lý trang trại đăng nhập thành công
Hậu điều kiện Người quản lý trang trại xem camera tại chuồng nuôi thành công
Kịch bản chính 1. Người quản lý trang trại vào trang chủ hệ thống
2. Người quản lý trang trại chọn chức năng Quản lý danh sách chuồng nuôi trên giao diện trang chủ
3. Giao diện Danh sách chuồng nuôi hiện lên gồm: - Danh sách chuồng nuôi
- Nút thêm chuồng nuôi
- Mỗi chuồng nuôi có nút sửa, xóa chuồng nuôi
- Mỗi chuồng có nút xem video từ camera của mỗi chuồng 4. Người quản lý trang trại chọn xem video từ camera của một chuồng nuôi
5. Giao diện Xem video từ camera của chuồng nuôi bao gồm: - Một video từ chuồng nuôi đó
- Video đã tích hợp nhận dạng và theo dõi lợn
Ngoại lệ 4. Tài khoản chưa có chuồng nuôi nào trong hệ thống 4.1. Hiển thị danh sách trống
Đỗ Đình Nam – D17HTTT1 52
Kịch bản Xem thông tin của lợn bằng cách chọn trực tiếp trên video: Use case Xem thông tin của lợn bằng cách chọn trực tiếp trên video
Actor Người quản lý trang trại
Tiền điều kiện Người quản lý trang trại đăng nhập thành công
Hậu điều kiện Người quản lý trang trại xem thông tin của lợn bằng cách chọn trực tiếp trên video thành công
Kịch bản chính 1. Người quản lý trang trại vào trang chủ hệ thống
2. Người quản lý trang trại chọn chức năng Quản lý danh sách chuồng nuôi trên giao diện trang chủ
3. Giao diện Danh sách chuồng nuôi hiện lên gồm: - Danh sách chuồng nuôi
- Nút thêm chuồng nuôi
- Mỗi chuồng nuôi có nút sửa, xóa chuồng nuôi
- Mỗi chuồng có nút xem video từ camera của mỗi chuồng 4. Người quản lý trang trại chọn xem video từ camera của một chuồng nuôi
5. Giao diện Xem video từ camera của chuồng nuôi bao gồm: - Một video từ chuồng nuôi đó
- Video đã tích hợp nhận dạng và theo dõi lợn
6. Người quản lý trang trại chọn lợn muốn xem thông tin trực tiếp trên video.
7. Giao diện hiển thị gồm:
- Thông báo “Xem thông tin Pig-Id” - Nút Xem
- Nút Hủy
8. Người quản lý trang trại chọn nút Xem
Đỗ Đình Nam – D17HTTT1 53 Ngoại lệ 3. Tài khoản chưa có chuồng nuôi nào trong hệ thống
3.1. Hiển thị danh sách trống
8. Người quản lý trang trại chọn nút Hủy 8.1. Quay lại bước 3
Bảng 4.2. Kịch bản xem thông tin lợn bằng cách chọn trực tiếp trên video
4.1.1.3.2. Chức năng Xem toàn bộ camera trong trang trại
Hình 4.3. Use case chức năng xem toàn bộ camera trong trang trại
Mô tả: Người quản lý trang trại đăng nhập vào hệ thống -> Chọn chức năng xem toàn bộ camera trong trang trại-> Hệ thống hiển thị toàn bộ các camera trong trang trại.
Kịch bản Xem toàn bộ camera trong trang trại: Use case Xem toàn bộ camera trong trang trại
Actor Người quản lý trang trại
Tiền điều kiện Người quản lý trang trại đăng nhập thành công
Hậu điều kiện Người quản lý trang trại xem xem toàn bộ camera trong trang trại thành công
Đỗ Đình Nam – D17HTTT1 54 Kịch bản chính 1. Người quản lý trang trại vào trang chủ hệ thống
2. Người quản lý trang trại chọn chức năng Xem video từ trang trại
3. Giao diện Xem toàn bộ camera trong trang trại hiện lên gồm: - Tất cả video của các trang trại
- Các video đều được tích hợp AI nhận dạng và theo dõi
Ngoại lệ 4. Tài khoản chưa có thông tin camera cho trang trại 4.1. Hiển thị danh sách trống
Bảng 4.3. Kịch bản xem toàn bộ camera trong trang trại
4.1.1.4. Sơ đồ tuần tự
Chức năng Xem video từ camera tích hợp nhận diện lợn:
Đỗ Đình Nam – D17HTTT1 55 Chức năng Xem toàn bộ camera trong trang trại:
Hình 4.5. Sơ đồ tuần tự chức năng Xem toàn bộ camera trong trang trại
4.1.2. Phân tích hệ thống
4.1.2.1. Xây dựng biểu đồ lớp thực thể (pha phân tích)
Dựa vào phần mô tả hệ thống, ta xây dựng lớp thực thể với mối quan hệ như sau:
Hình 4.6. Sơ đồ lớp thực thể
Phân tích mối quan hệ giữa các lớp thực thể để bổ sung các lớp thực thể còn thiếu và xác định thuộc tính của các thực thể:
Đỗ Đình Nam – D17HTTT1 56
Lớp User chứa thông tin cá nhân của người dùng: tên, số điện thoại, email, địa chỉ, ngày sinh. Có mối quan hệ 1-1 với thực thể Account.
Lớp Account chứa thông tin tài khoản hệ thống: username, password, active, activeCode, ngày tạo, ngày cập nhật. Account có mối quan hệ 1-1 với User và Role.
Lớp Roles chứa thông tin về quyền của Account bao gồm trường: tên của quyền. Quan hệ của Role và Account là 1-1.
Lớp Farms chứa thông tin về các trang trại gồm các trường: tên trang trại, địa chỉ trang trại, chủ trang trại. Quan hệ giữa lớp Account với lớp Farms là 1-n. Quan hệ giữa lớp Farms với Pens là 1-n.
Lớp Pens chứa thông tin về chuồng nuôi gồm các trường: tên chuồng, sức chứa, ghi chú. Quan hệ giữa lớp Pens và lớp Pigs là 1-n. Quan hệ giữa lớp Pens với lớp Events là 1-n.
Lớp Pigs chứa thông tin về lợn bao gồm các trường: mã theo dõi, ngày sinh, tình trạng sức khỏe, cân nặng, ngày nhập chuồng. Quan hệ giữa lớp Pigs với WeightType là n-1.
Lớp Events chứa thông tin về sự kiện chuồng nuôi bao gồm các trường: tên sự kiện, mô tả, ngày bắt đầu, ngày kết thúc, loại sự kiện. Quan hệ giữa lớp Events với EventType là n-1.
Lớp WeightType chứa thông tin về loại cân nặng của lợn bao gồm các trường: tên loại cân nặng, ghi chú. Quan hệ giữa lớp WeightType và Pigs là