https://media.tidechoir.cn/image/avatar.jpg

消失在彩霞里的Blog

记一次AI拍立得视频生成实践

记一次AI拍立得视频生成实践 近日,笔者受辅导员委托,为校宣传部开发一个官方的小程序平台,实现毕业生AI人像视频生成。效果模仿可灵AI的一键3D拍立得。尽管后来由于某些原因中止了,但实践过程中还是有趣的。 这个效果初看容易,实际上仅调用图生视频API无法直接得到很好的效果,并且不能精准地控制标尺和缩放效果。 笔者经过仔细观察,发现这个视频其实是由 前2秒的模板 + 后5秒的AI视频 组成。 开发过程 开发步骤 首先确定思路,该任务在视频实现方面有三个重要步骤。 上传毕业照,生成可爱风格的人像照片。 生成前2秒的效果:有一个弧形的标尺,左右旋转分别对应缩放效果。由于对于不同照片这个效果都是一致的,因此需要通过视频模板生成。 生成后5秒的AI效果:基于(1)中的可爱人像,调用图生视频API,用提示词引导模型得到灵动的效果。 由于API一般都用Python调用比较方便,采用Flask框架快速开发。 开发难点 经过简单的实践,(2)和(3)均可调用API完成,(1)却没有找到很好的方法。 最终,笔者采用一种个性化的定制方案:利用OpenCV绘制视频。 安装OpenCV 1 pip install opencv-python 绘制刻度 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 def draw_circle_ruler(frame, center, max_radius, angle, ruler_alpha): # 绘制刻度线 for i in range(0, 360, 10): # 计算刻度线位置 rad = math.

一些实习的收获与总结

一些实习的收获与总结 笔者在一家中厂进行了一个半月的实习,记录一篇博客写一写感受。 进入算法岗,做一做视觉大模型(VLM)的实践,玩玩A100。 由于工作的具体内容需保密,因此本篇博客仅记录个人感受和技术栈本身的梳理。 工作主要任务 完成RAG技术的综合调研,详细介绍知识图谱、知识库方案和多模态RAG技术 独立完成RAG、图片检索Demo搭建,学习Streamlit、Gradio的使用。 对项目图像数据集清洗、分类、增强、标注,微调VLM,测评效果对比 训练Yolov8、Yolov11小模型的效果,测试结果。 个人感悟 对于大模型算法岗来说,打标签是实习生经典的任务。同时,想要自己做一个高质量的数据集,确实需要人工标注。 这次有机会接触到A100和H200,公司一般相比高校会有更多的算力资源。 工作内容很看带的导师,有些偏向于做做研究、调研;有些则分配具体任务为主(打标、清洗数据、炼丹) 几个重要工作 下面展示几个重要的工作中用到的工程技术。 大模型微调 学习了Llama-factory的使用,这个框架事实上极其简单,配置好yaml即可开始训练。便捷程度堪比Yolo。 1 2 3 4 export PATH=~/anaconda3/bin:$PATH source activate conda activate your_env export CUDA_VISIBLE_DEVICES="4,5,6,7" # 选择gpu编号 1 llamafactory-cli train examples/train_lora/qwen2vl_lora_sft.yaml 改成自己的yaml, Yaml内容根据自己的需求修改,主要是模型名字、保存路径和训练轮次。 合并模型 1 llamafactory-cli export examples/merge_lora/qwen2vl_lora_sft.yaml SD数据增强 加载pipeline 1 2 3 4 pipe_img2img = AutoPipelineForImage2Image.from_pretrained( "your-path/stable-diffusion-3.5-large", torch_dtype=torch.float16 ).to("cuda") 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 files = ["img1.

Web智能乐谱播放器实现

