首页 > 文章 > 使用赛灵思 Vitis AI 加速医疗应用

使用赛灵思 Vitis AI 加速医疗应用

Alimul Hoque 2020年05月04日

目标

医学 AI 正在成为现代医疗行业的重要组成部分。它可提高检测精度,降低成本,实现早期疾病预测并可大量采用非侵入性手段。在这方面,成像设备发挥着至关重要的作用。随着该领域应用的不断增加,与医学成像处理相关的 AI 创新及算法正在迅速发展。这些算法的硬件实现方案可显著改善效率和时延。赛灵思的全面堆栈深度学习 SDK、Vitis AI 以及自适应性极高的赛灵思 AI 平台可帮助医疗设备制造商及开发商快速针对这些高度发展的算法执行原型设计,最大限度减少上市时间和成本。此外,赛灵思平台的可重配置性也可为其产品提供更长使用寿命的实用程序。

由于医疗影像的固有特征(分辨率更高、以电子及光子 3D 格式为主,等等),这些影像在输入 AI 推断引擎之前需要进行大量预处理。这些预处理算法需要对每个影像的每个像素执行多项复杂的运算,因此每秒可进行大量运算。在赛灵思平台以及赛灵思 AI 推断引擎 (DPU) 中实现这些预处理算法,可提供近乎实时的检测,这在医疗行业中非常重要。赛灵思 Vitis AI 可为这些整体应用加速解决方案提供端到端开发平台。

在这两篇文章中,我们演示医疗应用开发商如何在不编写任何较低级 RTL 代码的情况下,使用 Vitis AI 获取医疗影像数据集,开发并评估端到端 AI 加速应用。在第一篇文章中,我们主要采用皮肤病灶开源数据集[1],对影像进行预处理,创建一个机器学习网络,并在 x86 平台上对其进行训练。随后,我们将使用赛灵思 Vitis AI 工具套件在一款赛灵思 AI 推断平台 ZCU102 开发板上对模型进行量化、编译和评估。在第二篇文章中,我们将创建一款端到端解决方案,其中图像预处理 IP 将执行实时对比度调整、亮度调整、反色及伪色运算,然后再将其输入赛灵思 AI 加速 IP。


介绍

开发加速深度学习应用分两个阶段:第 1 阶段是模型创建与训练;第 2 阶段是为推断部署模型。在训练阶段,我们将为特定任务(在我们的示例中为对皮肤病灶影像进行分类)设计深度神经网络,并采用大型数据集对其进行训练。在推断阶段,我们将使用针对特定 AI 平台(在我们的示例中为赛灵思 ZCU102 平台)的应用逻辑编译并部署经过训练的模型。在推断过程中,应用逻辑将为模型提供新的数据/影像进行分类。对于我们的皮肤病灶检测应用,下面将更详细地介绍这两个阶段。


第 1 阶段:模型创建与训练

1.0 设计注意事项

1.1 迁移学习注意事项

训练深度神经网络需要大量数据集。收集大量医疗影像一直充满着挑战。我们的皮肤病灶数据集[1]只有 1 万张影像,不足以从头开始训练深度网络。为了克服这一挑战,我们将使用迁移学习技术。迁移学习可通过两种方式实现:一种是微调通过一般影像预先训练的网络;另一种是微调通过不同目标器官或任务的医疗影像预先训练的网络。为了方便使用,我们选择采用通过 ImageNet[2] 预先训练的 Inception v3 网络,这是一个有 1400 多万张普通影像的数据集

1.2 数据集大小注意事项

数据集大小是决定迁移学习级别的重要参数。即使有所增强,我们的皮肤数据集还是很小。Inception v3 网络中的参数数量非常大,大约 2200 万,所以完全适应可能会导致过度拟合。因此,我们选择执行部分适应。

1.3 Vitis AI 注意事项

在为针对赛灵思 AI 平台的迁移学习创建深度神经网络或选择该网络以实现部署时,我们需要确保赛灵思 Vitis AI 堆栈支持网络中的所有层、内核大小和激活函数。Vitis AI 堆栈完全支持我们为迁移学习选择的 Inception v3。此外,在我们的网络修改过程中,还支持 Dense 和 Softmax 层(稍后会详细介绍)。这些新添加层的内核大小和输入输出量也在支持的范围内。如欲了解有关支持层和内核大小等的更多详情,请参阅赛灵思 DPU IP 产品指南 PG338。[3]


2.0 数据准备:影像预处理

