2024年11月

来源:晓飞的算法工程笔记 公众号,转载请注明出处

论文: SAM4MLLM: Enhance Multi-Modal Large Language Model for Referring Expression Segmentation

创新点


  • 提出了一种允许
    MLLM
    理解像素级细节的方法
    SAM4MLLM
    ,无需改变
    MLLM
    模型架构、引入新标记或使用额外损失,该方法简单但对引用表达分割(
    RES
    )非常有效。
  • 为了连接
    MLLM

    SAM
    ,引入了一种新颖的方法,通过主动询问语言系统来获取提示点线索。
  • 在各种
    RES
    基准上进行实验,包括
    RES
    数据集、
    GRES

    ReasonSeg
    ,验证了
    SAM4MLLM
    的有效性,并展示了其在处理复杂像素感知任务中的优良性能。

内容概述


SAM4MLLM
是一种创新的方法,集成
Segment Anything Model

SAM
)与多模态大型语言模型(
MLLMs
)以实现像素感知任务。

  1. 首先,在
    MLLM
    训练数据集中引入像素级信息,而不改变原有的
    MLLM
    架构,这使得
    MLLM
    能够使用与主流
    LLM
    相同的文本交叉熵损失来理解像素级信息。
  2. 其次,考虑到输入分辨率限制和模型架构未明确设计用于视觉任务,
    MLLM
    在像素表达方面可能存在的潜在限制。进一步利用
    SAM
    增强输出,通过后处理
    MLLM
    的输出以相对简单的方式获得更高精度的分割掩码。
  3. 最后,为了在
    SAM

    MLLM
    之间建立联系,一种简单的方法是使
    MLLM
    生成
    SAM
    的提示点。利用
    LLM
    的对话能力,主动要求
    MLLM
    获取
    SAM
    的有效提示点。

SAM4MLLM
解决了
RES
问题,使得
MLLMs
能够学习像素级的位置信息。将详细的视觉信息与大型语言模型强大的表达能力以统一的基于语言的方式结合起来,而在学习中没有额外的计算开销。

SAM4MLLM


编码分割掩码为
SAM
提示

现有的用于分割的
MLLMs
依赖于模型架构的专门设计、分割特定的
token
和异构损失函数来预测对象掩码。而
SAM4MLLM
利用了
SAM
的特点,将少量文本提示
token
(边界框加上几个指示它们是否位于对象区域的点)转换为高质量的连续分割掩码。

SAM4MLLM
使用在边界框内采样的点作为离散提示。具体而言,使用一个边界框
\(Prompt_B \in \mathbb{N}^4\)

\(\mathcal{K}\)
个点来编码任意形状的掩码。
\(\mathcal{K}\)
个点的提示,每个点包含三个值:
\(x\)
坐标、
\(y\)
坐标以及它是否在掩码上,编码为
\(Prompt_P \in \mathbb{N}^{\mathcal{K} \times 3}\)

通过将连续分割掩码编码为离散的
SAM
提示,避免了添加任何
token
或改变模型结构,同时仅使用文本自回归交叉熵损失进行训练。这种方法与语言模型的原始训练模式一致,使得
MLLMs
能够理解像素级信息,并促进未来的模型扩展变得更加容易。

使用
MLLM
提示
SAM

为了将
SAM
以统一的方式纳入
MLLM
,一个主要问题在于获取
SAM
的提示点,包括在物体掩码区域内的正点(
inside
)和在外部的负点(
outside
)。为此,提出了两种解决方案:提示点生成(
Prompt-Point Generation
,
PPG
)和主动查询提示点(
Proactive Query of Prompt-Points
,
PQPP
)。

PPG
直接采用
MLLM
来生成提示点和边界框,但同时生成多个点的学习将面临挑战,因此仅使用了少量提示点。
PQPP
则利用了
MLLM
的对话能力,首先询问一个粗略的边界框,然后通过问答的方式在边界框内探测多个感兴趣的点以提示
SAM

  • SAM4MLLM-PPG

PPG
采用了一种能够同时接受文本提示和图像输入的
MLLM
。为了使
MLLM
与分割任务对齐,使用了参数高效的微调技术
LoRA
,从而基于包含图像-文本对和真实掩码的
RES
数据集进行模型训练。
LoRA
输出位置提示,包括边界框
\(Prompt_B \in \mathbb{N}^4\)

\(k\)
组正点和负点
\(Prompt_P \in \mathbb{N}^{(n_1+n_2)k \times 3}\)
,如图 (
a
) 所示,其中一组包含
\(n_1\)
个正点和
\(n_2\)
个负点(
\(n_1=2, n_2=1\)
)。

为了向
LoRA
提供位置监督,在训练阶段根据物体掩码随机采样
\(K\)
组点(
\(K>k\)
),然后将这些提示发送给
SAM
。对于每一组,
SAM
输出分割结果。过滤掉与真实掩码相比
IoU
较低的提示,仅保留前
\(k\)
组(如图 (
c
) 所示)。在该实现中,仅需要文本损失(自回归交叉熵损失)。
\(K\)
通常为
64

\(k=1\)

在推理阶段,
LoRA
直接输出发送给
SAM
进行分割的点,如图 (
b
) 所示。

  • SAM4MLLM-PQPP

PQPP
利用
MLLM
的查询-响应能力,而不是直接生成提示。对提示点进行采样,并主动询问
MLLM
这些点是否在掩码内(或外)。在训练阶段,根据真实掩码随机采样一个边界框和
\(K\)
组点,并进行两轮对话。在对话的第一轮中,
LoRA
响应一个边界框。在第二轮中,对于每个
\((n_1+n_2)K\)
个点,
LoRA
在训练期间响应该点是否在掩码内(是或否)。

