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 1BÁ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:
Hoàng Mai Phương
Lại Thị Huyền Thương
Mai Thị Quỳnh Anh Đinh Thị Quỳnh
20193060 20193128 20192685 20193073 Giáo viên HD:
Cô Trần Thị Thanh Hải
Trang 2LỜ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 3CHƯƠ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 4TÀI LIỆU THAM KHẢO 20
DANH 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 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ương trì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:
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ốđáng tin 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ưng cá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 1 Chỉ số BMI BMI là phương pháp không tốn kém và dễ thực hiện để tầm soátvấn đề sức khoẻ 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ì cho một quần thể dân chúng Để tính chỉ số BMI, người ta chỉ yêu cầu đo chiềucao và cân nặ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ình trạ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), đặctrưng sift 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 đang xé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ách chuẩ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 =ŷ
ω
Trang 12Trong đó:
[y1] [1 … x nk ] [ω1
và ŷ 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 β
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:
Trang 14Nhưng điều gì xảy ra nếu (X 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ápkhá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ụng Gradient 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 +ω1 x1+ ω2 x2 + ….+ω 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ần mộ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
Trang 15chươ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 16Sau 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
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 a *nh đã đọc vào một vector
Trang 17của các ảnh trong cùng một thư mục con.
vector < > get_Y( string src_path , vector < > get_Y , int inter ) {
int i = 0;
string pattern = "*.txt" ; // Dinh dang file can doc
vector <cv:: String > fileNames; // Vector luu dia chi cac file BMI se doc
glob( src_path + pattern, fileNames, true ); // Doc tat ca cac
for ( auto file : fileNames)
{
cout << file << endl;
double value;
fstream getfile(file); //Mở * file txt
getfile >> value; //Lưu giá trị đọc được vào biếC n value
if ( repeat != 0) {
for ( int j = 0; j < inter ; j++) {