【论文复现赛第六期】PSANet(含自定义C++外部算子调试经验)


在卷积神经网络中,卷积滤波器的设计使得信息流被限制在局部区域,从而限制了网络对复杂场景的理解。PSANet提出使用PSA(point-wise spatial attention)来解决局部区域限制的问题。通过PSA模块,每个位置的像素都可以和其他位置的像素建立联系。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

【论文复现赛第六期】psanet(含自定义c++外部算子调试经验) -

【飞桨论文复现赛第六期】PSANet

paper:PSANet: Point-wise Spatial Attention Network for Scene Parsing
github: https://github.com/hszhao/semseg
复现地址:https://github.com/justld/PSANet_paddle

本次复现的要求为PSANet-resnet50 输入分辨率512x1024 mIOU 77.24%,本次复现的miou为79.94%。

在卷积神经网络中,卷积滤波器的设计使得信息流被限制在局部区域,从而限制了网络对复杂场景的理解。PSANet提出使用PSA(point-wise spatial attention)来解决局部区域限制的问题。通过PSA模块,每个位置的像素都可以和其他位置的像素建立联系。

网络预测结果如下:【论文复现赛第六期】PSANet(含自定义C++外部算子调试经验) -

一、PSA(point-wise spatial attention)

PSA有3中模式:collect\distribute\bi-direction。collect和distribute是单向信息传递(collect:其他位置的信息传递到当前位置,distribute:当前位置的信息传递到其他位置),bi-direction是双向信息传递(其实就是collect+distribute)。【论文复现赛第六期】PSANet(含自定义C++外部算子调试经验) -

PSA(bi-direction)结构图如下,上方的分支为collect分支,下方为distribute分支。通过PSA模块,每个像素都可以和其他位置建立联系,从而丰富了上下文信息。【论文复现赛第六期】PSANet(含自定义C++外部算子调试经验) -

下图为PSA模块的原理(以collect为例,distribute与其相反):
1、输入特征图[c, h, w], 经过卷积层得到[mask_h * mask_w, h, w]的特征图(这里需要注意不一定是(2h-1)(2w-1),这个通道数是可以设置的,后续把2h-1当作mask_h,2w-1当作mask_w理解);
2、[mask_h * mask_w, h, w]中的每个embedding(就是mask_h * mask_w的向量)reshape为[mask_h, mask_w],得到特征图维度为[h * w, mask_h, mask_w];
3、假设某个embedding在原特征图的位置为i行j列,在新的特征图中,构建[h, w]的mask,使得mask的i行j列为[mask_h, mask_w]的中心,然后将mask的内容取出来,得到输出特征图的维度为[h * w, h, w]。(PS:这个步骤可能比较难理解,建议跟着源码看一下)【论文复现赛第六期】PSANet(含自定义C++外部算子调试经验) -

二、网络结构

PSANet网络结构于大部分网络相同,如下图所示,PSANet也使用了辅助损失函数。 【论文复现赛第六期】PSANet(含自定义C++外部算子调试经验) -

三、实验结果

官方此次复现的指标应该是参考mmsegmentation复现的结果,要求PSANet-resnet50 输入分辨率512x1024 mIOU=77.24%。
mmsegmentation PSANet参考:https://github.com/open-mmlab/mmsegmentation/tree/master/configs/psanet

简小派 简小派

简小派是一款AI原生求职工具,通过简历优化、岗位匹配、项目生成、模拟面试与智能投递,全链路提升求职成功率,帮助普通人更快拿到更好的 offer。

简小派 123 查看详情 简小派

四、快速体验

可以按照以下步骤快速体验PSANet,有以下几点说明:
1、PSANet包含有外部C++算子,在目录/home/aistudio/PSANet_paddle/paddleseg/models/ops;
2、运行的环境不要有使用pip安装的paddleseg,如果有需要卸载;(因为本算法未PR到paddleseg,外部C++算子未注册,运行可能会出错)
3、本次复现在单卡训练约50h,未使用多卡任务;(因为脚本任务排队时间长,第一次排上了自定义算子运行出错,所以用aistudio单卡跑完)

