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

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

關於 ADB,能夠看我以前的文章,ADB 實用筆記git

首先使用 Node.js 封裝下 ADB 的命令,爲了兼容鏈接多臺設備的問題,能夠使用一個標誌位,同時每次使用的時候使用 use 方法來指定對應的設備,call 方法做爲全部調用命令的基礎方法:github

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 查詢設備的基本操做。那麼問題就是怎麼識別抖音的視頻裏有好看的小姐姐呢?shell

我想的就是經過人臉識別的 API 來判斷,能夠經過 ADB 來截圖,而後調用相應的 AI 接口判斷截圖中人的顏值和性別,而後再決定是否關注和點贊該視頻,而後上滑切換到下一個視頻,如此反覆。api

整理一下,須要封裝的 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…:app

在註冊完成後能夠在控制檯的應用管理看到對應的試用的 API key 和 API Secretdom

和大多數開放平臺同樣,是經過將這兩個值傳遞給後臺來鑑權的,而且試用類型是免費的。async

在控制檯的人臉識別欄目下的 Detect API 下能夠看到對應的請求接口參數要求和相應的返回,console.faceplusplus.com.cn/documents/4…

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

接口返回值格式以下:

其中 faces 是一個數組,其實也很容易理解,畢竟一張圖片裏可能不止一我的嗎,每張臉的的顏值 beauty 是一個對象,區分了在男女眼中的顏值。真相了,男生和女生的審美不同!

基於上面的分析能夠開始寫代碼了,經過 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 之類的工具量出位置):

我試的是點贊 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個小時,效果仍是很明顯的,抖音從給我推薦各類沙雕視頻變成了各類小姐姐,抖音推薦算法牛逼呀,哈哈哈哈,這樣上班划水的時候也歡樂。

由於 gif 圖太大,太麻煩了,因此就簡單拍了個視頻,能夠看看程序訓練的過程,愛奇藝連接 www.iqiyi.com/w_19saaayji…、油管連接 www.youtube.com/watch?v=-_G…

最後看下個人帳號通過訓練的效果:

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

以上全部的代碼都開源在了個人 github 上,地址是 github.com/huruji/find…

最後照舊是一個廣告貼,最近新開了一個分享技術的公衆號,歡迎你們關注👇(目前關注人數可憐🤕)

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息