2.4.3.6. Luồng xử lý của Deep SORT kết hợp với YOLOv4
Luồng xử lý của Deep SORT được thực hiện tuần tự qua các bước dưới đây: Bước 1: Sử dụng YOLOv4 để phát hiện đối tượng trong khung hình hiện tại Bước 2: Deep SORT sử dụng bộ lọc Kalman để dự đoán các trạng thái track mới dựa trên các track trong quá khứ. Các trạng thái này lúc mới khởi tạo sẽ được gán 1 giá trị mang tính thăm dò (tentative). Giá trị này nếu vẫn được duy trì trong 3 frame tiếp theo, trạng thái sẽ chuyển từ thăm dò sang xác nhận (confirmed), và sẽ cố gắng được duy trì theo dõi trong 30 frame tiếp theo. Ngược lại, nếu mất dấu khi chưa đủ 3 frame, trạng thái sẽ bị xóa khỏi trình theo dõi.
Bước 3: Sử dụng những track đã được xác nhận, tiến hành đưa vào chiến lược đối sánh phân tầng (matching cascade) nhằm liên kết với các detection phát hiện được dựa trên độ đo về khoảng cách và đặc trưng.
Bước 4: Các track và các detection chưa được liên kết sẽ được đưa đến một lớp học tiếp theo.
Bước 5: Xử lý, phân loại các detection và các track
Bước 6: Sử dụng Kalman filter để hiệu chỉnh lại giá trị của track từ những detection đã được liên kết với track và khởi tạo các track mới.
Đỗ Đình Nam – D17HTTT1 31
CHƯƠNG III. NHẬN DẠNG LỢN SỬ DỤNG MẠNG HỌC SÂU YOLOv4
3.1. TRIỂN KHAI MẠNG YOLOv4 SỬ DỤNG THƯ VIỆN TENSORFLOW
Với việc sử dụng thư viện Tensorflow chúng ta có 2 option chạy bằng GPU hoặc CPU. Xử lý và tính toán dữ liệu hình ảnh ở YOLOv4 được tối ưu cực kỳ tốt khi chạy với GPU. Để triển khai kiến trúc của mạng YOLOv4, theo như mã nguồn của tác giả [6], ta có file yolov4.cfg để miêu tả các lớp của mạng theo từng khối. Có tất cả 5 loại layer được sử dụng trong cấu trúc của YOLOv4.
Lớp tích chập (Convolutional)
Lớp sử dụng tích chập để tìm đặc trưng của ảnh, hoặc co không gian ảnh với tham số stride = 2. Trong config của lớp tích chập có các tham số:
filter: số lượng bộ lọc stride: bước trượt
pad: số lượng padding không ta thêm vào xung quanh viền, pad = 1 để đảm bảo kích thước đầu ra sau tích chập.
activation: hàm kích hoạt. Ở đây YOLOv4 sử dụng hàm Mish Ví dụ 1 config của lớp tích chập: [convolutional] batch_normalize=1 filters=32 size=3 stride=1 pad=1 activation=mish
Lớp tăng kích thước (Upsampling)
Lớp này có chức năng tăng kích thước lên n lần theo tham số stride, tham số này cho biết khoảng cách dịch chuyển của ô tích chập ở mỗi bước chuyển pixel trên ảnh
Đỗ Đình Nam – D17HTTT1 32 stride=2
Lớp nối tắt (Shortcut)
Là điểm nối tắt như được sử dụng trong mạng hồi quy Resnet. Tham số from = - n để chỉ đầu ra của lớp nối tắt có được cộng thêm đặc tính trừu tượng của lớp thứ n tước đó tính từ lớp nối tắt.
[shortcut] from=-3
activation=linear
Lớp đường dẫn (Route)
Lớp này tham số layer có thể có 1 giá trị hoặc nhiều giá trị. Khi layer có một giá trị, nó xuất ra đặc tính trừu tượng của lớp được chỉ định bởi giá trị. Ví dụ, ta có tham số layer = -4, có nghĩa là lớp này sẽ xuất ra kết quả đặc tính đặc trưng từ lớp thứ 4 năm ở trước đó, kể từ lớp đường dẫn.
Ví dụ lớp đường dẫn có 1 giá trị:
[route] layers = -2
Khi layer có nhiều hơn hoặc bẳng 2 giá trị, nó sẽ trả về giá trị ghép nối từ các lớp được chỉ định bởi giá trị. Ví dụ, layer = -1, -7 sẽ trả về giá trị ghép nối từ lớp trước đó (-1) và lớp (-7) trước đó tính từ lớp đường dẫn.
Ví dụ lớp đường dẫn có 2 giá trị:
[route]
layers = -1,-7
Lớp nhận dạng (YOLO)
Đây chính là lớp nhận dạng đối tượng. Tham số anchors miêu tả 9 hộp giới hạn định trước, nhưng chỉ các hộp được chỉ định bởi mask thì mới được sử dụng.
Ví dụ về lớp nhận dạng:
[yolo]
Đỗ Đình Nam – D17HTTT1 33 anchors = 12, 16, 19, 36, 40, 28, 36, 75, 76, 55, 72, 146, 142, 110, 192, 243, 459, 401 classes=80 num=9 ignore_thresh = .7 truth_thresh = 1 iou_thresh=0.213 iou_loss=ciou
3.1.1. Xây dựng mô hình YOLOv4 trong Tensorflow
Bắt đầu từ lớp tích chập, ta phải xác định được kích thước của kernel mà lớp tích cập sử dụng. Chiều rộng và chiều cao của kernel được cung cấp bởi tệp cfg, độ sâu của kernel chính xác là số lượng bộ lọc (hoặc độ sâu của bản đồ đặc trưng trừu tượng) có trong lớp trước. Điều này có nghĩa là cần theo dõi số lượng bộ lọc trong lớp mà lớp chập đang được áp dụng.
Hàm tính tích chập
def convolutional(input_layer, filters_shape, downsample=False, activate=True, bn=True, activate_type='leaky'):
if downsample:
input_layer = tf.keras.layers.ZeroPadding2D(((1, 0), (1, 0)))(input_layer) padding = 'valid' strides = 2 else: strides = 1 padding = 'same'
conv = tf.keras.layers.Conv2D(filters=filters_shape[-1], kernel_size = filters_shape[0], strides=strides, padding=padding,
use_bias=not bn, kernel_regularizer=tf.keras.regularizers.l2(0.0005),
kernel_initializer=tf.random_normal_ initializer(stddev=0.01),
bias_initializer=tf.constant_initial izer(0.))(input_layer)
if bn: conv = BatchNormalization()(conv) if activate == True:
if activate_type == "leaky":
conv = tf.nn.leaky_relu(conv, alpha=0.1) elif activate_type == "mish":
Đỗ Đình Nam – D17HTTT1 34 conv = mish(conv)
return conv
Hàm kích hoạt mish
def mish(x):
return x * tf.math.tanh(tf.math.softplus(x))
Hàm tính khối kết nối dư (residual_block)
def residual_block(input_layer, input_channel, filter_num1, filter_num2, activate_type='leaky'):
short_cut = input_layer
conv = convolutional(input_layer, filters_shape=(1, 1, input_channel, filter_num1), activate_type=activate_type)
conv = convolutional(conv , filters_shape=(3, 3, filter_num1, filter_num2), activate_type=activate_type)
residual_output = short_cut + conv
return residual_output
Hàm tính khối đường dẫn
def route_group(input_layer, groups, group_id):
convs = tf.split(input_layer, num_or_size_splits=groups, axis=-1)
return convs[group_id]
Hàm Upsample
def upsample(input_layer):
return tf.image.resize(input_layer, (input_layer.shape[1] * 2, input_layer.shape[2] * 2), method='bilinear')
3.2. CHUẨN BỊ TẬP DỮ LIỆU HUẤN LUYỆN VÀ GÁN NHÃN 3.2.1. Chuẩn bị tập dữ liệu 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