当前位置: 首页 > 编程日记 > 正文

[Tracking] KCF + KalmanFilter目标跟踪

基于KCF和MobileNet V2以及KalmanFilter的摄像头监测系统

简介

这是一次作业。Tracking这一块落后Detection很多年了,一般认为Detection做好了,那么只要能够做的足够快,就能达到Tracking的效果了,实则不然,现在最快的我认为就是一些可以在手机等arm下使用的轻量神经网络了,但是其牺牲了准确性,依然达不到追踪的效果,因为你无法将多次识别的Object视为统一对象画出运动轨迹。Tracking与Detection的根本区别在于Tracking可以很快的识别,因为基本上只需要识别一次,然后调用跟踪算法对目标进行跟进就可以了,而跟踪算法只需要在目标所在位置附近进行搜‘索判断是否存在目标就可以了,不用像Detection那样整张图遍历来寻找目标。而本篇也是使用的是轻量神经网络MobileNet和MIL以及KCF追踪算法,两者结合使用,达到了一定的追踪效果。

由于比赛需要,我改了一改,做成了robomaster的追踪程序。。

1492605-20190117133730439-1312819750.gif

难点&解决

多个人的追踪

对于同时能够追踪多目标,我的想法是写一个Person类,实例化出不同的person对象,对个person对象只完成自己对象本身的追踪工作,不会干扰到其他对象的追踪。在对象走出视频流区域一段时间(可以作为参数设置)后将对象销毁。对于初始化问题,可以采用MobieNet的训练结果进行对象参数的初始化,当视频流中没有目标时只运行MobileNet的识别即可。识别必须每隔一段时间进行一次,将那些识别出的人与我们已经实例化出的人进行距离比较,相当于一个匹配,已有的保留,没有的再继续进行实例化,然后追踪。

人从各个方向运动的追踪

由于人可能从各个方向进入视频流,因此对分类器的要求会比较高,所以我们需要训练大量的实地场景的各种姿态进入视频流的图片,当然,由于宿舍空间有限,我没办法做出人从监视器各个角度各个方向进出的训练集。因此这个问题其实有待解决,但是我觉得可以通过丰富训练集来解决(废话)。

人遮挡状态下的追踪

对于遮挡状态下的追踪,我打算这么解决,遮挡首先分为短时间遮挡和长时间遮挡,对于短时间遮挡我们可以采用消失计时的方法,设置一个阈值,在消失阈值范围内输出原框,或者原来有速度进行一个预测,但是预测肯定会出问题,因为预测是按照前一帧的速度来预测的,因此预测的框会一直按照速度方向平移,所以速度应该在预测的时候逐渐减小,这样才能避免一直有速度的预测。还有就是可以通过卡尔曼滤波来做,这个我有做的打算,正在研究他的论文。这个问题属于Long-Term-Tracking问题,现有的方法有的是采用分块识别,就是分别识别人的某一部分,然后把识别到的结果合起来以及其他方法,具体还在看。

光照条件变化时候的追踪

对于光照变化的时候的追踪,我觉得这就完全可以交给我们的神经网络,神经网络提取的特征是可以保证在多尺度和各种光照条件下实现较高准确度的分类的,因此,在光照较暗和光照较强的条件下我们的神经网络都可以取得比较好的效果,因此是可以完成识别的任务的。

KCF & KalmanFilter

KCF

KCF算法是核相关滤波的简称,利用循环移位进行稠密采样,FFT快速变换进行分类器的训练,同时结合了多通道的HOG特征,大致的流程是,先利用循环矩阵不断对图像移位,得到多个样本,在第t帧中的当前位置附近利用这些样本训练一个分类器,这个分类器可以对框中是否有人做出一个概率响应,因此当我们来到下一帧的时候呢,先用循环矩阵对前一帧的区域进行循环移位得到若干样本,然后用前一帧训练的分类器分类得到输出响应,以响应最大的作为预测位置,然后再训练,再预测。这个算法的推导我会专门写一篇博客。

Kalman波波

状态方程:1492605-20190119221019897-846461167.gif

测量方程:1492605-20190119221024805-782700734.gif

xk是状态向量,zk是测量向量,Ak是状态转移矩阵,uk是控制向量,Bk是控制矩阵,wk是系统误差(噪声),Hk是测量矩阵,vk是测量误差(噪声)。wk和vk都是高斯噪声,即

