以下是详细的解释:
# 使用更具体的标记来固定基础镜像版本,确保环境一致性
FROM nvcr.io/nvidia/pytorch:23.01-py3
# 设置工作目录和环境变量
WORKDIR /root
ENV DETECTRON2_PATH /root/detectron2
# 复制并安装 Detectron2
COPY detectron2 $DETECTRON2_PATH
RUN pip install --no-cache-dir -e $DETECTRON2_PATH
# 设置入口命令
CMD ["bash"]
这个Dockerfile定义了构建一个基于NVIDIA的PyTorch镜像的开发环境,同时安装和配置Detectron2。让我们逐行解析这个Dockerfile:
基础镜像:
# 使用更具体的标记来固定基础镜像版本,确保环境一致性
FROM nvcr.io/nvidia/pytorch:23.01-py3
FROM
指令指定了构建这个镜像所基于的基础镜像。nvcr.io/nvidia/pytorch
,版本为 23.01-py3
。这意味着已经安装了PyTorch的NVIDIA优化版,且基于Python 3。设置工作目录和环境变量:
# 设置工作目录和环境变量
WORKDIR /root
ENV DETECTRON2_PATH /root/detectron2
WORKDIR /root
:设置工作目录为 /root
。后续的所有命令都会在这个目录下执行。ENV DETECTRON2_PATH /root/detectron2
:定义一个环境变量 DETECTRON2_PATH
,其值为 /root/detectron2
,方便在后续命令中引用这个路径。复制并安装 Detectron2:
# 复制并安装 Detectron2
COPY detectron2 $DETECTRON2_PATH
RUN pip install --no-cache-dir -e $DETECTRON2_PATH
COPY detectron2 $DETECTRON2_PATH
:将本地主机的 detectron2
目录复制到镜像内部的 $DETECTRON2_PATH
(即 /root/detectron2
)目录下。RUN pip install --no-cache-dir -e $DETECTRON2_PATH
:运行 pip install
命令以“可编辑模式”安装 detectron2
。--no-cache-dir
选项用于避免pip缓存安装包,以减少镜像体积。设置入口命令:
# 设置入口命令
CMD ["bash"]
CMD ["bash"]
:指定容器启动时的默认命令,这里是启动一个Bash shell。这使得容器在启动后进入Bash环境,用户可以在这个环境中继续运行其他命令。/root
,简化路径配置。detectron2
目录复制到镜像中。通过这些步骤,这个Dockerfile创建了一个既包含PyTorch又配置了Detectron2的开发环境,使得用户可以在容器内进行计算机视觉的开发和实验。
这段内容展示了构建一个Docker镜像的过程,并且执行了一些相关的命令。通过逐行分析可以更好地了解发生了什么。
查看构建目录内容:
[root@cityvisual-gpu011162126120 docker]# ls
detectron2 Dockerfile
detectron2
目录,另一个是Dockerfile
文件。构建镜像命令:
[root@cityvisual-gpu011162126120 docker]# docker build -t detectron2_env .
docker build
命令来构建Docker镜像。-t detectron2_env
:指定新镜像的标签为detectron2_env
。.
:指定构建上下文为当前目录,包含Dockerfile和detectron2
子目录。镜像构建过程:
Step 1/5:选择基础镜像
Step 1/5 : FROM nvcr.io/nvidia/pytorch:23.01-py3
---> 9eda6061497d
nvcr.io/nvidia/pytorch:23.01-py3
作为基础镜像。Step 2/5:复制detectron2
目录
Step 2/5 : COPY detectron2 /root/detectron2
---> 9c46a77f6793
detectron2
目录复制到镜像内的/root/detectron2
目录。Step 3/5:安装detectron2
Step 3/5 : RUN pip install -e /root/detectron2
---> Running in 996c4b8eb01d
detectron2
库。pycocotools
, termcolor
, yacs
, tabulate
, fvcore
, iopath
, omegaconf
, hydra-core
, black
等。Successfully installed antlr4-python3-runtime-4.9.3 black-24.4.2 detectron2-0.6 fvcore-0.1.5.post20221221 hydra-core-1.3.2 iopath-0.1.9 mypy-extensions-1.0.0 omegaconf-2.3.0 pathspec-0.12.1 portalocker-2.10.1 pycocotools-2.0.7 tabulate-0.9.0 termcolor-2.4.0 yacs-0.1.8
pip
。WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
WARNING: You are using pip version 21.2.4; however, version 24.2 is available.
You should consider upgrading via the '/usr/bin/python -m pip install --upgrade pip' command.
Step 4/5:设置工作目录
Step 4/5 : WORKDIR /root
---> Running in ac297733d7cb
/root
。Step 5/5:设置入口命令
Step 5/5 : CMD ["bash"]
---> Running in a245bd0213c6
bash
,即启动容器时进入Bash shell。镜像构建成功
Successfully built aafcb4714270
Successfully tagged detectron2_env:latest
detectron2_env:latest
。查看Docker镜像
[root@cityvisual-gpu011162126120 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
detectron2_env latest aafcb4714270 42 minutes ago 20.7GB
3f45d1c9166a 2 days ago 20.7GB
nvcr.io/nvidia/pytorch 20.12-py3 f59272c7f361 2 months ago 15.2GB
4f31e57b31d2 2 months ago 15.1GB
cuda 10.2-devel-ubuntu18.04-compile a8f1a999f299 3 months ago 4.6GB
nvcr.io/nvidia/pytorch 23.01-py3 9eda6061497d 18 months ago 20.5GB
nvcr.io/nvidia/pytorch ad0f29ddeb63 3 years ago 14.2GB
detectron2_env:latest
(IMAGE ID
为aafcb4714270
,大小为20.7GB
)。保存Docker镜像为文件
[root@cityvisual-gpu011162126120 docker]# docker save -o detectron2_env.tar detectron2_env:latest
docker save
命令将镜像保存为一个tar文件,文件名为detectron2_env.tar
,来源镜像为detectron2_env:latest
。查看目录内容
[root@cityvisual-gpu011162126120 docker]# ls
detectron2_env.tar
文件。detectron2 detectron2_env.tar Dockerfile
detectron2
(目录),detectron2_env.tar
(镜像文件)和Dockerfile
。detectron2
目录),构建并标签为detectron2_env
。20.7GB
。detectron2_env.tar
文件,便于分发和备份。这样通过这些步骤,用户可以构建、查看和保存一个包含Detectron2的Docker镜像。这个过程详细展示了每一步的执行和输出,对于理解Docker操作和镜像管理具有很好的参考价值。
这一段内容说明了如何使用docker run
命令来启动一个包含Detectron2环境的Docker容器,并查看正在运行的容器。以下是详细解析:
启动命令:
docker run --gpus all -d --name detectron2_env -v /data/dw/Detectron2:/liveguard -w /liveguard detectron2_env:latest tail -f /dev/null
docker run
:运行一个新的容器。
--gpus all
:启用容器对GPU的访问,这里表示让容器能够使用所有的GPU。这个参数要求Docker支持GPU加速。
-d
:表示以后台模式运行容器。
--name detectron2_env
:为新的容器指定一个名字为detectron2_env
。
-v /data/dw/Detectron2:/liveguard
:将本地目录/data/dw/Detectron2
挂载到容器内的/liveguard
目录。这样,主机上的数据可以直接在容器中访问,并与容器内的软件共享。
-w /liveguard
:设置容器的工作目录为/liveguard
,即运行任何命令之前将该目录作为当前目录。
detectron2_env:latest
:指定要运行的镜像,这里是之前构建并标记为latest
版本的detectron2_env
镜像。
tail -f /dev/null
:在容器中运行阻塞命令tail -f /dev/null
,保持容器持续运行。这是一种保持容器“活着”的简单方法,特别是当没有其他长时间运行的命令时。
查看容器状态:
[root@cityvisual-gpu011162126120 Detectron2]# docker ps
docker ps
:显示当前正在运行的容器。
输出内容如下:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a7863c2c7604 detectron2_env:latest "/opt/nvidia/nvidia_…" 10 minutes ago Up 10 minutes 6006/tcp, 8888/tcp detectron2_env
解析:
CONTAINER ID
:容器的唯一标识符,例如a7863c2c7604
。IMAGE
:容器使用的镜像名称,这里是detectron2_env:latest
。COMMAND
:容器中正在运行的命令,在这里显示为简略的命令"/opt/nvidia/nvidia_…"
。CREATED
:容器创建的时间,这里是10 minutes ago
。STATUS
:容器的状态,这里是Up 10 minutes
,表示容器已运行10分钟。PORTS
:容器暴露的端口,这里显示为6006/tcp, 8888/tcp
,但没有映射到主机的端口。NAMES
:容器的名称,这里是detectron2_env
,与启动容器时指定的名称一致。docker run
命令:启动了一个新的容器,并启用了GPU支持,以后台模式运行,并指定了容器名称、目录挂载和初始工作目录。
docker ps
命令:显示了当前正在运行的容器及其相关信息,包括容器ID、镜像、命令、创建时间、状态、暴露端口和名称。
通过这些操作,用户已经成功启动并管理一个包含Detectron2环境的Docker容器,并能够通过挂载的目录在容器和主机之间共享数据。
这段内容展示了在一个运行中的Docker容器中执行一个Python脚本以进行图像推理的过程。以下是具体步骤的解析:
进入容器:
docker exec -it detectron2_env bash
docker exec -it detectron2_env bash
让你进入名为 detectron2_env
的运行中的Docker容器,并启动交互式的Bash shell。进入容器后,你的提示符会变成容器内部的提示符,例如:
root@a7863c2c7604:/liveguard#
a7863c2c7604
是容器的ID。当前工作目录是 /liveguard
。运行Python推理脚本:
python3 detectron2_inference.py --input ./input.jpg --output ./outputs/ --model-name COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml --cache-dir ./models/
python3
来运行 detectron2_inference.py
脚本,并传递一些参数:
--input ./input.jpg
:待处理的输入图像,路径为 ./input.jpg
。--output ./outputs/
:处理后的输出结果将保存到 ./outputs/
目录。--model-name COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml
:指定使用的模型配置,这里是COCO实例分割模型mask_rcnn_R_50_FPN_3x
。--cache-dir ./models/
:指定模型缓存目录为 ./models/
。执行过程及输出:
cuda
, 表示GPU加速。Using device: cuda
[08/01 10:44:53 d2.checkpoint.detection_checkpoint]: [DetectionCheckpointer] Loading from https://dl.fbaipublicfiles.com/detectron2/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x/137849600/model_final_f10217.pkl ...
indexing
参数:/usr/local/lib/python3.8/dist-packages/torch/functional.py:504: UserWarning: torch.meshgrid: in an upcoming release, it will be required to pass the indexing argument. (Triggered internally at /opt/pytorch/pytorch/aten/src/ATen/native/TensorShape.cpp:3435.)
return _VF.meshgrid(tensors, **kwargs) # type: ignore[attr-defined]
Output saved to ./outputs/input_mask_rcnn_R_50_FPN_3x.jpg
docker exec -it detectron2_env bash
进入运行中的容器,并获得一个交互式终端。detectron2_inference.py
脚本,指定输入图像、输出目录、模型配置和缓存目录。mask_rcnn_R_50_FPN_3x
。./outputs
目录。这一步操作说明了如何在容器内部执行复杂的推理任务,并充分利用容器环境提供的依赖和库。这样,不仅可以确保一致的执行环境,还便于开发和调试机器学习模型。
这个代码是一个用于图像推理的脚本,使用Detectron2库进行图像实例分割、目标检测等任务。
# 导入必要的库
import argparse
import cv2
import os
import torch
from detectron2.utils.logger import setup_logger
from detectron2 import model_zoo
from detectron2.engine import DefaultPredictor
from detectron2.config import get_cfg
from detectron2.utils.visualizer import Visualizer
from detectron2.data import MetadataCatalog
# 定义主函数
def main(args):
# 初始化日志记录器
setup_logger()
# 设置FVCORE_CACHE环境变量
os.makedirs(args.cache_dir, exist_ok=True)
os.environ["FVCORE_CACHE"] = args.cache_dir
# 检查设备(CPU或CUDA)
device = 'cuda' if torch.cuda.is_available() else 'cpu'
print(f"Using device: {device}")
# 加载输入图像
im = cv2.imread(args.input)
# 创建配置
cfg = get_cfg()
cfg.merge_from_file(model_zoo.get_config_file(args.model_name))
cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.5 # 设置置信度阈值
cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url(args.model_name) # 加载模型权重
cfg.MODEL.DEVICE = device # 设置设备
# 创建预测器
predictor = DefaultPredictor(cfg)
# 进行预测
outputs = predictor(im)
# 可视化预测结果
v = Visualizer(im[:, :, ::-1], # BGR到RGB转换
MetadataCatalog.get(cfg.DATASETS.TRAIN[0]),
scale=1.2)
out = v.draw_instance_predictions(outputs["instances"].to("cpu"))
# 生成输出路径
input_filename = os.path.splitext(os.path.basename(args.input))[0]
model_filename = os.path.splitext(os.path.basename(args.model_name))[0]
output_filename = f"{input_filename}_{model_filename}.jpg"
output_path = os.path.join(args.output, output_filename)
# 保存输出图像到文件
output_image = out.get_image()[:, :, ::-1] # RGB到BGR转换
cv2.imwrite(output_path, output_image)
print(f"Output saved to {output_path}")
# 如果脚本是直接执行(而不是作为模块导入),则运行下面的代码
if __name__ == "__main__":
# 定义命令行参数解析器
parser = argparse.ArgumentParser(
description="Detectron2 Inference Script"
)
parser.add_argument("--input", required=True, help="Path to the input image")
parser.add_argument("--output", required=True, help="Path to the output directory")
parser.add_argument("--model-name", required=True,
help="Name of the model in Detectron2 Model Zoo")
parser.add_argument("--cache-dir", required=True,
help="Path to the cache directory")
# 解析命令行参数
args = parser.parse_args()
# 运行主函数
main(args)
setup_logger()
: 初始化日志记录,以便在控制台输出信息。os.environ["FVCORE_CACHE"] = args.cache_dir
: 设置环境变量 FVCORE_CACHE
指向给定的缓存目录(如果目录不存在则创建)。get_cfg()
和 model_zoo
配置文件来创建模型配置。DefaultPredictor
创建基于配置的预测器。Visualizer
将预测结果绘制到输入图像上。argparse
来解析命令行参数,确保输入图像路径、输出目录、模型名称和缓存目录都是必需的。main(args)
函数进行推理。这个脚本的主要功能是读取一张输入图像,使用指定的检测模型进行实例分割或目标检测,并可视化和保存预测结果图像。通过命令行参数指定模型、输入和输出路径,使得脚本高度可配置和灵活,用于不同的检测任务和数据集上。
一键体验Detectron2框架中的所有预训练模型
在自定义数据集上训练现有的Detectron2模型