监督训练用于自动诊断色素性皮肤病灶的神经网络,需要带标记的同质、清晰影像数据集。我们使用的皮肤病灶数据集已经过预处理,而且已作为用于学术机器学习目的的训练集发布,通过 ISIC 存档公开提供。这些影像由不同的医务人员在不同的时间使用大量不同的皮血管镜从不同的人群采集。鉴于这种多样性,在预处理流程中应用了各种采集与清理方法。例如,下图 1 中的标本 (a) 是皮血管镜拍摄的原始影像。该影像左下角有一个黑色边框。亮度较低、色调呈黄色而且病灶偏离中心位置。右边的影像 (b) 是经过处理的清晰影像。

Example-preprocessing
图 1:标本皮肤病灶影像的预处理示例 a)原始影像左下角有黑色边框、病灶偏离中心位置、色调呈黄色而且亮度较低,b)处理过的影像[4]

数据清理在训练流程中是一个非常重要的收敛步骤。同样,在推断过程中,清晰的同质标本对于获得更高的检测精度同样重要。这种预处理需要大量的计算。在接下来的第二篇文章中,我们将演示客户如何通过在赛灵思平台的硬件以及赛灵思 AI 推断引擎 (DPU) 中实现这些预处理算法,达到近乎实时的检测速度。


3.0 网络设计、GPU 训练与评估

我们的检测应用旨在将皮肤病灶标本分为 7 大类,分别是:nv(黑素细胞痣)、mel(恶性肿瘤)、bkl(良性角化病)、bcc(基底细胞癌)、akiec(光化性角化病)、vasc(血管性皮肤病)和 df(皮肤纤维瘤)。

3.1 创建平衡数据集

我们通过分析皮肤病灶数据集发现,它包含这 7 大类的 10015 张影像。Nv 类有 6705 张,mel 有 1113 张,bkl 有 1099 张,bcc 有 514 张,akiec 有 327 张,vasc 有 142 张,df 有 115 张。显然,该数据集并不平衡。

Dataset
图 2:数据集不平衡

按原样使用本数据集训练该网络,将创建一个严重偏向单一多数类 Nv 的模型。为了防止出现这种情况,我们使用离线数据增强技术来降低类型不平衡情况。为了创建增强影像,我们使用了 Keras ImageDataGenerator 类型,如下所示,

# Data generator

Datagen=ImageDataBenerator(width_shift_range=0.1, height_shift_range=0.1, rotation_range=180, zoom_range=0.1, horizontal_flip=True, vertical_flip=True, fill_mode='nearest')

 

我们还将数据集按 10:3 的比例划分为训练集和验证集。如欲了解详细信息,请参阅本文末尾参考资料部分 GitHub 链接中的 Jupyter Notebook dataaug.ipynb[10]。

3.2 网络修改

公开提供的 Inception v3 网络旨在将对象影像分为 1001 个输出类型。为了满足我们的应用需求,我们增强网络,以支持 7 个输出类型之间的分类。首先用扁平层代替 Inception v3 的分类层。在扁平层之后添加两个完全连接的层。最后,我们添加一个预测层(也称为 Softmax 层),它有 7 个输出,每个输出对应一类皮肤病灶疾病。这里是 Keras 代码段,我们在该处创建修改后的网络。如欲了解详细信息,请参阅位于 GitHub 链接中的 Jupyter Notebook training.ipynb。

# Create an inception_v3 model along with the imagenet pre-trained weights

model=keras.applications.inception_v3.InceptionV3(include_top=False, weights='imagenet',  input_shape=(224, 224, 3))

# Taking the output of the inception_v3 just before last layer

x = iv3_model.layers[-1].output

# flattening the outputs of the last conv layer

flatten = Flatten()(x)

# adding two fully connected layers. Meeting DPU requirement, keeping output/input ratio at @ 1/6

dense1 = Dense(2048, activation= 'relu')(flatten)

dense3= Dense(128, activation= 'relu')(dense1)

# adding the prediction layer with 'softmax'

predictions = Dense(7, activation='softmax')(dense3)

 

# Create the new model with the new outputs

model = Model(inputs=iv3_model.input, outputs=predictions)

Inception-v3-network
图 3:Inception v3 网络。它有两个部分:特性提取与分类。我们将“分类部分”替换为一个具有 7 组输出的、完全连接的全新分类层[9]

3.3 训练流程

