# ResNet50
## 论文
`Deep Residual Learning for Image Recognition`

- https://arxiv.org/abs/1512.03385

## 模型结构
ResNet50模型包含了49个卷积层、一个全连接层。

![ResNet50模型结构](./Doc/images/1.png)

## 算法原理
ResNet50使用了多个具有残差连接的残差块来解决梯度消失或梯度爆炸问题，并使得网络可以向更深层发展。

![算法原理](./Doc/images/2.png)

## 环境配置
### Docker 
拉取镜像：
```python
docker pull image.sourcefind.cn:5000/dcu/admin/base/custom:ort1.14.0_migraphx3.0.0-dtk22.10.1
```

创建并启动容器：
```
docker run --shm-size 16g --network=host --name=resnet50_ort --privileged --device=/dev/kfd --device=/dev/dri --group-add video --cap-add=SYS_PTRACE --security-opt seccomp=unconfined -v $PWD/resnet50_onnxruntime:/home/resnet50_onnxruntime -it <Your Image ID> /bin/bash

# 激活dtk
source /opt/dtk/env.sh
```

## 数据集
Imagenet-1k

## 推理
### Python版本推理
采用ONNXRuntime框架使用DCU进行推理，下面介绍如何运行python代码示例，Python示例的详细说明见Doc目录下的Tutorial_Python.md。
#### 设置Python环境变量
```
export PYTHONPATH=/opt/dtk/lib:$PYTHONPATH
```
#### 运行示例
```python
# 进入resnet50 onnxruntime工程根目录
cd <path_to_resnet50_onnxruntime> 

# 进入示例程序目录
cd Python/

# 安装依赖
pip install -r requirements.txt

# 下载模型
sh ./Resource/Models/download.sh

# 运行示例
python Classifier.py
```

### C++版本推理
采用ONNXRuntime框架使用DCU进行推理，下面介绍如何运行C++代码示例，C++示例的详细说明见Doc目录下的Tutorial_Cpp.md。
#### 配置c++环境变量
```
# 安装Opencv依赖
cd <path_to_resnet50_onnxruntime>
sh ./3rdParty/InstallOpenCVDependences.sh
```
#### 构建工程
```
source /opt/dtk/env.sh
rbuild build -d depend
```
#### 设置环境变量
将依赖库依赖加入环境变量LD_LIBRARY_PATH，在~/.bashrc中添加如下语句：
```
export LD_LIBRARY_PATH=<path_to_resnet50_onnxruntime>/depend/lib64/:$LD_LIBRARY_PATH
```
然后执行:
```
source ~/.bashrc
```

#### 运行示例
```
# 进入resnet50_onnxruntime工程根目录
cd <path_to_resnet50_onnxruntime> 

#下载模型
sh ./Resource/Models/download.sh

# 进入build目录
cd build/

# 执行示例程序
./ResNet50
```
## result
### python版本
```
class=n01843065 jacamar ; probability=11.903831
```
### C++版本
```
class=n01843065 jacamar ; probability=11.903831
```

## 精度
### 测试环境
- 加速卡：Z100
- 软件栈：dtk22.10.1
- 数据集：imagenet-1k

### 性能
| Engine | Model Path| Model Format | Accuracy(%) | Time(ms) |
| :------: | :------: | :------: | :------: | :------: |
| ONNXRuntime | model/resnet50-v2-7.onnx | onnx | 75.70 | 6.67 |

## 应用场景
### 算法类别
`图像分类`

### 热点应用行业
`制造,政府,医疗,科研`

## 源码仓库及问题反馈
https://developer.hpccube.com/codes/modelzoo/resnet50_onnxruntime

## 参考资料
https://github.com/onnx/models/tree/main/vision/classification/resnet

