1900 字
10 分钟
本地 OCR 翻译器部署

前言#

技术要点:Wsl+Docker+Mangaocr+Lunatranlator
项目地址

部署参考

1.配置WSL#

官方文档
安装 WSL和Docker 参考视频

① 安装WSL
默认安装位置:C:\Users\PC\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState

wsl --install

② 设置WSL启动占用
在C:\Users\PC下创建.wslconfig 文件,并配置内容

[wsl2]                      
 
# 是否强制 WSL2/WSLg 子系统使用 Windows 代理设置(请根据实际需要启用)
autoProxy=true
            
# WSL2/WSLg DNS 代理隧道,以便由 Windows 代理转发 DNS 请求(请根据实际需要启用)
dnsTunneling=true           
 
# WSL2/WSLg 子系统的 Windows 防火墙集成,以便 Hyper-V 或者 WPF 能过滤子系统流量(请根据实际需要启用)
firewall=true
 
# 启用 WSLg GUI 图形化程序支持
guiApplications=true
 
 # 启用 IPv6 网络支持
ipv6=false                   
 
# 启用 localhost 网络转发支持
localhostForwarding=true 
 
 # 限制 WSL2/WSLg 子系统的最大内存占用
memory=2GB

# 将交换存储空间设置为 2GB,默认为可用内存的 25%
swap=2GB
 
# 启用 WSL2/WSLg 子系统嵌套虚拟化功能支持
nestedVirtualization=true   
 
# 启用镜像网络特性支持
networkingMode=mirrored
 
# 启用 WSL2/WSLg 子系统页面文件通报,以便 Windows 回收已分配但未使用的内存
#pageReporting=true
 
# 设置 WSL2/WSLg 子系统的逻辑 CPU 核心数为 8(最大肯定没法超过硬件的物理逻辑核心数)
processors=6
 
# 实验性功能
[experimental]
 
 # 启用空闲内存自动缓慢回收
autoMemoryReclaim=gradual
 
# 启用 WSL2/WSLg 子系统和 Windows 宿主之间的本地回环互通支持
hostAddressLoopback=true
 
 # 启用 WSL2/WSLg 子系统虚拟硬盘空间自动回收
sparseVhd=true
 
# 和 dnsTunneling 配合使用,决定是否使用 Windows DNS 缓存池
useWindowsDnsCache=false

1.2 出现的问题#

问题参考

进入wsl后输入

touch ~/.sudo_as_admin_successful

2.安装docker desktop for windows#

Docker官网
4.32版本(无烦恼版本下载)

打开docker for desktop后会在C:\Users\PC\AppData\Local\Docker\wsl创建两个磁盘

① 依次将磁盘移动到D盘

wsl -l -v 	#查看版本和wsl列表
wsl --shutdown 	#关闭系统
wsl --export docker-desktop D:\Environment\Docker\data-desktop.tar 	#移出数据
wsl --unregister docker-desktop	#卸载子系统
wsl -l -v #查看是否删除
wsl --import docker-desktop D:\Environment\Docker\main\ D:\Environment\Docker\data-desktop.tar	#导入数据

wsl --export docker-desktop-data D:\Environment\Docker\docker-desktop-data.tar 	#移出数据
wsl --unregister docker-desktop-data 	#卸载子系统
wsl -l -v #查看是否删除
wsl --import docker-desktop-data D:\Environment\Docker\disk\ D:\Environment\Docker\docker-desktop-data.tar --version 2	#导入数据

② 删除打包文件
参考文献
D:\Environment\Docker\data-desktop.tar 和 D:\Environment\Docker\docker-desktop-data.tar

③ 手动更改%APPDATA%\Docker\settings.json中的customWslDistroDir参数

...
  "customWslDistroDir": "D:\\Environment\\Docker",
...

原:读取与安装位置C:\Users\PC\AppData\Local\Docker\wsl
改完后:读取与安装位置D:\Environment\Docker
此时启动docker 会读取D:\Environment\Docker下disk和main这两个文件夹下的的vhdx磁盘文件

④ 验证 打开docker,验证docker,进入cmd后

