正式处理:使用 Google API 从一个图片中读取特定号码段(一)

657 阅读2分钟

获取图片

鬼知道还会有这一步,老板跟我说所需要的信息全部在一步 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 把图片转换成文字,并且贴上标签的过程。