1492605-20190119221101165-611148612.gif

实际应用的推导过程如下:

1492605-20190119221348945-1117860690.png
1492605-20190119221355264-520447281.png

使用

关于使用KCF,我是写了个类,这样可以做多目标的跟踪,不然就只能单目标啦。而且加入了kalmanfilter来预测并且修正观测值。

class Person:def __init__(self, bg, bbox,delta_time = 0.2 ,acc = 2):self._zs = 0self._bbox = bboxself._tracker = cv.TrackerKCF_create()self._center = (int(bbox[0]+bbox[2]/2), int(bbox[1]+bbox[3]/2))self._mask = np.zeros(bg.shape, dtype = np.uint8)self._shape = bg.shapeself._no_time = 0self._tracker.init(bg,bbox)self._frame = bgself._predicted = Noneself.kalman = cv.KalmanFilter(4,2,0)# 状态空间4D 分别是x y vx vy,测量空间2D 分别是 x yself.kalman.transitionMatrix = np.array([[1,0,delta_time,0],[0,1,0,delta_time],[0,0,1,0],[0,0,0,1]],dtype = np.float32)self.kalman.measurementMatrix = np.array([[1,0,0,0],[0,1,0,0]],dtype = np.float32)self.kalman.statePre = np.array([[self._center[0]],[self._center[1]],[0],[0]],dtype = np.float32)self.kalman.statePost = np.array([[self._center[0]],[self._center[1]],[0],[0]],dtype = np.float32)self.kalman.processNoiseCov = acc * np.array([[0.25*delta_time**4,0,0.5*delta_time**3,0],[0,0.25*delta_time**4,0,0.5*delta_time**3],[0.5*delta_time**3,0,delta_time**2,0],[0,0.5*delta_time**3,0,delta_time**2]],dtype = np.float32)def update(self,new_bbox,center):self._bbox = new_bboxself._center = centerdef precess(self,src):self._zs = self._zs + 1h,w = self._shape[:2]frame = copy.copy(src)padding = 5 # paddingret, bbox = self._tracker.update(frame) # bbox: x y w hp1,p2 = (int(bbox[0]),int(bbox[1])),(int(bbox[0])+int(bbox[2]),int(bbox[1])+int(bbox[3]))center = (int((p1[0]+p2[0])/2),int((p1[1]+p2[1])/2))global person_countif self._no_time == 20:self._no_time = 0self._mask = np.zeros(self._shape,dtype=np.uint8)self._frame = srcreturn (False,src)if ret and p1[0]>=padding and p1[1]<= (w-padding):#and int(bbox[0])>=padding and int(bbox[0] + bbox[2])<= (w-padding) #and int(bbox[1])>=padding and int(bbox[1] + bbox[3])<=(h-padding)self._no_time = 0s = np.array([[np.float32(center[0])],[np.float32(center[1])]])self.kalman.correct(s)center = self.kalman.predict().astype(np.int)#print(center[0],center[1])center = (center[0,0],center[1,0])cv.line(self._mask,self._center,center,(255,255,0),2)mmask = cv.cvtColor(self._mask.astype(np.uint8),cv.COLOR_BGR2GRAY)mmask = cv.bitwise_not(mmask)self._frame = cv.add(frame, self._mask, mask = mmask)self.update(bbox,center)#self._predicted = [self._bbox[i]+self._speed[i] if i<2 else self._bbox[i] for i in range(4)]#predict_1,predict_2 = (int(self._predicted[0]),int(self._predicted[1])),(int(self._predicted[0])+int(self._predicted[2]),int(self._predicted[1])+int(self._predicted[3]))#cv.rectangle(self._frame,predict_1,predict_2,(0,255,255),2,1) # 画预测框#cv.putText(self._frame,"predicted",predict_1,cv.FONT_HERSHEY_SIMPLEX,0.5,(0,255,255),2)cv.rectangle(self._frame, p1, p2, (255, 0, 0), 2, 1) # 画识别框cv.putText(self._frame,"recognized",p2,cv.FONT_HERSHEY_SIMPLEX,0.5,(255,0,0),2)#cv.waitKey(10)return (True,self._frame)else:ret,bbox = recg_car(frame)if ret:p1,p2 = (int(bbox[0]),int(bbox[1])),(int(bbox[0])+int(bbox[2]),int(bbox[1])+int(bbox[3]))center = (int((p1[0]+p2[0])/2),int((p1[1]+p2[1])/2))s = np.array([[np.float32(center[0])],[np.float32(center[1])]])self.kalman.correct(s)center = self.kalman.predict().astype(np.int)center = (center[0,0],center[1,0])cv.line(self._mask,self._center,center,(255,255,0),2)mmask = cv.cvtColor(self._mask.astype(np.uint8),cv.COLOR_BGR2GRAY)mmask = cv.bitwise_not(mmask)self._frame = cv.add(frame, self._mask, mask = mmask)self.update(bbox,center)cv.rectangle(self._frame, p1, p2, (255, 0, 0), 2, 1) # 画识别框cv.putText(self._frame,"recognized",p2,cv.FONT_HERSHEY_SIMPLEX,0.5,(255,0,0),2)return (True,self._frame)else:self._no_time = self._no_time + 1mmask = cv.cvtColor(self._mask.astype(np.uint8),cv.COLOR_BGR2GRAY)mmask = cv.bitwise_not(mmask)self._frame = cv.add(frame, self._mask, mask = mmask)return (True,self._frame)

