{"id":13739966,"url":"https://github.com/OysterQAQ/ACG2vec","last_synced_at":"2025-05-08T19:35:14.827Z","repository":{"id":63070995,"uuid":"558173053","full_name":"OysterQAQ/ACG2vec","owner":"OysterQAQ","description":"ACG2vec (Anime Comics Games to vector) are committed to creating a playground that combines ACG and Deep learning.（文本语义检索、以图搜图、语义搜图、图片超分辨率、推荐系统）","archived":false,"fork":false,"pushed_at":"2024-02-20T06:45:49.000Z","size":79,"stargazers_count":536,"open_issues_count":0,"forks_count":25,"subscribers_count":5,"default_branch":"master","last_synced_at":"2024-11-15T09:44:28.412Z","etag":null,"topics":["acg","anime","deep-learning","embedding","feature-extraction","image-search","image-super-resolution","keras","tensorflow"],"latest_commit_sha":null,"homepage":"https://cheerfun.dev/acg2vec/","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/OysterQAQ.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2022-10-27T02:58:32.000Z","updated_at":"2024-11-11T04:42:34.000Z","dependencies_parsed_at":"2024-04-17T21:42:30.976Z","dependency_job_id":"07fefca5-50e4-4842-b2b0-881c74f8e375","html_url":"https://github.com/OysterQAQ/ACG2vec","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OysterQAQ%2FACG2vec","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OysterQAQ%2FACG2vec/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OysterQAQ%2FACG2vec/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OysterQAQ%2FACG2vec/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/OysterQAQ","download_url":"https://codeload.github.com/OysterQAQ/ACG2vec/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253135611,"owners_count":21859672,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["acg","anime","deep-learning","embedding","feature-extraction","image-search","image-super-resolution","keras","tensorflow"],"created_at":"2024-08-03T04:00:40.430Z","updated_at":"2025-05-08T19:35:14.464Z","avatar_url":"https://github.com/OysterQAQ.png","language":null,"funding_links":[],"categories":["Uncategorized"],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n\u003cimg src=\"https://raw.githubusercontent.com/OysterQAQ/Blog-Image/master/68747470733a2f2f696d67686f73742e697076342e686f73742f642f7637564a645872572f323032322f31312f30382f446b694c53585a4e2f69636f6e3138302e706e673f646f776e6c6f61643d31.png\" width = \"180\" alt=\"pixivic_icon\"/\u003e\n\u003c/p\u003e\n\n\n### \u003cdiv align=\"center\"\u003e\u003cb\u003e\u003ca href=\"README.md\"\u003e简体中文\u003c/a\u003e | \u003ca href=\"README_EN.md\"\u003eEnglish\u003c/a\u003e\u003c/b\u003e\u003c/div\u003e\n\n## Introduction\n\n**ACG2vec**全称为**A**nime **C**omics **G**ames **to** **vec**tor。本repo会持续维护一些基于二次元相关的深度学习领域实践与探索。\n\n在线预览（目前包含文本搜索、以图搜图、文本搜图、图片分数预测）：[https://cheerfun.dev/acg2vec/](https://cheerfun.dev/acg2vec/)\n\n开源仓库：[https://github.com/OysterQAQ/ACG2vec](https://github.com/OysterQAQ/ACG2vec)\n\n演示页前端开源仓库：[https://github.com/wewewe131/acg2vec-frontend](https://github.com/wewewe131/acg2vec-frontend)\n\n以上两个仓库求个star QAQ🌟🌟🌟\n\n目前模块包括：\n\n* model：深度神经网络模型模块，目前包括\n  * **acgvoc2vec**：基于从维基百科动漫列表、萌娘百科、Bangumi、pixiv、AnimeList等来源获取清洗处理抽取的510w语句对微调的sentence-transformers模型，生成二次元相关文本的特征向量，用于各种下游任务（标签推荐，标签搜索，推荐系统等）\n  \n    可以使用Huggingface在线体验:https://huggingface.co/OysterQAQ/ACGVoc2vec\n  \n  * **dclip**：使用danburoo2021数据集对clip（ViT-L/14）模型进行微调。\n  \n    可以使用Huggingface在线体验:https://huggingface.co/OysterQAQ/DanbooruCLIP\n  \n  * **pix2score**：基于resnet101的多任务模型，用于预测动漫插图的收藏数、浏览数与情色级别（训练中）\n  \n  * **illust2vec**：从[DeepDanbooru](https://github.com/KichangKim/DeepDanbooru)模型去除预测头并对末尾层做均值池化的图片语义特征抽取模型\n  \n  * **real-cugan_tf**：当前最优秀的动漫领域超分模型之一[Real-CUGAN](https://github.com/bilibili/ailab/tree/main/Real-CUGAN)的tensorflow实现，依赖[tfjs](https://github.com/tensorflow/tfjs)框架完成自适应后端的能运行在浏览器上的动漫超分工具。\n  \n  * **recSys4Pix**：构建最小化现代推荐系统实践\n  \n* webapp：对外提供web服务模块。目前包括开箱即用的二次元插画标签预测服务、以图搜图服务、插画特征抽取服务、文本特征抽取服务\n\n* docker：基于容器化的部署模块，包括了部署所需要的配置文件与资源文件（未开发完成）\n\n## 💡预览\n\n### 语义文本搜索\n\n![image-20230725185441532](https://raw.githubusercontent.com/OysterQAQ/Blog-Image/master/image-20230725185441532.png)\n\n### 语义图像搜索\n\n![image-20230725190057379](https://raw.githubusercontent.com/OysterQAQ/Blog-Image/master/image-20230725190057379.png)\n\n### 插画综合评分预测\n\n![image-20230725185608823](https://raw.githubusercontent.com/OysterQAQ/Blog-Image/master/image-20230725185608823.png)\n\n### 以图搜图\n\n![4](https://raw.githubusercontent.com/OysterQAQ/Blog-Image/master/image-20230725185702808.png)\n\n### 图片超分辨率\n\n![image-20230916210759548](https://raw.githubusercontent.com/OysterQAQ/Blog-Image/master/image-20230916210759548.png)\n\n## Architecture\n\n\u003cimg src=\"https://raw.githubusercontent.com/OysterQAQ/Blog-Image/master/arch.png\" alt=\"image-20220827172516288\" style=\"border-radius:10px\" /\u003e\n\n## Model Structure\n\n### illust2vec\n\n结构概览为：[DeepDanbooru](https://github.com/KichangKim/DeepDanbooru)的输入层至activation_96层作为特征抽取器（学习率设置为1e-5）+各个任务自定义resnet block与dense预测头（学习率设置为1e-2）\n\n预测任务为pixiv插画的浏览数、收藏数、图片浏览级别（文本标签可以使用DeepDanbooru模型进行预测）。\n\nDeepDanbooru模型是基于resnet的预测模型，用于预测动漫插画的标签信息，完整模型输出纬度为8000。DeepDanbooru能很好的预测Danbooru数据集所描述的多标签多分类问题，Danbooru数据集的标签分布更加的均衡，对图片的描述更加的准确，但是标签中没有对图片收藏数与浏览数的预测，因此其输出中并没有包含图片的质量信息（一般笔触细腻，作画精美的作品会得到更多的浏览与收藏）。\n\n因此考虑将DeepDanbooru的前半部分拼接上自定义任务的模块，以预测收藏浏览作为代理任务的方式对DeepDanbooru的前半部分进行小学习率的微调（自定义任务的模块使用正常学习率），使其能够包含插图的质量信息。\n\n当模型拟合，将模型的特征抽取器模块单独取出，拼接上平均pooling层，使其做到输入一张图片，输出1024维的向量，该向量作为图片的特征向量，用于下游任务。\n\n之前也考虑过使用Danbooru数据集微调CLIP，但是loss一直不变，大概原因可能是这种对比学习的模型，其学习效率与batchsize相关性很大，batchsize越大，正样本所对应的负样本就越多。\n\n### acgvoc2vec\n\n结构为[sentence-transformers](https://github.com/UKPLab/sentence-transformers)，使用其**distiluse-base-multilingual-cased-v2**预训练权重，以5e-5的学习率在动漫相关语句对数据集下进行微调，损失函数为MultipleNegativesRankingLoss。\n\n数据集主要包括：\n\n* Bangumi\n\n  * 动画日文名-动画中文名\n  * 动画日文名-简介\n  * 动画中文名-简介\n  * 动画中文名-标签\n  * 动画日文名-角色\n  * 动画中文名-角色\n  * 声优日文名-声优中文名\n\n* pixiv\n\n  * 标签日文名-标签中文名\n* AnimeList\n\n  * 动画日文名-动画英文名\n\n* 维基百科\n\n  * 动画日文名-动画中文名\n  * 动画日文名-动画英文名\n  * 中英日详情页h2标题及其对应文本\n  * 简介多语言对照（中日英）\n  * 动画名-简介（中日英） \n\n* moegirl\n\n  * 动画中文名的简介-简介\n* 动画中文名+小标题-对应内容\n\n在进行爬取，清洗，处理后得到510w对文本对（还在持续增加），batchzise=80训练了20个epoch，使st的权重能够适应该问题空间，生成融合了领域知识的文本特征向量（体现为有关的文本距离更加接近，例如作品与登场人物，或者来自同一作品的登场人物）。\n\n### DCLIP\n\n使用danburoo2021数据集对clip（ViT-L/14）模型进行微调。\n\n0-3 epoch学习率为4e-6，权重衰减为1e-3\n\n4-8 epoch学习率为1e-6，权重衰减为1e-3\n\n标签预处理过程：\n\n```python\n            for i in range(length):\n                # 加载并且缩放图片\n                if not is_image(data_from_db.path[i]):\n                    continue\n\n                try:\n                    img = self.preprocess(\n                        Image.open(data_from_db.path[i].replace(\"./\", \"/mnt/lvm/danbooru2021/danbooru2021/\")))\n                except Exception as e:\n                    #print(e)\n                    continue\n                # 处理标签\n                tags = json.loads(data_from_db.tags[i])\n                # 优先选择人物和作品标签\n                category_group = {}\n                for tag in tags:\n                    category_group.setdefault(tag[\"category\"], []).append(tag)\n\n                # category_group=groupby(tags, key=lambda x: (x[\"category\"]))\n                character_list = category_group[4] if 4 in category_group else []\n                # 作品需要过滤以bad开头的\n\n                work_list = list(filter(\n                    lambda e:\n                               e[\"name\"] != \"original\"\n                            , category_group[3])) if 3 in category_group else []\n                # work_list=  category_group[5] if 5 in category_group else []\n                general_list = category_group[0] if 0 in category_group else []\n                caption = \"\"\n                caption_2 = None\n                for character in character_list:\n                    if len(work_list) != 0:\n                        # 去除括号内作品内容\n                        character[\"name\"] = re.sub(u\"\\\\(.*?\\\\)\", \"\", character[\"name\"])\n                    caption += character[\"name\"].replace(\"_\", \" \")\n                    caption += \",\"\n                caption = caption[:-1]\n                caption += \" \"\n                if len(work_list) != 0:\n                    caption += \"from \"\n                for work in work_list:\n                    caption += work[\"name\"].replace(\"_\", \" \")\n                    caption += \" \"\n                # 普通标签\n                if len(general_list) != 0:\n                    caption += \"with \"\n                if len(general_list) \u003e 20:\n                    general_list_1 = general_list[:int(len(general_list) / 2)]\n                    general_list_2 = general_list[int(len(general_list) / 2):]\n                    caption_2 = caption\n                    for general in general_list_1:\n                        if general[\"name\"].find(\"girl\") == -1 and general[\"name\"].find(\"boy\") == -1 and len(\n                                re.findall(is_contain, general[\"name\"])) != 0:\n                            caption_2 += general[\"name\"].replace(\"_\", \" \")\n                            caption_2 += \",\"\n                    caption_2 = caption_2[:-1]\n                    for general in general_list_2:\n                        if general[\"name\"].find(\"girl\") == -1 and general[\"name\"].find(\"boy\") == -1 and len(\n                                re.findall(is_contain, general[\"name\"])) != 0:\n                            caption += general[\"name\"].replace(\"_\", \" \")\n                            caption += \",\"\n                    caption = caption[:-1]\n                else:\n                    for general in general_list:\n                        # 如果标签数据目大于20 则拆分成两个caption\n                        if general[\"name\"].find(\"girl\") == -1 and general[\"name\"].find(\"boy\") == -1 and len(\n                                re.findall(is_contain, general[\"name\"])) != 0:\n                            caption += general[\"name\"].replace(\"_\", \" \")\n                            caption += \",\"\n                    caption = caption[:-1]\n\n                # 标签汇总成语句\n                # tokenize语句\n                # 返回\n                # 过长截断 不行的话用huggingface的\n                text_1 = clip.tokenize(texts=caption, truncate=True)\n                text_2= None\n                if caption_2 is not None:\n                    text_2 = clip.tokenize(texts=caption_2, truncate=True)\n                # 处理逻辑\n\n                # print(img)\n                yield img, text_1[0]\n                if text_2 is not None:\n                    yield img, text_2[0]\n```\n\n### Pix2Score\n\n#### 简介\n\n在线体验：Https://cheerfun.org/acg2vec\n\ngithub 主仓库地址（ tensorflow 的 savemodel 格式可以在 release 中下载）： https://github.com/OysterQAQ/ACG2vec（求star～）\n\n基于[resnet101]()对插画的浏览数、收藏数、情色级别的分类预测，以 1e-3 的学习率在动漫插画数据集下进行训练，输入尺寸为224x224，输出字典为\n\n```json\n{\n\t\"bookmark_predict\": {\n\t\t\"0\": \"0-10\",\n\t\t\"1\": \"10-30\",\n\t\t\"2\": \"30-50\",\n\t\t\"3\": \"50-70\",\n\t\t\"4\": \"70-100\",\n\t\t\"5\": \"100-130\",\n\t\t\"6\": \"130-170\",\n\t\t\"7\": \"170-220\",\n\t\t\"8\": \"220-300\",\n\t\t\"9\": \"300-400\",\n\t\t\"10\": \"400-550\",\n\t\t\"11\": \"550-800\",\n\t\t\"12\": \"800-1300\",\n\t\t\"13\": \"1300-2700\",\n\t\t\"14\": \"2700-∞\"\n\t},\n\t\"view_predict\": {\n\t\t\"0\": \"0-500\",\n\t\t\"1\": \"500-700\",\n\t\t\"2\": \"700-1000\",\n\t\t\"3\": \"1000-1500\",\n\t\t\"4\": \"1500-2000\",\n\t\t\"5\": \"2000-2500\",\n\t\t\"6\": \"2500-3000\",\n\t\t\"7\": \"3000-4000\",\n\t\t\"8\": \"4000-5000\",\n\t\t\"9\": \"5000-6500\",\n\t\t\"10\": \"6500-8500\",\n\t\t\"11\": \"8500-12000\",\n\t\t\"12\": \"12000-19000\",\n\t\t\"13\": \"19000-35000\",\n\t\t\"14\": \"35000-∞\"\n\t},\n\t\"sanity_predict\": {\n\t\t\"0\": \"0-2\",\n\t\t\"1\": \"2-4\",\n\t\t\"2\": \"4-6\",\n\t\t\"3\": \"6-7\",\n\t\t\"4\": \"7-∞\"\n\t}\n}\n```\n\n#### 项目过程中解决的问题\n\n- **样本类别比例失衡** 将元数据导入clickhouse查找n分位数来重新划分分段范围\n- **数据集过大** 无法一次读入内存，使用generator逐步读取\n- **训练链路中io瓶颈** 取数据与预处理数据造成瓶颈，将dataset导出成tfrecord二进制格式（实测可以跑满机械硬盘连续读写值，大概是250M/s）\n- **开启混合精度导致loss nan** 调整学习率\n- **多任务梯度带偏** 多任务存在简单任务与复杂任务，学习到后期，网络中的权重更新的梯度被困难任务loss和简单任务loss的加和共同所影响，为了维持简单任务的loss会导致复杂任务loss下降缓慢，后期通过手动调整loss权重得到改善，也实现了pcgrad但是没有什么改善\n- **模型训练正常推理输出nan** 排查出bn层moving_mean与moving_variance权重异常（这也是为什么训练正常推理异常的原因），重新使用对应层初始化器初始化异常权重后，继续训练（之前训练拟合进度慢的问题也和这个有关），出现nan权重大概是因为混合精度造成的，详见https://oysterqaq.com/archives/1463\n- **部署的预处理一致性** 在模型本体集成base64图片预处理层，无需顾虑预处理行为（resize）不同导致的推理结果差异\n\n### cugan_tf\n\n当前最优秀的动漫领域超分模型之一[Real-CUGAN](https://github.com/bilibili/ailab/tree/main/Real-CUGAN)的tensorflow实现，依赖[tfjs](https://github.com/tensorflow/tfjs)框架完成自适应后端的能运行在浏览器上的动漫超分工具。\n\n原版实现分为切块后超分与整图超分，两种都以实现，但切块超分版本转为tfjs模型后在网页运行不正常，已向[tfjs](https://github.com/tensorflow/tfjs)仓库提交[issue](https://github.com/tensorflow/tfjs/issues/7960)。目前预览版本是整图超分版本，由于内存限制，限制了原始图片大小（512x512以内），后续issue解决将发布切块超分，大概率将不会有限制。\n\n#### pytorch模型迁移到tensorflow应该注意的点\n\n- **图片处理默认维度顺序：** tensorflow为nhwc，pytorch为nchw，卷积权重维度顺序也不相同\n\n- **tensorflow转置卷积无法自定义padding：** Conv2DTranspose层padding设为0，后续使用slice手动crop输出\n- **tf.pad无法接受负数：**使用 tf.slice作为替代\n- **多尺寸输入导致无法batch ：**无解\n- **延迟设置输入尺寸运行时获取size：**这是tensorflow图模型的限制\n- **python操作逻辑最好翻译为tensorflow 分支选择api**\n- **TensorArray：**TensorArray是图模式中python list替代品， TensorArray在eager模式TensorArray.write(i, x)可以直接生效，而在graph模式时需要将引用赋值给自身\n\n## Technical overview\n\n* Tensorflow 2.0作为模型训练引擎\n* 基于Spring Boot的web服务\n* 基于TF-serving的模型部署与前向推理\n* 基于Milvus实现的topk近似向量检索\n* 基于docker-compose的容器化跨平台部署\n* 基于Tendis的元数据存储\n\n## Deploy\n\n克隆本repo并在docker文件夹中使用docker-compose进行部署\n\n```shell\n#拉取项目\ngit clone https://github.com/OysterQAQ/ACG2vec-docker.git\n#下载release（1.0.0_for_tf_serving）中的模型包 解压到tf-serving/models\n#使用docker-compose部署\ndocker-compose up -d\n```\n\n## Usage\n\n基于restful api对外提供服务，以下是api文档（默认端口为8081，可在docker-compose.yaml中修改）：\n\n### Pix2Score图像打分\n\n\n#### 基本信息\n\n**Path：** /images/socresByPix2Score\n\n**Method：** POST\n\n**接口描述：**\n\n\n#### 请求参数\n\n**Headers**\n\n| 参数名称     | 参数值              | 是否必须 | 示例 | 备注 |\n| ------------ | ------------------- | -------- | ---- | ---- |\n| Content-Type | multipart/form-data | 是       |      |      |\n| **Body**     |                     |          |      |      |\n\n| 参数名称 | 参数类型 | 是否必须 | 示例 | 备注 |\n| -------- | -------- | -------- | ---- | ---- |\n| image    | file     | 是       |      |      |\n\n#### 返回数据\n\n\u003ctable\u003e\n  \u003cthead class=\"ant-table-thead\"\u003e\n    \u003ctr\u003e\n      \u003cth key=name\u003e名称\u003c/th\u003e\u003cth key=type\u003e类型\u003c/th\u003e\u003cth key=required\u003e是否必须\u003c/th\u003e\u003cth key=default\u003e默认值\u003c/th\u003e\u003cth key=desc\u003e备注\u003c/th\u003e\u003cth key=sub\u003e其他信息\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\u003ctbody className=\"ant-table-tbody\"\u003e\u003ctr key=0-0\u003e\u003ctd key=0\u003e\u003cspan style=\"padding-left: 0px\"\u003e\u003cspan style=\"color: #8c8a8a\"\u003e\u003c/span\u003e message\u003c/span\u003e\u003c/td\u003e\u003ctd key=1\u003e\u003cspan\u003estring\u003c/span\u003e\u003c/td\u003e\u003ctd key=2\u003e非必须\u003c/td\u003e\u003ctd key=3\u003e\u003c/td\u003e\u003ctd key=4\u003e\u003cspan style=\"white-space: pre-wrap\"\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd key=5\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr key=0-1\u003e\u003ctd key=0\u003e\u003cspan style=\"padding-left: 0px\"\u003e\u003cspan style=\"color: #8c8a8a\"\u003e\u003c/span\u003e data\u003c/span\u003e\u003c/td\u003e\u003ctd key=1\u003e\u003cspan\u003eobject\u003c/span\u003e\u003c/td\u003e\u003ctd key=2\u003e非必须\u003c/td\u003e\u003ctd key=3\u003e\u003c/td\u003e\u003ctd key=4\u003e\u003cspan style=\"white-space: pre-wrap\"\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd key=5\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr key=0-1-0\u003e\u003ctd key=0\u003e\u003cspan style=\"padding-left: 20px\"\u003e\u003cspan style=\"color: #8c8a8a\"\u003e├─\u003c/span\u003e bookmarkPredict\u003c/span\u003e\u003c/td\u003e\u003ctd key=1\u003e\u003cspan\u003enumber []\u003c/span\u003e\u003c/td\u003e\u003ctd key=2\u003e非必须\u003c/td\u003e\u003ctd key=3\u003e\u003c/td\u003e\u003ctd key=4\u003e\u003cspan style=\"white-space: pre-wrap\"\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd key=5\u003e\u003cp key=3\u003e\u003cspan style=\"font-weight: '700'\"\u003eitem 类型: \u003c/span\u003e\u003cspan\u003enumber\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr key=array-33\u003e\u003ctd key=0\u003e\u003cspan style=\"padding-left: 40px\"\u003e\u003cspan style=\"color: #8c8a8a\"\u003e├─\u003c/span\u003e \u003c/span\u003e\u003c/td\u003e\u003ctd key=1\u003e\u003cspan\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd key=2\u003e非必须\u003c/td\u003e\u003ctd key=3\u003e\u003c/td\u003e\u003ctd key=4\u003e\u003cspan style=\"white-space: pre-wrap\"\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd key=5\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr key=0-1-1\u003e\u003ctd key=0\u003e\u003cspan style=\"padding-left: 20px\"\u003e\u003cspan style=\"color: #8c8a8a\"\u003e├─\u003c/span\u003e viewPredict\u003c/span\u003e\u003c/td\u003e\u003ctd key=1\u003e\u003cspan\u003enumber []\u003c/span\u003e\u003c/td\u003e\u003ctd key=2\u003e非必须\u003c/td\u003e\u003ctd key=3\u003e\u003c/td\u003e\u003ctd key=4\u003e\u003cspan style=\"white-space: pre-wrap\"\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd key=5\u003e\u003cp key=3\u003e\u003cspan style=\"font-weight: '700'\"\u003eitem 类型: \u003c/span\u003e\u003cspan\u003enumber\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr key=array-34\u003e\u003ctd key=0\u003e\u003cspan style=\"padding-left: 40px\"\u003e\u003cspan style=\"color: #8c8a8a\"\u003e├─\u003c/span\u003e \u003c/span\u003e\u003c/td\u003e\u003ctd key=1\u003e\u003cspan\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd key=2\u003e非必须\u003c/td\u003e\u003ctd key=3\u003e\u003c/td\u003e\u003ctd key=4\u003e\u003cspan style=\"white-space: pre-wrap\"\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd key=5\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr key=0-1-2\u003e\u003ctd key=0\u003e\u003cspan style=\"padding-left: 20px\"\u003e\u003cspan style=\"color: #8c8a8a\"\u003e├─\u003c/span\u003e sanityPredict\u003c/span\u003e\u003c/td\u003e\u003ctd key=1\u003e\u003cspan\u003enumber []\u003c/span\u003e\u003c/td\u003e\u003ctd key=2\u003e非必须\u003c/td\u003e\u003ctd key=3\u003e\u003c/td\u003e\u003ctd key=4\u003e\u003cspan style=\"white-space: pre-wrap\"\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd key=5\u003e\u003cp key=3\u003e\u003cspan style=\"font-weight: '700'\"\u003eitem 类型: \u003c/span\u003e\u003cspan\u003enumber\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr key=array-35\u003e\u003ctd key=0\u003e\u003cspan style=\"padding-left: 40px\"\u003e\u003cspan style=\"color: #8c8a8a\"\u003e├─\u003c/span\u003e \u003c/span\u003e\u003c/td\u003e\u003ctd key=1\u003e\u003cspan\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd key=2\u003e非必须\u003c/td\u003e\u003ctd key=3\u003e\u003c/td\u003e\u003ctd key=4\u003e\u003cspan style=\"white-space: pre-wrap\"\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd key=5\u003e\u003c/td\u003e\u003c/tr\u003e\n               \u003c/tbody\u003e\n              \u003c/table\u003e\n\n\n### acgvoc2vec文本特征抽取\n\n\n#### 基本信息\n\n**Path：** /models/acgvoc2vec/feature\n\n**Method：** POST\n\n**接口描述：**\n\n\n#### 请求参数\n\n**Headers**\n\n| 参数名称     | 参数值                            | 是否必须 | 示例 | 备注 |\n| ------------ | --------------------------------- | -------- | ---- | ---- |\n| Content-Type | application/x-www-form-urlencoded | 是       |      |      |\n| **Query**    |                                   |          |      |      |\n\n| 参数名称 | 是否必须 | 示例 | 备注 |\n| -------- | -------- | ---- | ---- |\n| text     | 是       |      |      |\n\n#### 返回数据\n\n\u003ctable\u003e\n  \u003cthead class=\"ant-table-thead\"\u003e\n    \u003ctr\u003e\n      \u003cth key=name\u003e名称\u003c/th\u003e\u003cth key=type\u003e类型\u003c/th\u003e\u003cth key=required\u003e是否必须\u003c/th\u003e\u003cth key=default\u003e默认值\u003c/th\u003e\u003cth key=desc\u003e备注\u003c/th\u003e\u003cth key=sub\u003e其他信息\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\u003ctbody className=\"ant-table-tbody\"\u003e\u003ctr key=0-0\u003e\u003ctd key=0\u003e\u003cspan style=\"padding-left: 0px\"\u003e\u003cspan style=\"color: #8c8a8a\"\u003e\u003c/span\u003e message\u003c/span\u003e\u003c/td\u003e\u003ctd key=1\u003e\u003cspan\u003estring\u003c/span\u003e\u003c/td\u003e\u003ctd key=2\u003e非必须\u003c/td\u003e\u003ctd key=3\u003e\u003c/td\u003e\u003ctd key=4\u003e\u003cspan style=\"white-space: pre-wrap\"\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd key=5\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr key=0-1\u003e\u003ctd key=0\u003e\u003cspan style=\"padding-left: 0px\"\u003e\u003cspan style=\"color: #8c8a8a\"\u003e\u003c/span\u003e data\u003c/span\u003e\u003c/td\u003e\u003ctd key=1\u003e\u003cspan\u003enumber []\u003c/span\u003e\u003c/td\u003e\u003ctd key=2\u003e非必须\u003c/td\u003e\u003ctd key=3\u003e\u003c/td\u003e\u003ctd key=4\u003e\u003cspan style=\"white-space: pre-wrap\"\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd key=5\u003e\u003cp key=3\u003e\u003cspan style=\"font-weight: '700'\"\u003eitem 类型: \u003c/span\u003e\u003cspan\u003enumber\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr key=array-36\u003e\u003ctd key=0\u003e\u003cspan style=\"padding-left: 20px\"\u003e\u003cspan style=\"color: #8c8a8a\"\u003e├─\u003c/span\u003e \u003c/span\u003e\u003c/td\u003e\u003ctd key=1\u003e\u003cspan\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd key=2\u003e非必须\u003c/td\u003e\u003ctd key=3\u003e\u003c/td\u003e\u003ctd key=4\u003e\u003cspan style=\"white-space: pre-wrap\"\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd key=5\u003e\u003c/td\u003e\u003c/tr\u003e\n               \u003c/tbody\u003e\n              \u003c/table\u003e\n\n\n### dclip_text文本特征抽取\n\n#### 基本信息\n\n**Path：** /models/dclip_text/feature\n\n**Method：** POST\n\n**接口描述：**\n\n\n#### 请求参数\n\n**Headers**\n\n| 参数名称     | 参数值                            | 是否必须 | 示例 | 备注 |\n| ------------ | --------------------------------- | -------- | ---- | ---- |\n| Content-Type | application/x-www-form-urlencoded | 是       |      |      |\n| **Query**    |                                   |          |      |      |\n\n| 参数名称 | 是否必须 | 示例 | 备注 |\n| -------- | -------- | ---- | ---- |\n| text     | 是       |      |      |\n\n#### 返回数据\n\n\u003ctable\u003e\n  \u003cthead class=\"ant-table-thead\"\u003e\n    \u003ctr\u003e\n      \u003cth key=name\u003e名称\u003c/th\u003e\u003cth key=type\u003e类型\u003c/th\u003e\u003cth key=required\u003e是否必须\u003c/th\u003e\u003cth key=default\u003e默认值\u003c/th\u003e\u003cth key=desc\u003e备注\u003c/th\u003e\u003cth key=sub\u003e其他信息\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\u003ctbody className=\"ant-table-tbody\"\u003e\u003ctr key=0-0\u003e\u003ctd key=0\u003e\u003cspan style=\"padding-left: 0px\"\u003e\u003cspan style=\"color: #8c8a8a\"\u003e\u003c/span\u003e message\u003c/span\u003e\u003c/td\u003e\u003ctd key=1\u003e\u003cspan\u003estring\u003c/span\u003e\u003c/td\u003e\u003ctd key=2\u003e非必须\u003c/td\u003e\u003ctd key=3\u003e\u003c/td\u003e\u003ctd key=4\u003e\u003cspan style=\"white-space: pre-wrap\"\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd key=5\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr key=0-1\u003e\u003ctd key=0\u003e\u003cspan style=\"padding-left: 0px\"\u003e\u003cspan style=\"color: #8c8a8a\"\u003e\u003c/span\u003e data\u003c/span\u003e\u003c/td\u003e\u003ctd key=1\u003e\u003cspan\u003enumber []\u003c/span\u003e\u003c/td\u003e\u003ctd key=2\u003e非必须\u003c/td\u003e\u003ctd key=3\u003e\u003c/td\u003e\u003ctd key=4\u003e\u003cspan style=\"white-space: pre-wrap\"\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd key=5\u003e\u003cp key=3\u003e\u003cspan style=\"font-weight: '700'\"\u003eitem 类型: \u003c/span\u003e\u003cspan\u003enumber\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr key=array-37\u003e\u003ctd key=0\u003e\u003cspan style=\"padding-left: 20px\"\u003e\u003cspan style=\"color: #8c8a8a\"\u003e├─\u003c/span\u003e \u003c/span\u003e\u003c/td\u003e\u003ctd key=1\u003e\u003cspan\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd key=2\u003e非必须\u003c/td\u003e\u003ctd key=3\u003e\u003c/td\u003e\u003ctd key=4\u003e\u003cspan style=\"white-space: pre-wrap\"\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd key=5\u003e\u003c/td\u003e\u003c/tr\u003e\n               \u003c/tbody\u003e\n              \u003c/table\u003e\n\n\n### deepdanbooru图片打标签\n\n\n#### 基本信息\n\n**Path：** /images/labelsByDeepDanbooru\n\n**Method：** POST\n\n**接口描述：**\n\n\n#### 请求参数\n\n**Headers**\n\n| 参数名称     | 参数值              | 是否必须 | 示例 | 备注 |\n| ------------ | ------------------- | -------- | ---- | ---- |\n| Content-Type | multipart/form-data | 是       |      |      |\n| **Body**     |                     |          |      |      |\n\n| 参数名称 | 参数类型 | 是否必须 | 示例 | 备注 |\n| -------- | -------- | -------- | ---- | ---- |\n| image    | file     | 是       |      |      |\n\n#### 返回数据\n\n\u003ctable\u003e\n  \u003cthead class=\"ant-table-thead\"\u003e\n    \u003ctr\u003e\n      \u003cth key=name\u003e名称\u003c/th\u003e\u003cth key=type\u003e类型\u003c/th\u003e\u003cth key=required\u003e是否必须\u003c/th\u003e\u003cth key=default\u003e默认值\u003c/th\u003e\u003cth key=desc\u003e备注\u003c/th\u003e\u003cth key=sub\u003e其他信息\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\u003ctbody className=\"ant-table-tbody\"\u003e\u003ctr key=0-0\u003e\u003ctd key=0\u003e\u003cspan style=\"padding-left: 0px\"\u003e\u003cspan style=\"color: #8c8a8a\"\u003e\u003c/span\u003e message\u003c/span\u003e\u003c/td\u003e\u003ctd key=1\u003e\u003cspan\u003estring\u003c/span\u003e\u003c/td\u003e\u003ctd key=2\u003e非必须\u003c/td\u003e\u003ctd key=3\u003e\u003c/td\u003e\u003ctd key=4\u003e\u003cspan style=\"white-space: pre-wrap\"\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd key=5\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr key=0-1\u003e\u003ctd key=0\u003e\u003cspan style=\"padding-left: 0px\"\u003e\u003cspan style=\"color: #8c8a8a\"\u003e\u003c/span\u003e data\u003c/span\u003e\u003c/td\u003e\u003ctd key=1\u003e\u003cspan\u003estring []\u003c/span\u003e\u003c/td\u003e\u003ctd key=2\u003e非必须\u003c/td\u003e\u003ctd key=3\u003e\u003c/td\u003e\u003ctd key=4\u003e\u003cspan style=\"white-space: pre-wrap\"\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd key=5\u003e\u003cp key=3\u003e\u003cspan style=\"font-weight: '700'\"\u003eitem 类型: \u003c/span\u003e\u003cspan\u003estring\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr key=array-38\u003e\u003ctd key=0\u003e\u003cspan style=\"padding-left: 20px\"\u003e\u003cspan style=\"color: #8c8a8a\"\u003e├─\u003c/span\u003e \u003c/span\u003e\u003c/td\u003e\u003ctd key=1\u003e\u003cspan\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd key=2\u003e非必须\u003c/td\u003e\u003ctd key=3\u003e\u003c/td\u003e\u003ctd key=4\u003e\u003cspan style=\"white-space: pre-wrap\"\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd key=5\u003e\u003c/td\u003e\u003c/tr\u003e\n               \u003c/tbody\u003e\n              \u003c/table\u003e\n\n\n### illust2vec图片特征抽取\n\n#### 基本信息\n\n**Path：** /models/illust2vec/feature\n\n**Method：** POST\n\n**接口描述：**\n\n\n#### 请求参数\n\n**Headers**\n\n| 参数名称     | 参数值              | 是否必须 | 示例 | 备注 |\n| ------------ | ------------------- | -------- | ---- | ---- |\n| Content-Type | multipart/form-data | 是       |      |      |\n| **Body**     |                     |          |      |      |\n\n| 参数名称 | 参数类型 | 是否必须 | 示例 | 备注 |\n| -------- | -------- | -------- | ---- | ---- |\n| image    | file     | 是       |      |      |\n\n#### 返回数据\n\n\u003ctable\u003e\n  \u003cthead class=\"ant-table-thead\"\u003e\n    \u003ctr\u003e\n      \u003cth key=name\u003e名称\u003c/th\u003e\u003cth key=type\u003e类型\u003c/th\u003e\u003cth key=required\u003e是否必须\u003c/th\u003e\u003cth key=default\u003e默认值\u003c/th\u003e\u003cth key=desc\u003e备注\u003c/th\u003e\u003cth key=sub\u003e其他信息\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\u003ctbody className=\"ant-table-tbody\"\u003e\u003ctr key=0-0\u003e\u003ctd key=0\u003e\u003cspan style=\"padding-left: 0px\"\u003e\u003cspan style=\"color: #8c8a8a\"\u003e\u003c/span\u003e message\u003c/span\u003e\u003c/td\u003e\u003ctd key=1\u003e\u003cspan\u003estring\u003c/span\u003e\u003c/td\u003e\u003ctd key=2\u003e非必须\u003c/td\u003e\u003ctd key=3\u003e\u003c/td\u003e\u003ctd key=4\u003e\u003cspan style=\"white-space: pre-wrap\"\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd key=5\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr key=0-1\u003e\u003ctd key=0\u003e\u003cspan style=\"padding-left: 0px\"\u003e\u003cspan style=\"color: #8c8a8a\"\u003e\u003c/span\u003e data\u003c/span\u003e\u003c/td\u003e\u003ctd key=1\u003e\u003cspan\u003enumber []\u003c/span\u003e\u003c/td\u003e\u003ctd key=2\u003e非必须\u003c/td\u003e\u003ctd key=3\u003e\u003c/td\u003e\u003ctd key=4\u003e\u003cspan style=\"white-space: pre-wrap\"\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd key=5\u003e\u003cp key=3\u003e\u003cspan style=\"font-weight: '700'\"\u003eitem 类型: \u003c/span\u003e\u003cspan\u003enumber\u003c/span\u003e\u003c/p\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr key=array-39\u003e\u003ctd key=0\u003e\u003cspan style=\"padding-left: 20px\"\u003e\u003cspan style=\"color: #8c8a8a\"\u003e├─\u003c/span\u003e \u003c/span\u003e\u003c/td\u003e\u003ctd key=1\u003e\u003cspan\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd key=2\u003e非必须\u003c/td\u003e\u003ctd key=3\u003e\u003c/td\u003e\u003ctd key=4\u003e\u003cspan style=\"white-space: pre-wrap\"\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd key=5\u003e\u003c/td\u003e\u003c/tr\u003e\n               \u003c/tbody\u003e\n              \u003c/table\u003e\n\n\n## Thanks\n\n本项目离不开以下开源项目\n\n* [DeepDanbooru](https://github.com/KichangKim/DeepDanbooru)\n* [sentence-transformers](https://github.com/UKPLab/sentence-transformers)\n* [Milvus](https://github.com/milvus-io/milvus)\n* [TensorFlow](https://github.com/tensorflow/tensorflow)\n* [Keras](https://github.com/keras-team/keras)\n* [Spring Boot](https://github.com/spring-projects/spring-boot)\n* [SeaweedFS](https://github.com/seaweedfs/seaweedfs)\n* [TF-serving](https://github.com/tensorflow/serving)\n* [Tendis](https://github.com/Tencent/Tendis)\n* [Docker](https://github.com/docker/compose)\n\n## Trend\n\n![stars](https://starchart.cc/OysterQAQ/ACG2vec.svg)\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FOysterQAQ%2FACG2vec","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FOysterQAQ%2FACG2vec","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FOysterQAQ%2FACG2vec/lists"}