Web智能乐谱播放器实现 简介 在上一篇博客中,我实现了智能钢琴Web项目,仅需上传midi或musicxml可自动弹奏,同时支持更换音源。作为音乐爱好者,笔者在思索如何渲染乐谱,和钢琴曲一同播放。 技术流程 乐谱播放器的研发流程分为 读取乐谱 渲染乐谱 与midi同步,动态更新播放进度 musicXML是一种标准的乐谱记录格式,能够还原谱子全貌。市面上有许多读取musicxml的库,包括VexFlow、OpenSheetMusicDisplay等。 受用VUE实现一个乐谱播放器启发,笔者选用OpenSheetMusicDisplay库作为musicxml的渲染工具。 核心原理 乐谱渲染 首先安装opensheetmusicdisplay库 1 "opensheetmusicdisplay": "^1.8.4" 接着初始化osmd库 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 import { OpenSheetMusicDisplay as OSMD } from 'opensheetmusicdisplay' mounted() { this.setupOsmd() }, methods: { async setupOsmd() { if (this.$refs.container) { this.osmd = new OSMD(this.

Web智能钢琴实现

Web智能钢琴实现 简介 笔者热爱音乐,擅长钢琴,最近想做一个自动播放乐谱的功能。诸如此类自动演奏的软件有不少,弹琴吧、虫虫钢琴均可实现钢琴模拟和乐谱同步,但都收取会员费。 因此,借助Web技术手动实现一个是非常实用且有趣的事情。 参考项目 全部手搓太耗时间,笔者在github上找到一个很棒的项目。 自动钢琴 运行也非常简单 1 2 yarn install yarn start 这是一个Vue项目,用CSS模拟了钢琴的黑白键。不过仔细一看,这个钢琴缺少了低音域和高音域。 笔者决定做一个88键 “满血版”。经过一个多小时,大功告成! 布局技巧 所有白键直接均匀排开,麻烦的是黑键布局。可将每五个黑键分成一个组,组里采用绝对定位,组与组之间间隔相等。 项目原理 按键 事实上,这个“钢琴”是通过一个json来实现的,每个键都对应一个mp3。 88个键范围: 白键从A0-C8 黑键从A#0-A#7。 如果要更换音源,需要修改这88个音的MP3。人工对钢琴的每个键录音非常麻烦。 事实上,玩音乐的人都知道,musescore软件中音源是通过sf2格式存储的。那么有无办法将sf2文件转成所有音的MP3文件呢? 笔者查询百度和DS未果,一筹莫展之际,偶然间在github中找到一个读取sf2的库。 1 2 3 4 5 6 7 8 9 import sf2_loader as sf loader = sf.sf2_loader(r"you-path.sf2") music_list = [ 'A0', 'B0', 'C1', ..., 'A7', 'B7', 'C8' ] for note in music_list: loader.export_note(note, format='mp3', name=f'{note}.mp3') 一波操作,导出所有白键的音源(黑键同理)。这样就实现了钢琴换音源工作。可以将钢琴换成施坦威等高级音质。

机器学习——numpy手搓神经网络

机器学习——numpy手搓神经网络 引言 笔者近期给数学系学生讲授机器学习课程。讲解BP神经网络的反向传播、梯度下降等操作时,较难理解。 因此,写一篇博客记录一下numpy手搓神经网络的过程。 BP神经网络 手搓实现 导包 首先导入numpy库和画图的matplotlib库。只需要这两个! 1 2 import numpy as np import matplotlib.pyplot as plt 定义激活函数及其导数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 # 设置随机种子 np.random.seed(42) class ReLU: def __init__(self): pass def __call__(self, x): self.original_x = x return np.maximum(0, x) def derivative(self): return np.where(self.original_x > 0, 1, 0) class Sigmoid: def __init__(self): pass def __call__(self, x): self.

机器学习——RNN系列网络

机器学习——RNN系列网络 引言 授课过程中,对于RNN、GRU和LSTM,发现有一些难点需要梳理。调用pytorch中的torch.nn库尽管方便,但没法深刻理解公式和代码的对应关系。因此,写一篇博客记录一下这些网络的原理和手搓实现过程。 RNN 简单的MLP网络没法利用序列前后的信息,并且参数量很大。 RNN 通过引入“循环”结构,使得网络能够在处理当前输入时,利用之前步骤的信息。这种特性使其非常适合处理时间序列、文本、语音等具有顺序关系的数据,让模型具有短期记忆能力。 公式 隐藏层在时间t的更新公式: $$ h_t = \sigma(W_{hx}\cdot x_t+W_{hh}\cdot h_{t-1} + b_h) $$ 其中$\sigma$是激活函数,tanh或ReLU。$x_t$是t时刻的输入,$h_t$是当前的隐藏状态 $h_{t−1}$是上一时刻的隐藏状态 输出层公式: $$ y_t = W_{hy} \cdot h_t + b_y $$ $y_t$是当前时刻的输出 RNN的隐藏状态$h_t$起到了记忆的作用。 对于一整个序列,图示如下: pytorch实现 调库 可使用pytorch封装的nn.RNN模块。 1 2 3 4 5 6 7 8 9 10 11 class RNNModel(nn.Module): def __init__(self, input_dim, hidden_dim, output_dim=1, num_layers=1): super(RNNModel, self).__init__() self.rnn = nn.RNN(input_dim, hidden_dim, num_layers, batch_first=True) self.fc = nn.Linear(hidden_dim, output_dim) def forward(self, x): x, _ = self.