Other

算法初步——栈

上一节中我们讲到了队列(没有看的小伙伴先去补补课:算法初步——队列 - Echo_sun - 博客园 (cnblogs.com)),它是一种十分先进的数据结构,遵循着先进先出的原则。在这一节,我们将要介绍一种后进先出的数据结构——栈。 栈和队列一样,也是一种特殊的线性表,它的特殊性在于:栈只能在一端进行插入和删除操作。就像博主比较喜欢吃桶装薯片,那么我们拿出来或放进去薯片只能在整桶薯片的最上面进行(貌似现在的桶装薯片为了减少分量,在里面加了一个塑料抽屉)。栈的实现也很简单,我们只需要一个一维数组和一个指向栈顶的变量top即可。我们通过对top的操作来实现对整个栈的插入和删除操作。  栈的应用有一个非常典型的例子——判断回文。(这里解释一下回文:例如“ababa”,”xxyyxx”都是回文字符串,所谓回文字符串就是指正读反读均相同的字符串。)通过栈,我们很容易就可以判断一个字符串是不是回文字符串。  首先,我们要读取字符串并求出该字符串的长度。  gets_s(a);//读入一行字符串 len = strlen(a);//求出字符串的长度  如果一个字符串是回文,那么它是关于中间对称的,我们需要求出它的中点: mid = len / 2 - 1;//求出字符串的中间  接下来就轮到我们的栈大杀四方了。  首先我们将中点之前的字符入栈。 for (int i = 0; i <= mid; i++) { s[++top] = a[i]; }  接着我们就来到了最关键的地方,我们需要将栈里的字符进行出栈并于未入栈的字符进行匹配,如果都能匹配则说明该字符串为回文字符串,反之则不是。 for (int i = next; i < len;i++) { if (a[i] != s[top]) break; top--; } //如果top值为0,则说明所有的字符均被匹配完成 if (top == 0) cout << YES << endl; else cout << NO << endl;  完整代码如下:

实时车辆行人多目标检测与跟踪系统-上篇(UI界面清新版,Python代码)

