使用 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++ 的接口,https://www.faceplusplus.com.cn/face-detection/:
在注册完成后可以在控制台的应用管理看到对应的试用的 API key 和 API Secret
和大多数开放平台一样,是通过将这两个值传递给后台来鉴权的,并且试用类型是免费的。
在控制台的人脸识别栏目下的 Detect API 下可以看到对应的请求接口参数要求和相应的返回,https://console.faceplusplus.com.cn/documents/4888373
在可选参数 return_attributes
里的 gender
和 beauty
就是判断性别和颜值的。
其中 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 图太大,太麻烦了,所以就简单拍了个视频,可以看看程序训练的过程,爱奇艺链接 http://www.iqiyi.com/w_19saaayji1.html、油管链接 https://www.youtube.com/watch?v=-_Gwd3DHJZU&feature=youtu.be
其实也有一个问题,就是滤镜太严重了,很多网红脸,不知道有没有识别网红脸的算法
以上所有的代码都开源在了我的 github 上,地址是 https://github.com/huruji/find-beauty-in-douyin
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: TypeScript 的实用类型笔记
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
赞