# 手动安装 DepthAI

本指南将介绍设置 OAK 相机和 DepthAI 库的第一步。

 1. [安装依赖项](#Installing%20dependencies)
 2. [安装 DepthAI](#Installing%20DepthAI)
 3. [运行 OAK Viewer](#Running%20OAK%20Viewer)

### 安装依赖项

### 支持的平台

 * [Ubuntu/Debian](#%25E6%2589%258B%25E5%258A%25A8%25E5%25AE%2589%25E8%25A3%2585%2520DepthAI-Ubuntu%252FDebian)
 * [MacOS](#%25E6%2589%258B%25E5%258A%25A8%25E5%25AE%2589%25E8%25A3%2585%2520DepthAI-MacOS)
 * [Windows 10/11](#%25E6%2589%258B%25E5%258A%25A8%25E5%25AE%2589%25E8%25A3%2585%2520DepthAI-Windows%252010%252F11)
 * [Raspberry Pi](https://docs.luxonis.com/hardware/platform/deploy/to-rpi.md)
 * [Jetson Nano/Xavier](https://docs.luxonis.com/hardware/platform/deploy/to-jetson.md)
 * [Rock Pi](https://docs.luxonis.com/hardware/platform/deploy/to-rockpi.md)
 * [ROS](https://github.com/luxonis/depthai-ros)

 * [Windows 7](#%25E6%2589%258B%25E5%258A%25A8%25E5%25AE%2589%25E8%25A3%2585%2520DepthAI-Windows%25207)
 * [Docker](#%25E6%2589%258B%25E5%258A%25A8%25E5%25AE%2589%25E8%25A3%2585%2520DepthAI-Docker)
 * [WSL 2](#%25E6%2589%258B%25E5%258A%25A8%25E5%25AE%2589%25E8%25A3%2585%2520DepthAI-WSL%25202)
 * [OpenSUSE](#%25E6%2589%258B%25E5%258A%25A8%25E5%25AE%2589%25E8%25A3%2585%2520DepthAI-OpenSUSE)
 * [内核虚拟机 (KVM)](#Kernel%20Virtual%20Machine%20(KVM))
 * [VMware](#%25E6%2589%258B%25E5%258A%25A8%25E5%25AE%2589%25E8%25A3%2585%2520DepthAI-VMware)
 * [VirtualBox](#%25E6%2589%258B%25E5%258A%25A8%25E5%25AE%2589%25E8%25A3%2585%2520DepthAI-VirtualBox)

找不到您的平台？[联系我们](https://discuss.luxonis.com/)

### Ubuntu/Debian

执行以下命令安装所需依赖项：

```bash
sudo wget -qO- https://docs.luxonis.com/install_dependencies.sh | bash
```

这将执行以下操作：

 * 执行 apt update 和 apt upgrade
 * 安装 python3、pip3、cmake、git、udev（如果尚未安装）
 * 安装其他依赖项，如 libusb、libudev 等

> 如果从 PyPi 安装后 OpenCV 因非法指令而失败，请添加以下内容：
> ```bash
> echo "export OPENBLAS_CORETYPE=ARMV8" >> ~/.bashrc
> source ~/.bashrc
> ```

### MacOS

执行以下命令安装所需依赖项：

```bash
curl -fL https://docs.luxonis.com/install_dependencies.sh | bash
```

这将执行以下操作：

 * 安装 brew 和 git（如果尚未安装）

### Windows 10/11

您可以通过 [Windows 安装程序](https://github.com/luxonis/depthai/releases) 或使用 Chocolatey 包管理器手动安装所需组件：

#### 通过 Chocolatey 安装

要安装 Chocolatey 并使用它来安装 DepthAI 的依赖项，请执行以下操作：

 * 右键单击“开始”

 * 选择“Windows PowerShell (管理员)”并运行以下命令：

```powershell
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
```

 * 关闭 PowerShell，然后通过重复前两个步骤重新打开另一个 PowerShell（管理员）。

 * 安装 Python 和 PyCharm

```powershell
choco install cmake git python pycharm-community -y
```

### Windows 7

虽然我们不官方支持 Windows 7，但社区成员已通过使用 [Zadig](https://zadig.akeo.ie/) 手动安装 WinUSB
[取得了成功](https://discuss.luxonis.com/d/105-run-on-win7-sp1-x64-manual-instal-usb-driver)。连接 DepthAI 设备后，查找 USB ID 为 03E7 2485
的设备，并通过选择 WinUSB(v6.1.7600.16385) 然后点击 Install WCID Driver 来安装 WinUSB 驱动程序。

### Docker

我们在 Docker Hub 的 [luxonis/depthai-library repository](https://hub.docker.com/r/luxonis/depthai-library) 中维护了一个包含
DepthAI、其依赖项和有用工具的 Docker 镜像。该镜像基于 [luxonis/depthai-base](https://hub.docker.com/r/luxonis/depthai-base) 镜像构建。

在 Linux 主机（使用 X11 窗口系统）上的 Docker 容器中运行 rgb_preview.py 示例：

```bash
docker pull luxonis/depthai-library
docker run --rm \
    --privileged \
    -v /dev/bus/usb:/dev/bus/usb \
    --device-cgroup-rule='c 189:* rmw' \
    -e DISPLAY=$DISPLAY \
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    luxonis/depthai-library:latest \
    python3 /depthai-python/examples/ColorCamera/rgb_preview.py
```

要允许容器更新 X11，您可能需要在主机上运行 xhost local:root。

> 如果您在 Linux 主机上使用 OAK POE 设备，您应该将
> `--network=host`
> 参数添加到您的 docker 命令中，以便 docker 内的 depthai 能够与 OAK POE 通信。

### WSL 2

以下步骤是在运行 Ubuntu 20.04 的 WSL 2 上执行的，主机运行的是 Win10 20H2（OS build 19042.1586）。原始教程由 SputTheBot
[编写在此处](https://discuss.luxonis.com/d/693-i-got-depthai-demo-to-run-in-wsl)。

要让 OAK 在 WSL 2 上运行，您首先需要将 USB 设备附加到 WSL 2。我们使用了 [usbipd-win](https://github.com/dorssel/usbipd-win/releases) (2.3.0) 来实现。在 WSL 2
内部，您还需要安装 depthai
依赖项（[Ubuntu/Debian](#%25E6%2589%258B%25E5%258A%25A8%25E5%25AE%2589%25E8%25A3%2585%2520DepthAI-Ubuntu%252FDebian)）和 [USB/IP
客户端工具](https://github.com/dorssel/usbipd-win/wiki/WSL-support#usbip-client-tools)（2 条命令）。

要将 OAK 相机附加到 WSL 2，我们准备了以下 Python 脚本，您需要在主机计算机（管理员模式）上执行该脚本。

```python
import time
import os
while True:
    output = os.popen('usbipd wsl list').read() # 列出所有 USB 设备
    rows = output.split('\n')
    for row in rows:
        if ('Movidius MyriadX' in row or 'Luxonis Device' in row) and 'Not attached' in row: # 检查未附加的 OAK 相机
            busid = row.split(' ')[0]
            out = os.popen(f'usbipd wsl attach --busid {busid}').read() # 附加 OAK 相机
            print(out)
            print(f'Usbipd attached Myriad X on bus {busid}') # 日志
    time.sleep(.5)
```

之后，您可以在 WSL 2 内部检查 lsusb 命令，应该能够看到 Movidius MyriadX。

如果您想使用 usbipd-win >= 4.0，则 usbipd wsl 命令不再可用，因此您需要使用另一个脚本，该脚本最初由 kazuya
[编写在此处](https://discuss.luxonis.com/d/693-i-got-depthai-demo-to-run-in-wsl/5)。

```python
import time
import subprocess

while True:
    output = subprocess.run('usbipd list', capture_output=True, encoding="UTF-8")
    rows = output.stdout.split('\n')
    for row in rows:
        if ('Movidius MyriadX' in row or 'Luxonis Device' in row) and 'Not shared' in row:
            busid = row.split(' ')[0]
            out = subprocess.run(f'usbipd bind -b {busid}', capture_output=True, encoding="UTF-8")
            print(out.stdout)
            print(f'Usbipd bind Myriad X')
        if ('Movidius MyriadX' in row or 'Luxonis Device' in row) and 'Shared' in row:
            busid = row.split(' ')[0]
            out = subprocess.run(f'usbipd attach -w -b {busid}', capture_output=True, encoding="UTF-8")
            print(out.stdout)
            print(f'Usbipd attached Myriad X on bus {busid}')
    time.sleep(0.5)
```

> 不显示任何帧的示例（例如 IMU 示例）应该可以工作。我们没有花足够的时间在 WSL 2 中获取 OpenCV 显示帧，但您可以自己尝试一下，一些想法在
> [这里](https://stackoverflow.com/questions/65453763/python3-9-on-wsl2-ubuntu-20-04-how-to-display-image-using-cv2-opencv-python-4)
> 。

### OpenSUSE

对于 openSUSE，可在[这篇官方文章](https://en.opensuse.org/SDB:Install_OAK_AI_Kit)中找到如何在 openSUSE 平台上安装 OAK 设备的信息。

### 内核虚拟机 (KVM)

要在[内核虚拟机](https://www.linux-kvm.org/page/Main_Page)中访问 OAK-D 摄像头，需要在宿主机检测到 USB 总线变化时，动态地挂载和卸载 USB 设备。

当 DepthAI API 使用 OAK-D 摄像头时，它会更改 USB 设备类型。这在本地使用摄像头时会在后台自动发生。但在虚拟环境中使用时，情况则不同。

在宿主机上，使用以下代码：

```text
SUBSYSTEM=="usb", ACTION=="bind", ENV{ID_VENDOR_ID}=="03e7", MODE="0666", RUN+="/usr/local/bin/movidius_usb_hotplug.sh depthai-vm"
SUBSYSTEM=="usb", ACTION=="remove", ENV{PRODUCT}=="3e7/2485/1", ENV{DEVTYPE}=="usb_device", MODE="0666", RUN+="/usr/local/bin/movidius_usb_hotplug.sh depthai-vm"
SUBSYSTEM=="usb", ACTION=="remove", ENV{PRODUCT}=="3e7/f63b/100", ENV{DEVTYPE}=="usb_device", MODE="0666", RUN+="/usr/local/bin/movidius_usb_hotplug.sh depthai-vm"
```

udev 规则调用的脚本（movidius_usb_hotplug.sh）随后应将 USB 设备挂载/卸载到虚拟机。在这种情况下，我们需要调用 virsh 命令。例如，脚本可以执行以下操作：

```text
#!/bin/bash
# 发生错误时中止脚本执行
set -e
if [ "${ACTION}" == 'bind' ]; then
  COMMAND='attach-device'
elif [ "${ACTION}" == 'remove' ]; then
  COMMAND='detach-device'
  if [ "${PRODUCT}" == '3e7/2485/1' ]; then
    ID_VENDOR_ID=03e7
    ID_MODEL_ID=2485
  fi
  if [ "${PRODUCT}" == '3e7/f63b/100' ]; then
    ID_VENDOR_ID=03e7
    ID_MODEL_ID=f63b
  fi
else
  echo "无效的 udev ACTION: ${ACTION}" >&2
  exit 1
fi
echo "正在对 ${DOMAIN} 执行 virsh ${COMMAND}，设备为 ${ID_VENDOR}。" >&2
virsh "${COMMAND}" "${DOMAIN}" /dev/stdin <<END
<hostdev mode='subsystem' type='usb'>
  <source>
    <vendor id='0x${ID_VENDOR_ID}'/>
    <product id='0x${ID_MODEL_ID}'/>
  </source>
</hostdev>
END
exit 0
```

请注意，当设备从 USB 总线断开时，某些 udev 环境变量不可用（例如 ID_VENDOR_ID 或 ID_MODEL_ID），因此您需要使用 PRODUCT 环境变量来识别哪个设备已断开。

运行 DepthAI API 应用的虚拟机应定义一条识别 OAK-D 摄像头的 udev 规则。该 udev
规则在[此处](https://docs.luxonis.com/hardware/platform/deploy/usb-deployment-guide.md#USB%20deployment%20guide-Initial%20Connection-Debugging-Linux%20udev%20rules)描述。

### VMware

在 VMware 中使用 OAK-D 设备需要一些额外的一次性设置才能正常工作。

首先，确保 USB 控制器从 USB2 切换为 USB3。进入 虚拟机设置 -> USB 控制器 -> USB 兼容性，将其更改为 USB 3.1（或根据可用选项，旧版 VMware 选择 USB 3.0）。

根据设备状态，可能会显示两个设备，这两个设备都需要路由到虚拟机。它们可以在 播放器 -> 可移动设备 中看到：

 * Intel Movidius MyriadX
 * Intel VSC 环回设备 或 Intel Luxonis 设备

在 Linux 操作系统中，运行以下命令为普通用户授予 USB 权限：

```bash
echo 'SUBSYSTEM=="usb", ATTRS{idVendor}=="03e7", MODE="0666"' | sudo tee /etc/udev/rules.d/80-movidius.rules
sudo udevadm control --reload-rules && sudo udevadm trigger
```

如果虚拟机未检测到设备，请尝试以下操作：找到并选择类似 忘记连接规则 的选项（针对两个设备），然后在虚拟机内再次运行 DepthAI 示例。选择路由到虚拟机，并选择 不再询问
（这很重要，因为存在超时，如果宿主机未在几秒内开始通信，设备看门狗可能会触发）。您可能需要重复运行几次脚本，直到所有设置正确适用于 VMware。

### VirtualBox

如果要使用 VirtualBox 运行 DepthAI 源代码，请确保允许虚拟机访问 USB 设备。此外，请注意，默认情况下，VirtualBox 仅支持 USB 1.1 设备，而 DepthAI 分两个阶段运行：

 1. 当插入时显示。我们使用此端点将固件加载到设备上，这是一种 USB 启动技术。此设备为 USB2。

 2. 用于运行实际代码。在 USB 启动后显示，为 USB3。

为了支持 DepthAI 模式，您需要下载并安装 [Oracle VM VirtualBox 扩展包](https://www.virtualbox.org/wiki/Downloads)。安装完成后，在 USB 设置中启用 USB3（xHCI）控制器。

完成此操作后，您需要将 Myriad 作为 USB 设备从宿主机路由到 VirtualBox。这是深度设备在启动前的过滤器，此时它是一个 USB2 设备：

将未启动的深度设备路由到 VirtualBox

最后一步是添加 USB Intel 环回设备。深度设备通过 USB 启动其固件，启动后会显示为一个新设备。

该设备仅在深度设备/OAK 尝试重新连接时显示（在运行时，即运行深度设备管道后立即显示，例如 python3 depthai_demo.py）。

可能需要尝试几次才能让该环回设备显示并添加，因为您需要在深度设备在管道构建后尝试连接时执行此操作（此时它已通过 USB2 启动了内部固件）。

如果只想启用一次，您可以在以下位置看到环回设备（在管道启动后）：

在您告诉深度设备启动管道后立即找到环回设备，并选择它。

然后，为了永久启用此直通到 VirtualBox，请在以下设置中启用： 为深度设备/OAK 制作 USB 环回设备，以允许启动后的设备在 VirtualBox 中通信

为深度设备/OAK 制作 USB 环回设备，以允许启动后的设备在 VirtualBox 中通信

然后，对于每个要传递的额外深度设备/OAK 设备，只需为每个单元重复此最后的环回设置步骤（因为每个单元都有自己的唯一 ID）。

### 安装 DepthAI

安装 depthai 依赖项后，您可以参考 depthai-core 进行 C++ 开发，或通过 [PyPi](https://pypi.org/project/depthai/) 下载 depthai Python 库：

```bash
python3 -m pip install depthai
```

### 测试安装

我们有一套[示例](https://github.com/luxonis/depthai-python/tree/develop/examples)，可以帮助您验证设置是否正确。

首先，克隆 [depthai-python](https://github.com/luxonis/depthai-python/tree/develop) 仓库并进入该目录：

```bash
git clone https://github.com/luxonis/depthai-python.git
cd depthai-python
```

接下来，安装此仓库的依赖项。 请注意，我们建议在虚拟环境中安装这些依赖项，以免它们干扰系统上的其他 Python 工具/环境。

 * 对于开发机器（如 Mac/Windows/Ubuntu 等），我们推荐使用 [PyCharm](https://www.jetbrains.com/pycharm/) IDE，因为它能自动创建/管理虚拟环境，并带来许多其他好处。或者，也可以直接使用
   conda、pipenv 或 virtualenv（以及你偏好的 IDE）。
 * 对于资源受限的系统（如 Raspberry Pi 或其他小型 Linux 系统），我们推荐使用 conda、pipenv 或 virtualenv。如果要使用 virtualenv 设置虚拟环境，请运行 virtualenv venv && source
   venv/bin/activate。

在虚拟环境（或系统全局环境，如果你愿意）中，运行以下命令来安装此示例仓库的依赖项：

```bash
cd examples
python3 install_requirements.py
```

现在，从 examples 目录中运行 rgb_preview.py 脚本，以确保一切正常：

```bash
python3 ColorCamera/rgb_preview.py
```

如果一切顺利，会显示一个小窗口视频。下方是一个示例：

### 运行其他示例

运行完此示例后，你可以运行其他示例来了解 DepthAI 的各种可能性。你也可以继续：

 * 我们的教程，从 Hello World 教程开始，逐步解释 API 的使用方法（[这里](https://docs.luxonis.com/software/depthai/hello-world.md)）
 * 我们的示例，包含 DepthAI 上各种用户用例的实现（[这里](https://github.com/luxonis/oak-examples)）

你也可以继续往下学习如何将自己的神经网络转换为在 DepthAI 上运行。

我们还提供了下面的在线模型训练内容，演示如何训练和转换适用于 DepthAI 的模型：

 * [在线机器学习训练与模型转换](https://github.com/luxonis/ai-tutorials/tree/master/colab-notebooks)

### 运行 OAK Viewer

[OAK Viewer](https://docs.luxonis.com/software-v3/depthai/tools/oak-viewer.md) 是 DepthAI 和 OAK 相机的可视化工具。它是一个 GUI
应用，默认会运行一个演示程序，可视化所有流并在设备上运行推理。它还允许你更改设备的配置。DepthAI Viewer 支持 USB 和 POE 相机。

更多信息请参见 [这里](https://docs.luxonis.com/software-v3/depthai/tools/oak-viewer.md)。