在推理阶段,
LoRA
在第一轮中为输入的文本查询和图像输出一个边界框。然后,在边界框内均匀采样点并在第二轮再次发送给
MLLM-LoRA
,并询问它们是否为正点(或负点),用于
SAM
进行分割。通常将网格大小设置为
\(5\times 5\)
。为了在发送到
SAM
之前提供高质量的提示点,低置信度的点将被移除。

RES训练

为了使基础
MLLM

RES
任务对齐,使用包含与
RES
相关示例的三个数据集来指导模型朝目标前进。其中两个(
RES
数据集和
gRefCOCO
数据集)包含具有真实掩码的
RES
数据,第三个(
VQA
)是一个没有掩码的视觉对话数据集,用于进一步增强联合视觉-语言理解的总体能力。

在训练期间,为了保持
MLLM
在图像上的泛化能力,冻结了大部分网络参数,只调整了
MLLM
的视觉重采样器和
LoRA
适配器。

对于上述提到的所有数据集,我们在训练过程中不使用数据增强,因为翻转和/或裁剪可能会改变图像中物体的相对位置或关系。

主要实验




如果本文对你有帮助,麻烦点个赞或在看呗~
更多内容请关注 微信公众号【晓飞的算法工程笔记】

work-life balance.

Harbor 介绍

  • Harbor是一个开源的企业级Docker Registry服务,它提供了一个安全、可信赖的仓库来存储和管理Docker镜像。Harbor翻译为中文名称为"庇护;居住;"。可以理解为是Docker镜像的"居住环境"或者是镜像的"庇护所"。Harbor最初由VMware公司开发,旨在解决企业级Docker镜像管理的安全和可信任性问题。VMware于2016年发布,在2017年,VMware将Harbor开源,这使得更广泛的社区和组织可以自由地使用和贡献代码。Harbor是一个成熟、功能丰富且安全可靠的企业级Docker Registry服务,为企业容器化应用的部署和管理提供了强大的支持。

  • 我们在日常 Docker 容器使用和管理过程中,渐渐发现部署企业私有仓库往往是很有必要的, 它可以帮助你管理企业的一些敏感镜像, 同时由于 Docker Hub 的下载速度和 GFW 的原因, 往往需要将一些无法直接下载的镜像导入本地私有仓库. 而 Harbor 就是部署企业私有仓库的一个不二之选。

Harbor 特性

  • 基于角色的访问控制
    :用户与 Docker 镜像仓库通过“项目”进行组织管理,一个用户可以对多个镜像仓库在同一命名空间(project)里有不同的权限。
  • 镜像复制
    :镜像可以在多个 Registry 实例中复制(同步)。尤其适合于负载均衡,高可用,混合云和多云的场景。
  • 图形化用户界面
    :用户可以通过浏览器来浏览,检索当前 Docker 镜像仓库,管理项目和命名空间。
  • AD/LDAP 支持
    :Harbor 可以集成企业内部已有的 AD/LDAP,用于鉴权认证管理。
  • 审计管理
    :所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。
  • 国际化
    :已拥有英文、中文、德文、日文和俄文的本地化版本。更多的语言将会添加进来。
  • RESTful API
    :RESTful API 提供给管理员对于 Harbor 更多的操控, 使得与其它管理软件集成变得更容易。
  • 部署简单
    :提供在线和离线两种安装工具, 也可以安装到 vSphere 平台(OVA 方式)虚拟设备。

Harbor 和 Registry的比较

Harbor和Registry都是Docker的镜像仓库,但是Harbor作为更多企业的选择,是因为相比较于Regisrty来说,它具有很多的优势。

  • 提供基于Web界面的图形化管理界面,操作更友好。
  • 支持用户、项目和镜像的访问控制机制。
  • 可以对镜像进行扫描查找漏洞,提升安全性。
  • 完全支持LDAP/AD等标准化的企业用户管理。
  • 可以很好地集成到CI/CD流程中。
  • 提供API开放功能,便于第三方系统对接。

很适合团队和中小企业使用。

Harbor 架构

  • proxy
    :对应启动组件nginx。它是一个nginx反向代理,代理Notary client(镜像认证)、docker client(镜像上传下载)和浏览器的访问请求(Core Service)给后端的各服务器。
  • UI(Core Service)
    :对应启动组件harbor-ui。底层数据存储使用mysql数据库,主要提供了四个子功能。
    • UI
      :一个web管理页面ui
    • API
      :Harbor暴露的API服务。
    • Auth
      :用户认证服务,decode后的token中的用户信息在这里进行认证;auth后端可以接db、ldap、uaa三种认证实现。
    • Token服务
      :负责根据用户在每个project中的role来为每个docker push/pull 命令发布一个token,如果docker client发送给registry的请求没有带token,registry会重定向请求到token服务创建token。
  • Registry
    :对应启动组件registry。负责存储镜像文件和处理镜像的pull/push命令。Harbor对镜像进行强制的访问控制,Registry会将每个客户端的每个pull/push请求转发到token服务来获取有效的token。
  • Admin Service
    :对应启动组件harbor-admin server。是系统的配置管理中心附带检查存储用量,ui和jobserver启动时需要加载adminserver配置。
  • job server
    :对应启动组件harbor-jobservice。负责镜像复制工作,它和Registry通信。从一个Registry pull镜像然后push到另一个Registry,并记录job_log.
  • Log Collector
    :对应启动组件harbor-log。日志汇总组件,通过docker的log-driver把日志汇总到一起。
  • DB
    :对应启动组件harbor-db,负责存储project、user、role、replication、image_scan、access等的metadata数据。

