鬼知道還會有這一步,老闆跟我說所須要的信息所有在一步 iphone 手機的微信上,並且徹底是在聊天記錄裏的,和其餘的圖片沒有區分。我花了大半天找工具導出微信照片無果,最後仍是老闆花錢(約100RMB)購買了一個手機助手的會員版才最後導出來。shell
然而,這些圖片分佈在一個大文件夾(/tmp)下面的子文件夾裏,用了一小段 shell 腳本把它們放到同一個文件夾下(/RealImage)。bash
#!/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代碼以下:iphone
// 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);
}
複製代碼
這個時候,一波剔除以後,居然還有三千個,可是打開一看,質量良莠不齊。最後仍是交上了一個夥伴本身上手,把模糊的圖片和不相干的圖片手動刪除了,對的就是這麼不堪。async
咱們終於得到咱們要處理的數據集了,在第二篇文章中會講解經過 Google Vision API 把圖片轉換成文字,而且貼上標籤的過程。工具