In [ ]
# step 1: clone    # 可跳过# %cd ~/# !git clone https://gitee.com/dudulang001/PSANet_paddle.git# %cd PSANet_paddle# !git pull
In [ ]
# step 2: 卸载paddleseg   防止后续自定义外部算子未注册导致运行出错## 务必卸载paddleseg!pip uninstall paddleseg
In [ ]
# step 3: unzip data%cd ~/PSANet_paddle/
!mkdir data
!tar -xf ~/data/data64550/cityscapes.tar -C data/
%cd ~/
In [ ]
# step 4: 训练%cd ~/PSANet_paddle
!python train.py --config configs/psanet/psanet_resnet50_os8_cityscapes_1024x512_80k.yml \
     --use_vdl --log_iter 10 --s*e_interval 100 --s*e_dir output # --do_eval
In [1]
# step 5: val%cd ~/PSANet_paddle/
!python val.py \
       --config configs/psanet/psanet_resnet50_os8_cityscapes_1024x512_80k.yml \
       --model_path ~/model.pdparams
/home/aistudio/PSANet_paddle
Compiling user custom op, it will cost a few seconds.....
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/layers/utils.py:77: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
  return (isinstance(seq, collections.Sequence) and
2025-04-25 09:04:34 [INFO]	
---------------Config Information---------------
batch_size: 8
iters: 80000
loss:
  coef:
  - 1
  - 0.4
  types:
  - type: CrossEntropyLoss
  - type: CrossEntropyLoss
lr_scheduler:
  end_lr: 1.0e-05
  learning_rate: 0.01
  power: 0.9
  type: PolynomialDecay
model:
  align_corners: false
  backbone:
    output_stride: 8
    pretrained: https://bj.bcebos.com/paddleseg/dygraph/resnet50_vd_ssld_v2.tar.gz
    type: ResNet50_vd
  enable_auxiliary_loss: true
  mask_h: 59
  mask_w: 59
  normalization_factor: 1.0
  psa_softmax: true
  psa_type: 2
  shrink_factor: 2
  type: PSANet
  use_psa: true
optimizer:
  momentum: 0.9
  type: sgd
  weight_decay: 4.0e-05
train_dataset:
  dataset_root: data/cityscapes
  mode: train
  transforms:
  - max_scale_factor: 2.0
    min_scale_factor: 0.5
    scale_step_size: 0.25
    type: ResizeStepScaling
  - crop_size:
    - 1024
    - 512
    type: RandomPaddingCrop
  - type: RandomHorizontalFlip
  - brightness_range: 0.4
    contrast_range: 0.4
    saturation_range: 0.4
    type: RandomDistort
  - type: Normalize
  type: Cityscapes
val_dataset:
  dataset_root: data/cityscapes
  mode: val
  transforms:
  - type: Normalize
  type: Cityscapes
------------------------------------------------
W0425 09:04:34.999719   952 device_context.cc:447] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 10.1, Runtime API Version: 10.1
W0425 09:04:34.999774   952 device_context.cc:465] device: 0, cuDNN Version: 7.6.
2025-04-25 09:04:39 [INFO]	Loading pretrained model from https://bj.bcebos.com/paddleseg/dygraph/resnet50_vd_ssld_v2.tar.gz
2025-04-25 09:04:40 [INFO]	There are 275/275 variables loaded into ResNet_vd.
2025-04-25 09:04:40 [INFO]	Loading pretrained model from /home/aistudio/model.pdparams
2025-04-25 09:04:40 [INFO]	There are 316/316 variables loaded into PSANet.
2025-04-25 09:04:40 [INFO]	Loaded trained params of model successfully
2025-04-25 09:04:40 [INFO]	Start evaluating (total_samples: 500, total_iters: 500)...
500/500 [==============================] - 143s 287ms/step - batch_cost: 0.2866 - reader cost: 8.4048e-04
2025-04-25 09:07:04 [INFO]	[EVAL] #Images: 500 mIoU: 0.7994 Acc: 0.9637 Kappa: 0.9528 Dice: 0.8825
2025-04-25 09:07:04 [INFO]	[EVAL] Class IoU: 
[0.9839 0.8721 0.9272 0.5406 0.6225 0.6643 0.7219 0.8053 0.9271 0.654
 0.9481 0.8321 0.6427 0.9562 0.8628 0.9078 0.863  0.6689 0.7886]