Harbor 大概需要以下几个容器组成:

  • ui (Harbor的核心服务)。
  • log (运行着rsyslog的容器,进行日志收集)。
  • mysql (由官方mysql镜像构成的数据库容器)。
  • Nginx (使用Nginx做反向代理)。
  • registry (官方的Docker registry)。
  • adminserver (Harbor的配置数据管理器)。
  • jobservice (Harbor的任务管理服务)。
  • redis (用于存储session)。

本文harbor安装版本:harbor-offline-installer-v2.11.1.tgz
需要特别注意:由于Harbor是基于Docker Registry V2版本,所以Docker Engine必须大于20.10.10-ce+版本,docker-compose必须要大于v1.18.0+版本!

安装 Docker

详细安装步骤可参考

# 安装必要的依赖包
root@ubuntu2204:~# apt install apt-transport-https ca-certificates curl gnupg lsb-release -y

# 添加软件源的GPG密钥及docker源(阿里)
root@ubuntu2204:~# curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
root@ubuntu2204:~# add-apt-repository "deb [arch=$(dpkg --print-architecture)] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

# 选择安装指定稳定版, 例如 5:25.0.5-1~ubuntu.22.04~jammy
root@ubuntu2204:~# apt-cache madison docker-ce | awk '{ print $3 }'
5:27.3.1-1~ubuntu.22.04~jammy
5:27.3.0-1~ubuntu.22.04~jammy
......
5:26.0.2-1~ubuntu.22.04~jammy
5:26.0.1-1~ubuntu.22.04~jammy
5:26.0.0-1~ubuntu.22.04~jammy
5:25.0.5-1~ubuntu.22.04~jammy
5:25.0.4-1~ubuntu.22.04~jammy
......

root@ubuntu2204:~# VERSION_STRING=5:25.0.5-1~ubuntu.22.04~jammy
root@ubuntu2204:~# apt-get install docker-ce=$VERSION_STRING docker-ce-cli=$VERSION_STRING containerd.io docker-buildx-plugin docker-compose-plugin -y

# 查看docker信息
root@ubuntu2204:~# docker -v
Docker version 25.0.5, build 5dc9bcc
root@ubuntu2204:~#
root@ubuntu2204:~# docker version
Client: Docker Engine - Community
 Version:           25.0.5
 API version:       1.44
 Go version:        go1.21.8
 Git commit:        5dc9bcc
 Built:             Tue Mar 19 15:05:10 2024
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          25.0.5
  API version:      1.44 (minimum version 1.24)
  Go version:       go1.21.8
  Git commit:       e63daec
  Built:            Tue Mar 19 15:05:10 2024
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.7.22
  GitCommit:        7f7fdf5fed64eb6a7caf99b3e12efcf9d60e311c
 runc:
  Version:          1.1.14
  GitCommit:        v1.1.14-0-g2c9f560
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

root@ubuntu2204:~# ps -ef | grep docker
root       16048       1  0 14:56 ?        00:00:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
root       16245   12531  0 14:57 pts/1    00:00:00 grep --color=auto docker

# 启动|停止|重启|查看|开机自启
root@ubuntu2204:~# systemctl start|stop|restart|status|enable docker
 
# 测试 docker 是否安装正确
root@ubuntu2204:~# docker run --rm hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c1ec31eb5944: Pull complete
Digest: sha256:d211f485f2dd1dee407a80973c8f129f00d54604d2c90732e8e320e5038a0348
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

# 若能正常输出以上信息,则说明安装成功。

安装 Harbor 仓库

配置HTTPS证书

# 生成证书颁发机构证书
# 1.生成 CA 证书私钥
root@ubuntu2204:~# openssl genrsa -out ca.key 4096

# 2.生成 CA 证书
root@ubuntu2204:~# openssl req -x509 -new -nodes -sha512 -days 3650 -subj "/C=CN/ST=GD/L=GZ/O=DovOps/OU=IT/CN=zwc.harbor.com" -key ca.key -out ca.crt

# 参数说明:
#   C,Country,代表国家
#   ST,STate,代表省份
#   L,Location,代表城市
#   O,Organization,代表组织,公司
#   OU,Organization Unit,代表部门
#   CN,Common Name,代表服务器域名


# 生成服务器证书 
# 1.生成私钥
root@ubuntu2204:~# openssl genrsa -out zwc.harbor.com.key 4096

# 2.生成证书签名请求 (CSR)
root@ubuntu2204:~# openssl req -sha512 -new -subj "/C=CN/ST=GD/L=GZ/O=DovOps/OU=IT/CN=zwc.harbor.com" -key zwc.harbor.com.key -out zwc.harbor.com.csr

# 3.生成 x509 v3 扩展文件
root@ubuntu2204:~# cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1=zwc.harbor.com
DNS.2=svr.harbor.com
EOF

# 4.使用 v3.ext 文件来为您的 Harbor 主机生成证书
root@ubuntu2204:~# openssl x509 -req -sha512 -days 3650 -extfile v3.ext -CA ca.crt -CAkey ca.key -CAcreateserial -in zwc.harbor.com.csr -out zwc.harbor.com.crt
Certificate request self-signature ok
subject=C = CN, ST = GD, L = GZ, O = DovOps, OU = IT, CN = zwc.harbor.com


# 向 Harbor 和 Docker 提供证书 
# 1.将服务器证书和密钥复制到 Harbor 主机上的 certficates 文件夹中(根据自己实际环境)
root@ubuntu2204:~# mkdir -p /data/app/harbor/certs
root@ubuntu2204:~# cp zwc.harbor.com.crt  /data/app/harbor/certs
root@ubuntu2204:~# cp zwc.harbor.com.key  /data/app/harbor/certs

