由于一门课程作业主题与脸部数据识别有关,在GitHub上找到了一个开源代码库face-api.js(https://github.com/justadudewhohacks/face-api.js),想要识别在Instagram上抓取所图片的脸部数据,其过程如下:
1. 读取所有图片路径
在node.js中读取folders中的文件,可以用fs.readFile,假设我所有的图片都放在test这个文件夹下面,其方法如下:
const fs = require('fs')
const path = require('path')
const folderPath = '../images/test'
const readFileDir = fs.readdirSync(folderPath).map((fileName: any) => {
const fullPath = path.join(folderPath, fileName)
return fullPath
})
这个时候,console.log(readFileDir)就可以看到…/images/test路径下的所有文件,typeof readFileDir[0]是string
2. 读取所有脸部表情数据:
for (let i = 0; i < readFileDir.length; i++) {
const img = await canvas.loadImage(`${readFileDir[i]}`)
const results = await faceapi.detectAllFaces(img, faceDetectionOptions)
.withFaceExpressions()
results.forEach(el => {
console.log(el.expressions)
}}
}
写到这里的时候遇到一个问题,有同学会想,为什么不能直接在readFileDir这个变量代表的function里,比如我刚开始的时候就是这么写的:
readFileTest.forEach(el => {
const img = await canvas.loadImage('el')
const results = await faceapi.detectAllFaces(img, faceDetectionOptions)
.withFaceExpressions();
results.forEach(el => {
console.log(el.expressions)
})
这时候会报错:
'await' expressions are only allowed within async functions and at the
top levels of modules.
所以本人改用for循环,stackoverlfow上提供了另一个解决方案:
Your main function is async but you’re using await in an arrow function which isn’t declared as async