Thông qua hìnhảnh về khuôn mặt một người, chúng em đi ước tính chỉ số BMI của người đó thông quahồi quy tuyến tính sử dụng thư viện OpenCV lập trình ngôn ngữ C++... 1.2.2 Thư viện OpenCV
Trang 1VIỆN ĐIỆN TỬ - VIỄN THÔNG
BÁO CÁO BTL NNLT
Đề tài:
Ước lượng BMI của người dựa trên ảnh khuôn mặt Sinh viên thực hiện:
Giáo viên HD:
Cô Trần Thị Thanh Hải
Trang 2
LỜI NÓI ĐẦU
Ngày nay, khoa học công nghệ ngày càng phát triển, cùng với đó các cảm biến ảnh,
xử lí ảnh ngày càng trở nên đa dạng Việc sử dụng hình ảnh khuôn mặt không chỉ sửdụng trong xác thực, định danh mà còn có thể hướng đến các ứng dụng khác về sứckhỏe như xác định chỉ số BMI, ứng dụng vào y học Đề tài này chúng em chọn hướngđến ước lượng chỉ số BMI từ hình ảnh khuôn mặt thông qua việc xây dựng một mô hìnhhồi quy tuyến tính
Bài báo cáo được hoàn thành nhằm mục đích tìm hiểu, củng cố và trang bị cho bảnthân kiến thức về ngôn ngữ lập trình C++ với thư viện opencv Qua đó vận dụng nhữngkiến thức thu thập được để có thể vận dụng làm bài tập, ứng dụng vào dự án được đề ra.Xin chân thành cảm ơn cô Trần Thị Thanh Hải đã tạo môi trường giúp chúng em cóthể làm project này cũng như trang bị kiến thức, tài liệu cho chúng em!
Trang 3MỤC LỤC
LỜI NÓI ĐẦU 1
DANH MỤC HÌNH ẢNH 3
DANH MỤC KÝ HIỆU VÀ CHỮ VIẾT TẮT 4
Đóng góp của từng thành viên 5
CHƯƠNG 1 LÝ THUYẾT CHUNG 5
1.1 Chỉ số BMI 5
1.2 Môi trường lập trình 6
1.2.1 Ngôn ngữ lập trình C++ 6
1.2.2 Thư viện OpenCV 6
1.3 Xử lí cơ sở dữ liệu 6
1.3.1 Tính toán đặc trưng histogram RGB 7
1.3.2 Tính toán đặc trưng HOG 7
1.4 Thuật toán hồi qui đa tuyến tính (linear regression) 9
1.4.1 Hồi qui tuyến tính bằng đại số 10
1.4.2 Hồi qui đa tuyến tính bằng sử dụng Gradient desent 11
1.5 Đánh giá sai số ước lượng 12
CHƯƠNG 2 THỰC HÀNH 13
2.1 Các bước thưc hiện 13
2.1.1 Dữ liệu đầu vào 13
2.1.2 Đọc ảnh và dữ liệu 13
2.1.3 Tính toán một vector biểu diễn ảnh 14
2.1.4 Biểu diễn các dữ liệu ảnh như đã thu thập bằng vector đặc trưng biểu diễn 15
2.1.5 Cài đặt thuật toán hồi qui đa tuyến tính(Multiple linear regression) để tìm mô hình dự toán BMI của một khuôn mặt từ ảnh 15
2.1.6 Chương trình tính toán 16
2.1.7 Thực hiện đánh giá với tối thiểu 10 người mới không có trong CSDL đã thu, và đánh giá sai số ước lượng 17
2.2 Kết quả và nhận xét 18
KẾT LUẬN 19
PHỤ LỤC 20
Trang 4DANH MỤC HÌNH ẢNH
Hình 1 1 Chỉ số BMI 5
Hình 1 2 Môi trường lập trình 6
Hình 1 3 Ví dụ về histogram RGB 7
Hình 1 4 Đặc trưng HOG của ảnh 8
Hình 1 5 Sơ đồ tính toán HOG 8
Hình 1 6 Vote hướng vào cell 9
Hình 1 7 Ước tính cân nặng dựa vào chiều cao 10
Hình 1 8 Hàm mất mát phụ thuộc vào số lần lặp lại 12
Hình 2 2 Kết quả ước lượng 18
Trang 5DANH MỤC KÝ HIỆU VÀ CHỮ VIẾT TẮT
Trang 6Đóng góp của từng thành viên
Để phát huy ưu thế của từng thành viên đồng thời để các thành viên đều hiểu được chươngtrình, phát huy tối đa lợi thế làm việc nhóm, chúng em có bảng phân chia nhiệm vụ như sau:
Mai Thị Quỳnh Anh Chuẩn bị CSDL, code, Làm báo cáo Cả nhóm
Hoàng Mai Phương Chuẩn bị CSDL, code, Làm báo cáo Cả nhóm
Đinh Thị Quỳnh Chuẩn bị CSDL, code, Làm Slide Cả nhóm
Lại Thị Huyền Thương Chuẩn bị CSDL, code, Làm Slide Cả nhóm
CHƯƠNG 1 LÝ THUYẾT CHUNG
1.1 Chỉ số BMI
BMI (Body mass Index) là chỉ số được tính từ chiều cao và cân nặng, là một chỉ số đángtin cậy về sự mập ốm của một người BMI không đo lường trực tiếp mỡ của cơ thể nhưngcác nghiên cứu đã chứng minh rằng BMI tương quan với đo mỡ trực tiếp như ở Hình 1 1Chỉ số BMI BMI là phương pháp không tốn kém và dễ thực hiện để tầm soát vấn đề sứckhoẻ Tính chỉ số BMI là một phương pháp tốt nhất để đánh giá thừa cân và béo phì chomột quần thể dân chúng Để tính chỉ số BMI, người ta chỉ yêu cầu đo chiều cao và cânnặng, không tốn kém và dễ thực hiện Sử dụng chỉ số BMI cho phép người ta so sánh tìnhtrạng cân nặng của họ với quần thể nói chung
Và như đề án project này thì cũng đã thể hiện được mục đích của nó Thông qua hìnhảnh về khuôn mặt một người, chúng em đi ước tính chỉ số BMI của người đó thông quahồi quy tuyến tính sử dụng thư viện OpenCV lập trình ngôn ngữ C++
Trang 7Hình 1 1 Chỉ số BMI 1.2 Môi trường lập trình
1.2.1 Ngôn ngữ lập trình C++
C++ là một loại ngôn ngữ lập trình bậc trung (middle-level) Đây là ngôn ngữ lậptrình đa năng được tạo ra bởi Bjarne Stroustrup như một phần mở rộng của ngôn ngữlập trình C, hoặc "C với các lớp Class", Ngôn ngữ đã được mở rộng đáng kể theo thờigian và C ++ hiện đại có các tính năng: lập trình tổng quát, lập trình hướng đối tượng,lập trình thủ tục, ngôn ngữ đa mẫu hình tự do có kiểu tĩnh, dữ liệu trừu tượng, và lậptrình đa hình, ngoài ra còn có thêm các tính năng, công cụ để thao tác với bộ nhớ cấpthấp
1.2.2 Thư viện OpenCV
OpenCV được thiết kế một cách tối ưu, sử dụng tối đa sức mạnh của các dòng chip
đa lõi… để thực hiện các phép tính toán trong thời gian thực, nghĩa là tốc độ đáp ứngcủa nó có thể đủ nhanh cho các ứng dụng thông thường OpenCV là thư viện được thiết
kế để chạy trên nhiều nền tảng khác nhau (cross-patform), nghĩa là nó có thể chạy trên
hệ điều hành Window, Linux, Mac, iOS … Việc sử dụng thư viện OpenCV tuân theocác quy định về sử dụng phần mềm mã nguồn mở BSD do đó bạn có thể sử dụng thưviện này một cách miễn phí cho cả mục đích phi thương mại lẫn thương mại
Việc chọn môi trường lập trình ảnh hưởng rất nhiều đến quá trình làm, thực hiện dự
án, và từ những mặt lợi ích đã nêu thì chúng em đã dùng ngôn ngữ C++ với thư việnOpencv trên Visual Studio (Hình 1 2 Môi trường lập trình)
Trang 8Hình 1 2 Môi trường lập trình 1.3 Xử lí cơ sở dữ liệu
Để thực hiện đề án này thì trước tiên ta phải xử lí ảnh Trước tiên ta phải đọc ảnh,
từ dữ liệu ảnh đầu vào là ảnh ta thu được 1 ma trận Mat của ảnh đó Trong OpenCVvới giao diện C++, tất cả các kiểu dữ liệu ảnh, ma trận đều được lưu dưới dạngcv::Mat Hàm imread sẽ đọc ảnh đầu vào và lưu vào biến
Sau đó, ta tính toán ra vector đặc trưng của ảnh để ước tính BMI Bằng cách sửdụng các phương pháp rút trích đặc trưng ảnh ta sẽ thu được vector đặc trưng của ảnh.Nói một cách khác đó chính là bạn mã hóa hình ảnh thành một vector, và vector nàymang những đặc trưng (các số thực) đại diện cho ảnh đó Một vector biểu diễn ảnh cóthể tính toán đặc trưng histogram RGB của ảnh, histogram of gradient (HOG), đặc trưngsift và có thể sử dụng các hàm của OpenCV Trước tiên chúng ta đi tìm hiểu về một sốtính toán để ra vector dặc trưng
1.3.1 Tính toán đặc trưng histogram RGB
Histogram được gọi là biểu đồ sắc độ Biểu đồ sắc độ là đồ thị thể hiện thông tin độsáng của điểm ảnh (Pixel) tạo nên bức ảnh Đặc trưng histogram RGB của ảnh chính làbiểu đồ về sự phân bố màu “Đỏ, xanh lá, xanh da trời” của ảnh đó Và khi thực hiệnchương trình tính toán đặc trung này, ảnh được biểu diễn về một vector
Trang 9Hình 1 3 Ví dụ về histogram RGB
Từ một ảnh đầu vào ta thu được biểu đồ thể hiện màu ảnh như ở Hình 1 3 Ví dụ vềhistogram RGBNhưng do đây là biểu đồ về màu ảnh nên khi chụp ở độ sáng, phông nềnkhác nhau cũng ảnh hưởng khá nhiều đến kết uqar thu được và khi ước tính có thể sẽ sai
số lớn Vì vậy nhóm chúng em sẽ thực hiện biểu diễn vector đặc trưng của ảnh dựa vàoHOG
1.3.2 Tính toán đặc trưng HOG
Pháp rút trích đặc trưng hình ảnh HOG xuất bản ở hội nghị CVPR 2005 được đề xuấtbởi tác giả là Dalal và Triggs HOG là viết tắt của Histogram of Oriented Gradient - mộtloại “feature descriptor” Mục đích của “featura descriptor” là trừu tượng hóa đối tượngbằng cách trích xuất ra những đặc trưng của đối tượng đó và bỏ đi những thông tinkhông hữu ích Vì vậy, HOG được sử dụng chủ yếu để mô tả hình dạng và sự xuất hiệncủa một đối tượng trong ảnh
Bản chất của phương pháp HOG là sử dụng thông tin về sự phân bố của các cường
độ gradient (intensity gradient) hoặc của hướng biên (edge directins) để mô tả các đốitượng cục bộ trong ảnh Các toán tử HOG được cài đặt bằng cách chia nhỏ một bức ảnhthành các vùng con, được gọi là “tế bào” (cells) và với mỗi cell, ta sẽ tính toán mộthistogram về các hướng của gradients cho các điểm nằm trong cell Ghép các histogramlại với nhau ta sẽ có một biểu diễn cho bức ảnh ban đầu Để tăng cường hiệu năng nhậndạng, các histogram cục bộ có thể được chuẩn hóa về độ tương phản bằng cách tính mộtngưỡng cường độ trong một vùng lớn hơn cell, gọi là các khối (blocks) và sử dụng giátrị ngưỡng đó để chuẩn hóa tất cả các cell trong khối Kết quả sau bước chuẩn hóa sẽ làmột vector đặc trưng có tính bất biến cao hơn đối với các thay đổi về điều kiện ánh sángnhư trong Hình 1 4 Đặc trưng HOG của ảnh
Trang 10Hình 1 4 Đặc trưng HOG của ảnh
Với mỗi hình ảnh đầu vào kích thước 64x128, chia thành các block 16x16 chồngnhau, sẽ có 7 block ngang và 15 block dọc, nên sẽ có 7x15 = 105 blocks Mỗi blockgồm 4 cell Khi áp dụng biểu đồ 9-bin cho mỗi cell, mỗi block sẽ được đại diện bởi mộtvector có kích thước 36x1 Vì vậy, khi nối tất cả các vector trong một block lại vớinhau, ta sẽ thu được vector đặc trưng HOG của ảnh có kích thước 105x36x1 = 3780x1
Hình 1 5 Sơ đồ tính toán HOG
Theo như sơ đồ tính toán HOG (Hình 1 5 Sơ đồ tính toán HOG) ta gồm các bước làmsau:
Chuẩn hóa mức sáng và màu sắc của ảnh: việc dùng ảnh màu và các chuẩn hóa trên ảnhcho kết quả tốt hơn
Tính gradient của ảnh
Vote hướng vào cell (histogram): Ở bước 2, ta đã tính được ảnh gradient theo trục x (dx)
và gradient theo trục y (dy) Và ta tính góc và biên độ tương ứng của từng pixel đangxét như Hình 1 6 Vote hướng vào cell
Trang 11Hình 1 6 Vote hướng vào cell
Chuẩn hóa theo block: Vì hiện tại mỗi cell đang mang trong mình histogram trên vùngảnh 8x8, các thông tin này mang tính chất cục bộ Vì vậy tác giả đã đưa ra nhiều cáchchuẩn hóa khác nhau dựa trên các khối (block) chồng lấn (overlap) nhau
Trích vector đặc trưng của các block đã chuẩn hóa cho ảnh 64x128
Sau khi đã tính toán vector đặc trưng của ảnh, ta biểu diễn vector này cho từng ảnhtrong cơ sở dữ liệu tương ứng với các chỉ số BMI của nó, một CSDL sẽ có 1 vector đặctrung và 1 chỉ số BMI tương ứng
1.4 Thuật toán hồi qui đa tuyến tính (linear regression)
Để có thể liên hệ giữa ảnh (mặt người cần xác định BMI) và BMI ta sử dụng thuậttoán hồi qui đa tuyến tính (linear regression), đây là một thuật toán Supervised learning.Mục tiêu của giải thuật hồi quy tuyến tính là dự đoán giá trị của một hoặc nhiềubiến mục tiêu liên tục (continuous target variable) y dựa trên một ma trận đầu vào matrận x Linear hay tuyến tính hiểu một cách đơn giản là thẳng, phẳng Trong không gianhai chiều, một hàm số được gọi là tuyến tính nếu đồ thị của nó có dạng một đườngthẳng Trong không gian ba chiều, một hàm số được goi là tuyến tính nếu đồ thị của nó
có dạng một mặt phẳng Trong không gian nhiều hơn 3 chiều, khái niệm mặt phẳngkhông còn phù hợp nữa, thay vào đó, một khái niệm khác ra đời được gọi là siêu mặtphẳng (hyperplane)
1.4.1 Hồi qui tuyến tính bằng đại số
Về cơ bản thì ta sẽ có một tập huấn luyện chứa các cặp (X(i), Y(i)) tương ứng vànhiệm vụ của ta là phải tìm giá trị ŷ tương ứng với một đầu vào x mới Để làm điều này
ta cần tìm được quan hệ giữa x và y để từ đó đưa ra được dự đoán Hay nói cách trừutượng hơn là ta cần vẽ được một đường quan hệ thể hiện mối quan hệ trong tập dữ liệu
Y = Xω = ŷ (1 1)
Trang 12và ŷ là hai giá trị khác nhau do có sai số mô hình, tuy nhiên, chúng ta mong muốn rằng
sự khác nhau này rất nhỏ Chúng ta cần đi xác định hệ số ω
Hình 1 7 Ước tính cân nặng dựa vào chiều cao
Ví dụ khi ta ước tính cân nặng dựa vào chiều cao như trên Hình 1 7 Ước tính cânnặng dựa vào chiều caoCác chấm đỏ là dữ liệu đầu vào (cơ sở dữu liêu) gồm chiều cao
và cân nặng, đường màu xạnh chính là đường sau khi ước tính, tính được ω và biễn diễn
y = ω.x, ta thấy các chấm đỏ gần với các đường xanh vậy là kết quả của việc ước tínhkhá sát với thực
Với dữ liệu vào ma trận X (vector biểu diễn ảnh) và ma trận Y (chỉ số BMI) ta sẽtính được ma trận β
ω = Y.X-1 (1 2)
Như công thức = Y.X-1 (1 2) thì sẽ tính được ma trận βdựa vào ma trận nghịch đảo của X và Y Nhưng khi det(X)=0 thì việc tính này khôngkhả thi, và ta sẽ có công thức nghiệm:
ω = (XT X) -1 X T Y (1 3)
Trang 13Nhưng điều gì xảy ra nếu (XT.X) không thể đảo ngược (số ít hoặc suy biến) Đến đây,
vì để xác định một cách chính xác, nhóm chúng em sử dụng một phương pháp khác đểxác định các hệ số mà không phải tính nghịch đảo ma trận Đó là phương pháp sử dụngGradient desent
1.4.2 Hồi qui đa tuyến tính bằng sử dụng Gradient desent
Giả thuyết hàm đa tuyến tính n biến có dạng:
ŷ=ω0+ω1x1+ω2x2+ ….+ω n x n
hay ŷ=x ω với : x = [1 ; x1; x2; … ;x n] , w =[w0;w1;w2; ;w n]T
1.4.2.1 Hàm mất mát
Hàm mất mát của thuật toán có dạng: (trong đó: m là số lượng giá trị đúng )
Nhiệm vụ của chúng ta là tìm vector w sao cho hàm mất mát J(w) nhỏ nhất Giờ cầnmột thuật toán để tìm giá trị nhỏ nhất của hàm J Đó chính là gradient descent
1.4.2.2 Thuật toán Gradient descent
Dựa vào đạo hàm theo từng biến của hàm mất mát, ta sẽ xác định w i =w i −α ∂ J(ω)
Trang 14Với các giá trị w tìm được, chúng ta tính giá trị hàm mất mát Lặp lại điều này đếnkhi hàm mất mát đủ nhỏ, từ đó chúng ta xác định được ma trận w và hàm ŷ=x ω.
Việc số lần lặp lại ảnh hưởng đến giá trị hàm mất mát rất nhiều, lặp lại cang nhiều thì
độ chính xác càng cao (Hình 1 8 Hàm mất mát phụ thuộc vào số lần lặp lại ), nhưnglặp lại nhiều ảnh hưởng tới tốc dộ xử lí của chương trình cũng như bộ nhớ khi thực hiệnchương trình
Hình 1 8 Hàm mất mát phụ thuộc vào số lần lặp lại
Hình 1 8 Hàm mất mát phụ thuộc vào số lần lặp lại ta thấy, số lần lặp lại từ 0 – 1000
có sự thay đổi rất lớn đến hàm mất mát, độ chính xác cao hơn và càng tăng số lần lặp thìhàm mất mát càng gần với 0
1.5 Đánh giá sai số ước lượng
Như đã trình bày ở trên thì việc ước lượng như vậy vẫn còn sai số, nên phải xác địnhđược sai số của phép ước lượng này Ta sẽ có đầu vào là ma trận X và ma trận ω tínhđược ở trên và sẽ thu được y (chỉ số BMI thực thế) cần tính rồi so sánh với giá trị ŷ (chỉ
số BMI ước lượng)
Chúng ta mong muốn rằng sự sai khác e giữa giá trị thực y và ŷgiá trị dự đoán là nhỏnhất Nói cách khác, chúng ta muốn giá trị sau đây càng nhỏ càng tốt:
Trang 15Sau khi tính được sai số của bài toán, ta sẽ tiến hành đánh giá về độ chính xác khiước lượng BMI thông qua khuôn mặt dựa vào chỉ số sai số.
CHƯƠNG 2 THỰC HÀNH
Sau khi tìm hiểu qua về lý thuyết chung, chúng ta sẽ thự hành tìm hiểu về đề tài này
2.1 Các bước thưc hiện
2.1.1 Dữ liệu đầu vào
Để tính chính xác cao hơn thì dữ liệu đầu vào gồm 20 người, mỗi người 7 ảnh: Ảnh
có độ phân giải (640x480) 3 kênh màu được chụp theo các góc như sau: -60o, -30o, 0o,30o, 60o theo phương ngang và 2 ảnh ngẩng và cúi một góc khoảng 30o theo phươngthẳng đứng Số lượng ảnh: 20x7 = 140 ảnh, tương ứng với chiều cao và cân nặng củangười đó Trong đó, mỗi người được đánh số bởi mã số, họ tên, và được lưu một số ảnhkhuôn mặt được chụp theo các góc nhìn khác nhau Dữ liệu được lưu vào trong một thưmục, thư mục này chứa các thư mục con, mỗi thư mục con có tên là tên của người,trong đó có chứa các file ảnh khuôn mặt của người đó Để thuận tiện cho việc tính toánthì chúng em xử lí chỉ số BMI = cân nặng/(chiều cao * chiều cao)
2.1.2 Đọc ảnh và dữ liệu
Sử dụng hàm ‘imread()’ trong thư viện OpenCV để thực hiện đọc 1 ảnh Để thuậntiện tính toán, chúng em lưu các thư mục chứa ảnh và các tệp chứa dữ liệu chỉ số BMItương ứng vào các thư mục riêng biệt
// Doc tat ca cac anh
// Dau vao có noi luu cac anh sau doc (img)
// Dia chi Folder de doc anh
vector < Mat > readImgs( vector < Mat > img , string src_path )
{
vector <cv:: String > fileNames;
glob( src_path , fileNames, true );
//luu duong dan toi file vao fileNames
for ( auto file : fileNames
{
img push_back(imread(file)); //Lưu ảnh đã đọc vào một vector
}
return img ;