# 2.转变 zwc.harbor.com.crt 到 docker.zwc.harbor.com.crt,供 Docker 使用
root@ubuntu2204:~# openssl x509 -inform PEM -in zwc.harbor.com.crt -out docker.zwc.harbor.com.cert

# 3.将服务器证书、密钥和 CA 文件复制到 Harbor 主机上的 Docker 证书文件夹中。您必须首先创建适当的文件夹。 
root@ubuntu2204:~# mkdir -p /etc/docker/certs.d/zwc.harbor.com
root@ubuntu2204:~# cp docker.zwc.harbor.com.cert /etc/docker/certs.d/zwc.harbor.com
root@ubuntu2204:~# cp zwc.harbor.com.key /etc/docker/certs.d/zwc.harbor.com
root@ubuntu2204:~# cp ca.crt /etc/docker/certs.d/zwc.harbor.com

# 4.重新启动 Docker 
root@ubuntu2204:~# systemctl restart docker

# 说明
root@ubuntu2204:~# tree /etc/docker/certs.d/
/etc/docker/certs.d/
└── zwc.harbor.com
    ├── ca.crt                      <-- Certificate authority that signed the registry certificate
    ├── docker.zwc.harbor.com.cert  <-- Server certificate signed by CA
    └── zwc.harbor.com.key          <-- Server key signed by CA

下载安装 Harbor

# 获取Harbor最新稳定版
root@ubuntu2204:~# curl -s https://api.github.com/repos/goharbor/harbor/releases/latest | grep browser_download_url | cut -d '"' -f4 | grep '.tgz'
https://github.com/goharbor/harbor/releases/download/v2.11.1/harbor-offline-installer-v2.11.1.tgz
https://github.com/goharbor/harbor/releases/download/v2.11.1/harbor-offline-installer-v2.11.1.tgz.asc
https://github.com/goharbor/harbor/releases/download/v2.11.1/harbor-online-installer-v2.11.1.tgz
https://github.com/goharbor/harbor/releases/download/v2.11.1/harbor-online-installer-v2.11.1.tgz.asc

# 下载离线Harbor
root@ubuntu2204:~# wget https://github.com/goharbor/harbor/releases/download/v2.11.1/harbor-offline-installer-v2.11.1.tgz

root@ubuntu2204:~# tar -xf harbor-offline-installer-v2.11.1.tgz -C /data/app
root@ubuntu2204:~# cd /data/app/harbor/
root@ubuntu2204:/data/app/harbor# ls
LICENSE  certs  common.sh  harbor.v2.11.1.tar.gz  harbor.yml.tmpl  install.sh  prepare


# 编辑harbor.yml配置文件
root@ubuntu2204:/data/app/harbor# cp harbor.yml.tmpl harbor.yml
root@ubuntu2204:/data/app/harbor# vim harbor.yml
......
  4 # DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients.
  5 hostname: 172.16.70.162  //设置访问地址,可以是ip、主机名,不可以设置为127.0.0.1或localhost
  6
  7 # http related config
  8 http:  //启用http
  9   # port for http, default is 80. If https enabled, this port will redirect to https port
 10   port: 80  //默认http端口
 11
 12 # https related config
 13 https:  //启用https(注释则为禁用)
 14   # https port for harbor, default is 443
 15   port: 443
 16   # The path of cert and key files for nginx
 17   certificate: /data/app/harbor/certs/zwc.harbor.com.crt  //启用时,证书路径(禁用则注释)
 18   private_key: /data/app/harbor/certs/zwc.harbor.com.key  //启用时,私钥路径(禁用则注释)
 19   # enable strong ssl ciphers (default: false)
 20   # strong_ssl_ciphers: false
......
 46 # Remember Change the admin password from UI after launching Harbor.
 47 harbor_admin_password: Harbor@54321  //修改harbor登录密码
......
 65 # The default data volume
 66 data_volume: /data/app/harbor/data  //修改harbor仓库数据目录(安装Harbor时会自动创建)
......
164     # The directory on your host that store log
165     location: /data/app/harbor/log/harbor  //修改日志路径(安装Harbor时会自动创建)
......


# 安装并启动trivy漏洞扫描工具
root@ubuntu2204:/data/app/harbor# ./install.sh --with-trivy
[Step 0]: checking if docker is installed ...

Note: docker version: 25.0.5

[Step 1]: checking docker-compose is installed ...

Note: Docker Compose version v2.29.7

[Step 2]: loading Harbor images ...
......

[Step 3]: preparing environment ...

[Step 4]: preparing harbor configs ...
prepare base dir is set to /data/app/harbor
......
[Step 5]: starting Harbor ...
......

✔ ----Harbor has been installed and started successfully.----  # 提示安装成功

root@ubuntu2204:/data/app/harbor# ls
LICENSE  certs  common  common.sh  data  docker-compose.yml  harbor.v2.11.1.tar.gz  harbor.yml  harbor.yml.tmpl  install.sh  log  prepare


# 查看运行中的harbor相关容器(应该是启动10个容器)
root@ubuntu2204:/data/app/harbor# docker ps -a
CONTAINER ID   IMAGE                                   COMMAND                  CREATED              STATUS                        PORTS                           NAMES
545f561eabfd   goharbor/harbor-jobservice:v2.11.1      "/harbor/entrypoint.…"   About a minute ago   Up About a minute (healthy)                                   harbor-jobservice
85e7e42c1ea4   goharbor/nginx-photon:v2.11.1           "nginx -g 'daemon of…"   About a minute ago   Up About a minute (healthy)   0.0.0.0:80->8080/tcp, \   	
																										:::80->8080/tcp, 0.0.0.0:443->8443/tcp, :::443->8443/tcp   nginx
