Toàn bộ series Nhận diện Idol:
- Phần 1 – Chuyện ngày xưa – về sự ra đời của Nhận Diện Idol
- Phần 2 – Kiến trúc và các công nghệ sử dụng
- Phần 3 – Nào mình cùng đi cào dữ liệu
- Phần 4 – Nhận diện khuôn mặt với Microsoft Cognitive Service
- Phần 5 – Testing thuật toán – Sự thật về độ chính xác 60-80%
- Phần 6 – Từ demo tới deploy – Vô Thai Kiếm (Serverless Architecture)
Sau phần 4.1, hẳn các bạn cũng đã hiểu cơ chế hoạt động của một hệ thống nhận diện khuôn mặt. Trong phần này, chúng ta sẽ sử dụng dữ liêu khuôn mặt đã có của 12 VAV Idol để huấn luyện cho máy (Được ngắm gái xinh chắc nó mừng lắm). Bắt đầu nào!
Hướng dẫn đăng kí FaceAPI
Ở phần 3, mình đã hướng dẫn các bạn đăng kí account Microsoft Cognitive API. Để đăng kí FaceAPI, các bạn đăng nhập, sau đó vào link này: https://www.microsoft.com/cognitive-services/en-us/face-api.
Bấm Get Started for Free, kéo xuống bấm Subscribe để đăng kí tương tự phần 3:
Tiếp theo, vào đây để kiểm tra, nếu thấy Face – Preview là ok: https://www.microsoft.com/cognitive-services/en-US/subscriptions. Nhớ bấm Copy để copy key và lưu vào chỗ nào nhé, sau này còn dùng.
Face API cho phép sử dụng 30000 lần mỗi tháng, tối đa 20 lần mỗi phút, đủ để bạn nghịch ngợm rồi. Nếu muốn phát triển hệ thống lớn các bạn có thể mua bản trả phí trên Azure (1000 call/ 1USD).
Giới thiệu sơ về FaceAPI
Các bạn có thể đọc qua document của API này ở đây: https://www.microsoft.com/cognitive-services/en-us/face-api/documentation/overview. Document khá ngắn, đọc 10 phút là xong.
Đây là một số khái niệm mà mình nghĩ bạn cần biết rõ trước khi sử dụng API:
- Face: Mỗi khuôn mặt được lưu trên server là 1 face
- Person: Mỗi người được lưu trên server là 1 person. 1 người có thể có nhiều khuôn mặt.
- Person Group: Một Person Group là một nhóm người bao gồm nhiều người.