docker version

⑤ 配置docker镜像加速【2024.7.1】
镜像加速参考

...
  "registry-mirrors": [
    "https://hub.uuuadc.top",
    "https://docker.anyhub.us.kg",
    "https://dockerhub.jobcher.com",
    "https://dockerhub.icu",
    "https://docker.ckyl.me",
    "https://dockerpull.com",
    "https://dockerproxy.cn",
    "https://docker.awsl9527.cn"
  ],
...

3.移动ubantu系统 (wsl操作系统容器的移动)#

参考文献

① 进行转移

wsl -l -v 	#查看版本和wsl列表
wsl --shutdown 	#关闭系统
wsl --export Ubuntu D:\Environment\Ubuntu\ubuntu.tar	#移出数据
wsl --unregister Ubuntu  	#卸载子系统
wsl -l -v   #查看是否删除
wsl --import Ubuntu D:\Environment\Ubuntu\ D:\Environment\Ubuntu\ubuntu.tar --version 2  	#导入数据

ubuntu.exe config --default-user <你之前的用户>   # 修改用户名

② 删除D:\Environment\Ubuntu\ubuntu.tar

③ 更改wsl默认子系统

wslconfig /setdefault Ubuntu 
wslconfig /list	#查看

4.安装LunaTranslator#

项目地址

5.构建manga-ocr#

参考文献1
参考文献2 (docker镜像地址)
参考文献3 (这个是部署文件,需要下载到本地,主要参考里面的启动代码和docker启动代码有什么不同)

① 创建docker-compose.yml 文件

version: "3.8"
name: manga_ocr
services:
  manga_ocr:
    image: nanoskript/manga-ocr
    container_name: manga_ocr_cpu
    ports:
      - 5665:5665
    environment:
      - PORT=5665

② 开始构建

docker-compose up

5.2.问题1: 获取不到截取图片的路径#

报错提示: "GET /image?image_path=D%3A%5CResources%5C%5BGame+Tool%5D+LunaTranslator%5CLunaTranslator%5Ccache%5Ctemp%5C5cc97859-5069-4635-bd02-b65e1c56beb5.png HTTP/1.1" 404 Not Found

因为docker拉取的nanoskript/manga-ocr镜像不是官网提供的,该作者对启动服务代码进行了更改,所以需要对其代码进行修改

解决方法:
① 修改 D:…\LunaTranslator\LunaTranslator\ocrengines\mangaocr.py

import requests
from ocrengines.baseocrclass import baseocr
import os, uuid, gobject
import base64, json

class OCR(baseocr):

    def ocr(self, imagebinary):

        self.checkempty(["Port"])
        self.port = self.config["Port"]

        body = {"image": str(base64.b64encode(imagebinary), "utf-8")}

        response = requests.post(f"http://127.0.0.1:{self.port}/image", data=json.dumps(body))
        
        try:
            return response.json()
        except Exception as e:
            raise Exception(response.text) from e

② 从项目文件中获取到main.py,将其进行修改

import io
import os
import base64

from fastapi import FastAPI, File, Request
from starlette.middleware.cors import CORSMiddleware
from starlette.responses import RedirectResponse
from manga_ocr import MangaOcr
from PIL import Image

app = FastAPI(title="manga-ocr-docker")
app.add_middleware(CORSMiddleware, allow_origins=["*"])
mocr = MangaOcr()


@app.get("/", include_in_schema=False)
async def route_index():
    return RedirectResponse("/docs")

@app.post("/manga-ocr", summary="Run OCR on an image.")
async def route_manga_ocr(image: bytes = File()):
    return mocr(Image.open(io.BytesIO(image)))

@app.post("/image", summary="Run OCR on an image.")
async def route_manga_ocr(request: Request):
    # 处理图片然后返回文字
    data = await request.json()
    image_base64 = data.get("image")
    # 解码 Base64 编码的图像数据
    image_data = base64.b64decode(image_base64)
    img = Image.open(io.BytesIO(image_data))
return mocr(img)

③ 然后把这个文件传输到容器内