938f3c7392ee   goharbor/trivy-adapter-photon:v2.11.1   "/home/scanner/entry…"   About a minute ago   Up About a minute (healthy)                                   trivy-adapter
8e12aab73943   goharbor/harbor-core:v2.11.1            "/harbor/entrypoint.…"   About a minute ago   Up About a minute (healthy)                                   harbor-core
c8d115b85841   goharbor/harbor-db:v2.11.1              "/docker-entrypoint.…"   About a minute ago   Up About a minute (healthy)                                   harbor-db
30c6ab0f77c6   goharbor/harbor-registryctl:v2.11.1     "/home/harbor/start.…"   About a minute ago   Up About a minute (healthy)                                   registryctl
ad0ec6ffdfb8   goharbor/redis-photon:v2.11.1           "redis-server /etc/r…"   About a minute ago   Up About a minute (healthy)                                   redis
b35f315c7932   goharbor/registry-photon:v2.11.1        "/home/harbor/entryp…"   About a minute ago   Up About a minute (healthy)                                   registry
2edff162d014   goharbor/harbor-portal:v2.11.1          "nginx -g 'daemon of…"   About a minute ago   Up About a minute (healthy)                                   harbor-portal
e6736ea4ca01   goharbor/harbor-log:v2.11.1             "/bin/sh -c /usr/loc…"   About a minute ago   Up About a minute (healthy)   127.0.0.1:1514->10514/tcp       harbor-log


# 查看docker相关端口
root@ubuntu2204:/data/app/harbor# netstat -ntpl | grep docker
tcp        0      0 127.0.0.1:1514          0.0.0.0:*               LISTEN      17754/docker-proxy
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      18387/docker-proxy
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      18427/docker-proxy
tcp6       0      0 :::443                  :::*                    LISTEN      18398/docker-proxy
tcp6       0      0 :::80                   :::*                    LISTEN      18436/docker-proxy

# 查看本机IP
root@ubuntu2204:/data/app/harbor# hostname -I
172.16.70.162 172.17.0.1 172.18.0.1

安装 docker-compose

root@ubuntu2204:~# VERSION_COMPOSE=v2.29.7
root@ubuntu2204:~# curl -L "https://github.com/docker/compose/releases/download/$VERSION_COMPOSE/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose 
# 赋执行权限
root@ubuntu2204:~# chmod +x /usr/local/bin/docker-compose 
root@ubuntu2204:~# docker-compose -v
Docker Compose version v2.29.7

root@ubuntu2204:~# docker-compose -f /data/app/harbor/docker-compose.yml ps
WARN[0000] /data/app/harbor/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion
NAME                IMAGE                                   COMMAND                  SERVICE         CREATED              STATUS                        PORTS
harbor-core         goharbor/harbor-core:v2.11.1            "/harbor/entrypoint.…"   core            About a minute ago   Up About a minute (healthy)
harbor-db           goharbor/harbor-db:v2.11.1              "/docker-entrypoint.…"   postgresql      About a minute ago   Up About a minute (healthy)
harbor-jobservice   goharbor/harbor-jobservice:v2.11.1      "/harbor/entrypoint.…"   jobservice      About a minute ago   Up About a minute (healthy)
harbor-log          goharbor/harbor-log:v2.11.1             "/bin/sh -c /usr/loc…"   log             About a minute ago   Up About a minute (healthy)   127.0.0.1:1514->10514/tcp
harbor-portal       goharbor/harbor-portal:v2.11.1          "nginx -g 'daemon of…"   portal          About a minute ago   Up About a minute (healthy)
nginx               goharbor/nginx-photon:v2.11.1           "nginx -g 'daemon of…"   proxy           About a minute ago   Up About a minute (healthy)   0.0.0.0:80->8080/tcp, \
[::]:80->8080/tcp, 0.0.0.0:443->8443/tcp, [::]:443->8443/tcp
redis               goharbor/redis-photon:v2.11.1           "redis-server /etc/r…"   redis           About a minute ago   Up About a minute (healthy)
registry            goharbor/registry-photon:v2.11.1        "/home/harbor/entryp…"   registry        About a minute ago   Up About a minute (healthy)
registryctl         goharbor/harbor-registryctl:v2.11.1     "/home/harbor/start.…"   registryctl     About a minute ago   Up About a minute (healthy)
trivy-adapter       goharbor/trivy-adapter-photon:v2.11.1   "/home/scanner/entry…"   trivy-adapter   18 minutes ago       Up 4 minutes (healthy)


# 注意:如果harbor.yml配置修改了,要先执行"./prepare"命令进行配置载入,然后再重启harbor服务。
# 停止|启动|重启
root@ubuntu2204:~# docker-compose stop|start|restart

# 另外:
#   docker-compose down -v	# 停止并删除容器(数据保留在文件系统中,因此不会丢失任何数据)
#   docker-compose up -d	# 创建并启动容器

修改admin密码

# 1.修改harbor的登陆用户密码,则最好在harbor web界面里直接修改。

# 2.忘记harbor的web密码,建议删除data源数据的database,重新部署。
# docker-compose down -v
# rm -rf /data/app/harbor/data/database
# vim harbor.yaml           #在这里重置或修改密码
# docker-compose up -d
  • 修改本地WIN电脑hosts文件,做好harbor主机的域名解析
    • 172.16.70.162 zwc.harbor.com
    • 172.16.70.162 svr.harbor.com
  • 将名为"ca.crt"的CA证书下载到本地WIN电脑,浏览器再导入该证书
    • 1.Web 域名访问:
      https://zwc.harbor.com
    • 2.Web IP 访问:
      https://172.16.70.162
  • 默认账号:admin , 密码:Harbor@54321 (对应harbor.yml中的配置)