摘要:本文详细介绍如何利用深度学习中的YOLO及SORT算法实现车辆、行人等多目标的实时检测和跟踪,并利用PyQt5设计了清新简约的系统UI界面,在界面中既可选择自己的视频、图片文件进行检测跟踪,也可以通过电脑自带的摄像头进行实时处理,可选择训练好的YOLO v3/v4等模型参数。该系统界面优美、检测精度高,功能强大,设计有多目标实时检测、跟踪、计数功能,可自由选择感兴趣的跟踪目标。博文提供了完整的Python程序代码和使用教程,适合新入门的朋友参考,完整代码资源文件请转至文末的下载链接。本博文目录如下: 目录前言1. 功能及效果演示2. 视频中的目标检测3. 多目标跟踪下载链接结束语 ➷点击跳转至文末所有涉及的完整代码文件下载页☇ 完整资源下载链接:https://mianbaoduo.com/o/bread/mbd-YZiWlp5s 环境配置及演示视频链接:https://www.bilibili.com/video/BV1S64y1U7VA/(正在更新中,欢迎关注博主B站视频) 前言 前段时间博主写了一篇基于深度学习的车辆检测系统博文,里面是利用MATLAB实现的YOLO检测器,效果还不错,其完善的UI界面也受到不少粉丝的关注。最近有不少朋友发消息询问是否打算出一期Python版的车辆检测系统,其实我也早有写一篇类似博文的想法,毕竟老不更新粉丝都要跑( ๑ŏ ﹏ ŏ๑ )了。但每次想写博客又看到自己每天满满当当的日程,感觉无可奈何,没办法只得强行挤出一点点时间写点东西。那这里就强行开一个新坑,更新一下最近推出了车辆行人检测跟踪系统,准备从算法到模型训练、QT界面等实现细节跟大家做一个分享。由于博主实在太忙,这一系列可能不会更新很快,还请见谅,感兴趣的朋友可以在下方评论督促一下或私信交流,如若大家反响热烈,必定立即更新下一篇! 书归正传,车辆/行人等多目标的检测跟踪毫无疑问是当前视觉领域的网红方向,因为智能交通、无人驾驶的时代正呼之欲出,视觉检测自当是研究的基础。那么抛开这些大概念,我们如果想自己实现多目标检测跟踪的功能,有没有合适的算法去借鉴的呢?考虑到实时性,个人更加青睐YOLO算法,YOLO经过几代的发展,性能上有了很大提升,这里便采用YOLO模型进行目标检测。至于目标跟踪,权衡几种算法后我选择 SORT (Simple Online and Realtime Tracking, SORT)算法。 除此之外,一个舒服的系统界面是非常必要的,网上检测跟踪的代码很多,但几乎没有人将其开发成一个完整软件,有的也是粗犷简陋的界面。为此博主花了一番时间,精心设计了一款合适的界面,也是参考当前流行的客户端样式,不敢说精美,也算是保持了博主对界面清新、简约的风格了。这里上一张清晰的初始界面截图(点击图片可放大): 检测图片时的截图(点击图片可放大)如下,若为视频检测则可选择增加轨迹效果: 详细的功能演示效果参见博主的B站视频或下一节的动图演示,觉得不错的朋友敬请点赞、关注加收藏!系统UI界面的设计工作量较大,界面美化更需仔细雕琢,大家有任何建议或意见和可在下方评论交流。 1. 功能及效果演示 首先展示一下检测跟踪系统软件的功能和效果,系统主要实现的功能是车辆、行人等多目标的实时检测和跟踪,在界面中既可选择自己的视频、图片文件进行检测跟踪,也可以通过电脑自带的摄像头进行实时处理,可选择训练好的YOLO v3/v4等模型参数。 (1)选择视频文件进行检测跟踪:点击左侧视频按钮可弹出文件选择窗口,选择一个自己的MP4或AVI视频文件即可显示视频画面,目标标注在画面框中,右侧显示用时、目标数、置信度、位置坐标,要跟踪的目标可通过下拉框选择。 (2)选择画面中要跟踪的目标:在视频或摄像检测跟踪的过程中,如若想指定某个目标进行跟踪,可通过右侧的目标下拉选框选择,选择时画面暂停等待选择完成,画面中标注框定位到选中的目标。 (3)目标检测、跟踪、计数功能的切换:选择左侧选项,可切换检测、跟踪、计数功能,选择“跟踪计数”可在目标上标记运动轨迹并计数。 (4)利用摄像头进行检测跟踪:点击左侧摄像头按钮,则自动打开电脑上的摄像头设备,检测跟踪的标记信息同样显示在界面中。 (5)选择图片进行目标检测:点击图片选择按钮,弹出图片选择框选中一张图片进行检测,可自由浏览选中某个或多个对象。 2. 视频中的目标检测 由于整个软件的实现代码复杂,为了使得介绍循序渐进,首先介绍如何利用YOLO进行视频中目标对的检测。对于图像中的目标检测算法,其中比较流行的有YOLO、SSD等算法。这里我们使用YOLO v4/v3,这篇博文更多介绍的是如何通过代码使用YOLO,对于算法的原理细节和训练过程会在接下来的博文介绍。首先导入需要的依赖包,其代码如下: from collections import deque import numpy as np import imutils import time import cv2 import os from tqdm import tqdm 接下来进行参数设置,首先设置要检测的视频路径,这里需要修改为自己的视频路径;然后我们需要加载训练好的配置、模型权重参数,以及训练数据集的标签名称(类别)文件,它们的路径分别由变量labelPath、weightsPath、configPath表示。还有一些预定义的参数:filter_confidence(置信度阈值)和threshold_prob(非极大值抑制阈值),它们分别用于筛除置信度过低的识别结果和利用NMS去除重复的锚框: # 参数设置 video_path = .

java接口的default方法和 static方法

