使用 ADB 和 Node.js 訓練抖音模型——尋找好看的小姐姐

_忽如寄發表於2019-07-14

自己刷抖音時訓練的模型不行呀,推薦給我的都是一些沙雕視訊,都是摳腳大漢,很少漂亮的小姐姐,但是自己刷抖音訓練的話又太耗時間了,剛看看了 ADB ,發現這個簡直就是寶庫,想著就要不就使用 ADB 來幫我訓練一下,省的我手動訓練了。

使用 ADB 和 Node.js 訓練抖音模型——尋找好看的小姐姐

關於 ADB,可以看我之前的文章,ADB 實用筆記

首先使用 Node.js 封裝下 ADB 的命令,為了相容連線多臺裝置的問題,可以使用一個標誌位,同時每次使用的時候使用 use 方法來指定對應的裝置,call 方法作為所有呼叫命令的基礎方法:

const { exec } = require('child_process')
const path = require('path')

let currentDeviceName = ''
let isVerbose = false

const call = (code) => {
  return new Promise((resolve, reject) => {
    const command = `adb ${currentDeviceName ? `-s ${currentDeviceName}` : ''} ${code}`

    if (isVerbose) console.log(command, '\n')

    exec(command, (err, stdout, stderr) => {
      if (err) reject(new Error(err + ''))
      resolve(stdout)
    })
  })
}

const use = (device) => currentDeviceName = device.name
const verbose = (value) => isVerbose = value
複製程式碼

新增對應的裝置查詢方法,並通過解析字串的形式來將裝置儲存為陣列:

const rawDevices = () => call('devices')

const devices = async () => {
  return (await rawDevices())
    .split(/\n/)
    .map(line => line.split('\t'))
    .filter(line => line.length > 1)
    .map(device => ({ name: device[0].trim(), status: device[1].trim() }))
}
複製程式碼

現在完成了 ADB 查詢裝置的基本操作。那麼問題就是怎麼識別抖音的視訊裡有好看的小姐姐呢?

我想的就是通過人臉識別的 API 來判斷,可以通過 ADB 來截圖,然後呼叫相應的 AI 介面判斷截圖中人的顏值和性別,然後再決定是否關注和點贊該視訊,然後上滑切換到下一個視訊,如此反覆。

整理一下,需要封裝的 ADB 命令就是點選命令、滑動和截圖命令:

const touch = (x, y) => call(`shell input tap ${x} ${y}`)

const swipe = (x1, y1, x2, y2, ms = 200) => call(`shell input swipe ${x1} ${y1} ${x2} ${y2} ${ms} `)

const screenshot = (filename = 's.png', localSavePath = './') => call(`shell screencap -p > ${path.resolve(localSavePath, filename)}`)

複製程式碼

接著就是看看市場上的 AI 介面了,我選擇的是 Face++ 的介面,www.faceplusplus.com.cn/face-detect…:

使用 ADB 和 Node.js 訓練抖音模型——尋找好看的小姐姐

在註冊完成後可以在控制檯的應用管理看到對應的試用的 API key 和 API Secret

使用 ADB 和 Node.js 訓練抖音模型——尋找好看的小姐姐

和大多數開放平臺一樣,是通過將這兩個值傳遞給後臺來鑑權的,並且試用型別是免費的。

在控制檯的人臉識別欄目下的 Detect API 下可以看到對應的請求介面引數要求和相應的返回,console.faceplusplus.com.cn/documents/4…

使用 ADB 和 Node.js 訓練抖音模型——尋找好看的小姐姐

在可選引數 return_attributes 裡的 genderbeauty 就是判斷性別和顏值的。

介面返回值格式如下:

使用 ADB 和 Node.js 訓練抖音模型——尋找好看的小姐姐

其中 faces 是一個陣列,其實也很容易理解,畢竟一張圖片裡可能不止一個人嗎,每張臉的的顏值 beauty 是一個物件,區分了在男女眼中的顏值。真相了,男生和女生的審美不一樣!

使用 ADB 和 Node.js 訓練抖音模型——尋找好看的小姐姐

基於上面的分析可以開始寫程式碼了,通過 https 模組呼叫介面即可,為了方便將圖片通過 base64 的形式傳遞,大致如下:

const https = require('https');
const querystring = require('querystring');
const { base64Sync } = require('base64-img')