使用 Harbot 仓库

首先在Harbor web界面里最好创建一个自己需要的"项目" (或者使用默认的"library"项目),项目公开和私有:

  • Public: 所有用户对于公开项目都有读权限。
  • Private: 私有项目只能被有特定用户权限的人去访问。

如创建一个公开项目"202411_public",点击进去可以看到推送命令的信息提示。

  • 镜像打标签的命令:
    docker tag 镜像名:标签 harbot仓库地址/仓库项目名/镜像名:标签


    • docker tag SOURCE_IMAGE[:TAG] 172.16.70.162/202411_public/REPOSITORY[:TAG]
  • 推送到harbot仓库的命令:
    docker push harbot仓库地址/仓库项目名/镜像名:标签


    • docker push 172.16.70.162/202411_public/REPOSITORY[:TAG]
  • 从harbot仓库拉取镜像的命令:
    docker pull harbot仓库地址/仓库项目名/镜像名:标签


    • docker pull 172.16.70.162/202411_public/REPOSITORY[:TAG]

harbor登录 镜像推/拉

# 登录报错
root@ubuntu2204:~# docker login 172.16.70.162
Username: admin
Password:
Error response from daemon: Get "http://172.16.70.162/v2/": dial tcp 172.16.70.162:80: connect: connection refused

# 解决办法
root@ubuntu2204:~# cat /etc/docker/daemon.json
{
    "registry-mirrors": [
        "https://dockerpull.com",
        "https://docker.anyhub.us.kg",
        "https://dockerhub.jobcher.com",
    ],
    "insecure-registries": ["172.16.70.162"]  # 添加此行
}

# 修改过后重启docker, 重启Harbor服务
root@ubuntu2204:~# systemctl daemon-reload && systemctl restart docker
root@ubuntu2204:~# docker-compose -f /data/app/harbor/docker-compose.yml restart

# 再次登录
root@ubuntu2204:~# docker login 172.16.70.162
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

