Vấn đề đầu tiên cần giải quyết là thời điểm nào (frame bắt đầu) trong đoạn video được chọn để bắt đầu thuật toán tìm các vùng là vùng đầu của học sinh? Trong lớp học khi chưa có giáo viên vào lớp thì học sinh sẽ di chuyển hay trao đổi nhiều, điều này dẫn đến mức độ hỗn loạn dữ liệu (các điểm ảnh) trong các frame ảnh là rất lớn. Từ nhận xét này chúng tôi đề xuất thuật toán xác định thời điểm bắt đầu (frame bắt đầu) thực hiện thuật toán xác định các vùng đầu của học sinh, thuật toán 1. Ý tưởng chính của thuật toán chính là xem xét mức độ chênh lệch (độ thay đổi) của hai frame cách nhau một khoảng thời gian t.
Thuật toán 1: xác định frame bắt đầu cho thuật toán tìm các vùng đầu
của học sinh trong video
Input: video trong lớp học
Output: chỉ mục (indexing) frame theo yêu cầu
Step 1: max 0
start vị trí frame đầu tiên của video index start
Step 2: chuyển các frame về không gian xám Step 3: count 0 ; flag false
frame_1video[start].getFrame() Step 4: while (video còn và !flag) start start+t 4.1: frame_2 video[start].getFrame() 4.2: If (max ≤ |𝑓𝑟𝑎𝑚𝑒_2 – 𝑓𝑟𝑎𝑚𝑒_1|) then max = |𝑓𝑟𝑎𝑚𝑒_2 – 𝑓𝑟𝑎𝑚𝑒_1| index = start
Endif
4.3: frame_1 frame_2
If (start đủ lớn và count không đổi) then
flag true Endif
Endwhile
Step 5: Return index
Chúng tôi sử dụng tập dữ liệu 𝑇ℎ𝑒𝑎𝑑 để huấn luyện mô hình học chuyên sâu YOLO2 để được mô hình phát hiện vùng đầu trong ảnh của chúng tôi – có tên 𝑂𝑈𝑅_𝑌𝑂𝐿𝑂2ℎ𝑒𝑎𝑑, tập dữ liệu 𝑇ℎ𝑒𝑎𝑑 được xây dựng từ dữ liệu được trích trong một phần video và các ảnh được thu thập từ các nguồn khác nhau. Có thể trong quá trình xác định các đối tượng đầu học sinh trong frame thứ i và frame thứ k khác biệt nhau do môi trường tác động như: mức độ sáng thay đổi do mây, do che khuất của đối tượng khác đi ngang cửa sổ, do chuyển động của quạt, do màn che bị gió thổi, … hay do các đối tượng học sinh dịch chuyển. Từ đây chúng tôi xây dựng thuật toán để phát hiện các vùng đầu của từng frame trong đoạn video, thuật toán 2.
Thuật toán 2: Xác định các vùng đầu trong đoạn video
Input: tập hợp Frame có N phần tử, kết quả index từ thuật toán 1, và step
là bước nhảy
Output: tập hợp B có N phần tử, mỗi phần tử của tập hợp B là một tập
các vùng đầu của một frame (𝐵𝑖, 𝑖 = 1. . 𝑁)
start index for i=1 to N do
end for return B
Từ kết quả của thuật toán 2, chúng tôi xây dựng thuật toán để tích hợp các 𝐵𝑖, 𝑖 = 1. . 𝑁 từ các frame để có được một tập các vùng đầu của học sinh trong lớp tốt nhất, thuật toán 3.
Thuật toán 3: xác định một tập các vùng đầu của học sinh trong lớp. Input: 𝐵 = {𝐵𝑖/𝑖 = 1. . 𝑁} and d Output: 𝐵ℎ𝑒𝑎𝑑 𝐵ℎ𝑒𝑎𝑑 = 𝐵1 for i = 2 to N do for k = 1 to |𝐵𝑖| do if(!isElementOfSet( 𝐵ℎ𝑒𝑎𝑑, 𝐵𝑖[𝑘],d )) then 𝐵ℎ𝑒𝑎𝑑 = 𝐵ℎ𝑒𝑎𝑑∪ 𝐵𝑖[𝑘] endif endfor endfor return 𝐵ℎ𝑒𝑎𝑑
Thuật toán kiểm tra một phần tử có thuộc một tập hợp hay không dựa vào khoảng cách d dùng cho thuật toán 3. Mỗi phần tử là một hình chữ nhật. Tâm hai phần tử không xa nhau hơn khoảng cách d và giao hai hình chữ nhật này phải hơn α%.
Thuật toán kiểm tra (isElementOfSet(T,a, d))
Input: tập hợp T, phần tử a, khoảng cách d
for i = 1 to |𝑇| do
if(|𝑎. 𝑔𝑒𝑡𝐶𝑒𝑛𝑡𝑒𝑟() − 𝑇[𝑖]. 𝑔𝑒𝑡𝐶𝑒𝑛𝑡𝑒𝑟()| ≤ d) then ratio = 𝑎∩𝑇[𝑖]
𝑎∪𝑇[𝑖]
if(ratio > α) then value = true; endif
endif endfor