获取图片
鬼知道还会有这一步,老板跟我说所需要的信息全部在一步 iphone 手机的微信上,而且完全是在聊天记录里的,和其他的图片没有区分。我花了大半天找工具导出微信照片无果,最后还是老板花钱(约100RMB)购买了一个手机助手的会员版才最后导出来。
然而,这些图片分布在一个大文件夹(/tmp)下面的子文件夹里,用了一小段 shell 脚本把它们放到同一个文件夹下(/RealImage)。
#!/bin/bash
for file in 'tmp/*';
do
find $file -name "*.jpg" -exec cp {} RealImage \;
done
# 这个方法可以避免 /bin/cp: Argument list too long
# 直接 cp 可能会有上述问题
ls -l RealImage | grep "^-" | wc -l
至此,我获得了一个包含各种需要的和不需要的图片的文件夹。
剔除无关图片
趁着自己的 Google Cloud 还不用花钱,直接调用 Cloud Vision API 来帮我判断图片里是否含有电表。首先要建立一个客户段库:Google 文档。 之后,调用API代码如下:
// Imports the Google Cloud client library
const vision = require('@google-cloud/vision');
const fs = require("fs");
// Creates a client
const client = new vision.ImageAnnotatorClient();
const detect = async (n) => {
const fileName1 = 'AllPic';
const fileName2 = '.jpg';
client
.labelDetection(fileName1 + n + fileName2)
.then(results => {
const labels = results[0].labelAnnotations;
var find = false;
for (var i = 0; i < labels.length; i++) {
//我们这里看返回的标签类中的description里有没有包含 Electronics 或者 Electronic device 这两个标签,返回的labels的格式是Object。
if (labels[i].description == "Electronics" || labels[i].description == "Electronic device") {
find = true;
console.log(fileName1 + n + fileName2 + " Saved");
break;
}
}
if (find == false) {
fs.unlinkSync(fileName1 + n + fileName2);
console.log(fileName1 + n + fileName2 + " Deleted");
}
})
.catch(err => {
console.error('ERROR:', err);
});
}
// 这里之所以使用setTimeout是因为,Google Cloud Vision API 由每分钟调用次数的限制,不能太过频繁,所以就加个时间限制一下。
detect(1);
for (var i = 2; i < 9000; i++) {
(function (n) {
setTimeout(detect, (n) * 100, n);
})(i);
}
这个时候,一波剔除之后,竟然还有三千个,但是打开一看,质量参差不齐。最后还是交上了一个伙伴自己上手,把模糊的图片和不相干的图片手动删除了,对的就是这么不堪。
我们终于获得我们要处理的数据集了,在第二篇文章中会讲解通过 Google Vision API 把图片转换成文字,并且贴上标签的过程。