对于训练,我们冻结了 Inception V3 所有卷积层的预训练权重。此外,我们还随机对新添加的全连接层的权重进行了初始化。由于进行了微调,因此我们选择在反向传播运行时使用较小的学习率。采用分类交叉熵算法计算网络损耗,同时采用 Adam 算法更新网络权重。下面是我们用于训练流程的代码片段。如需了解有关信息,请参阅 Jupyter Notebook training.ipynb,也位于 GitHub 链接中。

# Freeze the weights of the layers that we aren't training (training the last 23)

for layer in model.layers[:-3]:

    layer.trainable = False

# Compile and prepare the network for training

model.compile(Adam(lr=0.001), loss='categorical_crossentropy', metrics=[categorical_accuracy, top_2_accuracy, top_3_accuracy])

# Declare a checkpoint to save the best trained model

checkpoint = ModelCheckpoint(filepath, monitor='val_categorical_accuracy', verbose=1,

                             save_best_only=True, mode='max')

 

# Declare how the training flow reduce the learning rate as the learning platos

reduce_lr = ReduceLROnPlateau(monitor='val_categorical_accuracy', factor=0.2, patience=2,

                              verbose=1, mode='max', min_lr=0.000001)

callbacks_list = [checkpoint, reduce_lr]

 

# Train the model for 20 epochs

history = model.fit_generator(train_batches,

                              steps_per_epoch=train_steps,

                              class_weight=class_weights,

                              validation_data=valid_batches,

                              validation_steps=val_steps,

                              epochs=20,

                              verbose=1,

                              callbacks=callbacks_list)

 

训练过程产生最佳权重,分类准确率达到 72.6%,前三名准确率达到 93.7%。

val_cat_acc: 0.7265469035256409

val_top_2_acc: 0.862275450618681

val_top_3_acc: 0.9371257461533099

由于我们使用了 Keras 框架来开发分类器模型,训练后的权重文件的输出为 HDF5 或 .h5 格式。Vitis AI 量化器工具支持 .pb 格式,也称为冻结图形格式。我们使用以下代码片段将 .h5 文件和网络转换为 .pb 格式。了解详情,请参阅 training.ipnb.

from keras import backend as K

frozen_graph = freeze_session(K.get_session(),output_names=[out.op.name for out in model.outputs])

tf.train.write_graph(frozen_graph, ".", "model/model_incv3_2_6.pb", as_text=False)


第 2 阶段:在赛灵思 AI 平台上移植和评估模型

在赛灵思 AI 平台上部署机器学习模型的主要优势是更好的推断时延和更小的功耗和内存占用。我们通过将训练模型的 32 位浮点权重量化为较低的精度来实现这些目标。此外,赛灵思的深度学习处理器单元 (DPU) 是可编程引擎,可执行高度优化的指令集。因此,我们需要将修改后的 Inception v3 网络编译成可以由 DPU 执行的指令集。赛灵思的 Vitis AI 工具链提供了量化和编译我们的训练模型所需的所有必需工具。

1.0 Vitis AI 工具设置

Vitis AI 软件可作为 Docker 镜像使用并且可从 Docker hub [6] 下载。我们按照 www.docs.Docker.com [7] 上的说明来安装 Docker。我们克隆了 Vitis AI 1.0 GitHub 库并从 Docker hub 中提取 Xilinx/vitis-aitools-1.0.0-cpu Docker 镜像。Vitis AI 指南 UG1414 [5] 提供了分步说明。以下是命令片段:

# pull the vitis-ai tools image from Docker hub

$ Docker pull xilinx/vitis-ai:tools-1.0.0-cpu

#Clone the Vitis AI repository

$ git clone https://github.com/xilinx/vitis-ai

# Launch the Docker container

$ cd Vitis-AI

$ ./Docker_run.sh  xilinx/vitis-ai:tools-1.0.0-cpu

# Once inside the container at /workspace, activate the vitis-ai-tensorflow conda environment

$ conda activate vitis-ai-tensorflow

2.0 权重量化

目前,赛灵思 AI 平台支持 8 位精度。为了量化训练权重,我们利用了 Vitis AI 工具 Docker 中预装的 via_q_tensorflow 应用。我们使用下表中所示的参数来调用 via_q_tensorflow。进一步了解其他选项和参数,请参阅 UG1414。

# Quantize the trained weights of skinl model

$ vai_q_tensorflow quantize \

                          --input_frozen_graph ${TF_NETWORK_PATH}/${FROZEN_MODEL}  \

                          --input_fn  ${INPUT_FN} \

                          --input_nodes ${INPUT_NODES} \

                          --output_nodes ${OUTPUT_NODES}\

                          --input_shapes ?,224,224,3 \

                          --calib_iter 10 \

                          --method 1 \

                          --gpu 0 \

                          --output_dir ${TF_NETWORK_PATH}/qoutput