2025-04-25 09:07:04 [INFO]	[EVAL] Class Precision: 
[0.9934 0.9274 0.9562 0.8691 0.8382 0.8159 0.8432 0.9091 0.9552 0.8596
 0.9646 0.8919 0.8184 0.9741 0.9425 0.9614 0.9633 0.8229 0.8825]
2025-04-25 09:07:04 [INFO]	[EVAL] Class Recall: 
[0.9904 0.936  0.9683 0.5885 0.7075 0.7814 0.8339 0.8758 0.9693 0.7322
 0.9823 0.9255 0.7496 0.9811 0.9107 0.9421 0.8923 0.7814 0.881 ]
In [ ]
# step 6: val flip%cd ~/PSANet_paddle/
!python val.py \
       --config configs/psanet/psanet_resnet50_os8_cityscapes_1024x512_80k.yml \
       --model_path ~/model.pdparams \
       --aug_eval \
       --flip_horizontal
In [ ]
# step 7: val ms flip %cd ~/PSANet_paddle/
!python val.py \
       --config configs/psanet/psanet_resnet50_os8_cityscapes_1024x512_80k.yml \
       --model_path ~/model.pdparams \
       --aug_eval \
       --scales 0.75 1.0 1.25 \
       --flip_horizontal
In [ ]
# step 8: 预测, 预测结果在~/PaddleSeg/output/result文件夹内%cd ~/PSANet_paddle/
!python predict.py \
       --config configs/psanet/psanet_resnet50_os8_cityscapes_1024x512_80k.yml \
       --model_path ~/model.pdparams \
       --image_path data/cityscapes/leftImg8bit/val/frankfurt/frankfurt_000000_000294_leftImg8bit.png \
       --s*e_dir output/result
In [6]
# 查看预测结果import cv2import matplotlib.pyplot as plt
image_path = "/home/aistudio/PSANet_paddle/output/result/added_prediction/frankfurt_000000_000294_leftImg8bit.png"image = cv2.imread(image_path)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

plt.imshow(image)
plt.show()
<Figure size 432x288 with 1 Axes>
In [ ]
# step 9: export   # 最好不要导出,自定义的外部算子目前在静态图推理有bug,issue:  https://github.com/PaddlePaddle/Paddle/issues/42068%cd ~/PSANet_paddle
!python export.py \
       --config configs/psanet/psanet_resnet50_os8_cityscapes_1024x512_80k.yml \
       --model_path ~/model.pdparams \
       --s*e_dir output --input_shape 1 3 512 1024
In [ ]
# step 10: infer         # 静态图推理,目前有bug,参考上一步issue%cd ~/PSANet_paddle
!python deploy/python/infer.py \
    --config output/deploy.yaml \
    --image_path ~/test.png \
    --s*e_dir output/infer/
In [ ]
## 静态图预测异常import cv2import matplotlib.pyplot as plt
image_path = "/home/aistudio/PSANet_paddle/output/infer/test.png"image = cv2.imread(image_path)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