API có khá nhiều method, nhưng ta chỉ cần chú ý một số method sau đây:
Person Group
Person
- Create: Tạo mới Person với tên và info
- Add Person Face: Thêm 1 ảnh khuôn mặt (face) cho person này
- List Persons: Hiển thị toàn bộ Person trong 1 Person Group
Face
- Detect: Phát hiện khuôn mặt trong ảnh, tương đương với phase Face Detection đã nói ở bài trước.
- Identity: Đầu vào là id của khuôn mặt và id của Person Group. Đầu ra là id của Person giống nhất. Tương đương với phase Face Recognition ở bài trước.
Viết code để huấn luyện cho máy
Ta sẽ phối hợp Postman và code để làm 4 bước sau (Xem lại hướng dẫn dùng postman nhé):
- Tạo 1 Person Group với id là vav-idols (Create Person Group)
- Tạo 12 Person, mỗi person tương ứng với 1 idol. Ta submit ảnh của mỗi idol lên để máy học (Create Person, Add Person Face)
- Gọi method Train của API (Train Person Group)
- Lấy id của các idol trên server về và lưu lại (List Person)
Bước 1, 3, 4 chỉ cần chạy một lần nên ta dùng Postman cho nhanh, đỡ phải viết code. Phần này hơi dài đấy nhé, nhớ kiên nhẫn.
Bắt đầu thôi nào!
1. Tạo Person Group với id là vav-idols
Các bạn mở Postman lên, dán link này vào: https://api.projectoxford.ai/face/v1.0/persongroups/vav-idols, chọn method là PUT, qua mục headers và body chọn param như trong ảnh nhé. (Trong headers, key là Ocp-Apim-Subscription-Key, value là key Microsoft của bạn).
2. Viết code để submit idol
Với mỗi idol, ta tạo 1 person trên hệ thống, userdata là sẽ id hiện tại của idol trong file filtered-idols.json. Ta dựa vào userdata để biết person đó là idol nào.
Sau khi tạo person, mỗi idol ta giữ lại 4 ảnh đầu và submit hết để huấn luyện. Lý do là 4 ảnh đầu sẽ được dùng để test độ chính xác của hệ thống.
Ở bản gốc do nhiều dữ liệu nên mình code bằng C#, giờ chúng ta dùng NodeJS để code ngắn và dễ hiểu hơn. (Đừng hỏi tại sao ngôn ngữ gì mình cũng biết ahihi, code dạo mà). Lưu ý là một số ảnh có thể không nhận diện được, do đó khi code ta cần để ý dùng try/catch.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Sử dụng thư viện | |
var request = require('sync-request'); | |
// Lấy danh sách idol từ file filtered-idols.json | |
var idols = require('./filtered-idols.json'); | |
let key = '91bc85*******'; // Thay thế bằng key của bạn | |
let groupId = 'vav-idols'; | |
// NodeJS không có thread.sleep nên ra dùng tạm function này | |
function sleep(time) { | |
console.log('Begin Sleep'); | |
var stop = new Date().getTime(); | |
while(new Date().getTime() < stop + time) { | |
; | |
} | |
console.log('End Sleep'); | |
} | |
// Tạo idol trên hệ thống | |
function submitIdol(idol) { | |
let url = `https://api.projectoxford.ai/face/v1.0/persongroups/${groupId}/persons`; | |
console.log(`Begin submit idol: ${idol.id} – ${idol.name}`); | |
var res = request('POST', url, { | |
headers: { | |
'Ocp-Apim-Subscription-Key': key | |
}, | |
json: { | |
name: idol.name, | |
userData: idol.id | |
} | |
}); | |
if (res.statusCode == 200) { | |
var person = JSON.parse(res.getBody('utf8')); | |
console.log(`SUCCESS – Submit idol ${idol.id} – ${idol.name}. Person ID: ${person.personId}`); | |
// Bỏ 4 ảnh đầu | |
for (let i = 4; i < idol.images.length; i++) { | |
// Submit ảnh của idol lên hệ thống | |
try { | |
submitIdolFace(person.personId, idol.images[i].image); | |
sleep(4*1000); // Sleep 4 giây vì limit 20 call/phút | |
} catch (err) { | |
console.log('ERROR'); | |
console.log(err); | |
} | |
} | |
} else { | |
console.log(res.getBody('utf8')); | |
} | |
} | |
// Submit ảnh của idol lên hệ thống | |
function submitIdolFace(personId, faceUrl) { | |
console.log(`Begin submit image ${faceUrl.substring(20,60)} for person id ${personId}`); | |
let url = `https://api.projectoxford.ai/face/v1.0/persongroups/${groupId}/persons/${personId}/persistedFaces`; | |
var res = request('POST', url, { | |
headers: { | |
'Ocp-Apim-Subscription-Key': key | |
}, | |
json: { | |
url: faceUrl | |
} | |
}); | |
if (res.statusCode == 200) { | |
console.log(`SUCCESS – Submit image ${faceUrl.substring(20,60)} for person id ${personId}.`); | |
} | |
} | |
for (let idol of idols) { | |
submitIdol(idol); | |
} |
Để chạy code, các bạn làm theo các bước sau:
- Vào đây tải NodeJS: https://nodejs.org/en/download/
- Sau khi cài đặt, vào trang này, bấm Clone or Download để tải project của mình về: https://github.com/ToiDiCodeDaoSampleCode/idol-submit
- Mở cửa số cmd và cd vào thư mục đã giải nén, gõ “npm install” để tải thư viện.
- Copy file filtered-idols.json của bạn bỏ vào thư mục này
- Mở file index.js lên thay thế key ở dòng số 8 thành key của bạn rồi save lại.
- Từ cửa sổ cmd, gõ “node index.js” để chạy code.
- Code chạy khá lâu, khoảng 20-25 phút tùy vào tốc độ mạng. Các bạn cứ xem log trên console là thấy.
3. Gọi API để train
Mở Postman và gọi method POST tới https://api.projectoxford.ai/face/v1.0/persongroups/vav-idols/train. Nhớ bỏ kèm key trong header nhé. Việc train chỉ mất khoảng 2,3 giây thôi.
4. Lấy toàn person trong group vav-idols
Tiếp tục gọi method GET tới link: https://api.projectoxford.ai/face/v1.0/persongroups/vav-idols/persons để lấy danh sách person trong group, đừng quên key trong headers nhé.
Bạn sẽ thấy kết quả trả về là 1 danh sách các idol, mỗi idol có 1 vài face. Hãy copy và lưu kết quả này vào 1 file, đặt tên là idol-person.json khác nhé, sẽ dùng tới trong phần sau đấy.
Kết
Chúc mừng bạn đã hoàn thành phần 4.2, đây là phần dài và gian khổ nhất trong series. Sau khi hoàn thành phần này, API của các bạn đã được nạp dữ liệu và train xong. Nhớ cất kĩ 2 file filtered-idols.json và idol-person.json để còn sử dụng ở phần sau.
Bây giờ, bạn có thể bắt đầu dùng API để nhận diện ảnh của 12 VAV Idol nổi tiếng như: Ngọc Tờ Rinh, Hường Hana, Vàng Anh, … Ở phần sau, mình sẽ hướng dẫn các bạn cách dùng API, cũng như test thử độ chính xác của nó nhé.
Cảm ơn anh Hoàng, rất dễ hiểu :). Hy vọng có 1 bài viết về các công nghệ web mà anh áp dụng. e.g: Web dùng gì để code? Host ở đâu & paging recent search như thế nào,..
LikeLike
Phần cuối sẽ có em nhé 😉
LikeLike
Lỗi này là sao vậy anh?
http://www.upsieutoc.com/image/YVq8Xw
LikeLike
Anh làm phiền em hỏi khi chạy dòng lệnh node index.js thì bị lỗi “Server responded with status code 401”
LikeLike
Chắc là để sai token đó em.
LikeLike
Token là key face api phải không anh? Anh có thể giải thích giúp em?
LikeLike
Ừm nó đó em. Xem có lấy đúng token trên trang của Microsoft ko nhé 😉
LikeLike
Cám ơn anh đã phản hồi.
LikeLike
Anh có thể giải thích giúp em không ạ?
LikeLike
Anh file filtered-idols.json có lỗi không? Em chạy chưa được.
LikeLike
Anh ơi em đang bí submit idol. Anh giúp em với ạ.
LikeLike
Em làm kĩ theo hướng dẫn là đc thôi e. Có vấn đề gì thì xem lại phần trc nữa nhé 😉
LikeLike
Cứ báo lỗi Error: Server responded with status code 401.
“Access denied due to invalid subscription key. Make sure you are subscribed to an API you are trying to call and provide the right key.” Nhưng em đã chèn key của Microsoft rồi, không biết nó bị lỗi ở đâu? Mong anh có thể gợi ý giúp em ạ. Em đã xem kỹ các phần trước rồi vẫn không được?
LikeLike
Face API có bị sao không anh? Access denied due to invalid subscription key.
LikeLike
Nó báo vậy là em điền key bị sai đó em.
LikeLike
E chào anh. Em đã làm giống a hướng dẫn khi sử dụng postman creat Person group, dán key vào nhưng nó cứ hiện lỗi 401 . EM chắc chắn là key đúng và đã test trên link của microsoft, nhưng khi đưa key vào link https://api.projectoxford.ai/face/v1.0/persongroups/vav-idols thì nó lại hiện lỗi 401
LikeLike
Em check lại endpoint xem nhé. Hình như gần đây nó đổi url endpoint thì phải
LikeLike
em check rồi mà nó vẫn vậy. KO biết có check đúng hem 😀 . Anh chỉ em với
LikeLike
Microsoft đã rút ngắn thời gian dùng thử xuống chỉ còn 7 ngày. Sau khi hết 7 ngày e có tiếp tục đky dùng thử được nữa không hay phải mua để dùng tiếp?
LikeLike
A ơi a có bài hướng dẫn sử dụng c# không?
LikeLike