Name

Type

Description

--input_frozen_graph

String

Frozen inference GraphDef file; the model/model_incv3_2_6.pb we created during Phase 1

--input_nodes

String

A list of input node names of the frozen graph

--output_nodes

String

A list of output nodes of the frozen graph

--input_shapes

String

A list of 4d shapes of all input_nodes.

--input_fn

String

This function feeds the input calibration images to the graph. The function format is module_name.input_fn_name.

--method

Int32

The method for quantization. We use 0: Non-overflow method

--calib_iter

Int32

The iterations of calibration. Total number of images for calibration = calib_iter * batch_size.

--output_dir

string

The directory in which to save the quantization results.

我们通过执行带有inspect”选项的 vitis_ai_tensorflow 应用来收集 input_node 名称、output_node 名称和 input_shape,如下所示,

$ vai_q_tensorflow inspect

--input_frozen_graph=model_incv3_2_6.pb

 

Op types used: 912 Const, 350 Identity, 87 Relu, 86 Conv2D, 86 Fill, 86 FusedBatchNorm, 12 ConcatV2, 9 AvgPool, 4 MaxPool, 3 BiasAdd, 3 MatMul, 1 Pack, 1 Placeholder, 1 Prod, 1 Reshape, 1 Shape, 1 Softmax, 1 StridedSlice

Found 1 possible inputs: (name=input_1, type=float(1), shape=[?,224,224,3])

Found 1 possible outputs: (name=dense_3/Softmax, op=Softmax)

校准影像集是训练/验证数据集或实际应用影像的子集。在第 1 阶段的“数据增强”步骤中,我们复制了 300 张校准影像。了解详情,请参阅 Jupyter  Notebook dataaug.ipynb。

对于 input_fn,我们修改了库中 Vitis AI 示例附带的 input_fn.py。我们修改了 input_fn.py 中的 calib_input(..) 函数。它分批读取校准影像并返回

为了方便起见,我们使用量化函数调用创建一个 bash 脚本 dnnq_skinl.sh。一旦我们获得了所有必要的参数,就可以更新脚本并在 conda 环境 vitis-ai-tensorflow 下的 Docker 容器中执行它

 $ ./dnnq_skinl.sh

 

化完成后,摘要显示如下所示:

INFO: Calibration Done.

INFO: Generating Deploy Model...

INFO: Deploy Model Generated.

********************* Quantization Summary *********************     

INFO: Output:      

  quantize_eval_model: qoutput/quantize_eval_model.pb      

  deploy_model: qoutput/deploy_model.pb

在量化流程中,在名为 qoutput/ 的输出目录中生成了两个文件。deploy_model.pb 文件包含量化的训练权重。我们将在下一节的网络编译期间使用此文件。quantize_eval_model.pd 文件可用于模型评估,我们将在后续的文章中对此进行介绍。


3.0 网络图的编译

Vitis AI 工具 Docker 附带了 Vitis AI VAI_C,这是一种领域专用的编译器。它能高效地将网络模型映射至赛灵思深度学习处理器单元 (DPU) 的高度优化指令序列。我们使用下表中所示的参数来调用 via_c_tensorflow。如需了解有关其他选项和参数的更多信息,请参阅 UG1414。

# Compile the skinl network

$ vai_c_tensorflow --frozen_pb qoutput/deploy_model.pb \

                 --arch {ARCH} \

                 --output_dir coutput/output_ZCU102/ \

                --net_name skinl

Parameters

Description

--arch

DPU architecture configuration file for VAI_C compiler in JSON format. It contains the dedicated options for the DPU. We used the configuration file for the ZCU102 board,  located at /opt/vitis_ai/compiler/arch/dpuv2/ZCU102/ZCU102.json

--frozen_pb

Path of TensorFlow frozen protobuf file. It is the deploy_model.pg file we generated during the quntization flow.

--output_dir

Path of output directory after compilation process. We choose ‘coutput/output_ZCU102/’

--net_name

Name of DPU kernel for network model after compiled, its skinl

为了方便起见,我们使用编译函数调用创建一个 bash 脚本 dnnc_skinl.sh。我们使用所有必需的参数来更新脚本,并在 conda 环境 vitis-ai-tensorflow 下的 Docker 容器中执行它

 $ ./dnnc_skinl.sh