使用MobileNet V2模型进行训练和预测

关于训练过程我就不一一介绍了,之前的博客也有写到怎么做,直接贴代码(完整的)。

import cv2 as cv
import sys
import numpy as np
import os
import copy
import tensorflow as tf
sys.path.append("..")
from utils import label_map_util
from utils import visualization_utils as vis_util
DEBUG = False # 表示不是调试模式
THRE_VAL = 0.4 # 这里设置的是置信度的阈值,如果大于这个阈值就在图像里面把他给框出来
# ['BOOSTING', 'MIL', 'KCF', 'TLD', 'MEDIANFLOW', 'GOTURN']
#tracker = cv.TrackerKCF_create()
#tracker = cv.TrackerMIL_create()
PATH_TO_CKPT ='/home/xueaoru/trace/car/frozen_inference_graph.pb' #网络结构配置文件
PATH_TO_LABELS = '/home/xueaoru/trace/car/label_map.pbtxt' # 标签映射关系配置文件
NUM_CLASSES = 2 # 分类数目
label_map = label_map_util.load_labelmap(PATH_TO_LABELS) # 调用函数加载labelmap,相当于把文本转换成了json文件
categories = label_map_util.convert_label_map_to_categories(label_map, max_num_classes=NUM_CLASSES, use_display_name=True)
# 上面一句是把每个labelmap格式的数据转换为dict类型的数据,每隔id对应一个输出的name
category_index = label_map_util.create_category_index(categories) # 得到每个id,也就是key
detection_graph = tf.Graph() #加载默认图
with detection_graph.as_default():od_graph_def = tf.GraphDef()with tf.gfile.GFile(PATH_TO_CKPT, 'rb') as fid:# 加载网络模型serialized_graph = fid.read()od_graph_def.ParseFromString(serialized_graph)tf.import_graph_def(od_graph_def, name='')sess = tf.Session(graph=detection_graph)# 运行开启session
image_tensor = detection_graph.get_tensor_by_name('image_tensor:0')
detection_boxes = detection_graph.get_tensor_by_name('detection_boxes:0')
detection_scores = detection_graph.get_tensor_by_name('detection_scores:0')
detection_classes = detection_graph.get_tensor_by_name('detection_classes:0')
num_detections = detection_graph.get_tensor_by_name('num_detections:0')
cap = cv.VideoCapture("/home/xueaoru/下载/red1.mp4")
#cap = cv.VideoCapture(1)
person_exist = False
class Person:def __init__(self, bg, bbox,delta_time = 0.2 ,acc = 2):self._zs = 0self._bbox = bboxself._tracker = cv.TrackerKCF_create()self._center = (int(bbox[0]+bbox[2]/2), int(bbox[1]+bbox[3]/2))self._mask = np.zeros(bg.shape, dtype = np.uint8)self._shape = bg.shapeself._no_time = 0self._tracker.init(bg,bbox)self._frame = bgself._predicted = Noneself.kalman = cv.KalmanFilter(4,2,0)# 状态空间4D 分别是x y vx vy,测量空间2D 分别是 x yself.kalman.transitionMatrix = np.array([[1,0,delta_time,0],[0,1,0,delta_time],[0,0,1,0],[0,0,0,1]],dtype = np.float32)self.kalman.measurementMatrix = np.array([[1,0,0,0],[0,1,0,0]],dtype = np.float32)self.kalman.statePre = np.array([[self._center[0]],[self._center[1]],[0],[0]],dtype = np.float32)self.kalman.statePost = np.array([[self._center[0]],[self._center[1]],[0],[0]],dtype = np.float32)self.kalman.processNoiseCov = acc * np.array([[0.25*delta_time**4,0,0.5*delta_time**3,0],[0,0.25*delta_time**4,0,0.5*delta_time**3],[0.5*delta_time**3,0,delta_time**2,0],[0,0.5*delta_time**3,0,delta_time**2]],dtype = np.float32)def update(self,new_bbox,center):self._bbox = new_bboxself._center = centerdef precess(self,src):self._zs = self._zs + 1h,w = self._shape[:2]frame = copy.copy(src)padding = 5 # paddingret, bbox = self._tracker.update(frame) # bbox: x y w hp1,p2 = (int(bbox[0]),int(bbox[1])),(int(bbox[0])+int(bbox[2]),int(bbox[1])+int(bbox[3]))center = (int((p1[0]+p2[0])/2),int((p1[1]+p2[1])/2))global person_countif self._no_time == 20:self._no_time = 0self._mask = np.zeros(self._shape,dtype=np.uint8)self._frame = srcreturn (False,src)if ret and p1[0]>=padding and p1[1]<= (w-padding):#and int(bbox[0])>=padding and int(bbox[0] + bbox[2])<= (w-padding) #and int(bbox[1])>=padding and int(bbox[1] + bbox[3])<=(h-padding)self._no_time = 0s = np.array([[np.float32(center[0])],[np.float32(center[1])]])self.kalman.correct(s)center = self.kalman.predict().astype(np.int)#print(center[0],center[1])center = (center[0,0],center[1,0])cv.line(self._mask,self._center,center,(255,255,0),2)mmask = cv.cvtColor(self._mask.astype(np.uint8),cv.COLOR_BGR2GRAY)mmask = cv.bitwise_not(mmask)self._frame = cv.add(frame, self._mask, mask = mmask)self.update(bbox,center)#self._predicted = [self._bbox[i]+self._speed[i] if i<2 else self._bbox[i] for i in range(4)]#predict_1,predict_2 = (int(self._predicted[0]),int(self._predicted[1])),(int(self._predicted[0])+int(self._predicted[2]),int(self._predicted[1])+int(self._predicted[3]))#cv.rectangle(self._frame,predict_1,predict_2,(0,255,255),2,1) # 画预测框#cv.putText(self._frame,"predicted",predict_1,cv.FONT_HERSHEY_SIMPLEX,0.5,(0,255,255),2)cv.rectangle(self._frame, p1, p2, (255, 0, 0), 2, 1) # 画识别框cv.putText(self._frame,"recognized",p2,cv.FONT_HERSHEY_SIMPLEX,0.5,(255,0,0),2)#cv.waitKey(10)return (True,self._frame)else:ret,bbox = recg_car(frame)if ret:p1,p2 = (int(bbox[0]),int(bbox[1])),(int(bbox[0])+int(bbox[2]),int(bbox[1])+int(bbox[3]))center = (int((p1[0]+p2[0])/2),int((p1[1]+p2[1])/2))s = np.array([[np.float32(center[0])],[np.float32(center[1])]])self.kalman.correct(s)center = self.kalman.predict().astype(np.int)center = (center[0,0],center[1,0])cv.line(self._mask,self._center,center,(255,255,0),2)mmask = cv.cvtColor(self._mask.astype(np.uint8),cv.COLOR_BGR2GRAY)mmask = cv.bitwise_not(mmask)self._frame = cv.add(frame, self._mask, mask = mmask)self.update(bbox,center)cv.rectangle(self._frame, p1, p2, (255, 0, 0), 2, 1) # 画识别框cv.putText(self._frame,"recognized",p2,cv.FONT_HERSHEY_SIMPLEX,0.5,(255,0,0),2)return (True,self._frame)else:self._no_time = self._no_time + 1mmask = cv.cvtColor(self._mask.astype(np.uint8),cv.COLOR_BGR2GRAY)mmask = cv.bitwise_not(mmask)self._frame = cv.add(frame, self._mask, mask = mmask)return (True,self._frame)def recg_car(frame):image_expanded = np.expand_dims(frame, axis=0)(boxes, scores, classes, num) = sess.run([detection_boxes, detection_scores, detection_classes, num_detections],feed_dict={image_tensor: image_expanded})score = np.squeeze(scores)max_index = np.argmax(score)score = score[max_index]# print(score)if score > THRE_VAL:box = np.squeeze(boxes)[max_index]#(ymin,xmin,ymax,xmax)h,w,_ = frame.shapemin_point = (int(box[1]*w),int(box[0]*h))max_point = (int(box[3]*w),int(box[2]*h))bbox = (min_point[0], min_point[1], max_point[0]-min_point[0], max_point[1] - min_point[1])return True,bboxelse:return False,None
ret, frame = cap.read()
if not ret:print("err")sys.exit()
ret,bbox = recg_car(frame)
person = Person(frame,bbox)
while True:ret,frame = cap.read()time = cv.getTickCount()if not ret:breakperson_exist,frame = person.precess(frame)cv.imshow("frame",frame)time = cv.getTickCount() - timeprint("处理时间:"+str(time*1000/cv.getTickFrequency())+"ms")key = cv.waitKey(1) & 0xffif key ==27:break
cap.release()
cv.destroyAllWindows()

转载于:https://www.cnblogs.com/aoru45/p/10281739.html

相关文章:

.net wap强制输出WML

强制输出WML:在web.config添加下面内容<system.web>下<browserCaps><result type"System.Web.Mobile.MobileCapabilities, System.Web.Mobile, Version1.0.5000.0, Cultureneutral, PublicKeyTokenb03f5f7f11d50a3a"/><use var"HTTP_USER_…

Tomcat在Linux上的安装与配置

1.安装好linux系统&#xff0c;下载适合的 Tomcat(jdk)下载JDK与Tomcatjdk 下载Tomcat 下载参考地址&#xff1a;jdk下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.htmltomcat下载地址:http://tomcat.apache.org /download-70.cgi…

上机实践 1 初识 Java

实验 1 一个简单的 Java 应用程序 一、实验目的 掌握开发 Java 应用程序的 3 个步骤&#xff1a;编写源文件、编译源文件和运行应用程序。 二、实验要求 1. 参照教材中的指导&#xff0c;使用网络课程中提供的链接下载并安装 JKD 并配置环境变量。 2. 编写一个简单的 Java…

论COSPLAY / 谨以此文纪念我暂短的Cos生涯

COSPLAY是什么COSPLAY这一名词是是英文Costume Play&#xff08;服饰扮演&#xff09;的缩写&#xff0c;从事COSPLAY相关活动的人员一般被称为COSPLAYER。目前流行的COSPLAY活动内容主要集中于通过服装、道具、饰品等扮演动漫作品中的人物角色&#xff0c;而从宽泛的意义上来说…

python 3下对stm32串口数据做解析

1、最近有个想做一个传感器数据实时显示的上位机&#xff0c;常规的数据打印太频繁了&#xff0c;无法直观的看出数据的变化。 python下的上位机实现起来简单一点&#xff0c;网上找了一些python界面Tkinter相关资料和python串口的demo.测试实现了简单的数据显示。 Mark 一下问…

《深入理解计算机系统》第八章——异常控制流知识点总结

课本习题&#xff1a; 8.11 #include <unistd.h> #include <stdio.h>int main(){int i;for(i0;i<2;i) fork();printf("hello\n");exit(0);}/** Result:* hello* hello* hello* hello*/ 8.12 #include <stdio.h> #include <unistd.h>vo…

vs2003复制一个web窗体,没有更改指向同一个cs 文件,引发大问题

今天我在原来的考试系统的出题模块中,input模块,因为增加的一个web窗体编译有问题,于是就复制了原来的启动项页面input,再改了名字为set1,然后在set1页面上删除了控件和代码,再把set1设置为启动项,谁知道问题出来了:因为两个aspx文件都是指向同一个CS文件&#xff0c;从他们的H…

8.29 对象?数组?

今天发现我的filter函数有问题&#xff0c;翻不了页&#xff0c;一直报错&#xff1a; 这是一个封装好的Array原型扩展函数。 /* Array 原型方法扩展 */(function() {$.extend(Array.prototype, {// 添加内容&#xff0c;比push多一个检查相同内容部分add: function(item) {if …

Nginx的作用

1、Nginx简介&#xff1a; 2、简介&#xff1a; Nginx是一个高性能的HTTP和反向代理服务器。 支持的操作系统众多&#xff0c;windows、linux、MacOSX 可实现负载均衡 Rewrite功能强大 电商架构大部分都采用NginxTomcat的架构 3、命令行使用&#xff1a; 三个命令&#xff1a;(…

(转)TabContainer要实现服务器端回传

TabContainer要实现服务器端回传,出来在后台实现 OnActiveTabChanged 事件外, 还需要在前台实现 OnClientActiveTabChanged 事件&#xff0c;这是关键。 <asp:UpdatePanel ID"UpdatePanel1"runat"server"ChildrenAsTriggers"true"><con…

python 获取脚本所在目录

pythonsys.path__file__abspathrealpath 平时写python经常会想获得脚本所在的目录&#xff0c;例如有个文件跟脚本文件放在一个相对的目录位置&#xff0c;那就可以通过脚本文件的目录找到对应的文件&#xff0c;即使以后脚本文件移到其他地方&#xff0c;脚本也基本不需要改动…

《深入理解计算机系统》第十章——系统级I/0

目录 10.1Unix I/O 10.2文件 10.3打开和关闭文件 10.4读和写文件 10.5用RIO包建壮地读写 10.6读取文件元数据 10.7读取目录内容 10.8共享文件 10.9 I/O重定向 10.10 标准I/O 10.1Unix I/O 在Linux中&#xff0c;一切皆为文件。 文件I/O函数-------打开文件、读文件…

终于完成了“微软”化

整整忙活了一个下午&#xff0c;基本上我的笔记本完成了可怕的“微软”化进程&#xff01;是的&#xff0c;当我完成FOXMAIL中邮件向OUTLOOK2007的迁移后&#xff0c;在办公层面&#xff0c;已经完成“微软”化了。其实真的不想这样&#xff0c;但是想MS在独霸桌面后&#xff0…

C#创建Windows服务

利用VS.NET创建C# Windows服务在很多应用中需要做windows服务来操作数据库等操作&#xff0c;比如 &#xff08;1&#xff09;一些非常慢的数据库操作&#xff0c;不想一次性去做&#xff0c;想慢慢的通过服务定时去做&#xff0c;比如定时为数据库备份等 &#xff08;2&#x…

《深入理解计算机系统》第七章——链接知识点总结

目录 7.1编译器驱动程序 7.2静态链接 7.3目标文件 7.4可重定位目标文件 7.5符号和符号表 7.6符号解析 • 静态库(.a archive files) 7.1编译器驱动程序 7.2静态链接 7.3目标文件 7.4可重定位目标文件 使用readelf -S查看hello.o 一个典型的ELF可重定位目标文件包含以下…

排序算法之直接插入排序

1、基本思想&#xff1a; 已知待排序列r[1...n],先将序列中的第一个记录看成是一个有序的子序列&#xff0c;然后从第二个记录起逐个进行插入&#xff0c;直至整个序列变成关键字非递减有序序列为止。 具体操作如下&#xff1a; &#xff08;1&#xff09;查找出r[i]在有序序列…

【代码片段】如何使用CSS来快速定义多彩光标

对于web开发中&#xff0c;我们经常都看得到需要输入内容的组件和元素&#xff0c;比如&#xff0c;textarea&#xff0c;或者可编辑的DIV(contenteditable) &#xff0c;如果你也曾思考过使用相关方式修改一下光标颜色的&#xff0c;那么这篇技术小分享&#xff0c;你绝对不应…

如何划分155MSDH带宽

我们单位拟计划租用运营商155MSDH电路&#xff0c;由于我们单位应用业务较多&#xff0c;为了避免各业务之间相互影响&#xff0c;更好地分享带宽&#xff0c;根据各业务数据量的大小&#xff0c;分别赋予一定的带宽&#xff0c;使各业务在自己的带宽内传输&#xff0c;但不知选…

慕课袁春风老师《计算机系统基础》一二三部分练习题

2.2 1、下列几种存储器中&#xff0c;&#xff08; A &#xff09;是易失性存储器。 A. cache B. EPROM C. Flash Memory D. CD-ROM 2、下面有关半导体存储器组织的叙述中&#xff0c;错误的是&#xff08; D &#xff09;。 A. 存储器的核心部分是存储阵列&#xff0c;…

47种常见的浏览器兼容性问题大汇总

浏览器兼容性问题大汇总 JavaScript 31. HTML对象获取问题 32. const问题 33. event.x与event.y问题 34. window.location.href问题 35. frame问题 36. 模态和非模态窗口问题 37. firefox与IE的父元素(parentElement)的区别 38. document.formName.item(”itemName”) 问题 39.…

封装了一下我佛山人4.0 (支持vs2005)asp.net 页面验证

第一次写控件&#xff0c;拿“我佛山人4.0”开个刀&#xff0c;实际上也不算是什么控件&#xff0c;只是封装了一下&#xff0c;方便在asp.net中使用。 建议先看“我佛山人 4。0”文档。 声明&#xff1a;控件中参考了不少网上的源码&#xff0c;大家不要觉得眼熟BS人啊。注&am…

九章算法班L8 Array Number

转载于:https://www.cnblogs.com/sissie-coding/p/10295478.html

linux密码时效更改方法

密码时效 按目前的形势&#xff0c;已有更强大的硬件大大地缩短了利用自动运行的程序来猜测密码的时间。因此在UNIX系统中防止密码被***的别一方法就是要经常地改变密码。很多时候&#xff0c;用户却不改变密码。因此一种机制用来强制规律性的更改密码是合乎要求的。这种技术称…

YOLOv10训练自己的数据集

至此,整个YOLOv10的训练预测阶段完成,与YOLOv8差不多。欢迎各位批评指正。

安卓相对布局常用语句

不BB写在自己博客园看的舒服 RelativeLayout布局 android:layout_marginTop"25dip" //顶部距离 android:gravity"left" //空间布局位置 android:layout_marginLeft"15dip //距离左边距 // 相对于给定ID控件 android:layout_above 将该控件的底部置于…

Tomcat V6 Examples移植到Apusic V5.1

目标&#xff1a;将Tomcat V6的的例子Examples移植到Apusic V5.1上术语&#xff1a;Tomcat&#xff1a;只提供了WEB容器的开源服务器&#xff1b;Apusic&#xff1a;提供了完整的J2EE支持的商用服务器&#xff1b;%TOMCAT_HOME%&#xff1a;Tomcat安装目录%APUSIC_HOME%&#x…

Android 活动与活动间数据传递--登录注册页面

AndroidManifest.xml: <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"package"com.example.myapplica…

使用SVG中的Symbol元素制作Icon

前言 随着大屏幕分辨率的普及以及各种移动设备层出不穷的移动互联网时代的到来&#xff0c;我们在网站设计时更应该关心内容在各种设备上的阅读性和显示效果。我们都希望能在任何时间&#xff0c;任何设备上都能清楚的&#xff0c;高效的传递信息给用户。 而随着各种高清视网膜…

【JOURNAL】恭喜发财

刚写完上一条blog不久&#xff0c;南京城里开始响彻了鞭炮声&#xff0c;人见人爱、极具亲和力的财神来了。上海的一个朋友发短信来说那个国际化大都市也被对财神的膜拜感染得热闹喧天。这是好的。昨天给老婆表亲家的孩子压岁钱&#xff0c;对方说免了吧&#xff0c;我坚持让他…

[树形dp] Jzoj P5233 概率博弈

Description 小A和小B在玩游戏。这个游戏是这样的&#xff1a;有一棵n个点的以1为根的有根树&#xff0c;叶子有权值。假设有m个叶子&#xff0c;那么树上每个叶子的权值序列就是一个1->m 的排列。一开始在1号点有一颗棋子。两人轮流将这颗棋子移向其当前位置的一个儿子。假…