# 登录账号信息保存位置,若不删除后续登录,则无需输入用户名和密码
root@ubuntu2204:~# cat /root/.docker/config.json
{
	"auths": {
		"172.16.70.162": {
			"auth": "YWRtaW46SGFyYm9yQDU0MzIx"
		}
	}

# 1.查看本地镜像
root@ubuntu2204:~# docker images
REPOSITORY                      TAG       IMAGE ID       CREATED        SIZE
goharbor/harbor-exporter        v2.11.1   cdf68efc001e   2 months ago   114MB
goharbor/redis-photon           v2.11.1   acf90a312d47   2 months ago   170MB
goharbor/trivy-adapter-photon   v2.11.1   24a8273e807a   2 months ago   339MB
goharbor/harbor-registryctl     v2.11.1   43fca2a06374   2 months ago   168MB
goharbor/registry-photon        v2.11.1   9da6663b36f2   2 months ago   90.3MB
goharbor/nginx-photon           v2.11.1   193a1b77b7d4   2 months ago   159MB
goharbor/harbor-log             v2.11.1   2752e033bfbb   2 months ago   169MB
goharbor/harbor-jobservice      v2.11.1   a8005a88b3dc   2 months ago   165MB
goharbor/harbor-core            v2.11.1   eaf65baad3f6   2 months ago   191MB
goharbor/harbor-portal          v2.11.1   f58813018a49   2 months ago   167MB
goharbor/harbor-db              v2.11.1   be56f8030c48   2 months ago   277MB
goharbor/prepare                v2.11.1   1d00ffdb2e67   2 months ago   216MB

# 2.本地镜像打标签并推送至Harbor
root@ubuntu2204:~# docker tag goharbor/nginx-photon:v2.11.1 172.16.70.162/202411_public/nginx-photon:v2
root@ubuntu2204:~# docker images | grep nginx
172.16.70.162/202411_public/nginx-photon   v2        193a1b77b7d4   2 months ago   159MB
goharbor/nginx-photon                      v2.11.1   193a1b77b7d4   2 months ago   159MB

root@ubuntu2204:~# docker push 172.16.70.162/202411_public/nginx-photon:v2
The push refers to repository [172.16.70.162/202411_public/nginx-photon]
7a130cf406bb: Pushed
fa65d0b345aa: Pushed
v2: digest: sha256:b7a54e6b04ffe19096cc5a788fa3364bc2dea742c26a990ea3270bf20eaa723d size: 741

# 3.拉取dockerhub镜像,打标签并推至Harbor
root@ubuntu2204:~# docker pull mysql:8.4.3
root@ubuntu2204:~# docker tag mysql:8.4.3 172.16.70.162/202411_public/mysql:8.4.3
root@ubuntu2204:~# docker images | grep mysql
172.16.70.162/202411_public/mysql          8.4.3     ed66f13824d5   4 weeks ago    592MB
mysql                                      8.4.3     ed66f13824d5   4 weeks ago    592MB

root@ubuntu2204:~# docker push 172.16.70.162/202411_public/mysql:8.4.3
The push refers to repository [172.16.70.162/202411_public/mysql]
488946e535dc: Pushed
c6a372379ade: Pushed
4baca2f64123: Pushed
e7f948391a9f: Pushed
3f0758c2bc58: Pushed
96bad7ffa575: Pushed
9a7be671c0ad: Pushed
4dae3171e4f9: Pushed
5cebbdcae534: Pushed
217e34a4f824: Pushed
8.4.3: digest: sha256:0b6d2de7d79984b386696b75aca8341fea4456775e2b22f806a463f2199d4624 size: 2411
  • 查看Harob仓库

在操作系统的世界里,Windows 系统一直占据着重要的地位。然而,你可能不知道的是,还有一个拥有 14.7K star 的开源替代版 ——
ReactOS

1、ReactOS 介绍

ReactOS 是一个自由开源的操作系统,其目标是实现与 Windows 系统在二进制级别上的兼容。这意味着,我们可以在这个系统上直接运行那些为Windows设计的软件和驱动程序,而无需担心兼容性问题。

2、ReactOS 的特点

1、开源免费

作为一个开源项目,ReactOS 允许任何人查看、修改和分发其源代码。这不仅为开发者提供了学习和创新的机会,也为用户提供了一个免费的操作系统选择。且项目源码大部分采用C和C++来实现的

2、兼容性强

ReactOS 致力于实现与 Windows 系统的高度兼容。它可以运行许多 Windows 应用程序,包括办公软件、游戏、多媒体播放器等。这使得用户在切换到 ReactOS 时,无需担心应用程序的兼容性问题。

3、轻量级

与一些庞大的操作系统相比,ReactOS 相对轻量级。它可以在较低配置的计算机上运行,为那些拥有老旧设备的用户提供了一个可行的选择。

4、多语言支持

开源的特性使得 ReactOS 的安全性可以得到更广泛的审查和改进。开发者和用户可以共同努力,发现和修复潜在的安全漏洞,提高系统的安全性。

:为了让全球用户都能轻松上手,ReactOS支持多种语言。无论你是中文爱好者,还是英文达人,都能找到适合自己的语言设置。

3、ReactOS 的应用场景

ReactOS不仅仅是一个替代品,更是一个让技术爱好者们可以尽情探索和实验的乐园。和Wine(Linux下的Windows兼容层)不同,ReactOS是一个完整的操作系统,而不是运行在其他系统上的模拟层,也不是基于Linux的,适合如下场景下使用。

1、老旧设备复活

对于那些拥有老旧计算机的用户,ReactOS 可以让他们的设备重新焕发生机。由于其轻量级的特点,它可以在较低配置的设备上流畅运行,延长设备的使用寿命。

2、软件开发和测试

开发者可以使用 ReactOS 进行软件开发和测试。由于它与 Windows 系统的兼容性,开发者可以在 ReactOS 上测试他们的应用程序,确保其在不同的操作系统环境下都能正常运行。

3、教育和学习

对于学习操作系统原理和软件开发的学生来说,ReactOS 是一个很好的学习资源。通过研究其源代码,学生可以深入了解操作系统的内部工作原理,提高他们的编程技能。

4、如何安装

如果想体验一下ReactOS,过程其实非常简单,首先去ReactOS官网:
https://reactos.org/
下载最新的ISO镜像文件。


镜像下载完成后,可以使用Vmware来安装它。

详细的安装步骤查参考WIKI:
https://reactos.org/wiki/Installing_ReactOS

如果你对操作系统底层开发感兴趣,或者手上有一些老旧的Windows应用想要复活,不妨试试ReactOS,它也许就是你的神奇解药。更多细节功能,感兴趣的可以到项目地址查看:

项目地址:
https://github.com/reactos/reactos

前言

领导要求做一个小项目,要求独立运行,用以最少的依赖,此时不想集成到主项目中,但是又想用HzyAdmin中如此好用的自动注入,还有操作简单的仓储模式,话不多说,直接开干。

HzyAdmin 是一个前后端分离的权限管理框架,前端采用 Vue 3 框架,后端采用 .NET 8、ORM 采用 EF 8。该框架提供了丰富的功能和插件,支持模块化开发和高效管理。

项目介绍

项目采用最新的 .NET 8 技术栈,结合 HZY.Framework,提供了一个强大且灵活的管理解决方案。平台支持模块化设计,兼容 WinForms 和 WPF,满足不同应用场景的需求。

项目功能

项目功能流程图,具体下图所示:

项目技术

  • 后端技术:.NET 8、EF Core 8
  • 前端:Vue3.x 、Antd Of Vue 4.x 、Vite 、Pinia 2.0.x 、TypeScript
  • 开发需要环境:VS 2022 、 .NET 8.0 、VS Code 、Redis
  • MVC 版本: https://gitee.com/hzy6/hzy-admin-mvc
  • WebApi 任务调度平台: https://gitee.com/hzy6/hzy-quartz

模块化工程结构

微服务案例模块化工程结构

属性依赖注入

项目特点

  • HzyAdmin
  • 前后端分离权限框架,前端采用Vue3框架,后端采用.NET 8,ORM 采用 EF 8
  • IOC、AOP插件
  • HZY.Framework.AutoRegisterIOC,针对微软IOC,对DI自动扫描注入服务,并且提供Aop 拦截功能。
  • EF仓储插件
  • HZY.Framework.EntityFrameworkRepositories,基于 EFCore 实现仓储。优雅的语法,高效便捷。仓储插件。
  • Api Controller 增强插件 HZY.Framework.DynamicApiController ,NET6、NET7 动态 Api Controller
  • hzy-quartz
  • 开箱即用 Quartz,WebApi 任务调度中心、统一化、自动化、可视化、管理企业项目中的定时任务。
  • 前端 UI
  • 采用 hzy-admin-client-ui 基于 vue3 + antdv + typescript 实现

项目效果

项目文档

文档地址:
http://47.98.179.56/docs/guide/hzy-admin/database/dbs.html

数据库脚本位置根目录 doc 文件夹 目前仅提供了 MySql、SqlServer、PgSql 脚本。

其他请使用efcore迁移(迁移教程请看文档)

项目地址

GitHub:
https://github.com/hzy-6/hzy-admin

Gitee:
https://gitee.com/hzy6/HzyAdmin

总结

本文示例仅展示了框架的部分功能。感兴趣的朋友可以通过项目地址获取更多详细信息。希望本文能在通用平台开发方面为大家提供有益的帮助。欢迎在评论区留言交流,分享您的宝贵经验和建议。

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。

也可以加入微信公众号
[DotNet技术匠]
社区,与其他热爱技术的同行一起交流心得,共同成长!
优秀是一种习惯,欢迎大家留言学习!


title: Nuxt.js 应用中的 vite:extendConfig 事件钩子详解
date: 2024/11/12
updated: 2024/11/12
author: cmdragon

excerpt:
vite:extendConfig 钩子允许开发者在 Vite 项目中扩展默认配置。这使得开发者可以根据特定需求自定义 Vite 的构建和开发行为,增强开发体验。

categories:

  • 前端开发

tags:

  • Nuxt
  • Vite
  • 钩子
  • 配置
  • 自定义
  • 构建
  • 开发


image
image

扫描
二维码
关注或者微信搜一搜:
编程智域 前端至全栈交流与成长

目录

  1. 概述
  2. vite:extendConfig
    钩子的详细说明
      1. 钩子的定义与作用
      1. 调用时机
      1. 参数说明
  3. 具体使用示例
      1. 示例:基本用法
      1. 示例:添加全局 CSS
  4. 应用场景
      1. 动态修改 Vite 配置
      1. 根据环境变量调整配置
      1. 扩展插件和构建设置
  5. 注意事项
      1. 配置验证
      1. 效能影响
  6. 总结

1. 概述

vite:extendConfig
钩子允许开发者在 Vite 项目中扩展默认配置。这使得开发者可以根据特定需求自定义 Vite 的构建和开发行为,增强开发体验。

2.
vite:extendConfig
钩子的详细说明

2.1 钩子的定义与作用

vite:extendConfig
钩子用于扩展 Vite 的默认配置。通过这一钩子,开发者可以添加或修改 Vite 的配置项,以满足应用的需求。

2.2 调用时机

vite:extendConfig
钩子通常在 Vite 初始化和构建开始之前被调用,这样配置的修改可以在应用构建和启动过程中生效。

2.3 参数说明

该钩子接收一个
viteInlineConfig
对象和
env
对象作为参数,
viteInlineConfig
包含了当前的 Vite 配置,而
env
提供了运行时的环境变量信息。

3. 具体使用示例

3.1 示例:基本用法

// plugins/viteExtendConfig.js
export default defineNuxtPlugin((nuxtApp) => {
  nuxtApp.hooks('vite:extendConfig', (viteInlineConfig, env) => {
    // 修改根目录
    viteInlineConfig.root = 'src';

    // 添加到环境变量中
    console.log('Current environment:', env.MODE);
  });
});

在这个示例中,我们修改了 Vite 的根目录配置,同时打印了当前的运行环境。

3.2 示例:添加全局 CSS

// plugins/viteAddGlobalCss.js
export default defineNuxtPlugin((nuxtApp) => {
  nuxtApp.hooks('vite:extendConfig', (viteInlineConfig) => {
    viteInlineConfig.css = {
      preprocessorOptions: {
        scss: {
          additionalData: `@import "src/styles/global.scss";`,
        },
      },
    };
  });
});

在这个示例中,我们为 Vite 配置添加了全局的 SCSS 文件,以便在项目中任何地方使用。

4. 应用场景

4.1 动态修改 Vite 配置

可以根据不同的环境动态修改 Vite 配置,例如根据 NODE_ENV 来设置 API 地址。

// plugins/viteDynamicConfig.js
export default defineNuxtPlugin((nuxtApp) => {
  nuxtApp.hooks('vite:extendConfig', (viteInlineConfig) => {
    if (process.env.NODE_ENV === 'production') {
      viteInlineConfig.server = {
        proxy: {
          '/api': 'https://api.example.com',
        },
      };
    }
  });
});

4.2 根据环境变量调整配置

根据环境变量,可以灵活调整 Vite 的构建设置。

// plugins/viteEnvConfig.js
export default defineNuxtPlugin((nuxtApp) => {
  nuxtApp.hooks('vite:extendConfig', (viteInlineConfig, env) => {
    if (env.MODE === 'development') {
      viteInlineConfig.base = '/dev/';
    } else {
      viteInlineConfig.base = '/prod/';
    }
  });
});

4.3 扩展插件和构建设置

添加和配置 Vite 插件。

// plugins/viteAddPlugin.js
import someVitePlugin from 'some-vite-plugin';

export default defineNuxtPlugin((nuxtApp) => {
  nuxtApp.hooks('vite:extendConfig', (viteInlineConfig) => {
    viteInlineConfig.plugins = [
      ...(viteInlineConfig.plugins || []),
      someVitePlugin(),
    ];
  });
});

5. 注意事项

5.1 配置验证

在更改 Vite 配置时,务必确认配置项的有效性,以防止构建失败。

5.2 效能影响

不合理的配置更改可能会影响构建和开发服务器的性能,因此需谨慎添加或修改配置项。

6. 总结

通过使用
vite:extendConfig
钩子,开发者可以灵活扩展 Vite 的默认配置,以满足特定的项目需求。这种自定义能力不仅增强了开发效率,还可以适应不同的环境和构建要求。合理使用这一钩子,将有助于提升开发体验和项目维护性。

余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:
编程智域 前端至全栈交流与成长
,阅读完整的文章:
Nuxt.js 应用中的 vite:extendConfig 事件钩子详解 | cmdragon's Blog

往期文章归档: