2025-02-28 12:06:54
基于 AI 的本地素材搜索引擎。扫描本地的图片以及视频,可以用自然语言进行查找。
实现中文语义下的 以图搜图、截图搜视频、查找本地素材、根据文字描述匹配画面、视频帧搜索、根据画面描述搜索视频。找素材再也不用费力去一个个翻 tag 了。
首先,默认看本文的照片视频都是存在 windows 系统上的,以下都是基于 win 系统的操作
需要准备3个或4个东西
Python 3.11.7,Git ,CUDA,这三个的下载地址在文章的最前边。
视情况,你可能还需要一个魔法上网工具(假设你的魔法上网工具代理在127.0.0.1:6808)
我这里采用直接系统内安装Python 3.11.7的方式(其实安装Python3.12.9也是可用的,看你需求了。)
如果你会用Miniconda,也可以用Miniconda实现Python多版本切换。
把页面拉到底,找到【Windows installer (64-bit)】点击下载
安装是注意,到这一步,需要如下图这样勾选 Add Python to PATH
然后再点上边的 Install Now
python
安装完成后,命令行里输入Python -V
,如果返回Python 3.11.7
那就是成功安装了。
命令行里输入 python -m pip install --upgrade pip
安装升级pip到最新版。
访问 Git 下载页面
点击【Download for Windows】,【64-bit Git for Windows Setup】点击下载
一路下一步安装
命令行运行git --version
,返回git version 2.XX.0.windows.1
就是安装成功了。
命令行运行nvidia-smi
,看下自己显卡支持的 CUDA版本
(升级显卡驱动可能会让你支持更高版本的 CUDA)
接下来前往英伟达 CUDA 官网,下载对应版本。
注意请下载,你对应的版本号最高的版本,比如我的是11.7的,那就下11.7.1(这里最后的.1意思是,11.7版本的1号升级版)
选你自己的操作系统版本,注意下个离线安装包【exe [local]】,在线安装的话,速度还是比较堪忧的。
以下假设你当前文件目录是D:\github\
,
避免玩其他 Python 项目时出现项目依赖冲突问题
pip install virtualenv
pip install virtualenvwrapper
# virtualenvwrapper一定要在virtualenv后安装
virtualenv MSWenv
这将在当前目录下创建一个名为”MSWenv”的虚拟环境。
D:\github\MSWenv\Scripts\activate
这将激活虚拟环境,并将您的终端提示符更改为虚拟环境名称类似这样
(MSWenv) D:\github> ▏
# 拉取仓库
git clone https://github.com/chn-lee-yumi/MaterialSearch.git
# 进入目录
cd MaterialSearch
# 安装全部依赖(GPU运行)
pip install -U -r requirements.txt --index-url=https://download.pytorch.org/whl/cu121 --extra-index-url=https://pypi.org/simple/
# 安装全部依赖(CPU运行)
pip install -U -r requirements.txt --index-url=https://pypi.org/simple/
注意:
1. GPU运行里的cu121
,作者原始脚本里这里是cu118
,虽然理论上最新的是cu124,但是作者限制torch版本要小于2.4,所以实际最大只能用到CU121。
2. 如果你这会儿还拿不准用 GPU 还是 CPU 运行的话,请先按照【安装全部依赖(GPU运行)】执行,torch的GPU版本也支持CPU运行。
按照以下命令启动项目
python main.py
如果不知道在你设备上 CPU 和 GPU 那个更快,可以在上边步骤中先走 【安装全部依赖(GPU运行)】,在依赖安装完毕后执行python benchmark.py
,运行基准测试。
建议通过在项目根目录创建.env文件修改配置
.env文件配置示例:
# 下面添加扫描路径,用英文半角逗号分隔
ASSETS_PATH=D:\Videos,D:\Pctures
# 如果路径或文件名包含这些字符串,就跳过,逗号分隔,不区分大小写
IGNORE_STRINGS=thumb,avatar,__MACOSX,icons,cache
# 图片最小宽度,小于此宽度则忽略。不需要可以改成0
IMAGE_MIN_WIDTH=64
# 图片最小高度,小于此高度则忽略。不需要可以改成0。
IMAGE_MIN_HEIGHT=64
# 视频每隔多少秒取一帧,视频展示的时候,间隔小于等于2倍FRAME_INTERVAL的算为同一个素材,同时开始时间和结束时间各延长0.5个FRAME_INTERVAL
FRAME_INTERVAL=2
# 视频搜索出来的片段前后延长时间,单位秒,如果搜索出来的片段不完整,可以调大这个值
VIDEO_EXTENSION_LENGTH=1
# 素材处理批次大小,过大会导致显存不足而无法运行或拖慢速度。
SCAN_PROCESS_BATCH_SIZE=4
# 支持的图片拓展名,逗号分隔,请填小写
IMAGE_EXTENSIONS=.jpg,.jpeg,.png,.gif,.heic,.webp,.bmp
# 支持的视频拓展名,逗号分隔,请填小写
VIDEO_EXTENSIONS=.mp4,.flv,.mov,.mkv,.webm,.avi
# 监听IP,如果想允许远程访问,把这个改成0.0.0.0
HOST=127.0.0.1
# 监听端口
PORT=8085
# 运行模式
DEVICE=cuda
# 使用模型
MODEL_NAME=OFA-Sys/chinese-clip-vit-base-patch16
# 数据库保存位置
SQLALCHEMY_DATABASE_URL=sqlite:///./instance/assets.db
# 是否web页启用登录验证功能,如需启用改为true
ENABLE_LOGIN=False
# 登录用户名
USERNAME=admin
# 登录密码
PASSWORD=123456
# 是否自动扫描设置路径下的文件变化,如果开启,则会在指定时间内进行扫描,每天只会扫描一次
AUTO_SCAN=False
# 自动扫描开始时间
AUTO_SCAN_START_TIME=22:30
# 自动扫描结束时间
AUTO_SCAN_END_TIME=8:00
# 是否启用文件校验(如果是,则通过文件校验来判断文件是否更新,否则通过修改时间判断)
ENABLE_CHECKSUM=False
IMAGE_EXTENSIONS
和VIDEO_EXTENSIONS
增加对应的后缀。
小图片没被扫描到的话,可以调低IMAGE_MIN_WIDTH
和IMAGE_MIN_HEIGHT
重试
运行模式(DEVICE)可以写的选项有auto/cpu/cuda/mps`四种,如果写 auto 的话,优先级是这样的:cuda > mps > directml > cpu
一般来说默认的小模型就够用了,如果你显存大或者感觉小模型的精度不够,可以改成更大的模型
更换模型需要删库重新扫描!否则搜索会报错。数据库路径见SQLALCHEMY_DATABASE_URL
参数。
模型越大,扫描速度越慢,且占用的内存和显存越大。
如果显存较小且用了较大的模型,并在扫描的时候出现了”CUDA out of memory”,请换成较小的模型或者改小SCAN_PROCESS_BATCH_SIZE
。如果显存充足,可以调大上面的SCAN_PROCESS_BATCH_SIZE
来提高扫描速度。
因为目前的N卡驱动,支持了内存显存融合,超过物理显存的模型会被放在内存中,不会直接炸显存
可以启动任务管理器——性能——GPU——专用GPU内存查看实际显存占用。不要让斜杠前的数字过于接近斜杠后的数字(比如:10.7/12GB就是良好配置,而11.8/12GB就不太好了)
OFA-Sys/chinese-clip-vit-base-patch16
OFA-Sys/chinese-clip-vit-large-patch14-336px
OFA-Sys/chinese-clip-vit-huge-patch14
openai/clip-vit-base-patch16
openai/clip-vit-large-patch14-336
myrun.txt
call D:\github\MSWenv\Scripts\activate
python main.py
pause
myrun.bat
以后启动直接运行这个文件就好了。打开浏览器访问最后提示的http://127.0.0.1:8085
The post 本地 AI 图片视频搜索引擎——MaterialSearch appeared first on 秋风于渭水.
2025-02-27 12:02:06
前天晚上微软最新发布的支持文档中,微软表示已经暂停向安装 AutoCAD 2022 的设备推送 Windows 11 24H2 ,待修复问题后才会恢复推送。
简而言之就是:如果你电脑内安装了 AutoCAD 2022 再将系统升级到 Windows 11 24H2 ,CAD 就会频繁奔溃退出。其他版本如 AutoCAD 2020、AutoCAD 2024 则不会受到影响。( AutoCAD 2024 肯定没事,我用的好好的)
消息来源:微软 Windows 11,版本 24H2 已知问题和通知
根据微软的说法,应该是 AutoCAD 2022 与系统之间的兼容性问题导致的,微软已经联系了 Autodesk 公司协助解决问题。待问题修复前使用 AutoCAD 2022 的用户不要手动升级安装 Windows 11 24H2
要注意微软的兼容性保留措施(暂停推送),只对系统内的 Windows Update、Windows更新 功能起作用,
如果使用 ISO 镜像、Windows 11安装助手、Media Creation 工具等方式安装的话是会绕过兼容性检测的。
如果你已经不小心升级到 Windows 11 24H2 了。可以考虑换个其他版本的 CAD ,比如 AutoCAD 2024 之类的不受影响的版本。
The post 【资讯】AutoCAD 2022 在 Windows 11 24H2 上出现频繁崩溃 请不要升级你的系统或CAD appeared first on 秋风于渭水.
2025-02-26 17:52:02
之前也不是没收到过 DMCA 投诉,但是如此离谱的 DMCA 还是头一次收到。
论北京爱奇艺科技有限公司(以下简称爱艺奇)的法务部门有多离谱,爱艺奇不是中国公司吗?咋中文都看不懂了?一个句子,开头、中间、结尾分别含有关键词的一部分给我投诉了?
而且举报的很多站点提供的盗版资源也不是爱艺奇持有版权的那个资源。
版权声明:头图所用 iQiyi 图标来源为 Donnnno,遵守 CC BY-SA 4协议。
大中午的突然收到谷歌邮件,告知有版权移除。
我感觉自己还挺遵守版权的啊,发生啥了?
打开一看,哦,原来是RSS翻译站啊。
RSS翻译的来源基本都是各种媒体的新闻报道,
在我的认知里新闻申明来源的转载和翻译应该是不侵犯版权的
为啥会收到版权投诉,然后我接着往下看
啥?我看见了啥?版权所有者:北京爱奇艺科技有限公司?版权物:film“我们之间”?
我直接惊呆好不好,我第一反应是,是不是有境外媒体报道了这个电影引用什么东西,导致我把原文翻译后的结果,让爱艺奇认为我侵权了?
于是我去看了下那个网址上到底有什么,结果……就这?
这和爱奇艺主张的电影《我们之间》有什么关系呢?
《 我们 的生活一夜 之间 发生了变化》=《我们之间》?
合着这玩意还能拆开理解的?
而且这里面的出现的唯一一个外链是 BBC 的,爱奇艺你咋不投诉英国 BBC 呢?
你在国内用爱艺奇里是搜不到任何名字叫《我们之间》的影视资源的,
爱奇艺现在有版权的能勉强挨上这四个字的,叫《我们之间的秘密》
所以可以这样缩短用主张版权吗?
爱奇艺确实有一个名字是“我们之间”的东西叫《Between us》(是一个泰剧,中文翻译是“麻绳”或“我们之间”,爱艺奇持有东南亚区版权)
而其他叫《我们之间》的资源,一个是韩剧,一个是西班牙电影,爱艺奇则通通都没有版权。
之前也不是没收到过 DMCA 投诉,但是如此离谱的 DMCA 还是头一次收到。
这也过于草台班子了,感觉纯粹是,程序自动化关键词搜索,然后自动一次性批量举报的结果。
经过申请详细清单,终于知道爱艺奇主张是什么东西了,是泰剧《我们之间》,就是上边提到的《Between us》(爱奇艺站内链接)爱奇艺持有东南亚区域版权。
但是实际上被爱艺奇举报的站点的网页涉及的关键词是《我们之间的秘密》、《我们之间的敌人》《Just Between Us 》、《我们之间》、《the space between us》、《day dau gai between us》等资源的影视站。他们的页面语言中文和英文都有,之间的共同点是都同时含有:我们
、之间
、between us
、播放
、观看
、play
、saw it
等关键词。
爱艺奇确实如上边所说的,在扩大化举报任何网页中含有这个名词的非合规影视资源站点。,哪怕对方实际提供的并不是爱艺奇有版权的资源,只是页面中含有关键词
【 我们 的生活一夜 之间 发生了变化,而且没有人预料到这一点||Our life changed overnight and no-one saw it coming 】
同时含有了我们
、之间
、saw it()
关键词,同时这不是已知的合规影视站点,所以爱艺奇的自动化版权维护工具就认为,这是一个提供《我们之间》播放的视频站,就给举报了。
The post 论爱艺奇的法务部门有多离谱,头一次见还能这样发 DMCA 的 appeared first on 秋风于渭水.
2025-02-18 15:01:36
一个全白嫖的免费随机图片 API 实现,通过使用免费的 Cloudflare Worker 与免费的微博相册实现。
通过使用 Cloudflare Worker 反向代理微博图床内图片实现:1、绕过微博防盗链。2、避免网页端看到微博图片链接从而查找到图片发布者的微博。
首先也是最简单的,随机从图片链接中抽一个,返回结果,简单粗暴,直接写进代码里,在图片数量在2K行以内基本不用太担心性能问题。
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
async function handleRequest(request) {
var background_urls = [
'https://ww2.sinaimg.cn/large/be6ad69bgw1eys2ubi8loj218g0p0h3y.jpg',
'https://ww4.sinaimg.cn/large/be6ad69bgw1eys2ubqm6ij218g0p0ql4.jpg',
'https://ww3.sinaimg.cn/large/be6ad69bgw1eys2ubroxej218g0p0nki.jpg',
'https://ww3.sinaimg.cn/large/be6ad69bgw1eys2ubpohkj218g0p01a1.jpg',
'https://ww2.sinaimg.cn/large/be6ad69bgw1eys2ubkx6ij218g0p07ht.jpg'
/*需要随机到的图片的链接*/
]
var index = Math.floor((Math.random()*background_urls.length));
res = await fetch(background_urls[index])
return new Response(res.body, {
headers: { 'content-type': 'image/jpeg' },
})
}
为什么要反代微博图床的图片,而不是直接返回图片地址给客户,主要是两个原因,
1. 微博是有防盗链设置的,会判断请求的 referer 是否是微博
2. 通过微博图片地址是可以反查到图片发送者的,如果打算提供公开服务,且不想暴漏自己的微博的话,最好隐藏图片实际地址。
因为代码有点长就不写文章里了,去github看吧。
基本就是构建请求头,检查图片地址是微博的话,就修改 referer 解决微博的防盗链,然后反向代理图片,返回结果。
var background_urls = [
'https://ww2.sinaimg.cn/large/be6ad69bgw1eys2ubi8loj218g0p0h3y.jpg',
'https://ww4.sinaimg.cn/large/be6ad69bgw1eys2ubqm6ij218g0p0ql4.jpg',
'https://ww3.sinaimg.cn/large/be6ad69bgw1eys2ubroxej218g0p0nki.jpg',
'https://ww3.sinaimg.cn/large/be6ad69bgw1eys2ubpohkj218g0p01a1.jpg',
'https://ww2.sinaimg.cn/large/be6ad69bgw1eys2ubkx6ij218g0p07ht.jpg'
/*需要随机到的图片的链接,注意最后一行没英文逗号*/
以上基本自用就够了,但是如果你打算提供公开服务那么还需要在 Cloudflare 内考虑好这些事情
Worker那10W 次请求看起来很高,一天才 86400 秒够每秒1次多了,但如果有人反复刷或者用户极多的时候,还是很快就会没的了。最多的时候我的某个 API 后端怼了8个 Cloudflare Worker来满足前端需求,就这每天快到 UTC 0的时候还经常有额度接近 90% 的提醒。
1. 屏蔽爬虫。很多数据收集公司的采集爬虫是不管源站死活的,他会高频反复的采集网址。
2. 限制请求速率,防止有人恶意刷图。
3. 考虑缓存优化,现在每次刷新都是一张新图。
The post 随机图片API:基于 Cloudflare Worker + 微博图床 appeared first on 秋风于渭水.
2025-01-13 10:21:39
又双叒叕要春运了,又要开始和其他人在 12306 搏斗抢票了。
基于多年的 12306 抢票经验,总结了一些抢票小技巧,希望能帮到你。
携程,管家,分流最终还是用你的12306账号去12306给你买票的。分流比较纯净,携程那可是能干出往你账号里添加不认识的人,然后用你的账号给其他人抢票的事情的。亦或者广州到重庆没票,给你买个广州南到佛山西,但是APP内已完成订单最大的字写的是《广州-重庆》让你以为你买到了全程票,你上车后才发现7个小时的车程,实际有座的区间只有20分钟的抽象事。
12306 放票不是完全整点,可能会早2~3秒,所以别卡整点刷新。(因为网页和APP显示的时间是你设备的时间,并不是真·北京时间)
如果你发现 12306 放票后,该车次直接就没看到票,这不是被人秒买走了,而是你的区间没开始售票。如果你这个区间售票,你肯定能看到票。
提交候补也是有排队的,是按你交钱的时间算的,未来有票了,谁先交钱先给谁票。
The post 年更话题:春运 12306 怎么抢票 appeared first on 秋风于渭水.
2024-12-30 17:30:16
终于在建站11年的当下终于给博客增加了文章归档页。
是基于 Rank Math SEO 插件的 Sitemap Settings 功能实现了一个简单的文章归档页。
顺带在文章归档页内塞了一个额外的网站数据年度统计功能。
大概长这样:文章归档
起因是在《WindowTabs: 让几乎一切 Windows 窗口支持多标签功能》一文下,博友 ddw2019 在评论中提到我的站点“没有找到 Archive 页面,一个个翻页起来,感觉还是有点点费劲的呀。”
之前我一直感觉文章归档页的感知不强,我认为它的主要意义和好处是:系统化整理文章、提高可发现性、增强用户体验、SEO优化、展示创作历程这 5 个方面。
毕竟现在右侧有文章分类、随机文章、热门文章三个模块。系统化整理文章、提高可发现性性上已经足够了。
在 SEO 优化上文章归档页固然归可以帮助搜索引擎更好地抓取和索引博客内容,不过在已经有 xml 站点地图的时候,文章归档页对于提供博客的 SEO 优化上作用不大,相较这种 html 格式站点地图,xml 格式的站点地图对搜索引擎会更加友好一些。
不过嘛,确实考虑到博客里确实是缺少一个展示创作历程和增强用户体验的东西。于是在2024年的年底,终于在建站 11 年后决定加上这个东西。
那么现在问题来了,如何多快好省的实现文章归档页 Archive 呢?
从这个博客的可以称之为极简的风格上估计大家都能看出,我并不太喜欢在美化折腾博客页面上消耗过多精力。
方案二 利用现有插件 Rank Math SEO 的站点地图功能实现。
好处是利用了现有插件,少装了一个插件,缺点是样式就简陋的多了,样式的自定义空间也小的多。
方案三 自己实现一个页面
优点是更加轻量,样式完全可以自定义。缺点是自己写东西需要费更多的时间。
权衡利弊后,我决定先用方案二顶上,先解决有无问题再说。
以下的必要前提是:你要有装 Rank Math SEO 这个插件,并且开启了他的 Sitemap 组件。
这里我只介绍必要的操作,如果想了解更多一点,这里有篇不错的文章 《家庭数据中心系列Rank Math SEO设置与优化-无敌的个人博客》
ex.your.domain/archives
并发布。进入博客后台,左侧找到 Rank Math SEO 的 Sitemap Settings 部分,切换到 HTML Sitemap 标签,并开启开关。
将 Display Format (显示模式)设置为 Page 也就是页面模式。如果你想在文章归档页放入额外的东西,也可以设置为 Shortcode 模式,这样上一步时,需要在你想要插入文章归档页的地方写短代码[rank_math_html_sitemap]
即可。
Sort by (排序方式),既然是文章归档页,那自然是选 Published Date (基于发表日期)啦。并且开启下边的 Show Dates (显示日期),这样文章后面就会显示发布日期了。
Item Titles (项目标题),作为文章归档页,建议选 Item Titles (文章标题)而不是 SEO Titles (SEO用标题)这两者的区别是:SEO用标题是给搜索引擎和搜索结果用户看的,可能会比实际的文章标题会有些奇妙的拉长和缩短。比如文章实际标题很长,但是 SEO 标题可能会为了能保证在搜索结果页把关键词凸显出来会相对减少次要描述。也就是说 Item Titles (文章标题)更能反映文章内容。
最后保存即可,现在前边设定的固定链接看到一个比较简陋的,文章归档页了。
类似本站这样:文章归档 (https://www.tjsky.net/archives)
本来事情就该结束了,结果中午的时候,我又在博友圈里看到了 ts小陈 的文章:《为WordPress网站添加年度数据汇总》
我发现,“诶,这个东西不错嘛,可以很直观的展现每年博客的发展数据。”
随后尝试直接套用代码,然后果不其然的发现:事情并没有那么简单。
毕竟我现在用的主题上次更新已经是2022年了,主题并没有完美支持页面模板php文件。
并不能像他原文介绍的那样:
于是我又研究了一下WordPress这个页面模板php文件应该怎么写,以及他代码具体是做了什么。
重新写了适配自己主题的页面模板文件。主要修改点是三个
修改其中统计字数的函数str_word_count()
为mb_strlen()
中文不用空格来分隔单词,对于中文字符串,str_word_count()
会将两个标点之间的整个字符串都视为一个单词,mb_strlen()
则会根据当前PHP设定的编码自适应用基于UTF8或gbk等编码正确统计字数。所以改一下得到准确的字数统计。
//修改前的代码,在原文文件的第79行
word_count = str_word_count(strip_tags(content)); // 去除HTML标签后计算字数
//修改后的代码
word_count = mb_strlen(strip_tags(content)); // 去除HTML标签后计算中文字数
大部分面板和一键脚本部署的 PHP 应该默认就开了 mb_strlen 这个函数,不过对于用虚拟主机的可能需要注意下,这个 PHP 函数不一定被启用了。
原文写的是”数据使用 Memcached 缓存”,让人以为只能用于 Memcached。不过实际上,如果你用 Redis 或者其他什么缓存,只要你装了对应的缓存插件,比如用 Redis 并且装了 Redis Object Cache。可以保证wp_cache_get()
和 wp_cache_set()
函数能正常工作就不需要注释掉缓存代码,不然每次都现场计算一次,这性能浪费不小。
最终效果如下图
很直观的数据
2017年上一个博客被我rm -rf */
干没了之后,在 17 年 12月 底重建,18 年还在保持正常的更新,可惜博客没啥人看(看评论数量),外在驱动力不足 导致 19 ~ 21 年我基本上没更新过博客,21 年底,因为一些机缘巧合博客收获了一波较大流量,加之因为这个机缘巧合重新拾起写代码的乐趣,重新开始恢复正常的更新频率。
The post 给博客增加 文章归档 和 年度统计 功能 appeared first on 秋风于渭水.