根据输入网络中的不同节点操作符,编译流程会生成两类内核。在我们的示例中,skinl_0 是将由硬件中的 DPU 执行的加速器内核。这个内核coutput/output_ZCU102 文件夹中生成的对象文件 dpu_skinl_0.elf 组成。而且 skinl_1 是由 CPU 创建并执行的 softmax 内核。然而,在该应用中,我们从 skinl_1 内核参数收集输入和输出维度,并使用它们创建 Python 函数 CPUCalculateSoftmax(..),该函数可在主机 CPU 中执行 softmax 计算。有关这方面的更多详细信息,请参阅以下评估部分。此外,编译还会在同一文件夹中生成 meta.json 文件。该文件包含运行时库路径。我们使用 scp 将 /coutput/ 文件夹复制到 ZCU102 电路板上。编译流程的部分输出如下所示:

Kernel topology "skinl_kernel_graph.jpg" for network "skinl"

kernel list info for network "skinl"

                               Kernel ID : Name

                                       0 : skinl_0

                                       1 : skinl_1


4.0 ZCU102 上的模型评估

inx 的 ZCU102 是一个用于评估针对边缘部署的加速机器学习应用的优秀平台。该电路板具有 Zynq UltraScale+ 器件、DDR4 存储器、丰富的外设和接口以及扩展能力。[8]

chip
图 5:带有 JTAG、SD 卡和以太网端口的 ZCU102 平台。图 4:ZCU102 电路板上配置为 SD 启动的开关 SW6
我们对 ZCU102 电路板进行了配置,使其从 SD 卡启动,并通过其以太网端口连接到网络。为了简单和便于应用评估,我们创建了一个带有预装 Jupyter  Notebook 的电路板影像。Jupyter Notebook 会在平台启动结束时自动启动。我们在浏览器上通过 http://board_ip_address:8888 来访问 Jupyter  Notebook。我们在笔记本电脑上通过 jtag-over-usb 访问它,从而收集 board_ip_address。有关配置选项、设置以及通过 jtag 和 SSH 访问Jupyter Notebook 的更多详细信息,请参阅用户指南 UG1414。

创建应用:

当电路板启动并开始运行时,我们可在 Jupyter Notebook 环境中创建病灶检测应用。可以使用 C++ 或 Python API 创建 Vitis AI 应用。所有必需的 API 库都已安装在电路板影像中。该影像可从 GitHub 链接下载。我们使用 Python API 创建应用。

使用 Python 创建 Vitis AI 应用的第一步是,将我们在上面的网络编译步骤中生成的 DPU 对象文件 dpu_skinl_0.elf 转换为共享库。我们通过使用 Arm GCC 工具链来完成这一步。请参阅 Jupyter Notebook skinl_app.ipynb。共享库的命名格式必须是 “libdpumodelModelName.so”,在本例中是 libdpumodelskinl.so。我们将共享库放在 /dpuv2_rundir/ 子目录中,该子目录与 skinl_app.ipynb 脚本的路径级别相同。使用的命令如下所示:

# Transform the dpu_skinl_0.elf into shard library libdpumodelskinl.so

 !/usr/bin/aarch64-xilinx-linux-gcc    -fPIC    -shared   ../coutput/output_ZCU102/dpu_skinl_0.elf   -o libdpumodelskinl.so

Vitis AI 带有“Runner Class”,它可以提供 FPGA 初始化抽象并为调度计算任务至 DPU 提供了方法。我们采用下面所示的语法实例化 Vitis Runner 对象;/vitis_rundir/ 是包含 libdpumodelskinl.so 和 meta.json 文件的文件夹的路径。

# Instantiate the runner for the DPU

 dpu = runner.Runner(path+'/dpuv2_rundir/' )

现在我们将输入的影像数据以 DPU 可以读取和处理的格式放入存储器中。为此,我们使用以下 API 调用收集 DPU 的输入和输出张量。输出采用 Python 列表格式。

# get the input and output tensors

inputTensors = dpu.get_input_tensors()

outputTensors = dpu.get_output_tensors()

我们根据输入和输出张量列表估计输入和输出维度,如下所示:

shapeIn = (batchSize,) + tuple([inputTensors[0].dims[i] for i in range(inputTensors[0].ndims)][1:])

outputHeight = outputTensors[0].dims[2]

outputWidth = outputTensors[0].dims[3]

outputChannel = outputTensors[0].dims[1]

 我们使用这些维度在存储器中创建输入和输出数据缓存:

outputData.append(np.empty((batchSize,outputSize), dtype = np.float32, order = 'C'))

inputData.append(np.empty((shapeIn), dtype = np.float32, order = 'C'))

然后,我们用想要检测的病灶影像填充输入缓存,如下所示:

#place input images in to the input buffer

k = steps * batchSize

for j in range(batchSize):

        imageRun = inputData[0]

imageRun[j,...]  =img[j+k].reshape(inputTensors[0].dims[1],inputTensors[0].dims[2],inputTensors[0].dims[3])

最后,我们使用输入缓存和输出缓存的位置将计算任务调度到 DPU,并在此转储计算输出。DPU 执行完成后,结果会显示在 outputData 缓存中。

dpu.execute_async(inputData,outputData)

最后,我们通过使用 outputData 调用 CPUCalcSoftmax(..) 在 CPU 中执行 Softmax 计算。CPUCalcSoftmax(..) 是在 skil_aux.py 文件中定义的 Python 函数。

CPUCalcSoftmax(outputData[0][j], outputSize)

Softmax 函数的输出是我们通过 inputData 缓存输入的一批病灶影像的检测类别列表。在 Jupyter Notebook skinl_app.ipnb 中,我们使用了 600 张影像,并演示了模型准确性估算和应用的平均每秒帧数 (FPS)。

在 zcu102 平台上运行的 Jupyter Notebook屏幕截图:

zcu102-board-platform
图 6:zcu102 电路板平台上的 python 可加载共享库创建
DPU-classification
图 7:zcu102 平台上的 DPU 分类及 Top-3 估算
FPS-estimation-on-zcu102.
图 8:zcu102 上的 FPS 估算。

参考文献部分中的 GitHub 链接包含以下项目。这些都可以下载,

1)  Vitis AI 工具 docker Jupyter Notebook dataaug.ipynb、training.ipynb 以及相关文件和库

2)  带有 skinl_app.ipynb 的 ZCU102 电路板的 SD 影像以及相关文件和必需库。


致谢

我要感谢 Pat McGuire 的审阅、编辑和深思熟虑的反馈,以及哈佛 Dataverse 分享皮肤病变数据集。 


参考文献

文件位于 https://github.com/Xilinx/Vitis-AI-Tutorials/tree/Medical-AI-Acceleration

 

[1] Tschandl, Philipp, 2018, "The HAM10000 dataset, a large collection of multi-source dermatoscopic images of common pigmented skin lesions", https://doi.org/10.7910/DVN/DBW86T, Harvard Dataverse, V1, UNF:6:IQTf5Cb+3EzwZ95U5r0hnQ

[2] ImageNet, An image database organized according to the WordNet hierarchy, http://www.image-net.org/

[3] Xilinx, PG338, DPU for Convolutional Neural Network v3.0 https://www.xilinx.com/support/documentation/ip_documentation/dpu/v3_0/pg338-dpu.pdf

 [4] Scientific Data, 14 August 2018, Preprocessed and processed image: https://www.nature.com/articles/sdata2018161

[5] Xilinx, UG1414 Vitis AI User Guide, Version 1.0, 10 December 2019, https://www.xilinx.com/support/documentation/sw_manuals/vitis_ai/1_0/ug1414-vitis-ai.pdf

[6] Xilinx, The Vitis™ AI software Docker image on Docker hub. https://hub.Docker.com/r/xilinx/vitis-ai/tags

[7] docker, Instructions on installing Docker and add user to the Docker group. https://docs.Docker.com/install/linux/Docker-ce/ubuntu/

[8] Xilinx, ZCU102 product page on the Xilinx website: https://www.xilinx.com/products/boards-and-kits/ek-u1-ZCU102-g.html

[9] Google, Image Classification Transfer Learning with Inception v3,  https://codelabs.developers.google.com/codelabs/cpb102-txf-learning/index.html#1

[10] Xilinx, Alimul Hoque, https://github.com/Xilinx/Vitis-AI-Tutorials/tree/Medical-AI-Acceleration


About Alimul Hoque

About Alimul Hoque

Alimul Hoque 是一名加速解决方案架构师。他于 3 年前加入赛灵思,专注于帮助客户为数据中心和边缘部署创建加速解决方案。在加入赛灵思之前,Alimul 曾在英特尔公司工作了 10 多年,主要从事平台设计和数据中心架构方面的工作。他在东北大学获得 BSEE 和 MSSE 学位。他与 Moushumi Nazneen 的婚姻幸福美满;他喜欢旅游、园艺和看电影。