星际旅行向导机器人(paddlegan+wechaty完成)
星际旅行向导机器人(基于paddlehub+wechaty完成) 主要使用的三个模型(风格迁移,场景动漫化,人物动漫化),结合wechaty完成微信机器人。
星际旅行向导机器人
本项目为基于wechaty+paddlehub实现的星际旅行向导机器人
2090年的一天你驱着自己的私人飞船航行在大麦哲伦星系右旋臂附近,恒星的闪光让你流连忘返,殊不知危险以悄然来临。
一颗冒失的小行星擦破了你飞船的右燃料箱,让你去巴卡罗马星探望外婆的计划破灭。
“噢,现在担心的不是什么外婆不外婆的,你得赶紧寻找可降落的行星,燃料已经不足以支撑你长久飞行”
情急之下,你连线上了星际旅行向导机器人。
注:项目人脸漫画化,风格迁移,动漫场景化均来自于PaddleGAN GitHub🔗:https://github.com/PaddlePaddle/PaddleGAN
1.1 B站效果展示
视频链接:https://www.bilibili.com/video/BV1Kb4y1z7kH
github链接:
https://github.com/Cursky/Cosmic-Wanderer-Guide-Robot
1.2 项目实现过程
1.部署wechaty至云服务器
可以参考以下链接进行部署:
https://aistudio.baidu.com/aistudio/projectdetail/1836012?channelType=0&channel=0
2.下载paddlegan源码到根目录:
https://github.com/PaddlePaddle/PaddleGAN
3.下载run.sh stylenew.py run.py到本机
4.创建image,envimage,output,output_dir文件夹,用于接受微信信息图像并生成图像
2.1 服务器部署流程
!docker pull wechaty/wechaty:latest
!export WECHATY_LOG="verbose"
!export WECHATY_PUPPET="wechaty-puppet-wechat"
!export WECHATY_PUPPET_SERVER_PORT="8080"
!export WECHATY_TOKEN="puppet_padlocal_xxxxxx" # 这里输入你自己的token
!docker run -ti --name wechaty_puppet_service_token_gateway --rm -e WECHATY_LOG -e WECHATY_PUPPET -e WECHATY_TOKEN -e WECHATY_PUPPET_SERVER_PORT -p "$WECHATY_PUPPET_SERVER_PORT:$WECHATY_PUPPET_SERVER_PORT" wechaty/wechaty:latest
可以利用 docker ps -a 查看是否运行成功
以及 输入网址: https://api.chatie.io/v0/hosties/xxxxxx (后面的xxxxxx就是你的token)
ping出服务器地址 而不是0.0.0.0的话就说明部署成功
2.2 代码解读
2.2.1 制作平面星球护照
平面行星为距离飞船1AU的固态行星,该行星为飞船附近唯一可居住行星,该行星本为一颗宜居岩石行星,但该行星一名画家为了其狂热的梦想制造了二向粒子,导致其行星变为二维平面,凡是进入该星球的人或飞船皆会被二向化。
制作步骤:
1.接受用户发送的证件照
2.对证件照进行漫画化
3.与原先准备好的护照模板进行拼接
#接受用户发送的证件照并对其进行漫画化
if msg.text() == '制作平面行星护照':
robot_state = 1
await talker.say('已收取到制作平面行星护照请求,请发送证件照!')
if robot_state == 1 and msg.type() == Message.Type.MESSAGE_TYPE_IMAGE:
# 制作平面星球护照
await talker.say('已收到证件照,开始制作中')
# 将Message转换为FileBox
file_box_user_image = await msg.to_file_box()
# 获取图片名
img_name = file_box_user_image.name
# 图片保存的路径
img_path = './image/' + img_name
# 将图片保存为本地文件
await file_box_user_image.to_file(file_path=img_path)
# await msg.say('已收到证件照,开始制作中。。。。。。')
p2c = Photo2CartoonPredictor(output_path='./output')
p2c.run('./'+img_path)
print("生成成功!")
Stitching_images('./output/p2c_cartoon.png')#制作护照图像
file_box_final_result = FileBox.from_file('./output/p2c_cartoon.png')
robot_state = 0
await talker.say('制作完成,请携带护照入境。')
await msg.say(file_box_final_result)
#与护照模板的拼接函数
def Stitching_images(input_path:str):
"""
input_path:输入图像地址
return:覆盖生成图像
本函数将完成生成图像与护照的拼接
"""
save_img = input_path
M_Img = Image.open('./output/huzhao.png')
S_Img = Image.open(input_path)
coordinate=(21,64)
M_Img.paste(S_Img, coordinate, mask=None)
M_Img.save(save_img)
2.2.2 模拟不同行星景象
平面行星:
电子行星:
海洋行星:
星云行星
艺术行星
模拟步骤:
1.跟据用户发言确定聊天机器人状态
2.根据聊天机器人状态以及用户发送的照片生成不同的风格图像
#1.跟据用户发言确定聊天机器人状态
if msg.text() == '模拟海洋行星':
robot_state = 2
await talker.say('已收到模拟海洋行星环境请求,请发送待模拟的环境图片!')
if msg.text() == '模拟电子行星':
robot_state = 3
await talker.say('已收到模拟电子行星环境请求,请发送待模拟的环境图片!')
if msg.text() == '模拟星云行星':
robot_state = 4
await talker.say('已收到模拟星云行星环境请求,请发送待模拟的环境图片!')
if msg.text() == '模拟艺术行星':
robot_state = 5
await talker.say('已收到模拟艺术行星环境请求,请发送待模拟的环境图片!')
if msg.text() == '模拟平面行星':
robot_state = 6
await talker.say('已收到模拟平面行星环境请求,请发送待模拟的环境图片!')
# 2.根据聊天机器人状态以及用户发送的照片生成不同的风格图像
if robot_state == 2 and msg.type() == Message.Type.MESSAGE_TYPE_IMAGE:
# 模拟海洋行星景象
await talker.say('已收到图像,开始模拟中')
# 将Message转换为FileBox
file_box_user_image = await msg.to_file_box()
# 获取图片名
img_name = file_box_user_image.name
# 图片保存的路径
img_path = './envimage/' + img_name
# 将图片保存为本地文件
await file_box_user_image.to_file(file_path=img_path)
style = 'ocean'#模拟海洋行星
envirstyle(img_path,style)
file_box_final_result = FileBox.from_file('./output_dir/LapStyle/stylized.png')
robot_state = 0
await talker.say('模拟完成!')
await msg.say(file_box_final_result)
if robot_state == 3 and msg.type() == Message.Type.MESSAGE_TYPE_IMAGE:
# 模拟电子行星景象
await talker.say('已收到图像,开始模拟中')
# 将Message转换为FileBox
file_box_user_image = await msg.to_file_box()
# 获取图片名
img_name = file_box_user_image.name
# 图片保存的路径
img_path = './envimage/' + img_name
# 将图片保存为本地文件
await file_box_user_image.to_file(file_path=img_path)
style = 'circuit'#模拟电子行星
envirstyle(img_path,style)
file_box_final_result = FileBox.from_file('./output_dir/LapStyle/stylized.png')
robot_state = 0
await talker.say('模拟完成!')
await msg.say(file_box_final_result)
if robot_state == 4 and msg.type() == Message.Type.MESSAGE_TYPE_IMAGE:
# 模拟星云行星景象
await talker.say('已收到图像,开始模拟中')
# 将Message转换为FileBox
file_box_user_image = await msg.to_file_box()
# 获取图片名
img_name = file_box_user_image.name
# 图片保存的路径
img_path = './envimage/' + img_name
# 将图片保存为本地文件
await file_box_user_image.to_file(file_path=img_path)
style = 'stars'#模拟星云行星
envirstyle(img_path,style)
file_box_final_result = FileBox.from_file('./output_dir/LapStyle/stylized.png')
robot_state = 0
await talker.say('模拟完成!')
await msg.say(file_box_final_result)
if robot_state == 5 and msg.type() == Message.Type.MESSAGE_TYPE_IMAGE:
# 模拟扭曲行星景象
await talker.say('已收到图像,开始模拟中')
# 将Message转换为FileBox
file_box_user_image = await msg.to_file_box()
# 获取图片名
img_name = file_box_user_image.name
# 图片保存的路径
img_path = './envimage/' + img_name
# 将图片保存为本地文件
await file_box_user_image.to_file(file_path=img_path)
style = 'starrynew'#模拟扭曲行星
envirstyle(img_path,style)
file_box_final_result = FileBox.from_file('./output_dir/LapStyle/stylized.png')
robot_state = 0
await talker.say('模拟完成!')
await msg.say(file_box_final_result)
if robot_state == 6 and msg.type() == Message.Type.MESSAGE_TYPE_IMAGE:
# 模拟平面行星景象
await talker.say('已收到图像,开始模拟中')
# 将Message转换为FileBox
file_box_user_image = await msg.to_file_box()
# 获取图片名
img_name = file_box_user_image.name
# 图片保存的路径
img_path = './envimage/' + img_name
# 将图片保存为本地文件
await file_box_user_image.to_file(file_path=img_path)
predictor = AnimeGANPredictor()
predictor.run(img_path)
file_box_final_result = FileBox.from_file('./output/anime.png')
robot_state = 0
await talker.say('模拟完成!')
await msg.say(file_box_final_result)
#星云 电子 海洋 艺术 行星环境模拟代码
import paddle
import os
import sys
sys.path.insert(0, os.getcwd())
from ppgan.apps import LapStylePredictor
import argparse
def envirstyle(input_path:str,style_chose:str):
"""
input_path:目标图像文件
style_chose:选择风格迁移模型
"""
predictor = LapStylePredictor(output='output_dir',
style=style_chose,
weight_path=None,
style_image_path=None)
predictor.run(input_path)
#平面行星模拟代码(场景动漫化)
predictor = AnimeGANPredictor()
predictor.run(img_path)
file_box_final_result = FileBox.from_file('./output/anime.png')
2.2.3 完整代码
import os
import asyncio
from ppgan.apps import Photo2CartoonPredictor#人像动漫化
from PIL import Image
from ppgan.apps import AnimeGANPredictor#场景动漫化
from stylenew import envirstyle#场景模拟
# predictor = AnimeGANPredictor()
# predictor.run(PATH_OF_IMAGE)
# p2c = Photo2CartoonPredictor(output_path='../output')
# p2c.run('../samples/plain.jpg')
from wechaty import (
Contact,
FileBox,
Message,
Wechaty,
ScanStatus,
)
robot_state = 0 #机器人状态
style = ''#待模拟风格
def Stitching_images(input_path:str):
"""
input_path:输入图像地址
return:覆盖生成图像
本函数将完成生成图像与护照的拼接
"""
save_img = input_path
M_Img = Image.open('./output/huzhao.png')
S_Img = Image.open(input_path)
coordinate=(21,64)
M_Img.paste(S_Img, coordinate, mask=None)
M_Img.save(save_img)
async def on_message(msg: Message):
talker = msg.talker()
global robot_state
global style
# robot_state = 0
if msg.text() == 'ding':
await msg.say('这是自动回复: dong dong dong')
if msg.text() == 'hi' or msg.text() == '你好' or msg.text()=='救救我' or msg.text()=='请求帮助':
await talker.say('Dont Painc,这里是星际旅行向导小天,虽然星际旅行危机四伏,千变万化。\n但在这里我将帮助你完成星际旅航\n对我回复:“我在哪?”即可以获得附近星球坐标。')
if msg.text() == '我在哪'or msg.text() == '我在哪?':
await talker.say('你目前处于大麦哲伦星系左悬臂附近,以目前飞船能量周围可去行星有:平面行星,海洋行星,电子行星,星云行星以及艺术行星')
await talker.say('你可以发送‘获取+行星名字+详细信息’来获取相关行星的详细信息\n例如‘获取海洋行星详细信息’')
if msg.text() == '再见':
await talker.say('很高兴为您服务,祝您星际旅途愉快!')
if msg.text() == '获取海洋行星详细信息':
# 海洋行星具体介绍
await talker.say('海洋行星为距离飞船3AU的液态水行星,该星球由百分之99的水构成,为地球初代海洋样貌。\n\n经大麦哲伦星际旅行局报告显示,该星球不适宜生存,也尚未发现明显的生物存在痕迹')
await talker.say('因飞船瞭望镜受损无法观察行星真实全貌,您可以发送“模拟海洋行星”并给出一张照片,旅行向导将模拟出照片环境在海洋行星的景象。')
if msg.text() == '获取电子行星详细信息':
# 电子行星具体介绍
await talker.say('电子行星为距离飞船1AU的岩石行星,该行星本来为一颗岩石行星,因为大麦哲伦星系的电子产品垃圾均往该行星倾倒,目前该行星已经通体为电子绿色\n\n经大麦哲伦星际旅行局报告显示,该星球不适宜生存')
await talker.say('因飞船瞭望镜受损无法观察行星真实全貌,您可以发送“模拟电子行星”并给出一张照片,旅行向导将模拟出照片环境在电子行星的景象。')
if msg.text() == '获取星云行星详细信息':
# 星云行星具体介绍
await talker.say('星云行星为距离飞船4AU的气态行星,该行星属于星云附近粒子相互作用而出现的产物,整颗行星由90%的氢气和10%的氮气构成\n\n经大麦哲伦星际旅行局报告显示,该星球不适宜生存,也尚未发现明显的生物存在痕迹')
await talker.say('因飞船瞭望镜受损无法观察行星真实全貌,您可以发送“模拟星云行星”并给出一张照片,旅行向导将模拟出照片环境在星云行星的景象。')
if msg.text() == '获取艺术行星详细信息':
# 扭曲行星具体介绍
await talker.say('艺术行星为距离飞船18AU的固态行星,该行星为大麦哲伦造星俱乐部所创造的产物,某位宇宙金主为纪念其喜欢的艺术家而花重金打造而成,该行星风貌通体扭曲但却呈现了一种别样的美丽。\n\n经大麦哲伦星际旅行局报告显示,此为观赏行星,不适于生存。')
await talker.say('因飞船瞭望镜受损无法观察行星真实全貌,您可以发送“模拟艺术行星”并给出一张照片,旅行向导将模拟出照片环境在艺术行星的景象。')
if msg.text() == '获取平面行星详细信息':
# 平面行星具体介绍
await talker.say('平面行星为距离飞船1AU的固态行星,该行星为飞船附近唯一可居住行星,该行星本为一颗宜居岩石行星,但该行星一名画家为了其狂热的梦想制造了二向粒子,导致其行星变为二维平面,凡是进入该星球的人或飞船皆会被二向化。')
await talker.say('因飞船瞭望镜受损无法观察行星真实全貌,您可以发送“模拟平面行星”并给出一张照片,旅行向导将模拟出照片环境在平面行星的景象。')
await talker.say('如有意向登陆平面行星,请发送‘制作平面行星护照’并给出一张证件照,旅行向导将为你制作登陆平面行星所需的护照!')
if msg.text() == '制作平面行星护照':
robot_state = 1
await talker.say('已收取到制作平面行星护照请求,请发送证件照!')
if msg.text() == '模拟海洋行星':
robot_state = 2
await talker.say('已收到模拟海洋行星环境请求,请发送待模拟的环境图片!')
if msg.text() == '模拟电子行星':
robot_state = 3
await talker.say('已收到模拟电子行星环境请求,请发送待模拟的环境图片!')
if msg.text() == '模拟星云行星':
robot_state = 4
await talker.say('已收到模拟星云行星环境请求,请发送待模拟的环境图片!')
if msg.text() == '模拟艺术行星':
robot_state = 5
await talker.say('已收到模拟艺术行星环境请求,请发送待模拟的环境图片!')
if msg.text() == '模拟平面行星':
robot_state = 6
await talker.say('已收到模拟平面行星环境请求,请发送待模拟的环境图片!')
if robot_state == 1 and msg.type() == Message.Type.MESSAGE_TYPE_IMAGE:
# 制作平面星球护照
await talker.say('已收到证件照,开始制作中')
# 将Message转换为FileBox
file_box_user_image = await msg.to_file_box()
# 获取图片名
img_name = file_box_user_image.name
# 图片保存的路径
img_path = './image/' + img_name
# 将图片保存为本地文件
await file_box_user_image.to_file(file_path=img_path)
# await msg.say('已收到证件照,开始制作中。。。。。。')
p2c = Photo2CartoonPredictor(output_path='./output')
p2c.run('./'+img_path)
print("生成成功!")
Stitching_images('./output/p2c_cartoon.png')#制作护照图像
file_box_final_result = FileBox.from_file('./output/p2c_cartoon.png')
robot_state = 0
await talker.say('制作完成,请携带护照入境。')
await msg.say(file_box_final_result)
if robot_state == 2 and msg.type() == Message.Type.MESSAGE_TYPE_IMAGE:
# 模拟海洋行星景象
await talker.say('已收到图像,开始模拟中')
# 将Message转换为FileBox
file_box_user_image = await msg.to_file_box()
# 获取图片名
img_name = file_box_user_image.name
# 图片保存的路径
img_path = './envimage/' + img_name
# 将图片保存为本地文件
await file_box_user_image.to_file(file_path=img_path)
style = 'ocean'#模拟海洋行星
envirstyle(img_path,style)
file_box_final_result = FileBox.from_file('./output_dir/LapStyle/stylized.png')
robot_state = 0
await talker.say('模拟完成!')
await msg.say(file_box_final_result)
if robot_state == 3 and msg.type() == Message.Type.MESSAGE_TYPE_IMAGE:
# 模拟电子行星景象
await talker.say('已收到图像,开始模拟中')
# 将Message转换为FileBox
file_box_user_image = await msg.to_file_box()
# 获取图片名
img_name = file_box_user_image.name
# 图片保存的路径
img_path = './envimage/' + img_name
# 将图片保存为本地文件
await file_box_user_image.to_file(file_path=img_path)
style = 'circuit'#模拟电子行星
envirstyle(img_path,style)
file_box_final_result = FileBox.from_file('./output_dir/LapStyle/stylized.png')
robot_state = 0
await talker.say('模拟完成!')
await msg.say(file_box_final_result)
if robot_state == 4 and msg.type() == Message.Type.MESSAGE_TYPE_IMAGE:
# 模拟星云行星景象
await talker.say('已收到图像,开始模拟中')
# 将Message转换为FileBox
file_box_user_image = await msg.to_file_box()
# 获取图片名
img_name = file_box_user_image.name
# 图片保存的路径
img_path = './envimage/' + img_name
# 将图片保存为本地文件
await file_box_user_image.to_file(file_path=img_path)
style = 'stars'#模拟星云行星
envirstyle(img_path,style)
file_box_final_result = FileBox.from_file('./output_dir/LapStyle/stylized.png')
robot_state = 0
await talker.say('模拟完成!')
await msg.say(file_box_final_result)
if robot_state == 5 and msg.type() == Message.Type.MESSAGE_TYPE_IMAGE:
# 模拟艺术行星景象
await talker.say('已收到图像,开始模拟中')
# 将Message转换为FileBox
file_box_user_image = await msg.to_file_box()
# 获取图片名
img_name = file_box_user_image.name
# 图片保存的路径
img_path = './envimage/' + img_name
# 将图片保存为本地文件
await file_box_user_image.to_file(file_path=img_path)
style = 'starrynew'#模拟艺术行星
envirstyle(img_path,style)
file_box_final_result = FileBox.from_file('./output_dir/LapStyle/stylized.png')
robot_state = 0
await talker.say('模拟完成!')
await msg.say(file_box_final_result)
if robot_state == 6 and msg.type() == Message.Type.MESSAGE_TYPE_IMAGE:
# 模拟平面行星景象
await talker.say('已收到图像,开始模拟中')
# 将Message转换为FileBox
file_box_user_image = await msg.to_file_box()
# 获取图片名
img_name = file_box_user_image.name
# 图片保存的路径
img_path = './envimage/' + img_name
# 将图片保存为本地文件
await file_box_user_image.to_file(file_path=img_path)
predictor = AnimeGANPredictor()
predictor.run(img_path)
file_box_final_result = FileBox.from_file('./output/anime.png')
robot_state = 0
await talker.say('模拟完成!')
await msg.say(file_box_final_result)
async def on_scan(
qrcode: str,
status: ScanStatus,
_data,
):
print('Status: ' + str(status))
print('View QR Code Online: https://wechaty.js.org/qrcode/' + qrcode)
async def on_login(user: Contact):
print(user)
async def main():
# 确保我们在环境变量中设置了WECHATY_PUPPET_SERVICE_TOKEN
if 'WECHATY_PUPPET_SERVICE_TOKEN' not in os.environ:
print('''
Error: WECHATY_PUPPET_SERVICE_TOKEN is not found in the environment variables
You need a TOKEN to run the Python Wechaty. Please goto our README for details
https://github.com/wechaty/python-wechaty-getting-started/#wechaty_puppet_service_token
''')
bot = Wechaty()
bot.on('scan', on_scan)
bot.on('login', on_login)
bot.on('message', on_message)
await bot.start()
print('[Python Wechaty] Ding Dong Bot started.')
github.com/wechaty/python-wechaty-getting-started/#wechaty_puppet_service_token
''')
bot = Wechaty()
bot.on('scan', on_scan)
bot.on('login', on_login)
bot.on('message', on_message)
await bot.start()
print('[Python Wechaty] Ding Dong Bot started.')
asyncio.run(main())
请点击此处查看本环境基本用法.
Please click here for more detailed instructions.
更多推荐
所有评论(0)