-
线上训练得到的模型是否支持离线部署在本地
-
自己想要开发Workflow,开发环境需要准备什么?有现成的Workflow工作流推荐吗?
-
试了好多次,终于完成了
-
masterpiece:1.3),(the best quality:1.2),(super fine illustrations:1.2),(Masterpiece),high quality, high detail,dappled sunlight,god rays,(SOLO:1.4),FULL BODY,(from above1:5) Botanical, masterpiece, best quality, extremely detailed,detailed,art of light novel cover,highres,[(white background:1.4)::5],[(sit on sofa ):1.2):5],[(pendulum clock):1.3):5],[(game character portrait:1.4):5],incense burner,vase,broken glass,broken screen,transparent glass (1 girl),(solo},(hanfu:1.2), tasse,(full body:1.3),((silver))short hair((black and (blue) ends)),whole body,transparent jacket,look at viewer, (hairflower:1.3),gemstone decoration,[hands painted by Rembrandt]
-
账期、产品类型等查询ModelArts的消费详情在哪里查看?
-
-
华为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
上滑加载中
推荐直播
-
华为云码道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华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签