范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

使用MindStudio进行FOMM模型推理全流程详解

  使用MindStudio进行FOMM模型推理
  使用MindStudio对FOMM模型进行ONNX推理
  本次实验使用MindStudio开发工具进行SSH远程连接、编译、开发等操作,MindStudio的安装配置请参照:
  https://www.hiascend.com/document/detail/zh/mindstudio/50RC2/progressiveknowledge/index.html
  MindStudio提供了AI开发所需的一站式开发环境,支持模型开发、算子开发以及应用开发三个主流程中的开发任务。依靠模型可视化、算力测试、IDE本地仿真调试等功能,MindStudio能够帮助您在一个工具上就能高效便捷地完成AI应用开发。MindStudio采用了插件化扩展机制,开发者可以通过开发插件来扩展已有功能。
  一、模型简介
  FOMM模型最早是Aliaksandr Siarohin等人在发表的《First Order Motion Model for Image Animation》一文中提到的用于图像动画化(image animation)的模型。图像动画化任务是指给定一张原图片和一个驱动视频,通过视频合成,生成主角为原图片,而动画效果和驱动视频一样的视频。以往的视频合成往往依赖于预训练模型来提取特定于对象的表示,而这些预训练模型是使用昂贵的真实数据注释构建的,并且通常不适用于任意对象类别。而FOMM的提出很好的解决了这个问题。
  FOMM主要依赖于两个模型:kp detector和generator。顾名思义,第一个模型的作用是关键点检测,第二个模型的作用是视频生成。而本次FOMM模型推理实验也是主要围绕这两个模型来进行。
  本文详细介绍了在310P(昇腾显卡)和T4(nvidia显卡)两种机器上,使用MindStudio对FOMM模型进行onnx模型推理的具体步骤。
  二、MindStudio项目初始化
  1 新建项目
  首先在Name一栏输入项目名:
  然后我们需要配置项目的CANN工具包依赖。尤其是我们第一次使用MindStudio的时候,这一步是不可省略的。
  选择CANN Version一栏后面的Change选项,配置我们项目的CANN工具包依赖。在该界面,首先选择我们的项目开发所使用的服务器,然后选择服务器上CANN工具包的安装路径,最后点击Finish,保存配置。
  MindStudio在创建新项目这一界面为我们提供了一个昇腾APP应用Pyhton框架空工程,这能帮助我们更加方便地管理和开发我们的应用,即下图中的ACL Project(Python),我们选择这一项,点击Finish。
  2 下载github源码仓
  进入项目界面后在底部选择"终端",执行如下命令:
  git clone https://github.com/AliaksandrSiarohin/first-order-model.git
  等待下载完成
  这里为了方便,我们将下载下来的源码从first-order-model文件夹中提出来,直接放在FOMM1(我们的项目目录)下,并删除空的first-order-model文件夹。
  3 配置conda环境,安装项目所需依赖
  源码仓的readme建议使用pip install -r requirements.txt安装项目所需依赖。
  但由于其依赖版本过低,所以此处不建议直接使用源码仓中的requirements.txt进行安装。具体依赖和版本如下:
  依赖名称
  版本
  cloudpickle
  2.1.0
  cycler
  0.11.0
  dask
  2022.2.0
  decorator
  5.1.1
  imageio
  2.21.0
  imageio-ffmpeg
  0.4.7
  kiwisolver
  1.4.4
  matplotlib
  3.3.2
  mmcv-full
  1.5.0
  networkx
  2.7.1
  numpy
  1.21.5
  onnx
  1.12.0
  onnxruntime
  1.12.1
  opencv-python
  4.6.0.66
  pandas
  1.3.5
  pillow
  9.2.0
  pycparser
  2.21
  pyparsing
  3.0.9
  python
  3.7
  pytz
  2022.1
  pytorch
  1.11.0
  pywavelets
  1.3.0
  pyyaml
  6.0
  scikit-image
  0.18.0
  scikit-learn
  1.0.2
  scipy
  1.7.3
  six
  1.16.0
  skl2onnx
  1.12
  sympy
  1.10.1
  toolz
  0.12.0
  torchaudio
  0.11.0
  torchvision
  0.12.0
  tqdm
  4.64.0
  其中需要注意的是,scikit-image的版本必须低于0.19.0。
  另外,根据源码仓readme,需要额外从github上下载一些依赖包:
  在我们的项目目录下运行如下命令:
  git clone https://github.com/1adrianb/face-alignment
  cd face-alignment
  python setup.py install
  cd ..
  git clone --recursive https://github.com/AliaksandrSiarohin/pose-evaluation
  git clone https://github.com/facebookresearch/maskrcnn-benchmark
  cd maskrcnn-benchmark
  python setup.py install
  4 下载数据集
  为了方便下载,这里提供了已经预处理好的taichi数据集(.mp4格式)。
  https://pan.baidu.com/s/1zSDFYXwrBvCfw2NAIxQAYg
  提取码:mind
  下载整个taichi文件夹,将下载后的taichi文件夹放入FOMM1/data/。
  三、配置远程服务器
  1 添加SSH配置
  点击左上角file,选择setting
  在左侧选择tools,在下拉菜单中选择SSH Configurations,点击"+"
  在新建的空白配置页面输入服务器ip,用户名,密码;
  勾选save password保存密码;
  点击test connection测试是否能连接服务器;
  最后点击下面的ok配置完成。
  配置好SSH服务器后回到项目界面,点击上方菜单栏中的tools,在下拉菜单中点击start SHH session,选择刚才配置好的SSH连接,即可成功连接SSH服务器,并弹出远程操作终端:
  2 管理CANN工具包
  如果我们在使用过程中需要更换我们所要使用的CANN工具,则可按照以下步骤更换。
  首先,如下图所示,点击MindStudio界面上端的CANN manager按钮,打开CANN管理界面:
  按下图所示,先在弹出的界面选择change CANN,然后在新弹出的界面选择我们使用的远程服务器:
  然后如下图所示,选择服务器上CANN工具包安装的目录,我这里是/home/infname46/Ascend/ascend-toolkit/5.1.RC2,选择好后点击ok:
  最后点击finish,等待部署完毕即可:
  配置好后,重启MindStudio。
  3 部署项目至服务器
  在顶部菜单栏选择Tools,在下拉菜单中选择Deployment,再选择Configuration:
  在弹出的配置页面中,首先点击"+",输入配置名称,点击OK:
  然后在右侧SSH configuration处选择项目部署的服务器,之后同样点击test Connection测试连接是否成功,然后选择Mappings配置项目映射目录:
  在mapping中配置路径映射关系,配置好后点击ok提交:
  最后,完成了服务器的一切配置之后,需要将项目部署到服务器上。在MindStudio项目界面,右键选择我们的项目,选择Deployment,Upload to,选择目标服务器:
  文件开始上传:
  最后,我们可以通过"Tools—Deployment—Automatic Upload"来设置自动部署。设置好自动部署后,每当我们在本地对程序进行修改后,按"Ctrl + S"保存,MindStudio便会自动将编辑过的文件自动上传至服务器。
  4 配置远程SSH解释器
  该步骤的目的是可以在本地的windows系统上使用MindStudio运行/调试在远程服务器上运行的程序。
  首先点击MindStudio右上角的齿轮,在弹出的列表中选择Project Structure:
  在弹出的设置界面,选择左侧菜单栏的SDK,点击"+",选择Add Python SDK:
  在弹出的界面选择SSH Interpreter;选择项目部署的服务器;选择服务器上所使用的conda虚拟环境的安装路径;最后点击OK保存配置:
  5 设置项目的默认python环境
  首先进入project structure界面,左侧然后左侧选择project,再project的SDK选项下选择我们要使用的python环境,具体如下图:
  然后再选择project structure界面中的modules,在该界面配置modules SDK,额然后点击ok保存配置即可:
  四、模型转换
  1 生成onnx模型
  在项目中创建以下目录:
  checkpoint
  taichi-onnx
  taichi-onnx/oms
  然后根据作者提供的链接下载所需的.pth.tar格式的模型参数文件,保存在checkpoint文件夹中。
  模型参数文件的链接如下:
  https://drive.google.com/open?id=1PyQJmkdCsAkOYwUyaj_l-l0as-iLDgeH
  编写将.pth.tar格式的checkpoint转化为onnx模型的程序get_onnx_bs1.py,放在项目根目录下。
  实现思路很简单,用源码仓提供的模型加载函数加载checkpoint模型,然后用torch.onnx.export导出onnx模型。
  代码中用到的util.load_checkpoints是从项目源码中提取出来的一个函数,其主要内容见下图:
  此外,因为目前onnx对某些pytorch中的算子还不支持,此项目中所涉及到的onnx不支持的算子包括:torch.inverse和torch.nn.functional.grid_sample。这两个算子需要我们用onnx支持的算子重新实现。其中inverse算子我们用自己实现的inverse_without_cat.py中的invmat函数代替;grid_sample算子用point_grid_my.py中的bilinear_grid_sample函数代替。
  inverse_without_cat.py和point_grid_my.py的具体内容如下:
  编辑好后将这两个程序放在项目目录下。
  导出onnx之前需要对以下python文件进行修改:
  将modules/dense_motion.py中的下图所示位置代码替换为:
  jacobian = torch.matmul(kp_source["jacobian"], invmat(kp_driving["jacobian"]))
  将modules/dense_motion.py中下图所示位置的代码替换为:
  sparse_deformed = bilinear_grid_sample(source_repeat, sparse_motions)
  将modules/generator.py中的下图所示位置的代码替换为:
  return bilinear_grid_sample(inp, deformation, align_corners=True)
  修改完成后,使用onnx模型转换程序导出onnx模型。
  首先我们要在MindStudio上配置get_onnx_bs1.py的运行环境,点击进入编辑配置界面:
  进入编辑配置界面后,点击"+",选择Ascend App,首先在界面上方的Name一栏输入程序名称,然后在Deployment一栏选择项目部署的配置,即我们在"第三章第3节 部署项目至服务器"中配置的服务器。
  在Executable处选择get_onnx_bs1.py:
  然后在Parameters一栏输入如下参数配置:
  --config config/taichi-256.yaml --checkpoint checkpoint/taichi-cpk.pth.tar --outdir taichi-onnx --genname taichi-gen-bs1 --kpname taichi-kp-bs1
  最后点击ok保存程序配置。这样配置好以后就可以实现在本地的MindStudio上调试远程服务器上运行的python程序了。
  点击MindStudio上方工具栏的绿色三角按钮,运行该程序即可导出onnx模型。
  2 onnx模型转换成om模型
  首先如下图所示,点击MindStudio界面上端的model converter按钮,在弹出的界面中首先选择服务器上onnx模型的位置,然后等待模型加载完毕后,继续在target soc version一栏选择自己的昇腾服务器的芯片类型,我这里用的是Ascend310P3,最后选择om模型的输出位置,然后点next即可。
  然后这里直接点next:
  最后第三个页面直接点finish,开始模型转换:
  稍等片刻,模型转换成功:
  五、模型推理
  1 配置推理环境
  将aclruntime-0.0.1-cp37-cp37m-linux_x86_64.whl下载下来,放在项目目录下,并上传至服务器。
  下载链接:https://pan.baidu.com/s/1mzZhhPByVcXVeqUk9S9qNQ
  提取码:mind
  下载推理程序包,在本地的终端执行以下命令:
  git clone https://gitee.com/ascend/tools.git
  等待下载完成,然后将下载好的tools包上传至服务器(也可以直接在服务器的终端输入上条命令clone到服务器上)
  然后在远程服务器终端上执行以下命令,安装aclruntime包:
  pip install aclruntime-0.0.1-cp37-cp37m-linux_x86_64.whl
  (若是在普通用户下执行需要加上--user参数)
  2 数据预处理
  首先修改config/taichi-256.yaml,将其中dataset_params:下的root_dir:修改为data/taichi。
  参考FOMM1/reconstruction.py,编写数据预处理程序如下:
  然后需要修改run.py。首先将下图中所示的代码修改为:
  parser.add_argument("--mode", default="train", choices=["train", "reconstruction", "animate", "pre"])
  然后在run.py的最后添加代码:
  elif opt.mode == "pre":
  print("pre processing...")
  pre_processing(config, generator, kp_detector, opt.checkpoint, log_dir, dataset)
  然后修改logger.py中下图所示的那行代码,将其改为:checkpoint = torch.load(checkpoint_path, map_location=torch.device("cpu"))
  打开Run/Debug Configurations界面:
  配置好run.py的mode为预处理的运行参数和环境:
  点击运行run.py。等待程序执行完毕:
  运行结束后在终端查看预处理后的数据的保存目录,保存结果如下所示:
  3 模型推理
  首先是在昇腾服务器上推理om模型:
  这里为了后续使用数据方便一些我们将tools/ais-bench_workload/tool/ais_infer/ais_infer.py中下图所示位置的代码修改成:
  if args.output != None:
  # timestr = time.strftime("%Y_%m_%d-%H_%M_%S")
  output_prefix = args.output
  # os.mkdir(output_prefix, 0o755)
  logger.info("output path:{}".format(output_prefix))
  else:
  output_prefix = None
  然后我们需要配置服务器上的环境变量:
  首先在服务器终端执行命令:vim ~/.bashrc
  然后在文件的最后添加如下内容:
  source /usr/local/Ascend/ascend-toolkit/set_env.sh
  source /etc/profile
  然后即可开始进行模型推理。首先配置Ascend App程序:
  其中Executable为:项目目录/tools/ais-bench_workload/tool/ais_infer/ais_infer.py
  运行参数为:
  --model /home/ltm/fomm/taichi-onnx/oms/taichi-kp-bs1.om --input /home/ltm/fomm/infer_out/d/ --output /home/ltm/fomm/infer_out/kpd/ --outfmt NPY
  然后按同样的方式,再配置一个名为infer kps的运行参数为如下内容的Ascend App程序:
  --model /home/ltm/fomm/taichi-onnx/oms/taichi-kp-bs1.om --input /home/ltm/fomm/infer_out/d/ --output /home/ltm/fomm/infer_out/kpd/ --outfmt NPY
  配置好后点击运行按钮运行程序:
  等待代码运行完毕即可。程序运行完后,下图中所标示的值便是我们测出来的性能指标:
  之后,需要运行apart_kp_out.py,对推理kp模型输出的数据进行简单处理,以便之后使用。首先配置apart_kp_out.py的运行环境:
  配置好后运行该程序:
  待程序运行结束,即可开始gen模型的推理,同样先配置Ascend App程序:
  其中Executable为:项目目录/tools/ais-bench_workload/tool/ais_infer/ais_infer.py
  运行参数为:--model /home/ltm/fomm/taichi-onnx/oms/taichi-gen-bs1.om --input /home/ltm/fomm/infer_out/s/,/home/ltm/fomm/infer_out/kpdv/,/home/ltm/fomm/infer_out/kpdj/,/home/ltm/fomm/infer_out/kpsv/,/home/ltm/fomm/infer_out/kpsj/ --output /home/ltm/fomm/infer_out/out/ --outfmt NPY
  配置好后点击运行,等待程序运行结束即可。
  至此,在310P上推理om模型就完成了。接下来要在T4机器上推理模型,由于目前TensorRT不支持FOMM里的用到的很多算子,故此次推理使用线上推理。
  首先要写一个线上推理用的python程序:
  推理程序的实现思路很简单,用python的time包记录模型从输入到输出所花费的平均时间然后把平均时间代到性能的计算公式里即可。这部分功能我写在online_infer.py里,其核心代码如下:
  然后修改run.py,首先修改其下图中所示的代码:
  将这句修改为:parser.add_argument("--mode", default="train", choices=["train", "reconstruction", "animate", "pre", "infer", "ori_re"])
  然后在最后加上如下代码:
  elif opt.mode == "infer":
  print("Infer ...")
  infer(config, generator, kp_detector, opt.checkpoint, log_dir, dataset)
  改好后,进入运行配置界面,配置推理程序:
  配置好后运行该程序,等待程序运行结束即可:
  程序运行结果如下:
  4 精度测试
  此处需要对源码中的FOMM1/reconstruction.py进行较大修改:
  然后配置run.py的mode为reconstruction的运行参数的环境:
  然后点击运行,运行run.py,等待程序运行结束:
  Reconstruction的结果保存在./checkpoint/reconstruction/下:
  然后配置pose-evaluation/extract.py的两个运行环境,如下所示:
  其中参数为:
  --in_folder ../data/taichi/test/ --out_file out/akd_gt.pkl --is_video --type body_pose --image_shape 256,256
  和
  --in_folder ../checkpoint/reconstruction/png/ --out_file out/akd_gen.pkl --is_video --type body_pose --image_shape 256,256
  配置好后依次运行两个程序:
  等待程序运行完毕。
  两个程序运行结束后,分别可以得到一个.pkl格式的文件,最后,配置精度计算的程序:
  然后运行该程序,即可得到FOMM模型的精度指标:
  至此,一整个FOMM模型推理过程就结束了
  六、其他问题
  如果在开发过程中遇到其他问题或者是不明白的地方,我们可以登录昇腾官方论坛进行求助。昇腾论坛链接如下:
  https://bbs.huaweicloud.com/forum/forum-945-1.html
  在这里,我们可以找到很多经验帖、总结帖,亦可以在昇腾论坛发帖求助技术人员,帮助我们解决问题。
  七、FAQ
  问题一:
  转onnx模型的时候出现"Exporting the operator inverse to ONNX opset version 11 is not supported"的报错。
  分析:
  出现这个错误的原因是因为onnx目前还不支持Pytorch的部分算子,比如我在项目中遇到的torch.inverse和torch.nn.functional.grid_sample这两个算子,都是onnx现在还不支持的算子,如果模型中有使用到这两个算子的话,则会在转onnx模型的时候报上述的错误。
  解决方法:
  用onnx支持的算子实现onnx不支持的算子的功能,或者寻找替代的算子。
  问题二:
  使用Model Converter的时候CANN Machine一栏无法更改。
  解决方法:
  Model Converter界面中的CANN Machine一栏的内容无法在Model Converter界面修改,想要修改的应该点击CANN Manager,在此界面更改项目的CANN工具依赖。