plt.imshow(image)
plt.show()
In [ ]
# step 11: test tipc       准备数据# test tipc 1: prepare data%cd ~/PSANet_paddle/
!bash test_tipc/prepare.sh ./test_tipc/configs/psanet/train_infer_python.txt 'lite_train_lite_infer'
In [ ]
# step 12: test tipc       # test tipc 2: pip install requirements%cd ~/PSANet_paddle/test_tipc/
!pip install -r requirements.txt
In [ ]
# step 13: test tipc       # test tipc 3: 安装auto_log%cd ~/# !git clone https://github.com/LDOUBLEV/AutoLog           %cd AutoLog/
!pip3 install -r requirements.txt
!python3 setup.py bdist_wheel
!pip3 install ./dist/auto_log-1.2.0-py3-none-any.whl
In [ ]
# step 14: test tipc       这里需要注意,自定义的外部算子导出时需要给定维度,否则会导致维度丢失,参考train_infer_python.txt# test tipc 4: test train inference%cd ~/PSANet_paddle/
!bash test_tipc/test_train_inference_python.sh ./test_tipc/configs/psanet/train_infer_python.txt 'lite_train_lite_infer'

五、外部C++算子踩坑调试记录

1、仿照repo给的pytorch参考代码,写了外部算子,在cpu前向推理测试算子,与torch输出一致,于是直接训练模型,结果几次迭代后网络输出全部为nan;

2、移除自定义外部算子,网络训练恢复正常,确认问题在自定义算子内;

3、cpu测试,打印反向传播梯度,与torch不一致,仔细核对,发现问题为反向传播梯度不一致;
首先说一下原因:官方给的relu算子示例,他的特征图输出维度和输入维度是相同的,所以定义梯度不需要初始化,因为每个梯度值都会被覆盖(见下方代码)。
但是PSA算子的输入是[mask_h*mask_w, h, w],输出是[h * w, h, w],他们维度不同!!!! 所以如果不对梯度初始化,那么未赋值的梯度值是随机的,导致网络训练奔溃,将梯度初始化为0后解决该问题。(哭死,这里不知道掉了多少头发才发现)

std::vector<paddle::Tensor> ReluCPUBackward(const paddle::Tensor& x,                                            const paddle::Tensor& out,                                            const paddle::Tensor& grad_out) {  CHECK_INPUT(x);  CHECK_INPUT(out);  CHECK_INPUT(grad_out);  auto grad_x = paddle::Tensor(paddle::PlaceType::kCPU, x.shape());   # 看这里  auto out_numel = out.size();  auto* out_data = out.data<float>();  auto* grad_out_data = grad_out.data<float>();  auto* grad_x_data = grad_x.mutable_data<float>(x.place());  for (int i = 0; i < out_numel; ++i) {
    grad_x_data[i] =
        grad_out_data[i] * (out_data[i] > static_cast<float>(0) ? 1. : 0.);
  }  return {grad_x};
}

4、cpu算子调试好了后,cuda算子就好写多了,但是需要注意不要有小错误,不然很难发现;(梯度初始化一开始写错了,部分未初始化为0,然后一个个梯度打印出来调试,又是大把的头发)

六、复现经验

1、使用paddleseg套件复现论文,可以赢在起跑线;
2、论文提供的repo不一定没问题(切记这一点,官方的repo模型中有个compact参数,只要设定了就会报错,一开始以为自己写的有问题,后来发现原来官方提供的就有问题,只是它没用到);
3、写自定义算子一定要仔细核对,最好能够一个个参数前向反向对齐,cpu gpu都确认无误再使用,否则出问题很难debug。

以上就是【论文复现赛第六期】PSANet(含自定义C++外部算子调试经验)的详细内容,更多请关注其它相关文章!


