本文是关于“韩女团小卡扭蛋机”项目的介绍。作者结合飞桨黑客松活动,利用PaddleX、EasyEdge和GUI技术,制作了可抽取4名女团成员小卡的扭蛋机。项目先划分数据集、训练模型,再经EasyEdge部署,最后通过GUI实现抽卡动画效果,用户可获取扭蛋币体验,旨在传播韩流文化。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

其实一直想做一个韩国女团的安利(推荐)项目,奈何自己太菜了,一直没搞。一眨眼就到2021年年底了,也就想着结合自己的长处写一个充满韩范项目吧,恰巧遇到飞桨黑客松 48H Coding Party活动,就想试着写一个,给2021年留下一个完美的句号。
经过我长时间的观察,做韩范的项目寥寥无几。我想主要原因可能是大佬们都喜欢动漫、二次元文化。而我作为一个不合格的程序猿,个人更倾向韩流文化,因此就写一个充满韩范的小项目——韩女团小卡(氪金)扭蛋机!
先来科普一下小卡文化:简单来说就是一张专辑里面会有男女团成员其中一名成员的一张小卡(就是限量版纸质照片),如果想抽到自己喜欢的成员的小卡,运气好可能买一两张就有,运气不好可能一直都出不来。其他饭圈那套我就不再解释了。(郑重提醒:理性追星,不要无脑氪金)
争取做AI Studio韩流传播第一人(doge)
(PS:此项目带有个人喜爱取向)
小卡扭蛋机放入了4名不同女团成员,如下图 (原本是8名的,但是类内差异太大,以至于效果不好,只能忍痛割爱,┭┮﹏┭┮)
从左到右分别是:
1、2: Red Velvet的朴秀荣
3、4:(G)I-DLE的赵美延
5、6:BlackPink的朴彩英
7、8:AOA的金雪炫
不知道你会更pick那一款呢
点击“抽取扭蛋”按钮即可抽取扭蛋小卡!
首先点击右上角的
”Fork“或者”喜爱“获取扭蛋币一枚进行体验!
一、PaddleX在线训练图像分类模型随机抽取预测(可直接NoteBook在线实现扭蛋机抽卡 [PS:无动画效果] )
二、EasyEdge部署图像分类模型在网页端
三、发送requests请求获取结果后用GUI进行动画展示
!pip install paddlex==1.3.10 -i https://pypi.tuna.tsinghua.edu.cn/simple !pip install paddlelite -i https://pypi.tuna.tsinghua.edu.cn/simple !pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple !pip install chardet -i https://pypi.tuna.tsinghua.edu.cn/simple !pip install mpimg -i https://pypi.tuna.tsinghua.edu.cn/simple !pip install imgaug
数据集来源于:手机多年的存货(来源于微博)+百度搜图
友情提示:数据集仅供学习和个人使用
import os
path='nvtuan'if not os.path.exists(path):
os.makedirs(path)else: pass!unzip -oq /home/aistudio/data/data120007/韩国女团小姐姐.zip -d nvtuan/
import warnings
warnings.filterwarnings("ignore")import osimport random
dirpath='nvtuan'def get_all_txt():
all_list = []
i = 0
for root, dirs, files in os.walk(dirpath):
for file in files:
i = i + 1
if ("JOY" in root):
all_list.append(os.path.join(root, file) + " 0
") if ("meiyan" in root):
all_list.append(os.path.join(root, file) + " 1
") if ("Rose" in root):
all_list.append(os.path.join(root, file) + " 2
") if("xuexuan" in root):
all_list.append(os.path.join(root, file) + " 3
")
allstr = ''.join(all_list)
f = open('nvtuan/all_list.txt', 'w', encoding='utf-8')
f.write(allstr) return all_list, i
all_list, all_lenth = get_all_txt()
random.shuffle(all_list)
random.shuffle(all_list)#数据集划分train_size = int(all_lenth * 0.8)
train_list = all_list[:train_size]
val_list = all_list[train_size:]train_txt = ''.join(train_list)
f_train = open('nvtuan/train_list.txt', 'w', encoding='utf-8')
f_train.write(train_txt)
f_train.close()
val_txt = ''.join(val_list)
f_val = open('nvtuan/val_list.txt', 'w', encoding='utf-8')
f_val.write(val_txt)
f_val.close()import paddleimport warningsimport osimport randomimport matplotlib.pyplot as plt #plt 用于显示图片import matplotlib.image as mpimg #mpimg 用于读取图片from paddle.onnx import exportfrom paddlex.cls import transformsimport cv2import numpy as npimport paddlex as pdximport imgaug.augmenters as iaafrom tqdm import tqdmimport chardet
train_transforms = transforms.Compose([ # transforms.resize(256),
transforms.RandomCrop(crop_size=224),
transforms.RandomHorizontalFlip(),
transforms.RandomVerticalFlip(),
transforms.Normalize()
])
eval_transforms = transforms.Compose([
transforms.ResizeByShort(short_size=256),
transforms.CenterCrop(crop_size=224),
transforms.Normalize()
])train_dataset = pdx.datasets.ImageNet(
data_dir='',
file_list='nvtuan/train_list.txt',
label_list='nvtuan/labels.txt',
transforms=train_transforms,
shuffle=True)
eval_dataset = pdx.datasets.ImageNet(
data_dir='',
file_list='nvtuan/val_list.txt',
label_list='nvtuan/labels.txt',
transforms=eval_transforms)
num_classes = len(train_dataset.labels)
model = pdx.cls.ResNet50_vd_ssld(num_classes=num_classes)model.train(num_epochs=50,
train_dataset=train_dataset,
train_batch_size=16,
eval_dataset=eval_dataset,
lr_decay_epochs=[5, 15, 30],
save_dir='output/resnet50_vd_ssld',
save_interval_epochs=5,
learning_rate=0.025,
use_vdl=True)#若有报错“testdata/.ipynb_checkpoints”相关的错 或者 'NoneType' object has no attribute 'dtype' ,请重新执行即可(出蛋通道卡住了)#若第一次抽取没有显示图片,请再次点击抽取import paddleimport warningsimport osimport randomimport matplotlib.pyplot as plt #plt 用于显示图片import matplotlib.image as mpimg #mpimg 用于读取图片import paddlex as pdximport cv2import numpy as npimport timeprint("正在进行扭蛋中,请稍后...... ")
time.sleep(5)#清除出蛋通道(解决“testdata/.ipynb_checkpoints”相关的错)import osimport shutil
delList = []
delDir = "testdata/.ipynb_checkpoints"delList = os.listdir(delDir )for f in delList:
filePath = os.path.join( delDir, f ) if os.path.isfile(filePath):
os.remove(filePath) elif os.path.isdir(filePath):
shutil.rmtree(filePath,True)
fileDir='testdata'pathDir=os.listdir(fileDir) #取图片的原始路径picknumber=int(1) #从文件夹中取一张数量图片sample = random.sample(pathDir, picknumber) #随机选取picknumber数量的样本图片model = pdx.load_model('output/resnet50_vd_ssld/best_model')
result = model.predict(os.path.join(fileDir,sample[0]))
a=mpimg.imread(os.path.join(fileDir,sample[0]))
plt.figure(figsize=(10,10))
plt.imshow(a)
plt.axis('off')
plt.show()# print(result)print("恭喜你获得: ", result[0]['category'].split(" ")[1],"小卡一张")正在进行扭蛋中,请稍后...... 2021-12-15 17:37:59 [INFO] Model[ResNet50_vd_ssld] loaded.
<Figure size 720x720 with 1 Axes>
恭喜你获得:
<br/>
金雪炫
<br/>
小卡一张
<br/>
部署效果:
输入图片:
我们可以看到图片对应预测的类别是对的
但是我们依然可以通过不通过游览器随机上传图片来预测图片达到抽取扭蛋的效果
!paddlex --export_inference --model_dir=/home/aistudio/output/resnet50_vd_ssld/best_model --save_dir=./inference_model
预测完,把以下的文件下载到本地
还要下载 对应类别文件 labels.txt(本项目放在:/home/aistudio/nvtuan/labels.txt)
(注:由于EasyEdge不支持中文标签,因此先把标签换成英文,后面再通过程序映射到中文显示)
即把labels.txt改为
0 JOY
1 MEIYAN
2 ROSE
3 XUEXUAN
下载完这三个文件即准备就绪
点击进入网站: EasyEdge
1.点击立即使用
2.然后选择上传本地模型:
网络结构对应之前下载的:model 文件
网络参数对应之前下载的:params 文件
模型标签对应之前下载的:labels.txt
注: 后面步骤与快速实现椎间盘检测(paddleX)和部署(EasyEdge)一样,因此借鉴吖吖查大佬项目的图
3.点击生成模型
4.选择芯片与操作系统
5.待模型生成完毕,选择获取SDK
6.下载并获取序列号激活
7.选择联网在线激活
8.打开刚才下载的压缩包 打开这个exe文件
9.输入刚刚激活的序列号,并点击启动服务
就会有如下的界面:
启动后(激活)会显示:
部署完成!!!
但这只是完成了正常图像分类的部署,要达到我们扭蛋机抽取小卡效果,还是需要加一些代码进行实现。
本地部署好后,我们可以使用以下代码进行实现。
注:本地执行!!!不是在Notebook这里执行!!!
from tkinter import *from PIL import Image, ImageTk, ImageSequenceimport timeimport tkinterimport requestsimport osimport randomimport matplotlib.pyplot as plt # plt 用于显示图片import matplotlib.image as mpimg # mpimg 用于读取图片root = Tk()
root.geometry("1000x1000")
root.title('韩女团小卡扭蛋机')
gif_label = Label(root,image="")
gif_label.pack()
img = PhotoImage(file=".\nvtuan\1.gif")#按钮设置B = tkinter.Button(root, width=1000, height=1000, text='抽取扭蛋', relief=RIDGE, font=('Helvetica', 100),
bg='black', fg='white', image=img, borderwidth=50, compound="center",command=lambda :animation(count))
B.pack()#画布设置canvas = Canvas(root, width=1000, height=1000, bg='white')
canvas.pack()
im = Image.open('.\nvtuan\1.gif')# GIF图片流的迭代器frames = im.n_frames # gives total number of frames that gif contains# creating list of PhotoImage objects for each framesim = [PhotoImage(file='.\nvtuan\1.gif', format=f"gif -index {i}") for i in range(frames)]
count = 0anim = Nonedef animation(count):
global anim
im2 = im[count]
gif_label.configure(image=im2)
count += 1
if count == frames: #动画结束后进行的操作
headers = {'content-type': 'charset=gb2312'} # 标题显示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
fileDir = 'nvtuan'
pathDir = os.listdir(fileDir) # 取图片的原始路径
picknumber = int(1) # 从文件夹中取一张数量图片
sample = random.sample(pathDir, picknumber) # 随机选取picknumber数量的样本图片
with open(os.path.join(fileDir, sample[0]), 'rb') as f:
img = f.read()
result = requests.post('http://127.0.0.1:24401/', params={'threshold': 0.1}, data=img, headers=headers).json()
c_dict = {'JOY': '朴秀荣', 'MEIYAN': '赵美延', 'ROSE': '朴彩英', 'XUEXUAN': '金雪炫'} #英文标签映射中文
a = mpimg.imread(os.path.join(fileDir, sample[0]))
plt.figure(figsize=(10, 10))
plt.title("恭喜你获得:" + c_dict.get(result['results'][0]['label'].split(" ")[1]) + "小卡一张", fontsize='xx-large',
fontweight='heavy', bbox=dict(facecolor='y', edgecolor='black', alpha=0.65))
plt.imshow(a)
plt.axis('off')
plt.show()
quit()
anim = root.after(800, lambda: animation(count))
root.mainloop()点击“抽取扭蛋”按钮即可抽取扭蛋小卡!
以上就是飞桨首款韩女团小卡扭蛋机的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号