module.exports = function (file, scoreLevel = 70) {
  const base64 = base64Sync(file)
  const data = querystring.stringify({
    api_key: "自己的api_key",
    api_secret: "自己的api_secret",
    image_base64: base64,
    return_attributes: 'gender,age,beauty'
  })

  const options = {
    host: 'api-cn.faceplusplus.com',
    path: '/facepp/v3/detect',
    method: 'POST',
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
    }
  }

  return new Promise((resolve, reject) => {
    const req = https.request(options, (res) => {
      res.on('data', (d) => {
        let b = {}
        try {
          b = JSON.parse('' + d)
        } catch (err) {
          resolve({
            shouldFollow: false
          })
          return
        }

        const faces = b.faces || []

        let shouldFollow = false
        let score = 0

        for (let i = 0; i < faces.length; i++) {
          const attrs = faces[i].attributes
          score = attrs.beauty.male_score
          if (attrs.gender.value == 'Female' && attrs.beauty.male_score >= scoreLevel) {
            shouldFollow = true
            break
          }
        }
        resolve({
          shouldFollow,
          score
        })
      })

    });
    req.on('error', (e) => {
      resolve(false)
    });
    req.write(data)
    req.end()
  })
}

複製程式碼

這裡對外接受檔案和顏值分數要求,如果返回的 faces 陣列中有大於這個分數要求並且性別是小姐姐的話就關注和點贊。

為了更好地訓練效果,可以在點贊和關注的視訊裡多停留一會兒,這樣抖音就更加知道我們喜歡看小姐姐了。

接著就是處理對應的點贊和關注的 tap 操作,這個我是通過我自己手機螢幕的解析度和按鈕位置大致估算出來的(更精確的可以截一張抖音的圖然後通過 faststone 之類的工具量出位置):

使用 ADB 和 Node.js 訓練抖音模型——尋找好看的小姐姐

我試的是點贊 1300 是可以的,關注 1200 是可以的,我的手機解析度是 1080 X 2280

上滑操作其實很好處理,x軸不變,y軸變小即可。

以上分析完後,先實現個等待函式。

function awaitMoment(time = 2000) {
  return new Promise((resolve) => {
    setTimeout(() => resolve(), time)
  })
}
複製程式碼

裝置開啟抖音後,先上滑切換一個視訊

async function main() {
  const device = (await adb.devices())[0]

  adb.use(device)
  adb.verbose(true)

  await adb.swipe(200, 1000, 200, 100, 200)

  await awaitMoment()
}
複製程式碼

等待兩秒後截一個圖,(這裡做的很粗糙,因為兩秒的截圖可能沒有小姐姐,但是實踐證明,這樣訓練是可以的),然後呼叫 face++ 的介面,根據結果來是否關注和點贊,然後刪掉對應的截圖,接著呼叫這個方法:


const fileName = ((Math.random() + '').substr(2, 7)) + '.png'
  await adb.screenshot(fileName, path.resolve(__dirname, 'images'))
  const file = path.resolve(path.resolve(__dirname, 'images', fileName))

  const { shouldFollow, score } = await face(file, 70)

  console.log('shouldFollow', shouldFollow)
  console.log('score', score)

  if (shouldFollow) {

    await adb.touch(1000, 1300)
    await adb.touch(1000, 1200)

    await awaitMoment(5000)
  }

  fs.unlinkSync(file)

  await main()
複製程式碼

這樣基本就大功告成了。

執行即可啦,接著就是等待程式自動幫助我們關注好看的小姐姐了。

我大概訓練了2,3個小時,效果還是很明顯的,抖音從給我推薦各種沙雕視訊變成了各種小姐姐,抖音推薦演算法牛逼呀,哈哈哈哈,這樣上班划水的時候也歡樂。

使用 ADB 和 Node.js 訓練抖音模型——尋找好看的小姐姐

因為 gif 圖太大,太麻煩了,所以就簡單拍了個視訊,可以看看程式訓練的過程,愛奇藝連結 www.iqiyi.com/w_19saaayji…、油管連結 www.youtube.com/watch?v=-_G…

最後看下我的賬號經過訓練的效果:

使用 ADB 和 Node.js 訓練抖音模型——尋找好看的小姐姐

(其實也有一個問題,就是濾鏡太嚴重了,很多網紅臉,不知道有沒有識別網紅臉的演算法)

以上所有的程式碼都開源在了我的 github 上,地址是 github.com/huruji/find…

最後照舊是一個廣告貼,最近新開了一個分享技術的公眾號,歡迎大家關注?(目前關注人數可憐?)

使用 ADB 和 Node.js 訓練抖音模型——尋找好看的小姐姐

相關文章