背景 当一个接口要添加一些新的公共逻辑,写了一个新的方法,那么所有的实现类都需要重写新方法,如果实现类太多,会非常麻烦。 这时可以使用 default。 default 接口中的default方法,可以写方法内容。 接口中的default方法不强制重写,不会影响到已有的实现类。 static 接口中的default方法,可以直接通过接口名称调用。 示例: OrderService 接口. public interface OrderService { /** * 接口中的变量都是 默认 public static final的,可以不用写这些修饰符 */ String NAME = static; /** * static方法,可以直接通过接口名称调用 static方法。 * 比如 OrderService.selectName(); * */ static String selectStatic() { return NAME; } /** * default方法,实现类不强制重写 default方法。 * */ default String selectDefault() { return default; } String selectOrder(); } 接口实现类: public class OrderServiceImpl implements OrderService { @Override public String selectOrder() { return order; } } 测试: public class InterfaceTest { public static void main(String[] args) { OrderServiceImpl orderServiceImpl = new OrderServiceImpl(); String user = orderServiceImpl.

java狂神流程控制:顺序结构,if选择结构

在流程控制中一共有三种结构,本节将顺序结构和if选择结构一起写。 一、顺序结构 由于顺序结构非常简单,所以就不做多赘述。  二、if选择结构 if选择结构一共有四种,单选择,双选择,多选择和switch多选择结构。 1、单选择结构 单选择结构会在语句里面加入else(否则),这样就可以做出对错的判断。  2、双选择结构 双选择结构与单选择结构相比就多了一条选择的路。  图中score是成绩的意思,使用nextInt是因为要让用户输入的是整数,输入小数就会报错。  3、多选择结构 多选择结构相比双选择结构又会多出许多可选择的路径。 关于多选择结构要看一下基本语法是怎么写的: 编写最后一行代码是因为防止用户输入不属于0-100范围内的数字,这样才能保证程序完整运行。  4、switch结构  选择结构还有一个实现方式,就是switch case语句。 switch case语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。 switch case语句的基本形式如下: 在switch case语句中还有一个特性,叫做case穿透,示例如下: 在本例中通过switch case语句写了一个选择结构,当我们输入”D时,下面的输出栏却输出了在D下面要输出的语句,当我们在“D”下面加上“break后就不会出现此现象了。可以把这里的break”看作一个门槛,只有到达该要求就可以输出相应的语句,并且不会再往下输出。将该例完整补充完就如下图: 像上面这样补充完整之后就不会出现继续输出下面语句的情况了。   补充1:还有一个嵌套式的选择结构,简单解释一下:设置一道题,现有一个需求,需要从0-100中找出用户选择的数字,如果我们按常规的用用户选择的数字去对比的话效率就非常低,我们可以将0-100分为1-50和50-100两组,这样分别对比的话效率就会大大增加。如果还要继续提高效率的话就可以将0-100继续细分为多组,以此来提高效率。  补充2:在以后我们可能也会需要用到查看文件的源码的情况,在这里将如何查看文件源码写一下。 1、在这里我们使用idea来做演示,先点击idea上方的File找到Project Structure 2、点击进去就可以看到你的电脑的java.class文件存放的地方。 3、然后按着路径就可以找到文件夹,再找到你所选的的java文件的java.class文件,将其复制。 4、再回到idea,找到idea中你选择的java文件所在的文件夹,再右击就可以看到Open in里面的Explorer 点击就会跳出一个文件夹,将刚刚你复制到java.class文件复制到里面,关闭,然后再回到idea就可以看到java的源码文件了。 (这是我得到的源码文件)  

The Missing Semester of Your CS Education(第八课,元编程)笔记

依赖管理 不同项目所用的版本号其具体含义并不完全相同,但是一个相对比较常用的标准是语义版本号,这种版本号具有不同的语义,它的格式是这样的:主版本号.次版本号.补丁号。相关规则有: 如果新的版本没有改变 API,请将补丁号递增; 如果您添加了 API 并且该改动是向后兼容的,请将次版本号递增; 如果您修改了 API 但是它并不向后兼容,请将主版本号递增。 这么做有很多好处。现在如果我们的项目是基于您的项目构建的,那么只要最新版本的主版本号只要没变就是安全的 ,次版本号不低于之前我们使用的版本即可。换句话说,如果我依赖的版本是1.3.7,那么使用1.3.8、1.6.1,甚至是1.3.0都是可以的。如果版本号是 2.2.4 就不一定能用了,因为它的主版本号增加了。我们可以将 Python 的版本号作为语义版本号的一个实例。您应该知道,Python 2 和 Python 3 的代码是不兼容的,这也是为什么 Python 的主版本号改变的原因。类似的,使用 Python 3.5 编写的代码在 3.7 上可以运行,但是在 3.4 上可能会不行。 使用依赖管理系统的时候,您可能会遇到锁文件(lock files)这一概念。锁文件列出了您当前每个依赖所对应的具体版本号。通常,您需要执行升级程序才能更新依赖的版本。这么做的原因有很多,例如避免不必要的重新编译、创建可复现的软件版本或禁止自动升级到最新版本(可能会包含 bug)。还有一种极端的依赖锁定叫做 vendoring,它会把您的依赖中的所有代码直接拷贝到您的项目中,这样您就能够完全掌控代码的任何修改,同时您也可以将自己的修改添加进去,不过这也意味着如何该依赖的维护者更新了某些代码,您也必须要自己去拉取这些更新。 --- 持续集成系统 随着您接触到的项目规模越来越大,您会发现修改代码之后还有很多额外的工作要做。您可能需要上传一份新版本的文档、上传编译后的文件到某处、发布代码到 pypi,执行测试套件等等。或许您希望每次有人提交代码到 GitHub 的时候,他们的代码风格被检查过并执行过某些基准测试?如果您有这方面的需求,那么请花些时间了解一下持续集成。 持续集成,或者叫做 CI 是一种雨伞术语(umbrella term,涵盖了一组术语的术语),它指的是那些“当您的代码变动时,自动运行的东西”,市场上有很多提供各式各样 CI 工具的公司,这些工具大部分都是免费或开源的。比较大的有 Travis CI、Azure Pipelines 和 GitHub Actions。它们的工作原理都是类似的:您需要在代码仓库中添加一个文件,描述当前仓库发生任何修改时,应该如何应对。目前为止,最常见的规则是:如果有人提交代码,执行测试套件。当这个事件被触发时,CI 提供方会启动一个(或多个)虚拟机,执行您制定的规则,并且通常会记录下相关的执行结果。您可以进行某些设置,这样当测试套件失败时您能够收到通知或者当测试全部通过时,您的仓库主页会显示一个徽标。 本课程的网站基于 GitHub Pages 构建,这就是一个很好的例子。Pages 在每次master有代码更新时,会执行 Jekyll 博客软件,然后使您的站点可以通过某个 GitHub 域名来访问。对于我们来说这些事情太琐碎了,我现在我们只需要在本地进行修改,然后使用 git 提交代码,发布到远端。CI 会自动帮我们处理后续的事情。 测试简介 多数的大型软件都有“测试套件”。您可能已经对测试的相关概念有所了解,但是我们觉得有些测试方法和测试术语还是应该再次提醒一下: 测试套件:所有测试的统称。 单元测试:一种“微型测试”,用于对某个封装的特性进行测试。 集成测试:一种“宏观测试”,针对系统的某一大部分进行,测试其不同的特性或组件是否能协同工作。 回归测试:一种实现特定模式的测试,用于保证之前引起问题的 bug 不会再次出现。 模拟(Mocking): 使用一个假的实现来替换函数、模块或类型,屏蔽那些和测试不相关的内容。例如,您可能会“模拟网络连接” 或 “模拟硬盘”。  

linux-磁盘IO工具使用

mysql文件句柄不调整有个214限制, 配置和内核调优后,性能就和硬件有关系了 [root@centos7 ~]# xfs_growfs -l /dev/sda1 | grep bsize log size unchanged, skipping data = bsize=4096 blocks=262144, imaxpct=25 naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal bsize=4096 blocks=2560, version=2 yum -y install sysstat iostat 和 iotop -c: 显示CPU使用情况 -d: 显示磁盘使用情况 -N: 显示磁盘阵列(LVM) 信息 -n: 显示NFS 使用情况 -k: 以 KB 为单位显示 -m: 以 M 为单位显示 -t: 报告每秒向终端读取和写入的字符数和CPU的信息 -V: 显示版本信息 -x: 显示详细信息 -p:[磁盘] 显示磁盘和分区的情况 测试 d if=/dev/zero of=/a.txt dd if=/dev/sda of=/dev/null tps:该设备每秒的传输次数(Indicate the number of transfers per second that were issued to the device.

4大查找算法

1.背景 查找算法经常被面试问到... 2.代码 2.1.线性查找算法 package com.ldp.structure.demo03Search; import org.junit.Test; import java.util.ArrayList; import java.util.List; /** * @create 04/17 12:03 * @description <p> * 线性查找 * </p> */ public class Test01LinearSearch { /** * 测试线性查找 */ @Test public void test01() { int[] array = {14, 57, 2, 1, 96, 74, 9, 2, 708}; List<Integer> integers = linearSearch(array, 2); System.out.println(integers); } /** * 线性查找 * * @param array * @param searchValue * @return */ public List<Integer> linearSearch(int[] array, int searchValue) { ArrayList<Integer> list = new ArrayList<>(); for (int i = 0; i < array.

mysql

## mysql 创建用户并分配权限 #权限: SELECT,INSERT,DROP,UPDATE,.. ALL(全部权限) #databasename: 数据库名称,* 表示所有数据库 #tablename: 表名称, * 表示所有表 #用户名 #host:可以连接的ip, %表示所有的IP地址 #密码 grant [权限] privileges on [databasename].[tablename] to '[用户名]@'[host]' identified by '[密码]' with grant option ; docker run --name snpsql -p 3304:3306 -e MYSQL_ROOT_PASSWORD=123456 -v $PWD/conf:/etc/mysql/conf.d -v $PWD/data:/var/lib/mysql mysql:latest

聚合影音系统开源源码 通霸云互站全网首发-新视界V7

资源来源网络,如果需要授权,请大家更换源码,模块仅供学习,如需商用请购买正版授权 1、替换全部文件(前端+后端+数据库)域名:【】改为你自己的域名 2、替换全部文件(前端+后端+数据库)APP名称:【通霸】改为你自己的APP昵称 3、修改后端文件/application/database.php数据库信息 4、去注册apicloud账号 5、APP请上传,网站根目录,格式命题为【app.apk】 6、网页手机端下载页面修改:根目录/application/app/view/index/m.html 7、网页端页面修改地址:根目录/application/app/view/index/ 8、app里面支付宝赏金数字修改文件地址:前端/html/shangjin_fm文件, 9、添加模块clipBoard webBrowser UIScrollPicture dialogBox mcm 10、后台登陆地址:域名/login/login/xsj账号密码默认admin 123456 下载地址:mageglw.com