-
华为ai创作,真滴不错,
-
各位开发者小伙伴,1024活动已经落下帷幕啦活动精彩回放请前往【向云而生·1024程序员节】进行回顾在这个程序员节,我们奉上了开发者为主角的直播盛典8位开发者为您讲述了自己的成长之路12场技术直播,华为云专家给您带来了最前沿的技术干货还有AI、IOT、数据库、数字机器人等10+赋能课程AI作画让您领略了人工智能的绘图魅力开发者认证让您更好地证明了自己的学习成就相信这次程序员节您收获满满~12月12日活动开奖啦!公示期截止12月15日24点公示期有任何疑议请微信联系华为云小助手01【微信号:hwcloud01】为避免信息遗漏,不接受其他方式沟通咨询哈~奖品将在12月20日前邮寄如遇其他情况延迟发货将在本帖进行说明没有填写奖品邮寄信息表的用户请抓紧填写获奖信息收集表:cid:link_0兑奖截止日期:2022年12月15日24点逾期视为弃奖,不补发的哦!终极大奖获奖用户名单yd_294805619参与体验抽无线鼠标获奖用户名单宸一wxstar8wiki.wang楠羽孙小北这个地方是昵称玉米大砍刀MeowCandyyd_240226496yd_219711917jpnm01yd_252707528yd_291025743yd_247246417lambert-97yd_51210837Yeats_Liao写在黄河那边yd_213502166云创数码DeepBlack十年树木yd_214778988yd_282923624yd_253581440yd_214119195yd_230470858suhouyiyd_268727814IT技术分享社区Archiveyd_213567128yd_263652204HWY-JemonJackyd_212030892高级云网管yd_299973837yd_217835051浓墨淡彩charm_11Jack20stsl浮沉随浪云司机花溪yd_273043000惘纬马生北屿、yd_234736785贾玲小名明白yd_222000010春暖花开鸭先知yd_247400592yd_224859370suifeng1324etudouyd_248408148yd_247420638fsifddsenjoy快乐yd_260581964yd_298333163繁星666胡琦yd_217899404向瑶函yd_242363962nukinsansolojinbei清雨小竹HB1688yd_228742227jcuckoo朱晓玲陈女士JaneConanyd_240107967yd_216968427参与课程学习抽技术书籍获奖用户名单yd_230071579yd_241408118yd_222024386yd_219415723yd_274596252yd_228070605yd_276847401yd_223026678yd_212460198yd_279258108yd_278748971yd_268377690yd_293342506yd_266107152yd_295195244yd_249114302yd_277122788yd_236543048yd_278404838yd_244879313yd_233667126yd_228936739yd_249996875yd_270714822wq765416999yd_275588207yd_287641417yd_250824828yd_284678188yd_210485554yd_239402046yd_235438957yd_225151767yd_210703006yd_263082519yd_234195495yd_298771856yd_214653737yd_252786135yd_247436979yd_277815831yd_287365261yd_245556066yd_293544034yd_261851172yd_262871738yd_251255061yd_243790537yd_258916864yd_295264576yd_285625009yd_244585531yd_230209929yd_217999734yd_270354123yd_268004872yd_276821101yd_213923649yd_239811570yd_240518538yd_263528391yd_295673607yd_266731347yd_213671314yd_297637016yd_248822574yd_249782213yd_249459026贺珺yd_249479989yd_233465280yd_287995306yd_279193075yd_223643431yd_284904424yd_269153679yd_267763465yd_224039283yd_237924774yd_268607286报名活动抽幸运盲盒获奖用户名单yd_210822078yd_244213231yd_265393154yd_253349375yd_281276705yd_237665850yd_257213989yd_289128518yd_251790179yd_268598884yd_289261550yd_223645112yd_267520148yd_221326510yd_242069630yd_240988629yd_245167351yd_236026573yd_212595328yd_252405320yd_251813210yd_264026510yd_232880902yd_272288881yd_232961600yd_288636818yd_286168834yd_281362712yd_282081658yd_240826904yd_297755054yd_276300745yd_285915137yd_243582016yd_212605493yd_250431196yd_290111390yd_233600190yd_281288513yd_238950748yd_250932097yd_277505431yd_273827728yd_231190079yd_222823601sunofprovenceyd_231175573yd_251044525yd_279617170yd_270904411yd_293317080yd_227800022yd_239698361TiAmoZhangyd_275706905yd_223455627yd_237296731yd_236535379yd_231160286yd_248587354yd_223448322yd_262968408yd_280871982yd_212653554yd_224484498yd_271414026yd_223127468yd_238110245yd_237731380yd_230834212yd_297702280yd_235867509yd_256907194yd_293979782yd_280502684yd_299964080yd_229890964yd_245032869yd_295709647yd_271410174yd_252865363yd_299954779yd_237667580yd_216968427yd_293568877yd_219187186yd_213423458yd_253497002yd_244482145yd_275543192yd_233339849yd_270098299yd_292505566yd_268024858yd_242034010yd_295533109yd_261043069yd_235223267yd_266741220yd_270119745下面公布我们这次活动期间的有效参与用户名单请在下方查看哦!公示期:即日起截止12月11日24点公示期有任何疑议请微信联系华为云小助手01【微信号:hwcloud01】为避免信息遗漏,不接受其他方式沟通咨询哈~公示期结束后12月12日将使用巨公抽奖平台等方式抽取届时可在本帖查看最终获奖名单奖品将在12月20日前邮寄如遇其他情况延迟发货将在本帖进行说明没有填写奖品邮寄信息表的用户请抓紧填写获奖信息收集表:cid:link_0兑奖截止日期:2022年12月15日24点逾期视为弃奖,不补发的哦!再次介绍一下12月12日将要抽取的奖项:报名参加“向云而生· 1024程序员节”活动(以下简称社区活动)在11月30日前完成社区活动任务,即可参与不同奖品的抽奖。·报名社区活动并参与任意一项活动,即可抽取 幸运盲盒,奖品数量100个;·参与“技术宝典”活动,在活动期间:1、报名并完成任意特定课程的学习即可抽取《ModelArts人工智能应用开发指南》书籍,奖品数量80本;2、报名并完成完成任意指定产品体验任务即可抽取 无线鼠标,奖品数量80个;3、报名并完成任意指定认证即可参与抽取终极大奖礼包(价值4000元电子产品)。具体活动规则请查看:cid:link_1终极大礼包有效参与用户名单通过认证用户公示名单序号认证名称论坛昵称华为云账号通过认证时间1GaussDB入门级开发者认证-Javayd_260839465hw7****0992022/10/262人工智能入门级开发者认证yd_213567128hid****82xiwlmwz4u12022/10/283人工智能入门级开发者认证编号是局loy****ve19892022/11/284GaussDB入门级开发者认证-Javayd_240226496JNU****107332272022/11/65人工智能入门级开发者认证yd_260581964hw0****53252022/11/266人工智能入门级开发者认证yd_214188310bkp****p2022/10/287人工智能入门级开发者认证Jack20Jac****2022/11/88人工智能入门级开发者认证yd_234923576hid****fv5jmfy28rdr2022/11/309GaussDB入门级开发者认证-Javazekelovecsd****ke2022/10/3010人工智能入门级开发者认证yd_294805619lin****i01252022/11/911使用AppCube低代码平台开发园区访客应用这个地方是昵称hwi****gbgw8wvl56bxs2022/11/2612使用AppCube低代码平台开发园区访客应用Yeats_Liaoyea****iao2022/11/1513使用AppCube低代码平台开发园区访客应用向瑶函hw9****9972022/11/714使用AppCube低代码平台开发园区访客应用yd_237217500hw0****63772022/11/115使用AppCube低代码平台开发园区访客应用MeowCandyhzy****2022/10/2816使用AppCube低代码平台开发园区访客应用Hello Diggerxj1****11212022/10/2417使用AppCube低代码平台开发园区访客应用北屿、hw_****15871053474_012022/10/2318使用AppCube低代码平台开发园区访客应用清雨小竹zzz****2022/10/2119使用AppCube低代码平台开发园区访客应用惘纬der****ngle2022/10/2020使用AppCube低代码平台开发园区访客应用qingqingjiayuan6qin****gjiayuan62022/10/1721使用AppCube低代码平台开发园区访客应用yd_240107967hw_****15852390672_012022/10/1722基于华为云DevCloud的托马斯商城Yeats_Liaoyea****iao2022/11/10其他奖项有效参与用户名单请点击下方附件下载查看
-
最近AI绘画刷屏各大网站,我也来跟个风吧
-
醉后不知天在水,满船清梦压星河
-
Windows11安装Detectron2 0.简介 Detectron2 是 Facebook AI Research 的下一代目标检测库,可提供最先进的检测和分割算法。 它是 Detectron 和 maskrcnn-benchmark 的继任者。它支持 Facebook 中的许多计算机视觉研究项目和生产应用程序。现在也有越来越多的模型基于detectron2构建或部署。下面是框架模型能实现的基本效果。 由于detectron2 官方不支持Windows系统,所以在windows系统上安装有些坑需要注意,本文介绍在windows11系统上安装Detectron2的步骤和注意事项。 图像来源:https://github.com/facebookresearch/detectron2 1.系统环境 测试机器的软硬件基本配置如下: windows 11 anaconda(conda版本4.12.0) pytorch 1.11.0 torchvision 0.12.0 cuda 11.3 cuDNN 8.0 python 3.8 (其他支持的版本也可以) RTX 3080 laptop Visual Studio(编译detectron2时会用到,二选一) vs 2015 vs 2019 安装时间:2022.7.12(当天下载的新版本,部分安装文件的代码与之前的有所不同) 2. Detectron2下载地址 Detectron2仓库地址(下载框架源码) Detectron2官方文档(介绍安装和使用方法,无windows安装选项) Detectron2 Model Zoo地址(通过Model Zoo下载预训练模型测试或是用) 下载detectron2-main.zip后,解压到没有中文路径名的文件夹下例如:D:\python\detectron2-main 3. windows11安装detectron2 Detectron2官方不提供windows支持 实践证明windows 11可以正常安装和使用Detectorn2 以下步骤在本机测试有效,不排除因不同电脑的系统环境等因素出现其他问题,建议根据提示逐一解决 (1) 新建conda环境 创建新环境yolov7。因本机已经有pytorch1.11的环境,因此这里直接拷贝该环境,避免重复安装pytorch1.11 conda create -n yolov7 --clone pytorch1.11 1 激活环境 conda activate yolov7 1 (2) 安装pytorch 对于还没有安装pytorch1.11的同学,可以在刚创建的conda环境中执行如下命令快速安装指定版本的torch和cudatoolkit conda install pytorch==1.11.0 torchvision==0.12.0 torchaudio cudatoolkit=11.3 1 (3) 安装cocoapi 为使用户更好地使用 COCO 数据集, COCO 提供了各种语言的API Detectron2依赖cocoapi,在此提前安装 cocoapi下载地址 下载cocoapi-master.zip后解压到D:\python\cocoapi-master 启动conda prompt进入D:\python\cocoapi-master\PythonAPI目录 (yolov7) D:\python\cocoapi-master> (yolov7) D:\python\cocoapi-master>cd PythonAPI (yolov7) D:\python\cocoapi-master\PythonAPI> 执行【生成命令】 (yolov7) D:\python\cocoapi-master\PythonAPI>python setup.py build_ext --inplace 1 执行【安装命令】 (yolov7) D:\python\cocoapi-master\PythonAPI>python setup.py build_ext install # 执行提示: Installed c:\users\irace\.conda\envs\yolov7\lib\site-packages\pycocotools-2.0-py3.8-win-amd64.egg Processing dependencies for pycocotools==2.0 Finished processing dependencies for pycocotools==2.0 (4) 安装fvcore fvcore是一个轻量级的核心库,它提供了在各种计算机视觉框架(如Detectron2)中共享的最常见和最基本的功能 fvcore仓库地址 下载fvcore-main.zip后解压到D:\python\fvcore-main 将conda promt窗口切换到D:\python\fvcore-main目录 编译安装 (yolov7) D:\python\fvcore-main>python setup.py build --force develop # 安装提示: Finished processing dependencies for fvcore==0.1.5 1 2 3 (5) 安装ninja Ninja是一个比Make更快速的小型构建系统 安装Detectron2需用用到Ninja,在此提前安装 继续在conda promt窗口yolov7环境下安装ninja conda install ninja 1 (6) 安装Detectron2 Detectron2仓库地址 下载detectron2-main.zip后解压到D:\python\detectron2-main 修改文件内容:注意以下所有要修改的文件都是在yolov7环境下找,别改错其他环境的文件了 可通过everything搜索找到yolov7环境下对应文件,举例修改argument_spec.h文件,找env\yolov7文件夹中的文件 修改cpp_extension.py C:\Users\irace.conda\envs\yolov7\Lib\site-packages\torch\utils\cpp_extension.py 第318行,注释的是原语句,后一行是改后的 # match = re.search(r'(\d+)\.(\d+)\.(\d+)', compiler_info.decode(*SUBPROCESS_DECODE_ARGS).strip()) match = re.search(r'(\d+)\.(\d+)\.(\d+)', compiler_info.decode(' gbk').strip()) 1 2 修改argument_spec.h C:\Users\irace.conda\envs\yolov7\Lib\site-packages\torch\include\torch\csrc\jit\runtime\argument_spec.h 第170行,注释的是原语句,后一行是改后的 // static constexpr size_t ARG_SPEC_DEPTH_LIMIT = 128; static const size_t ARG_SPEC_DEPTH_LIMIT = 128; 1 2 修改Detectron2文件夹下ROIAlignRotated_cuda.cu D:\python\detectron2-main\detectron2\layers\csrc\ROIAlignRotated\ROIAlignRotated_cuda.cu 将所有的ceil改为ceilf 建议用vs code等工具打开代码查找并替换,注意不能用replace all,因为有文件中有的函数名中包含ceil字母,必须一个个查看替换: 修改Detectron2文件夹下deform_conv_cuda_kernel.cu D:\python\detectron2-main\detectron2\layers\csrc\deformable\deform_conv_cuda_kernel.cu 将所有的floor改为floorf 修改Detectron2文件夹下cocoeval.cpp D:\python\detectron2-main\detectron2\layers\csrc\cocoeval\cocoeval.cpp 487行,注释的是原语句,后一行是改后的 // localtime_r(&rawtime, &local_time); localtime_s(&local_time,&rawtime); 1 2 下面可以开始编译,在Detectron-main文件夹下,执行命令 (yolov7) D:\python\detectron2-main>python setup.py build develop 1 可能的错误1: 检测到的 CUDA 版本 (10.0) 与用于编译的版本不匹配 # 错误提示: raise RuntimeError(CUDA_MISMATCH_MESSAGE.format(cuda_str_version, torch.version.cuda)) RuntimeError: The detected CUDA version (10.0) mismatches the version that was used to compile PyTorch (11.3). Please make sure to use the same CUDA versions. 使用conda list命令,检查pytroch的cuda版本为cuda11.3: pytorch 1.11.0 py3.8_cuda11.3_cudnn8_0 1 再检查系统安装的CUDA目录 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA 发现本机装了多个CUDA版本:9.2,10.0,11.3 再检查系统环境变量CUDA_PATH设置是v10.0的版本 因此,将系统环境变量CUDA_PATH改为11.3版本: C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.3 重启conda prompt (修改环境变量后必须重启命令行工具生效) 再次激活yolov7环境,并进入detectron2-main目录,再次执行命令 (yolov7) D:\python\detectron2-main>python setup.py build develop 1 可能的错误2: 发现在执行上述安装命令过程中,会下载很多个依赖库,一直报下载超时的错误 例如:下载pathspec>=0.9.0超时,提示: Installed c:\users\irace\.conda\envs\yolov7\lib\site-packages\mypy_extensions-0.4.3-py3.8.egg Searching for pathspec>=0.9.0 Reading https://pypi.org/simple/pathspec/ Downloading https://files.pythonhosted.org/packages/42/ba/a9d64c7bcbc7e3e8e5f93a52721b377e994c22d16196e2b0f1236774353a/pathspec-0.9.0-py2.py3-none-any.whl#sha256=7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a error: Download error for https://files.pythonhosted.org/packages/42/ba/a9d64c7bcbc7e3e8e5f93a52721b377e994c22d16196e2b0f1236774353a/pathspec-0.9.0-py2.py3-none-any.whl#sha256=7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a: timed out 检查发现是要找 pathspec>=0.9.0时下载超时,可以用pip选择清华源安装 pip install pathspec==0.9.0 -i https://pypi.tuna.tsinghua.edu.cn/simple # ... Successfully installed pathspec-0.9.0 为了节约时间不一个个下载,可以执行setup.py时,直接将清华源加上,随后过程一马平川: (yolov7) D:\python\detectron2-main>python setup.py build develop -i https://pypi.tuna.tsinghua.edu.cn/simple 1 最后的结果 Finished processing dependencies for detectron2==0.6 1 4.测试安装 (1) 下载模型 Detectron2 Model Zoo地址 选择model zoo中一个模型下载用于测试 注意1个模型需要下载2个文件: 表格第1列模型名称右键另存的是 [*.yaml] 模型描述文件 表格倒数第2列model按钮右键另存为的是 [*.pkl] 权重文件 下载权重文件*.pkl 例如,下载模型权重文件为:model_final_280758.pkl 在D:\python\detectron2-main下新建一个models目录存放下载的模型权重(也可以放其他地方) 在models目录下新建models\faster_rcnn_R_50_FPN_3x目录(模型多了,用文件夹名区分不同的模型权重) 将权重model_final_280758.pkl拷贝到D:\python\detectron2-main\models\faster_rcnn_R_50_FPN_3x\中 下载网络结构文件*.yaml 例如,下载模型结构文件为:faster_rcnn_R_50_FPN_3x.yaml 将上述文件拷贝到D:\python\detectron2-main\configs中合适的文件夹下(该文件夹下默认已经有很多模型的结构文件了) 下面是Faster R-CNN系列模型下载地址: Name lr sched train time (s/iter) inference time (s/im) train mem (GB) box AP model id download R50-C4 1x 0.551 0.102 4.8 35.7 137257644 model | metrics R50-DC5 1x 0.380 0.068 5.0 37.3 137847829 model | metrics R50-FPN 1x 0.210 0.038 3.0 37.9 137257794 model | metrics R50-C4 3x 0.543 0.104 4.8 38.4 137849393 model | metrics R50-DC5 3x 0.378 0.070 5.0 39.0 137849425 model | metrics R50-FPN 3x 0.209 0.038 3.0 40.2 137849458 model | metrics R101-C4 3x 0.619 0.139 5.9 41.1 138204752 model | metrics R101-DC5 3x 0.452 0.086 6.1 40.6 138204841 model | metrics R101-FPN 3x 0.286 0.051 4.1 42.0 137851257 model | metrics X101-FPN 3x 0.638 0.098 6.7 43.0 139173657 model | metrics (2) 安装opencv demo需要是用opencv库 安装opencv-python,从清华源找一个可以下的版本,这里选择4.5.5.62版下载 (yolov7) D:\python\detectron2-main>pip install opencv-python==4.5.5.62 -i https://pypi.tuna.tsinghua.edu.cn/simple 1 (3) 运行测试代码 准备待测图像 demo.py同级目录下新建images文件夹:D:\python\detectron2-main\demo\images 将待测图像拷贝到D:\python\detectron2-main\demo\images文件夹(也可以放其他目录) demo运行方式1:命令行运行demo.py 用conda promt在D:\python\detectron2-main目录下运行demo/demo.py(注意demo.py的路径) 这个命令参数太多太长,容易输入错误,各种提示找不到文件或路径 python demo/demo.py --config-file ../configs/COCO-Detection/faster_rcnn_R_50_FPN_3x.yaml --input images/rally.jpg --opts MODEL.WEIGHTS ../models/faster_rcnn_R_50_FPN_3x/model_final_280758.pkl 1 demo运行方式2:在pycharm中运行demo.py,这种方式方便调试 在pycharm中打开Detectron2工程中的demo.py文件 设置命令行参数:Run → Edit Configuration → Configuration → Parameters中输入命令行参数如下: –config-file …/configs/COCO-Detection/faster_rcnn_R_50_FPN_3x.yaml –input images/rally.jpg –output output –opts MODEL.WEIGHTS …/models/faster_rcnn_R_50_FPN_3x/model_final_280758.pkl 点击【ok】后,直接即可在pycharm中运行demo.py 运行后,检测结果rally.jpg将自动保存在D:\python\detectron2-main\demo\output文件夹下 至此,Windows 11下安装Detectro2圆满结束。 文章知识点与官方知识档案 ———————————————— 版权声明:本文为CSDN博主「iracer」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/iracer/article/details/125755029
-
win10 detectron2 安装教程 1. 准备工作 conda 添加清华镜像源 参考这篇文章:Conda 常用命令详解 + 配置 pip 添加清华镜像源 参考这篇文章:pip添加各种国内镜像源 注意:全文所用 cmd 都需要用管理员身份打开❗ 嫌每次都右击选择管理员身份麻烦的话参考这篇文章:如何设置 cmd 默认以管理员身份打开? 2. Requirements (安装依赖) Linux 或 macOS Python≥ 3.7 PyTorch ≥ 1.8 和 与 PyTorch安装版本 相匹配的 torchvision。 将它们一起从 pytorch.org 安装来确保这一点。 安装PyTorch参考链接:Win10 安装 CUDA(CUDA Toolkit)、cuDNN + PyTorch 详细教程 gcc & g++ ≥ 5.4 下载链接:MinGW-w64 - for 32 and 64 bit Windows 下载好之后解压到本地即可。 sjlj 稳定性好,支持 32位。seh 性能比较好,但不支持 32位,64位的选seh。 选第四个即可 也可以选择下载 在线安装工具 然后完整安装: 添加系统环境变量 参考:你的安装位置\MinGW64\bin OpenCV 是可选的,但演示和可视化需要它。 OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,它提供了很多函数,这些函数非常高效地实现了计算机视觉算法(最基本的滤波到高级的物体检测皆有涵盖)。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。OpenCV 的应用领域非常广泛,包括图像拼接、图像降噪、产品质检、人机交互、人脸识别、动作识别、动作跟踪、无人驾驶等。 pip install opencv-contrib-python=4.5.3.56 1 这个版本的 opencv-python 在 Python3.8+PyTorch1.8.1 环境下运行正常。 fvcore fvcore是一个轻量级的核心库,它提供了在各种计算机视觉框架 (如Detectron2)中共享的最常见和最基本的功能。 这个库基于Python 3.6+ 和 PyTorch。 点击fvcore 下载链接到GitHub下载压缩包到本地 解压并 cd 到 setup.py 所在目录 cd 你的下载目录\fvcore 然后用指令安装 python setup.py build --force develop ninja 是可选的,但建议使用,可以帮助更快的构建detectron2。 命令行安装:pip install ninja 或 conda install ninja pycocotools COCO(Common Objects in Context),是微软团队提供的一个可以用来进行图像识别的数据集。 pycocotools(python api tools of COCO) 有助于在COCO中加载、解析和可视化annotations。 但是,pycocotools的维护者不再提供Windows平台的支持。所以在Windows安装需要修改一些源文件的内容。 方法一:这是微雨曳荷.Windows下安装detectron2(免修改版本)的方法,可以尝试 pip install pycocotools-windows 方法二:点击链接GitHub - philferriere/cocoapi: Clone of COCO API 下载 Github 上 修改好 适合windows的coco版本 到本地,然后用pip setup.py安装 cd coco/PythonAPI python setup.py build_ext --inplace python setup.py build_ext install Visual Studio 2019——MSVC编译环境 detectron2需要微软的MSVC(Microsoft Visual C/C++)编译器。(需要MSVC当中的cl.exe) 注意安装 2017~2019版!! 点击链接Visual Studio 官方下载地址下载 官方生成工具 后双击运行安装即可。 安装只选择 C++ build tools 选项即可 建议安装到默认位置 添加系统环境变量(detectron2需要MSVC当中的cl.exe,因此你需要配置cl.exe的系统环境) 参考:C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.29.30133\bin\Hostx64\x64 3. 安装detectron2 点击链接 GitHub - Detectron2免修改版下载链接 下载到本地后解压到一个你确定不会删的文件夹 这是Github作者修改过的版本,放在了Github上,下载.zip压缩包(也可以git clone 链接克隆到本地)并用命令行安装即可。(下载下来是detectron2框架所有文件,) 运行 cmd 并 cd到这个文件夹 或者在这个文件夹地址栏输入cmd并回车,打开的cmd就已经进入到当前目录了 然后用下面命令安装: pip install -e . 1 至此detectron2框架就安装好了。👏🏻👏🏻👏🏻 4. 运行demo.py进行测试 demo.py: from detectron2.engine.defaults import DefaultPredictor from detectron2.config import get_cfg from detectron2.data import MetadataCatalog # 元数据目录 from detectron2.utils.visualizer import Visualizer, ColorMode from detectron2 import model_zoo # 图像库 """ 总之,DataCatalog和MetadataCatalog两个类实现了torch.utils.data.Dataset的创建与具体数据集读取的分, 提供了使用字符串创建Dataset和DataLoader的方法。 """ import cv2 import numpy as np class Detector: """ 定义检测器 """ def __init__(self, model_type='OD'): self.cfg = get_cfg() # 配置文件 if model_type == 'OD': # 目标检测模式 self.cfg.merge_from_file(model_zoo.get_config_file( "COCO-Detection/faster_rcnn_R_101_FPN_3x.yaml")) # coco图像库已经训练好的图像模型(Faster-RCNN;ResNet101) self.cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url( # 模型权重 "COCO-Detection/faster_rcnn_R_101_FPN_3x.yaml") elif model_type == "IS": # 实例分割模式 self.cfg.merge_from_file(model_zoo.get_config_file( "COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml")) self.cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url( "COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml") self.cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.7 # 分数阈值测试 self.cfg.MODEL.DEVICE = 'cuda' # 运算设备 self.predictor = DefaultPredictor(self.cfg) # 最基本的预测器 def onImage(self, imagePath): image = cv2.imread(imagePath) # 读取图像 predictions = self.predictor(image) # 预测(置信度,位置,类别) viz = Visualizer(image[:, :, ::-1], metadata=MetadataCatalog.get(self.cfg.DATASETS.TRAIN[0]), instance_mode=ColorMode.IMAGE_BW) # 可视化工具 output = viz.draw_instance_predictions(predictions["instances"].to('cpu')) # 把 GPU 跑的数据结果放到 CPU cv2.imshow("Result", output.get_image()[:, :, ::-1]) cv2.waitKey() if __name__ == '__main__': detector = Detector(model_type='IS') # 这里选择检测模式('OD': 目标检测;'IS': 实例分割) detector.onImage('./test1.jpg') # 这里放你的测试图片路径 测试图片: 测试结果: 终于配置好了,还不含泪三连❗❗❗😭😭😭 References: Requirements (必备条件)部分可参考:小白wwj.Windows10下安装detectron2超详细教程(小白视角) detectron2安装部分可参考:微雨曳荷.Windows下安装detectron2(免修改版本) 关于 python setup.py install 的理解:python setup.py install 常用命令参数详解 detectron2 官方文档 ———————————————— 版权声明:本文为CSDN博主「LiYikou」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_45770232/article/details/126471738
-
什么是Disco Diffusion? Disco Diffusion 是发布于 Google Colab 平台的一款利用人工智能深度学习进行数字艺术创作的工具,它是基于 MIT 许可协议的开源工具,可以在 Google Drive 直接运行,也可以部署到本地运行,目前最新的版本是 Disco Diffusion v5.4。 这里我给大家推荐线上运行的,这里需要你有一点的上网能力(科学上网) 如何使用Disco Diffusion? 用白话讲 Disco Diffusion 的基本工作就是把你给出的 Prompts(提示/描述)由文字信息变成图像信息,把你用文字描述的画面「画」出来。实际操作也基本如此,很简单,先来看几张用 Disco Diffusion 生成的图片 Prompts:a lake,spring,ultradetailed anime Prompts:Ultrawide view, A golden white temple with light effect in the center of the valley, Red plum blossoms all over the mountains,snowfall in winter,fog, Prompts:A real photographic landscape painting with incomparable reality.Van Gogh's the starry night,Dreamy,Greg Rutkowski and Thomas Kinkade,unreal engine,cinematic. 我最喜欢的梵高的风格 正文 准备工作 注册一个谷歌账号。(这个得自行百度) 入门教程 01. 使用浏览器打开 Disco Diffusion v5.2 [w/ VR Mode]。 02. 点击页面右上角「登录」按钮,登入你的谷歌账号。 03.点击全部运作 04.点击仍然运行 05.点击确定 06.它会让你注册一个云端硬盘 点击连接 07.允许云端云盘连接 开始行动 默认跑一个默认的描述A beautiful painting of a singular lighthouse, shining its light across a tumultuous sea of blood by greg rutkowski and thomas kinkade, Trending on artstation. 查看云端硬盘 https://drive.google.com/drive/folders/101KgJg6wBGeURx9rHjwWe6AALbKikTii https://drive.google.com/drive/folders/101KgJg6wBGeURx9rHjwWe6AALbKikTii 本地运行 上面提到过 Disco Diffusion 是可以部署到本地运行的,这边有一个本地部署的教程,供大家参考。 Disco Diffusion AI Guide by Eliso 本地运行需要 Nvidia 12GB VRAM 的 GPU,如果你的电脑无此配置,可以使用 CPU 本地运行,但是速度会很慢。 以上就是全部的教程了,欢迎大家留言评论。 ———————————————— 版权声明:本文为CSDN博主「heart_6662」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_62932195/article/details/125304751
-
前言MindSpore着重提升易用性并降低AI开发者的开发门槛,MindSpore原生适应每个场景包括端、边缘和云,并能够在按需协同的基础上,通过实现AI算法即代码,使开发态变得更加友好,显著减少模型开发时间,降低模型开发门槛。通过MindSpore自身的技术创新及MindSpore与华为昇腾AI处理器的协同优化,实现了运行态的高效,大大提高了计算性能;MindSpore也支持GPU、CPU等其它处理器。一、什么是MindSpore Hub1.简单介绍官方版本的预训练模型中心库---MindSpore Hubmindspore_hub 是一个Python库下载网址:点击跳转2.MindSpore Hub包含功能即插即用的模型加载简单易用的迁移学习import mindsporeimport mindspore_hub as mshubfrom mindspore import set_context, GRAPH_MODEset_context(mode=GRAPH_MODE,device_target="Ascend",device_id=0)model = "mindspore/1.6/googlenet_cifar10"# Initialize the number of classes based on the pre-trained model.network = mshub.load(model, num_classes=10)network.set_train(False)# ...3.MindSpore Hub使用场景· 推理验证:mindspore_hub.load用于加载预训练模型,可以实现一行代码完成模型的加载。· 迁移学习:通过mindspore_hub.load完成模型加载后,可以增加一个额外的参数项只加载神经网络的特征提取部分,这样就能很容易地在之后增加一些新的层进行迁移学习。· 发布模型:可以将自己训练好的模型按照指定的步骤发布到MindSpore Hub中,以供其他用户进行下载和使用。二、安装MindSpore Hub1.确认系统环境信息硬件平台支持Ascend、GPU和CPU。确认安装Python 3.7.5版本。MindSpore Hub与MindSpore的版本需保持一致。MindSpore Hub支持使用x86 64位或ARM 64位架构的Linux发行版系统。在联网状态下,安装whl包时会自动下载setup.py中的依赖项,其余情况需自行安装。2.安装在命令行中输入下面代码进行下载MindSpore Hub whl包pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/{version}/Hub/any/mindspore_hub-{version}-py3-none-any.whl --trusted-host ms-release.obs.cn-north-4.myhuaweicloud.com -i https://pypi.tuna.tsinghua.edu.cn/simple3.下载源码从Gitee下载源码。git clone https://gitee.com/mindspore/hub.git -b r1.9编译安装MindSpore Hub。cd hub ##切换到hub文件下python setup.py install ## 下载4.进行验证在能联网的环境中执行以下命令,验证安装结果。import mindspore_hub as mshubmodel = mshub.load("mindspore/1.6/lenet_mnist", num_class=10)如果出现下列提示,说明安装成功:Downloading data from url https://gitee.com/mindspore/hub/raw/r1.9/mshub_res/assets/mindspore/1.6/lenet_mnist.mdDownload finished!File size = 0.00 MbChecking /home/ma-user/.mscache/mindspore/1.6/lenet_mnist.md...Passed!三、加载模型1.介绍于个人开发者来说,从零开始训练一个较好模型,需要大量的标注完备的数据、足够的计算资源和大量训练调试时间。使得模型训练非常消耗资源,提升了AI开发的门槛,针对以上问题,MindSpore Hub提供了很多训练完成的模型权重文件,可以使得开发者在拥有少量数据的情况下,只需要花费少量训练时间,即可快速训练出一个较好的模型。2.推理验证##使用url完成模型的加载import mindspore_hub as mshubimport mindsporefrom mindspore import Tensor, nn, Model, set_context, GRAPH_MODEfrom mindspore import dtype as mstypeimport mindspore.dataset.vision as visionset_context(mode=GRAPH_MODE,device_target="Ascend",device_id=0)model = "mindspore/1.6/googlenet_cifar10"# Initialize the number of classes based on the pre-trained model.network = mshub.load(model, num_classes=10)network.set_train(False)最后使用MindSpore进行推理3.迁移学习#使用url进行MindSpore Hub模型的加载,注意:include_top参数需要模型开发者提供。import osimport mindspore_hub as mshubimport mindsporefrom mindspore import Tensor, nn, set_context, GRAPH_MODEfrom mindspore.nn import Momentumfrom mindspore import save_checkpoint, load_checkpoint,load_param_into_netfrom mindspore import opsimport mindspore.dataset as dsimport mindspore.dataset.transforms as transformsimport mindspore.dataset.vision as visionfrom mindspore import dtype as mstypefrom mindspore import Modelset_context(mode=GRAPH_MODE, device_target="Ascend", device_id=0)model = "mindspore/1.6/mobilenetv2_imagenet2012"network = mshub.load(model, num_classes=500, include_top=False, activation="Sigmoid")network.set_train(False)#在现有模型结构基础上,增加一个与新任务相关的分类层。class ReduceMeanFlatten(nn.Cell):def __init__(self):super(ReduceMeanFlatten, self).__init__()self.mean = ops.ReduceMean(keep_dims=True)self.flatten = nn.Flatten()def construct(self, x):x = self.mean(x, (2, 3))x = self.flatten(x)return x# Check MindSpore Hub website to conclude that the last output shape is 1280.last_channel = 1280# The number of classes in target task is 10.num_classes = 10reducemean_flatten = ReduceMeanFlatten()classification_layer = nn.Dense(last_channel, num_classes)classification_layer.set_train(True)train_network = nn.SequentialCell([network, reducemean_flatten, classification_layer])#定义数据集加载函数。def create_cifar10dataset(dataset_path, batch_size, usage='train', shuffle=True):data_set = ds.Cifar10Dataset(dataset_dir=dataset_path, usage=usage, shuffle=shuffle)# define map operationstrans = [vision.Resize((256, 256)),vision.RandomHorizontalFlip(prob=0.5),vision.Rescale(1.0 / 255.0, 0.0),vision.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5]),vision.HWC2CHW()]type_cast_op = transforms.TypeCast(mstype.int32)data_set = data_set.map(operations=type_cast_op, input_columns="label", num_parallel_workers=8)data_set = data_set.map(operations=trans, input_columns="image", num_parallel_workers=8)# apply batch operationsdata_set = data_set.batch(batch_size, drop_remainder=True)return data_set# Create Datasetdataset_path = "/path_to_dataset/cifar-10-batches-bin"dataset = create_cifar10dataset(dataset_path, batch_size=32, usage='train', shuffle=True)#为模型训练选择损失函数、优化器和学习率。def generate_steps_lr(lr_init, steps_per_epoch, total_epochs):total_steps = total_epochs * steps_per_epochdecay_epoch_index = [0.3*total_steps, 0.6*total_steps, 0.8*total_steps]lr_each_step = []for i in range(total_steps):if i < decay_epoch_index[0]:lr = lr_initelif i < decay_epoch_index[1]:lr = lr_init * 0.1elif i < decay_epoch_index[2]:lr = lr_init * 0.01else:lr = lr_init * 0.001lr_each_step.append(lr)return lr_each_step# Set epoch sizeepoch_size = 60# Wrap the backbone network with loss.loss_fn = nn.SoftmaxCrossEntropyWithLogits(sparse=True, reduction="mean")loss_net = nn.WithLossCell(train_network, loss_fn)steps_per_epoch = dataset.get_dataset_size()lr = generate_steps_lr(lr_init=0.01, steps_per_epoch=steps_per_epoch, total_epochs=epoch_size)# Create an optimizer.optim = Momentum(filter(lambda x: x.requires_grad, classification_layer.get_parameters()), Tensor(lr, mindspore.float32), 0.9, 4e-5)train_net = nn.TrainOneStepCell(loss_net, optim)#开始重训练。for epoch in range(epoch_size):for i, items in enumerate(dataset):data, label = itemsdata = mindspore.Tensor(data)label = mindspore.Tensor(label)loss = train_net(data, label)print(f"epoch: {epoch}/{epoch_size}, loss: {loss}")# Save the ckpt file for each epoch.if not os.path.exists('ckpt'):os.mkdir('ckpt')ckpt_path = f"./ckpt/cifar10_finetune_epoch{epoch}.ckpt"save_checkpoint(train_network, ckpt_path)#在测试集上测试模型精度。model = "mindspore/1.6/mobilenetv2_imagenet2012"network = mshub.load(model, num_classes=500, pretrained=True, include_top=False, activation="Sigmoid")network.set_train(False)reducemean_flatten = ReduceMeanFlatten()classification_layer = nn.Dense(last_channel, num_classes)classification_layer.set_train(False)softmax = nn.Softmax()network = nn.SequentialCell([network, reducemean_flatten, classification_layer, softmax])# Load a pre-trained ckpt file.ckpt_path = "./ckpt/cifar10_finetune_epoch59.ckpt"trained_ckpt = load_checkpoint(ckpt_path)load_param_into_net(classification_layer, trained_ckpt)loss = nn.SoftmaxCrossEntropyWithLogits(sparse=True, reduction="mean")# Define loss and create model.eval_dataset = create_cifar10dataset(dataset_path, batch_size=32, do_train=False)eval_metrics = {'Loss': nn.Loss(),'Top1-Acc': nn.Top1CategoricalAccuracy(),'Top5-Acc': nn.Top5CategoricalAccuracy()}model = Model(network, loss_fn=loss, optimizer=None, metrics=eval_metrics)metrics = model.eval(eval_dataset)print("metric: ", metrics)四、模型发布#将你的预训练模型托管在可以访问的存储位置。参照模板,在你自己的代码仓中添加模型生成文件mindspore_hub_conf.py,文件放置的位置如下:googlenet├── src│ ├── googlenet.py├── script│ ├── run_train.sh├── train.py├── test.py├── mindspore_hub_conf.py#参照模板,在hub/mshub_res/assets/mindspore/1.6文件夹下创建{model_name}_{dataset}.md文件,其中1.6为MindSpore的版本号,hub/mshub_res的目录结构为:hub├── mshub_res│ ├── assets│ ├── mindspore│ ├── 1.6│ ├── googlenet_cifar10.md│ ├── tools│ ├── get_sha256.py│ ├── load_markdown.py│ └── md_validator.py————————————————版权声明:本文为CSDN博主「跳楼梯企鹅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/weixin_50481708/article/details/127952827
-
用300行Python代码实现一个人脸识别系统 最近又多了不少朋友关注,先在这里谢谢大家。关注我的朋友大多数都是大学生,而且我简单看了一下,低年级的大学生居多,大多数都是为了完成课程设计,作为一个过来人,还是希望大家平时能多抽出点时间学习一下,这种临时抱佛脚的策略要少用嗷。今天我们来python实现一个人脸识别系统,主要是借助了dlib这个库,相当于我们直接调用现成的库来进行人脸识别,就省去了之前教程中的数据收集和模型训练的步骤了。 注:直接安装dlib库可能会有编译错误,可以通过下列方式获取编译好的dlib库 获取方式1: 直接从付费资源下载 人脸识别系统+windows64位-dlib-19.17.0-cp37-cp37m-win_amd64.zip-深度学习文档类资源-CSDN文库 获取方式2: 在B站视频三连并在评论区留下你的邮箱地址 用300行代码实现人脸识别系统_哔哩哔哩_bilibili 获取方式3: 在CSDN博客中三连并在评论区留下你的邮箱地址 用300行Python代码实现一个人脸识别系统_dejahu的博客-CSDN博客 基本原理 人脸识别和目标检测这些还不太一样,比如大家传统的训练一个目标检测模型,你只有对这个目标训练了之后,你的模型才能找到这样的目标,比如你的目标检测模型如果是检测植物的,那显然就不能检测动物。但是人脸识别就不一样,以你的手机为例,你发现你只录入了一次你的人脸信息,不需要训练,他就能准确的识别你,这里识别的原理是通过人脸识别的模型提取你脸部的特征向量,然后将实时检测到的你的人脸同数据库中保存的人脸进行比对,如果相似度超过一定的阈值之后,就认为比对成功。不过我这里说的只是简化版本的人脸识别,现在手机和门禁这些要复杂和安全的多,也不是简单平面上的人脸识别。 总结下来可以分为下面的步骤: 上传人脸到数据库 人脸检测 数据库比对并返回结果 这里我做了一个简答的示意图,可以帮助大家简单理解一下。 代码实现 废话不多说,这里就是我们的代码实现,代码我已经上传到码云,大家直接下载就行,地址就在博客开头。 不会安装python环境的兄弟请看这里:如何在pycharm中配置anaconda的虚拟环境_dejahu的博客-CSDN博客_如何在pycharm中配置anaconda 创建虚拟环境 创建虚拟环境前请大家先下载博客开头的码云源码到本地。 本次我们需要使用到python3.7的虚拟环境,命令如下: conda create -n face python==3.7.3 conda activate face 1 2 安装必要的库 pip install -r requirements.txt 1 愉快地开始你的人脸识别吧! 执行下面的主文件即可 python UI.py 1 或者在pycharm中按照下面的方式直接运行即可 首先将你需要识别的人脸上传到数据库中 通过第二个视频检测功能识别实时的人脸 详细的代码如下: # -*- coding: utf-8 -*- """ ------------------------------------------------- Project Name: yolov5-jungong File Name: window.py.py Author: chenming Create Date: 2021/11/8 Description:图形化界面,可以检测摄像头、视频和图片文件 ------------------------------------------------- """ # 应该在界面启动的时候就将模型加载出来,设置tmp的目录来放中间的处理结果 import shutil import PyQt5.QtCore from PyQt5.QtGui import * from PyQt5.QtCore import * from PyQt5.QtWidgets import * import threading import argparse import os import sys from pathlib import Path import cv2 import torch import torch.backends.cudnn as cudnn import os.path as osp FILE = Path(__file__).resolve() ROOT = FILE.parents[0] # YOLOv5 root directory if str(ROOT) not in sys.path: sys.path.append(str(ROOT)) # add ROOT to PATH ROOT = Path(os.path.relpath(ROOT, Path.cwd())) # relative from models.common import DetectMultiBackend from utils.datasets import IMG_FORMATS, VID_FORMATS, LoadImages, LoadStreams from utils.general import (LOGGER, check_file, check_img_size, check_imshow, check_requirements, colorstr, increment_path, non_max_suppression, print_args, scale_coords, strip_optimizer, xyxy2xywh) from utils.plots import Annotator, colors, save_one_box from utils.torch_utils import select_device, time_sync # 添加一个关于界面 # 窗口主类 class MainWindow(QTabWidget): # 基本配置不动,然后只动第三个界面 def __init__(self): # 初始化界面 super().__init__() self.setWindowTitle('Target detection system') self.resize(1200, 800) self.setWindowIcon(QIcon("images/UI/lufei.png")) # 图片读取进程 self.output_size = 480 self.img2predict = "" self.device = 'cpu' # # 初始化视频读取线程 self.vid_source = '0' # 初始设置为摄像头 self.stopEvent = threading.Event() self.webcam = True self.stopEvent.clear() self.model = self.model_load(weights="runs/train/exp_yolov5s/weights/best.pt", device="cpu") # todo 指明模型加载的位置的设备 self.initUI() self.reset_vid() ''' ***模型初始化*** ''' @torch.no_grad() def model_load(self, weights="", # model.pt path(s) device='', # cuda device, i.e. 0 or 0,1,2,3 or cpu half=False, # use FP16 half-precision inference dnn=False, # use OpenCV DNN for ONNX inference ): device = select_device(device) half &= device.type != 'cpu' # half precision only supported on CUDA device = select_device(device) model = DetectMultiBackend(weights, device=device, dnn=dnn) stride, names, pt, jit, onnx = model.stride, model.names, model.pt, model.jit, model.onnx # Half half &= pt and device.type != 'cpu' # half precision only supported by PyTorch on CUDA if pt: model.model.half() if half else model.model.float() print("模型加载完成!") return model ''' ***界面初始化*** ''' def initUI(self): # 图片检测子界面 font_title = QFont('楷体', 16) font_main = QFont('楷体', 14) # 图片识别界面, 两个按钮,上传图片和显示结果 img_detection_widget = QWidget() img_detection_layout = QVBoxLayout() img_detection_title = QLabel("图片识别功能") img_detection_title.setFont(font_title) mid_img_widget = QWidget() mid_img_layout = QHBoxLayout() self.left_img = QLabel() self.right_img = QLabel() self.left_img.setPixmap(QPixmap("images/UI/up.jpeg")) self.right_img.setPixmap(QPixmap("images/UI/right.jpeg")) self.left_img.setAlignment(Qt.AlignCenter) self.right_img.setAlignment(Qt.AlignCenter) mid_img_layout.addWidget(self.left_img) mid_img_layout.addStretch(0) mid_img_layout.addWidget(self.right_img) mid_img_widget.setLayout(mid_img_layout) up_img_button = QPushButton("上传图片") det_img_button = QPushButton("开始检测") up_img_button.clicked.connect(self.upload_img) det_img_button.clicked.connect(self.detect_img) up_img_button.setFont(font_main) det_img_button.setFont(font_main) up_img_button.setStyleSheet("QPushButton{color:white}" "QPushButton:hover{background-color: rgb(2,110,180);}" "QPushButton{background-color:rgb(48,124,208)}" "QPushButton{border:2px}" "QPushButton{border-radius:5px}" "QPushButton{padding:5px 5px}" "QPushButton{margin:5px 5px}") det_img_button.setStyleSheet("QPushButton{color:white}" "QPushButton:hover{background-color: rgb(2,110,180);}" "QPushButton{background-color:rgb(48,124,208)}" "QPushButton{border:2px}" "QPushButton{border-radius:5px}" "QPushButton{padding:5px 5px}" "QPushButton{margin:5px 5px}") img_detection_layout.addWidget(img_detection_title, alignment=Qt.AlignCenter) img_detection_layout.addWidget(mid_img_widget, alignment=Qt.AlignCenter) img_detection_layout.addWidget(up_img_button) img_detection_layout.addWidget(det_img_button) img_detection_widget.setLayout(img_detection_layout) # todo 视频识别界面 # 视频识别界面的逻辑比较简单,基本就从上到下的逻辑 vid_detection_widget = QWidget() vid_detection_layout = QVBoxLayout() vid_title = QLabel("视频检测功能") vid_title.setFont(font_title) self.vid_img = QLabel() self.vid_img.setPixmap(QPixmap("images/UI/up.jpeg")) vid_title.setAlignment(Qt.AlignCenter) self.vid_img.setAlignment(Qt.AlignCenter) self.webcam_detection_btn = QPushButton("摄像头实时监测") self.mp4_detection_btn = QPushButton("视频文件检测") self.vid_stop_btn = QPushButton("停止检测") self.webcam_detection_btn.setFont(font_main) self.mp4_detection_btn.setFont(font_main) self.vid_stop_btn.setFont(font_main) self.webcam_detection_btn.setStyleSheet("QPushButton{color:white}" "QPushButton:hover{background-color: rgb(2,110,180);}" "QPushButton{background-color:rgb(48,124,208)}" "QPushButton{border:2px}" "QPushButton{border-radius:5px}" "QPushButton{padding:5px 5px}" "QPushButton{margin:5px 5px}") self.mp4_detection_btn.setStyleSheet("QPushButton{color:white}" "QPushButton:hover{background-color: rgb(2,110,180);}" "QPushButton{background-color:rgb(48,124,208)}" "QPushButton{border:2px}" "QPushButton{border-radius:5px}" "QPushButton{padding:5px 5px}" "QPushButton{margin:5px 5px}") self.vid_stop_btn.setStyleSheet("QPushButton{color:white}" "QPushButton:hover{background-color: rgb(2,110,180);}" "QPushButton{background-color:rgb(48,124,208)}" "QPushButton{border:2px}" "QPushButton{border-radius:5px}" "QPushButton{padding:5px 5px}" "QPushButton{margin:5px 5px}") self.webcam_detection_btn.clicked.connect(self.open_cam) self.mp4_detection_btn.clicked.connect(self.open_mp4) self.vid_stop_btn.clicked.connect(self.close_vid) # 添加组件到布局上 vid_detection_layout.addWidget(vid_title) vid_detection_layout.addWidget(self.vid_img) vid_detection_layout.addWidget(self.webcam_detection_btn) vid_detection_layout.addWidget(self.mp4_detection_btn) vid_detection_layout.addWidget(self.vid_stop_btn) vid_detection_widget.setLayout(vid_detection_layout) # todo 关于界面 about_widget = QWidget() about_layout = QVBoxLayout() about_title = QLabel('欢迎使用目标检测系统\n\n 提供付费指导:有需要的好兄弟加下面的QQ即可') # todo 修改欢迎词语 about_title.setFont(QFont('楷体', 18)) about_title.setAlignment(Qt.AlignCenter) about_img = QLabel() about_img.setPixmap(QPixmap('images/UI/qq.png')) about_img.setAlignment(Qt.AlignCenter) # label4.setText("<a href='https://oi.wiki/wiki/学习率的调整'>如何调整学习率</a>") label_super = QLabel() # todo 更换作者信息 label_super.setText("<a href='https://blog.csdn.net/ECHOSON'>或者你可以在这里找到我-->肆十二</a>") label_super.setFont(QFont('楷体', 16)) label_super.setOpenExternalLinks(True) # label_super.setOpenExternalLinks(True) label_super.setAlignment(Qt.AlignRight) about_layout.addWidget(about_title) about_layout.addStretch() about_layout.addWidget(about_img) about_layout.addStretch() about_layout.addWidget(label_super) about_widget.setLayout(about_layout) self.left_img.setAlignment(Qt.AlignCenter) self.addTab(img_detection_widget, '图片检测') self.addTab(vid_detection_widget, '视频检测') self.addTab(about_widget, '联系我') self.setTabIcon(0, QIcon('images/UI/lufei.png')) self.setTabIcon(1, QIcon('images/UI/lufei.png')) self.setTabIcon(2, QIcon('images/UI/lufei.png')) ''' ***上传图片*** ''' def upload_img(self): # 选择录像文件进行读取 fileName, fileType = QFileDialog.getOpenFileName(self, 'Choose file', '', '*.jpg *.png *.tif *.jpeg') if fileName: suffix = fileName.split(".")[-1] save_path = osp.join("images/tmp", "tmp_upload." + suffix) shutil.copy(fileName, save_path) # 应该调整一下图片的大小,然后统一防在一起 im0 = cv2.imread(save_path) resize_scale = self.output_size / im0.shape[0] im0 = cv2.resize(im0, (0, 0), fx=resize_scale, fy=resize_scale) cv2.imwrite("images/tmp/upload_show_result.jpg", im0) # self.right_img.setPixmap(QPixmap("images/tmp/single_result.jpg")) self.img2predict = fileName self.left_img.setPixmap(QPixmap("images/tmp/upload_show_result.jpg")) # todo 上传图片之后右侧的图片重置, self.right_img.setPixmap(QPixmap("images/UI/right.jpeg")) ''' ***检测图片*** ''' def detect_img(self): model = self.model output_size = self.output_size source = self.img2predict # file/dir/URL/glob, 0 for webcam imgsz = 640 # inference size (pixels) conf_thres = 0.25 # confidence threshold iou_thres = 0.45 # NMS IOU threshold max_det = 1000 # maximum detections per image device = self.device # cuda device, i.e. 0 or 0,1,2,3 or cpu view_img = False # show results save_txt = False # save results to *.txt save_conf = False # save confidences in --save-txt labels save_crop = False # save cropped prediction boxes nosave = False # do not save images/videos classes = None # filter by class: --class 0, or --class 0 2 3 agnostic_nms = False # class-agnostic NMS augment = False # ugmented inference visualize = False # visualize features line_thickness = 3 # bounding box thickness (pixels) hide_labels = False # hide labels hide_conf = False # hide confidences half = False # use FP16 half-precision inference dnn = False # use OpenCV DNN for ONNX inference print(source) if source == "": QMessageBox.warning(self, "请上传", "请先上传图片再进行检测") else: source = str(source) device = select_device(self.device) webcam = False stride, names, pt, jit, onnx = model.stride, model.names, model.pt, model.jit, model.onnx imgsz = check_img_size(imgsz, s=stride) # check image size save_img = not nosave and not source.endswith('.txt') # save inference images # Dataloader if webcam: view_img = check_imshow() cudnn.benchmark = True # set True to speed up constant image size inference dataset = LoadStreams(source, img_size=imgsz, stride=stride, auto=pt and not jit) bs = len(dataset) # batch_size else: dataset = LoadImages(source, img_size=imgsz, stride=stride, auto=pt and not jit) bs = 1 # batch_size vid_path, vid_writer = [None] * bs, [None] * bs # Run inference if pt and device.type != 'cpu': model(torch.zeros(1, 3, *imgsz).to(device).type_as(next(model.model.parameters()))) # warmup dt, seen = [0.0, 0.0, 0.0], 0 for path, im, im0s, vid_cap, s in dataset: t1 = time_sync() im = torch.from_numpy(im).to(device) im = im.half() if half else im.float() # uint8 to fp16/32 im /= 255 # 0 - 255 to 0.0 - 1.0 if len(im.shape) == 3: im = im[None] # expand for batch dim t2 = time_sync() dt[0] += t2 - t1 # Inference # visualize = increment_path(save_dir / Path(path).stem, mkdir=True) if visualize else False pred = model(im, augment=augment, visualize=visualize) t3 = time_sync() dt[1] += t3 - t2 # NMS pred = non_max_suppression(pred, conf_thres, iou_thres, classes, agnostic_nms, max_det=max_det) dt[2] += time_sync() - t3 # Second-stage classifier (optional) # pred = utils.general.apply_classifier(pred, classifier_model, im, im0s) # Process predictions for i, det in enumerate(pred): # per image seen += 1 if webcam: # batch_size >= 1 p, im0, frame = path[i], im0s[i].copy(), dataset.count s += f'{i}: ' else: p, im0, frame = path, im0s.copy(), getattr(dataset, 'frame', 0) p = Path(p) # to Path s += '%gx%g ' % im.shape[2:] # print string gn = torch.tensor(im0.shape)[[1, 0, 1, 0]] # normalization gain whwh imc = im0.copy() if save_crop else im0 # for save_crop annotator = Annotator(im0, line_width=line_thickness, example=str(names)) if len(det): # Rescale boxes from img_size to im0 size det[:, :4] = scale_coords(im.shape[2:], det[:, :4], im0.shape).round() # Print results for c in det[:, -1].unique(): n = (det[:, -1] == c).sum() # detections per class s += f"{n} {names[int(c)]}{'s' * (n > 1)}, " # add to string # Write results for *xyxy, conf, cls in reversed(det): if save_txt: # Write to file xywh = (xyxy2xywh(torch.tensor(xyxy).view(1, 4)) / gn).view( -1).tolist() # normalized xywh line = (cls, *xywh, conf) if save_conf else (cls, *xywh) # label format # with open(txt_path + '.txt', 'a') as f: # f.write(('%g ' * len(line)).rstrip() % line + '\n') if save_img or save_crop or view_img: # Add bbox to image c = int(cls) # integer class label = None if hide_labels else (names[c] if hide_conf else f'{names[c]} {conf:.2f}') annotator.box_label(xyxy, label, color=colors(c, True)) # if save_crop: # save_one_box(xyxy, imc, file=save_dir / 'crops' / names[c] / f'{p.stem}.jpg', # BGR=True) # Print time (inference-only) LOGGER.info(f'{s}Done. ({t3 - t2:.3f}s)') # Stream results im0 = annotator.result() # if view_img: # cv2.imshow(str(p), im0) # cv2.waitKey(1) # 1 millisecond # Save results (image with detections) resize_scale = output_size / im0.shape[0] im0 = cv2.resize(im0, (0, 0), fx=resize_scale, fy=resize_scale) cv2.imwrite("images/tmp/single_result.jpg", im0) # 目前的情况来看,应该只是ubuntu下会出问题,但是在windows下是完整的,所以继续 self.right_img.setPixmap(QPixmap("images/tmp/single_result.jpg")) # 视频检测,逻辑基本一致,有两个功能,分别是检测摄像头的功能和检测视频文件的功能,先做检测摄像头的功能。 ''' ### 界面关闭事件 ### ''' def closeEvent(self, event): reply = QMessageBox.question(self, 'quit', "Are you sure?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: self.close() event.accept() else: event.ignore() ''' ### 视频关闭事件 ### ''' def open_cam(self): self.webcam_detection_btn.setEnabled(False) self.mp4_detection_btn.setEnabled(False) self.vid_stop_btn.setEnabled(True) self.vid_source = '0' self.webcam = True th = threading.Thread(target=self.detect_vid) th.start() ''' ### 开启视频文件检测事件 ### ''' def open_mp4(self): fileName, fileType = QFileDialog.getOpenFileName(self, 'Choose file', '', '*.mp4 *.avi') if fileName: self.webcam_detection_btn.setEnabled(False) self.mp4_detection_btn.setEnabled(False) # self.vid_stop_btn.setEnabled(True) self.vid_source = fileName self.webcam = False th = threading.Thread(target=self.detect_vid) th.start() ''' ### 视频开启事件 ### ''' # 视频和摄像头的主函数是一样的,不过是传入的source不同罢了 def detect_vid(self): # pass model = self.model output_size = self.output_size # source = self.img2predict # file/dir/URL/glob, 0 for webcam imgsz = 640 # inference size (pixels) conf_thres = 0.25 # confidence threshold iou_thres = 0.45 # NMS IOU threshold max_det = 1000 # maximum detections per image # device = self.device # cuda device, i.e. 0 or 0,1,2,3 or cpu view_img = False # show results save_txt = False # save results to *.txt save_conf = False # save confidences in --save-txt labels save_crop = False # save cropped prediction boxes nosave = False # do not save images/videos classes = None # filter by class: --class 0, or --class 0 2 3 agnostic_nms = False # class-agnostic NMS augment = False # ugmented inference visualize = False # visualize features line_thickness = 3 # bounding box thickness (pixels) hide_labels = False # hide labels hide_conf = False # hide confidences half = False # use FP16 half-precision inference dnn = False # use OpenCV DNN for ONNX inference source = str(self.vid_source) webcam = self.webcam device = select_device(self.device) stride, names, pt, jit, onnx = model.stride, model.names, model.pt, model.jit, model.onnx imgsz = check_img_size(imgsz, s=stride) # check image size save_img = not nosave and not source.endswith('.txt') # save inference images # Dataloader if webcam: view_img = check_imshow() cudnn.benchmark = True # set True to speed up constant image size inference dataset = LoadStreams(source, img_size=imgsz, stride=stride, auto=pt and not jit) bs = len(dataset) # batch_size else: dataset = LoadImages(source, img_size=imgsz, stride=stride, auto=pt and not jit) bs = 1 # batch_size vid_path, vid_writer = [None] * bs, [None] * bs # Run inference if pt and device.type != 'cpu': model(torch.zeros(1, 3, *imgsz).to(device).type_as(next(model.model.parameters()))) # warmup dt, seen = [0.0, 0.0, 0.0], 0 for path, im, im0s, vid_cap, s in dataset: t1 = time_sync() im = torch.from_numpy(im).to(device) im = im.half() if half else im.float() # uint8 to fp16/32 im /= 255 # 0 - 255 to 0.0 - 1.0 if len(im.shape) == 3: im = im[None] # expand for batch dim t2 = time_sync() dt[0] += t2 - t1 # Inference # visualize = increment_path(save_dir / Path(path).stem, mkdir=True) if visualize else False pred = model(im, augment=augment, visualize=visualize) t3 = time_sync() dt[1] += t3 - t2 # NMS pred = non_max_suppression(pred, conf_thres, iou_thres, classes, agnostic_nms, max_det=max_det) dt[2] += time_sync() - t3 # Second-stage classifier (optional) # pred = utils.general.apply_classifier(pred, classifier_model, im, im0s) # Process predictions for i, det in enumerate(pred): # per image seen += 1 if webcam: # batch_size >= 1 p, im0, frame = path[i], im0s[i].copy(), dataset.count s += f'{i}: ' else: p, im0, frame = path, im0s.copy(), getattr(dataset, 'frame', 0) p = Path(p) # to Path # save_path = str(save_dir / p.name) # im.jpg # txt_path = str(save_dir / 'labels' / p.stem) + ( # '' if dataset.mode == 'image' else f'_{frame}') # im.txt s += '%gx%g ' % im.shape[2:] # print string gn = torch.tensor(im0.shape)[[1, 0, 1, 0]] # normalization gain whwh imc = im0.copy() if save_crop else im0 # for save_crop annotator = Annotator(im0, line_width=line_thickness, example=str(names)) if len(det): # Rescale boxes from img_size to im0 size det[:, :4] = scale_coords(im.shape[2:], det[:, :4], im0.shape).round() # Print results for c in det[:, -1].unique(): n = (det[:, -1] == c).sum() # detections per class s += f"{n} {names[int(c)]}{'s' * (n > 1)}, " # add to string # Write results for *xyxy, conf, cls in reversed(det): if save_txt: # Write to file xywh = (xyxy2xywh(torch.tensor(xyxy).view(1, 4)) / gn).view( -1).tolist() # normalized xywh line = (cls, *xywh, conf) if save_conf else (cls, *xywh) # label format # with open(txt_path + '.txt', 'a') as f: # f.write(('%g ' * len(line)).rstrip() % line + '\n') if save_img or save_crop or view_img: # Add bbox to image c = int(cls) # integer class label = None if hide_labels else (names[c] if hide_conf else f'{names[c]} {conf:.2f}') annotator.box_label(xyxy, label, color=colors(c, True)) # if save_crop: # save_one_box(xyxy, imc, file=save_dir / 'crops' / names[c] / f'{p.stem}.jpg', # BGR=True) # Print time (inference-only) LOGGER.info(f'{s}Done. ({t3 - t2:.3f}s)') # Stream results # Save results (image with detections) im0 = annotator.result() frame = im0 resize_scale = output_size / frame.shape[0] frame_resized = cv2.resize(frame, (0, 0), fx=resize_scale, fy=resize_scale) cv2.imwrite("images/tmp/single_result_vid.jpg", frame_resized) self.vid_img.setPixmap(QPixmap("images/tmp/single_result_vid.jpg")) # self.vid_img # if view_img: # cv2.imshow(str(p), im0) # self.vid_img.setPixmap(QPixmap("images/tmp/single_result_vid.jpg")) # cv2.waitKey(1) # 1 millisecond if cv2.waitKey(25) & self.stopEvent.is_set() == True: self.stopEvent.clear() self.webcam_detection_btn.setEnabled(True) self.mp4_detection_btn.setEnabled(True) self.reset_vid() break # self.reset_vid() ''' ### 界面重置事件 ### ''' def reset_vid(self): self.webcam_detection_btn.setEnabled(True) self.mp4_detection_btn.setEnabled(True) self.vid_img.setPixmap(QPixmap("images/UI/up.jpeg")) self.vid_source = '0' self.webcam = True ''' ### 视频重置事件 ### ''' def close_vid(self): self.stopEvent.set() self.reset_vid() if __name__ == "__main__": app = QApplication(sys.argv) mainWindow = MainWindow() mainWindow.show() sys.exit(app.exec_()) ———————————————— 版权声明:本文为CSDN博主「肆十二」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/ECHOSON/article/details/122404926
-
遗传算法(Genetic Algorithm,GA) 最早是由美国的 John holland于20世纪70年代提出,该算法是根据大自然中生物体进化规律而设计提出的。是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。该算法通过数学的方式,利用计算机仿真运算,将问题的求解过程转换成类似生物进化中的染色体基因的交叉、变异等过程。在求解较为复杂的组合优化问题时,相对一些常规的优化算法,通常能够较快地获得较好的优化结果。遗传算法已被人们广泛地应用于组合优化、机器学习、信号处理、自适应控制和人工生命等领域遗传算法的起源可追溯到20世纪60年代初期。1967年,美国密歇根大学J. Holland教授的学生 Bagley在他的博士论文中首次提出了遗传算法这一术语,并讨论了遗传算法在博弈中的应用,但早期研究缺乏带有指导性的理论和计算工具的开拓。1975年, J. Holland等提出了对遗传算法理论研究极为重要的模式理论,出版了专著《自然系统和人工系统的适配》,在书中系统阐述了遗传算法的基本理论和方法,推动了遗传算法的发展。20世纪80年代后,遗传算法进入兴盛发展时期,被广泛应用于自动控制、生产计划、图像处理、机器人等研究领域。编码由于遗传算法不能直接处理问题空间的参数,因此必须通过编码将要求解的问题表示成遗传空间的染色体或者个体。这一转换操作就叫做编码,也可以称作(问题的)表示(representation)。评估编码策略常采用以下3个规范:a)完备性(completeness):问题空间中的所有点(候选解)都能作为GA空间中的点(染色体)表现。b)健全性(soundness): GA空间中的染色体能对应所有问题空间中的候选解。c)非冗余性(nonredundancy):染色体和候选解一一对应。 适应度函数进化论中的适应度,是表示某一个体对环境的适应能力,也表示该个体繁殖后代的能力。遗传算法的适应度函数也叫评价函数,是用来判断群体中的个体的优劣程度的指标,它是根据所求问题的目标函数来进行评估的。 遗传算法在搜索进化过程中一般不需要其他外部信息,仅用评估函数来评估个体或解的优劣,并作为以后遗传操作的依据。由于遗传算法中,适应度函数要比较排序并在此基础上计算选择概率,所以适应度函数的值要取正值。由此可见,在不少场合,将目标函数映射成求最大值形式且函数值非负的适应度函数是必要的。适应度函数的设计主要满足以下条件:a)单值、连续、非负、最大化b) 合理、一致性c)计算量小 d)通用性强。在具体应用中,适应度函数的设计要结合求解问题本身的要求而定。适应度函数设计直接影响到遗传算法的性能。 初始群体选取遗传算法中初始群体中的个体是随机产生的。一般来讲,初始群体的设定可采取如下的策略:a)根据问题固有知识,设法把握最优解所占空间在整个问题空间中的分布范围,然后,在此分布范围内设定初始群体。b)先随机生成一定数目的个体,然后从中挑出最好的个体加到初始群体中。这种过程不断迭代,直到初始群体中个体数达到了预先确定的规模。
-
加入沃土云创高校计划后,如何申请开课?1、请登录华为云账号,下载附件中的开课申请表和课程大纲模板(开课申请表有样例,可参考)2、并参考附件指导书中第五大点,在线提交开课计划(开课申请表需请二级学院盖章)3、预计3个工作日进行课程审核关于开课有任何问题可联系张女士13753491670(微信同号)
-
GNN的适用范围非常广泛,既可以处理具有显式关联结构的数据,如药物分子、电路网络等,也可以处理具有隐式关联结构的数据,如图像、文本等。近年来,GNN被用于解决各行各业的问题,如生物化学领域中的分子指纹识别、药物分子设计、疾病分类等,交通领域中对交通需求的预测、对道路速度的预测,计算机图像处理领域中的目标检测、视觉推理等,自然语言领域中的实体关系抽取、关系推理等。在引文 [1] 中分成6个方向:自然语言处理、计算机视觉、自然科学研究、知识图谱、组合优化、图生成,对GNN的应用做出了较为全面且细致的归纳总结。纵观GNN的各类应用,GNN表现出了如下3个优势:(1)GNN具有强大的图数据拟合能力。作为一种建立在图上的端对端学习框架,GNN展示出了强大的图数据拟合能力。图数据是科学与工程学领域中一种十分常见的数据研究对象,因此,GNN也被应用到了很多相关场景下,并且都取得了不错的效果。通常这些应用均会利用GNN去拟合研究对象的一些理化性质,从而指导或加速相应的科研与开发工作。比如引文 [2] 利用GNN去拟合两图中节点对的组合性质,从而提升蛋白质相互作用点预测的精度,而蛋白质相互作用点预测是药物分子发现与设计工作的重要构成部分;引文 [3] 将高频电路抽象成图数据,利用GNN去拟合其电磁学性质,相较于严格的电磁学仿真计算,该方法能极大地加速高频电路(比如5G芯片)的设计工作。(2)GNN具有强大的推理能力。计算机要完成推理任务,离不开对语义实体的识别以及实体之间关系的抽取,GNN理所当然地被应用到了很多推理任务的场景中去。相较于之前大多基于关系三元组的建模方式,GNN能够对表征语义关系的网络进行整体性的建模,习得更加复杂与丰富的语义信息,这对提升推理任务的效果大有裨益。深度学习经过近几年的发展,在许多识别相关人物上都取得了前所未有的成果,基于此,需要更深程度地理解数据的推理任务被提出,比如计算机视觉中的视觉问答(Visual Question Answering)、视觉推理(Visual Reasoning),自然语言处理中的多跳推理(Multi-hop Reasoning)等。随着GNN的流行,很多工作也尝试将GNN以一种端对端的形式嵌入到学习系统中去,以提升相关任务的效果。我们举两个例子来说明:一是基于事实的视觉问答中(Fact-based Visual Question Answering)中,问题中不再直接包含答案内容,需要学习系统经过推理将问题中的事实关系正确映射到答案中的实体上。在引文 [4] 中通过引入GCN同时建模多条事实来提高对答案推理的正确性,这一方法在相关数据集上取得了极大的效果提升。二是多跳推理,相比于之前的阅读理解任务,多跳推理需要跨越多个段落甚至多个文档来寻找实体之间的多跳关系,这是一个更加开放、更加复杂的推理任务。在引文 [5] 中通过嵌入GNN,构造了一个抽取加推理的双线学习框架,使得学习系统在可解释性提高的同时也在相关数据集上获得了极大的效果提升。(3)GNN与知识图谱结合,可以将先验知识以端对端的形式高效地嵌入到学习系统中去。人类在学习后习得的知识,会被大脑神经系统进行系统的加工并存储起来,作为之后相关活动发生时的一种先验知识高效地提升人类的应对表现,并且往往知识之间会产生各种关联,形成“知识地图”。这种机制对应着数据科学领域中一字儿技术如知识图谱的广泛应用。从数据建模的层面来看,这些知识(或者规则、经验、常识、事实等)为模型提供了额外的相关信息,可以有效提升学习系统的效果。作为一种端对端的图数据学习模型,GNN结合知识图谱,可以将先验知识高效地嵌入到任意一种学习系统中去,从而替身任务效果。比如引文 [6] 在零样本学习任务中利用GCN对词汇网络(WordNet进行建模),实现了类别之间的语义关系到其视觉表示上的迁移,从而大大提升视觉模型在一些完全不提供训练样本的类别上的分类准确率。引文 [7] 通过补充额外的知识图谱信息,将知识图谱与用户-商品二部图构成一种合成的图结构,然后利用GNN进行推荐任务建模,同时增强了推荐系统的准确率、多样性与可解释性。
-
DDPG算法简介DDPG是DQN连续动作的扩展版本。DDPG全称Deep Deterministic Policy Gradient在DDPG算法之前,我们在求解连续动作空间问题时,主要有两种方式:一是对连续动作做离散化处理,然后再利用强化学习算法(例如DQN)进行求解。二是使用Policy Gradient (PG)算法 (例如Reinforce) 直接求解。但是对于方式一,离散化处理在一定程度上脱离了工程实际;对于方式二,PG算法在求解连续控制问题时效果往往不尽人意。为此,DDPG算法横空出世,在许多连续控制问题上取得了非常不错的效果。DDPG算法是Actor-Critic (AC) 框架下的一种在线式深度强化学习算法,因此算法内部包括Actor网络和Critic网络,每个网络分别遵从各自的更新法则进行更新,从而使得累计期望回报最大化。DDPG算法将确定性策略梯度算法和DQN算法中的相关技术结合在一起,之前我们在讲DQN算法时,详细说明了其中的两个重要的技术:经验回放和目标网络。具体而言,DDPG算法主要包括以下三个关键技术:(1)经验回放:智能体将得到的经验数据(s,a,r,s^{'},done)放入Replay Buffer中,更新网络参数时按照批量采样。(2)目标网络:在Actor网络和Critic网络外再使用一套用于估计目标的Target Actor网络和Target Critic网络。在更新目标网络时,为了避免参数更新过快,采用软更新方式。(3)噪声探索:确定性策略输出的动作为确定性动作,缺乏对环境的探索。在训练阶段,给Actor网络输出的动作加入噪声,从而让智能体具备一定的探索能力。
-
VGG模型是2014年ILSVRC竞赛的第二名,第一名是GoogLeNet。但是VGG模型在多个迁移学习任务中的表现要优于googLeNet。而且,从图像中提取CNN特征,VGG模型是首选算法。它的缺点在于,参数量有140M之多,需要更大的存储空间。但是这个模型很有研究价值。VGG网络是2014年由牛津大学著名研究组VGG (Visual Geometry Group) 提出的。在2014到2016年(ResNet提出之前),VGG网络可以说是当时最火并被广泛应用的Backbone。后面由于各种新的网络提出,论精度VGG比不上ResNet,论速度和参数数量VGG比不过MobileNet等轻量级网络,慢慢的VGG开始淡出人们的视线。当VGG已经被大家遗忘时,2021年清华大学、旷视科技以及香港科技大学等机构共同提出了RepVGG网络,希望能够让VGG-style网络Great Again。RepVGG无论是在精度还是速度上都已经超过了ResNet、EffcientNet以及ReNeXt等网络。那RepVGG究竟用了什么方法使得VGG网络能够获得如此大的提升呢,在论文的摘要中,作者提到了structural re-parameterization technique方法,即结构重参数化。实际上就是在训练时,使用一个类似ResNet-style的多分支模型,而推理时转化成VGG-style的单路模型。模型的名称——“VGG”代表了牛津大学的Oxford Visual Geometry Group,该小组隶属于1985年成立的Robotics Research Group,该Group研究范围包括了机器学习到移动机器人。下面是一段来自网络对同年GoogLeNet和VGG的描述:“GoogLeNet和VGG的Classification模型从原理上并没有与传统的CNN模型有太大不同。大家所用的Pipeline也都是:训练时候:各种数据Augmentation(剪裁,不同大小,调亮度,饱和度,对比度,偏色),剪裁送入CNN模型,Softmax,Backprop。测试时候:尽量把测试数据又各种Augmenting(剪裁,不同大小),把测试数据各种Augmenting后在训练的不同模型上的结果再继续Averaging出最后的结果。”需要注意的是,在VGGNet的6组实验中,后面的4个网络均使用了pre-trained model A的某些层来做参数初始化。虽然提出者没有提该方法带来的性能增益。先来看看VGG的特点: 小卷积核。作者将卷积核全部替换为3x3(极少用了1x1); 小池化核。相比AlexNet的3x3的池化核,VGG全部为2x2的池化核; 层数更深特征图更宽。基于前两点外,由于卷积核专注于扩大通道数、池化专注于缩小宽和高,使得模型架构上更深更宽的同时,计算量的增加放缓; 全连接转卷积。网络测试阶段将训练阶段的三个全连接替换为三个卷积,测试重用训练时的参数,使得测试得到的全卷积网络因为没有全连接的限制,因而可以接收任意宽或高为的输入。论文名称:RepVGG: Making VGG-style ConvNets Great Again论文下载地址:https://arxiv.org/abs/2101.03697官方源码(Pytorch实现):https://github.com/DingXiaoH/RepVGG
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签