不加一滴油,用空气炸锅,做好吃的虎皮鸡爪家里人很喜欢去菜市场买做好的虎皮鸡爪,口感绵软,容易脱骨。拌上料非常好吃。这东西在家里基本上是无法实现的,因为要走大油油炸,而且鸡爪又含水分,容易爆,所以非常危险,一般不轻易尝试。天冷了,教你一道懒人酸辣汤,营养开胃,喝上一碗暖胃浑身热乎乎本期导读天冷了,教你一道懒人酸辣汤,营养开胃,喝上一碗暖胃浑身热乎乎天气越来越冷了,汤菜特别受欢迎,做法简单,吃着热乎,酸辣汤,是一道家常汤菜小吃,口味酸辣咸鲜香,喝着营养开胃。酸理想中的肉末茄子,软糯香滑入味,美味少油可以兼得以前做茄子肉末都要放很多油,这次不会,真的健康美味!(厨友快乐生活乐乐乐)想香点就还是很油炸,减肥的这方子很适用,蛮好吃的,很解馋。(厨友丫头Abby)厨友雨少寒轩理想中的肉末茄子如果没有月亮,我们的世界会变成怎样?头条创作挑战赛今天高冷神秘会给大家讲,如果世界上没有月亮,我们的世界将会变成什么样。不知道大家有没有想过如果没有月亮会怎么样。月亮虽然离我们非常遥远,有足足38万公里,并且在地球上视频霜降至,看滨海湾深秋里的盎然生机秋风萧瑟天气凉,草木摇落露为霜。今日霜降,是二十四节气中的第十八个节气,秋季的最后一个节气,也是一年之中昼夜温差最大的时节。霜降时节,意味着暮秋已至新冬欲来。万物毕成,草木开始枯黄红尘有道,大象无形,自然可好我就像一粒微小的尘埃自从那一天,你走进我心海我心潮澎湃每一天我都在期待期待着你的到来因为我对你早已经相思成灾一颗心随着你去浪迹天涯海角有你的地方就会有我的存在与你相遇在这茫茫的网海军队驻地标准合理确定,军人周末回家休息权益得到更好维护剑客行者三剑客三剑客漫画大唐说起驻地官兵,我想起一个故事。心中顿又五味杂陈。很久前,在某军官的营区附近,有个公路桥。而这个桥,恰巧是两个省的分界线。而这个分界线,也给大家的生活带来洞庭湖中央有个小渔村,周末带家人来这有得吃又好玩在洞庭湖中央的赤山岛(又名蠡山岛)的一个美丽山村沙湾渔村,这里人们傍湖而居,这里山清水秀,环境优美,水天一色,自治理洞庭湖,保护好母亲湖,优化自然环境以来,渔民上岸发展,种植柑橘,5场集体采访收官代表团新闻发言人妙语谈生态近日,中国共产党第二十次全国代表大会新闻中心举行多场集体采访,各代表团新闻发言人共话近年来各地区自然生态取得的成效。同期北京代表团新闻发言人北京市委常委秘书长赵磊今年北京,PM2。或许你不知道,武汉是个被埋没的宝藏旅游城市去过一趟武汉才后悔,你会发现,你真的是去迟了,在很多喜好旅行的人眼里,武汉,其实是一个被埋没的宝藏旅游城市!那里有黄鹤楼与武汉第一高楼绿地大厦,还有鹦鹉洲大桥与龟山电视塔,还可以去武汉又火了,200米山上发现新物种,是时候出去走走了10月20日,科研人员官宣,在武汉黄陂发现了一个新物种,目前在中国其他地方没有发现过,在全球也没有听说过,有可能成为武汉的招牌物种。发现新物种的地方,就在武汉黄陂石门山上,大约20
探秘俄罗斯,十块钱在俄罗斯能干哪些事?俄罗斯是个地广人稀的国家,冬天的时候,天寒地冻。现在不少人热衷于冬天到俄罗斯旅行,在俄罗斯看雪景,感受北国风光。除了感受当地的风景以外,青春靓丽的俄罗斯妹子,也是很多中国男人所喜欢集体村落开发项目启动仪式在泰安肥城市隆重举行9月28日,振兴新乡村淘响圣井峪集体村落开发项目启动仪式在肥城市圣井峪旅游度假村隆重举行。安临站镇党委书记王开军,党委副书记镇长梁乙胜出席活动肥城市旅游发展服务中心副主任刘建军到会四川渠县两江四岸展新颜三山两水入画来封面新闻记者曾业依山傍水,大美渠县。渠江和流江,在四川渠县交汇,三国古战场八濛山自然生态马鞍山地标景区文峰山遥相呼应。两江四岸,三山两水,8个城市公园点缀其间,山水相融,景城一体,分手25年后,再看杨钰莹与赖文峰,他们各自有着怎样的人生境况?前言有一次我无意地翻看杂志,看到杨钰莹,我就在想我将来的女朋友就应该是这个样子。说这句话的正是原来厦门远华集团董事长的侄子,赖文峰。当他第一次在杂志上看到杨钰莹的时候,就被她甜甜的人生如戏岁月如歌人生如戏岁月如歌儿童像梦幻,少年像童话,青年像诗歌,中年像小说,老年像散文,而整个人生酷似戏剧。这是在潜江曹禺公园的石头上看到的,也被这几名句简单的话深深地吸引了,以人生如戏岁月如朋友圈可爱又押韵的句子,超好玩一早上困,中午困,晚上困,一拿手机就不困。二花花世界迷人眼,没有实力别赛脸。三老骥伏枥,志在千里,横扫饥饿,做回自己。四只要男人换得快,没有悲伤只有爱。五爱情经不起等待,叫我宝贝就王俊凯,比易烊千玺,差吗?为什么走着走着,人生就大不同1999年9月21日,王俊凯出生在重庆市。1年2个月又7天后的2000年11月28日,易烊千玺出生在湖南省怀化市洪江市。其实,命运一开始并没有把这2个小屁孩,摆在一起,让他们在同一时隔50年!72岁作家不远千里来到临平寻昔日知己上世纪70年代,我作为知青来临平下乡插队,在这里生活了5年。现在50年过去了,想找到曾经的好朋友,写他们,也是我的一大愿望9月21日,72岁的杨阿姨独自一人来到东湖派出所综合服务中忍不住想摘抄!那些富含人生哲理的宝藏金句头条创作挑战赛1人生难得是青春,要学汤铭日日新。但嘱加鞭须趁早,莫抛岁月负双亲。袁玉冰2人生就是这样,要耐得住寂寞,才守得住繁华。七堇年3我们不肯探索自己本身的价值,我过分看重别人心灵都震撼了哪些话曾给予鼓舞的力量生而为人,多少会遇到一些挫折迷茫胆怯退缩。那么,在你的人生旅途中,有没有这样一两句话,给你以鼓舞的力量,助你撕开黑暗,走出思维的迷茫,重新踏上征途呢?1讲真的,你真正要做的事情,连人民日报金句摘抄纵有疾风起,人生不言弃1。昙花一现,却等待了整个白昼蝉鸣一夏,却蛰伏了好几个四季。2。不因一叶障目,而不识神秀岱宗不为一朝风月,而不解万古长空。3。不是所有的坚持都有结果,但总有一些坚持,能从一寸冰封的