D:\Development Projects\manga-ocr> docker ps
CONTAINER ID   IMAGE                  COMMAND                   CREATED         STATUS         PORTS
NAMES
3f4c6dfc8894   nanoskript/manga-ocr   "/bin/sh -c 'pdm run…"   7 seconds ago   Up 7 seconds   0.0.0.0:5665->5665/tcp   manga_ocr_cpu

D:\Development Projects\manga-ocr> docker cp ./main.py 3f4c6dfc8894:/main.py
Successfully copied 2.56kB to 3f4c6dfc8894:/main.py

D:\Development Projects\manga-ocr> docker-compose restart

6.将修改好的容器打包为一个新的镜像方便之后使用#

将容器打包并不会将 挂载卷的内容 和 环境变量 打包进去,此时会将容器更新的openai和安装的manga-ocr打包入新镜像中,之后使用这个镜像启动时,就不需要重新更新openai和安装manga-ocr了,否则每次重新构建容器就需要重新安装opanai和manga-ocr,而使用这个新镜像后就不需要了。

如果你不想构建镜像,那么你的容器就不能够删除,更改环境变量 或 更改GPT模型要在你更改好挂载的文件后,通过docker-compose restart来重启容器,来达到更新的效果。

而创建新镜像就可以随便删除容器,更改好变量后直接重构都没问题。

docker ps --all
docker commit <容器id> <镜像名> 

创建的镜像会与原镜像共享资源,可以不删除源镜像
修改docker-compose.yaml启动文件

version: "3.8"
name: manga_ocr
services:
  manga_ocr:
    image: my-manga-ocr:g1
    container_name: manga_ocr_cpu
    ports:
      - 5665:5665
    environment:
      - PORT=5665

此时可以删除原本的容器了,然后根据这个新镜像启动这个容器

7.全部构建完成后,磁盘空间会被扩大,产生不必要的占用空间,手动清理#

① 记录要清理的磁盘路径 D:\Environment\Docker\docker-desktop-data\ext4.vhdx

② wsl —shutdown # 关闭系统

③ wsl -l -v # 查看系统运行情况

④ diskpart # 运行管理计算机的驱动器的 DiskPart 命令

⑤ select vdisk file=“D:\Environment\Docker\docker-desktop-data\ext4.vhdx” # 选择磁盘

⑥ compact vdisk # 压缩磁盘

⑦ detach vdisk # 卸载磁盘

7.5.调试/测试:#

① 进入容器的方法

docker ps 
docker exec -it 容器ID /bin/bash

② 查看镜像和容器的大小

docker system df -v

7.6.完全卸载docker和wsl#

参考1

首先使用geek删除docker for desktop
然后进入 应用管理 卸载ubantu
然后 wsl --unregister Ubuntu

参考2

Windows搜索 ”启用或关闭Windows功能” 并关闭以下功能↓ (需要重启电脑)

7.7.可能会遇到的问题↓#

综合问题1.在docker-compose up时,会拉取镜像,此时发生ERROR拉取失败,会产生的镜像占用空间 (此时磁盘被撑大了,需要查看问题2)#

解决方法

综合问题2.删除镜像和容器后,磁盘空间没有减少 (这是因为wsl不会自动收缩磁盘,需要手动操作)#

解决方法

综合问题3.打开docker容器和镜像不见了!#

解决方法1
解决方法2

手动更改%APPDATA%\Docker\settings.json中的customWslDistroDir参数

此时打开docker for desktop

参考1
参考2
是Docker的问题,将docker升级到4.32版本

wsl --unregister docker-desktop-data 	#卸载子系统
wsl -l -v #查看是否删除
wsl --import  docker-desktop-data D:\Environment\Docker\disk\ D:\Environment\Docker\docker-desktop-data.tar --version 2	#导入数据

8.测试结果参考(仅CPU处理)#

本地 OCR 翻译器部署
https://fuwari.vercel.app/posts/部署教程/mangaocr/本地-ocr-翻译器部署/
作者
Ctory-Nily
发布于
2024-07-14
许可协议
CC BY-NC-SA 4.0