# git  # python  # 自定义  # type  # fig  # whee  # udio  # igs  # red  # pip安装  # cos  # c++  # ai  # 网站建设期望度问卷  # seo要学代码吗  # 推广案例网站设计教程  # 新网站怎么做seo优化  # 抚州谷歌seo推荐  # 昆明抖音seo公司  # 建设股公司网站  # 广州网站seo优化费用  # 昆明seo工具  # 吐鲁番网站建设哪家专业  # 官网  # 未注册  # 要有  # 很难  # 需要注意  # 信息传递  # 一言  # 第六期  # 中文网 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 时间、空间可控的视频生成走进现实,阿里大模型新作VideoComposer火了  微软bing聊天推出AI购物工具 可进行比价并查看历史最低价  提升工作效率的智能工具:Zapier 让工作变得更简单!  北京公司实施AI技术,推行4.5天工作制,抵制996文化,提升员工工作幸福感  优傲机器人的人机协作技术 助力中小企发展  斑马推出全新升级版思维机:以人工智能为核心的交互式学习体验  在这里见未来!杭州未来科技城全球AI盛会邀您共探最前沿  测试框架-安全和自动驾驶  央视报道!星纪魅族集团车载人机交互技术成世界移动通信大会焦点  人工智能赋能广西自然资源领域监测监管  iPhone两秒出图,目前已知的最快移动端Stable Diffusion模型来了  2025世界人工智能大会(上海)开幕式纪要  郭帆:AI发展日新月异,或是弯道超车好莱坞的最好机会  《共同的演化》展览启幕,重新思考人类与人工智能关系  导演郭帆:人工智能应用可能会影响《流浪地球 3》的创作开发  Moka发布AI原生HR SaaS产品“Moka Eva”,布局AGI时代  第四范式「式说」大模型入选《2025年通用人工智能创新应用案例集》  中国联通推出“极光一号”5G机载终端,适配大疆等品牌无人机设备  陈丹琦ACL学术报告来了!详解大模型「*」数据库7大方向3大挑战,3小时干货满满  AI在教育中的角色:AI如何改变我们的学习方式  WHEE功能介绍  周星驰支持的人工智能与 Web3 初创公司 Moonbox 完成 100 万美元融资  人工智能大胆预测:银河系至少有2万个地球,36种外星文明  真全息产品,亮相深圳文博会——dipal数伴拓展元宇宙非沉浸式体验  国内通用人形机器人将发布、产业加速突破  智能化解决方案:保障数据安全阻击泄露和丢失  世界人工智能大会机器人同台炫技!梳理A股相关业务营收占比超50%的个股名单  谷歌推出RT-2视觉语言动作模型,使机器人能够掌握垃圾丢弃技能  联通发布鸿湖图文AI大模型1.0,可实现以文生图  马斯克发推讽刺人工智能:机器学习的本质就是统计  赋能金融新生态,多家银行创新应用成果亮相世界人工智能大会  挤爆服务器,北大法律大模型ChatLaw火了:直接告诉你张三怎么判  意大利警察拟用AI预测犯罪 该算法被指种族歧视严重  亚马逊确认今年不举办re:MARS人工智能大会  苹果在韩举办首届中小企业智能制造论坛,加速推动工业4.0发展  为了避免人工智能可能带来的灾难,我们要向核安全学习  1.6亿美元收购Singularity AI,昆仑万维布局通用人工智能  大疆 Air 3 无人机售价和实物照片曝光  绿联发布笑脸屏幕显示充电状态的30W/65W Q湃机器人充电器  人工智能如何改变未来语言?  电池比 Air 2S 大 20%,大疆 Air 3 无人机现身 FCC  650亿参数,8块GPU就能全参数微调:邱锡鹏团队把大模型门槛打下来了  联想浏览器引入小乐 AI 助手,成功接入百度文心一言大模型,经过实测证实  Win11 的画图应用将包含 Windows Copilot 的 AI 工具整合  阿里达摩院发布免费开放100项AI专利许可的动机是什么?  映宇宙数字人“映映”亮相ChinaJoy,展示AI黑科技实现用户互动  陈根:AI工具为游戏软件实时3D内容助力  AI 冥想应用 Ogimi.ai 推出,可为用户提供教练级个性化指导  给小朋友最好的科技礼物:乐天派桌面机器人  Valve 将拒绝采用 AI 生成未知版权内容的游戏上架 Steam 

 2025-07-16

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.