使​用​P​H​P​调​用​功​能​强​大​的​J​A​V​A​ ​类​库

本文档详细介绍了如何在Windows环境下安装配置JDK,并通过修改PHP.INI文件设置来让PHP能够顺利调用JAVA类库。此外,还提供了一个具体的实例演示如何创建并使用自定义的JAVA类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JAVA是个非常强大的编程利器,它的扩展库也是非常的有用,这篇教程,主要讲述怎样使用PHP调用功能强大的JAVA 类库(classes)。为了方便你的学习,这篇教程将包括JAVA的安装及一些基本的例子。 


windows下的安装 


第一步:安装JDK,这是非常容易的,你只需一路回车的安装好。然后做好以下步骤。 
在 Win9x 下加入 :“PATH=%PATH%;C:\jdk1.2.2\bin” 到AUTOEXEC.BAT文件中 
在 NT 下加入 “;C:\jdk1.2.2\bin”到环境变量中。 


这一步是非常重要的,这样PHP才能正确的找到需调用的JAVA类。 


第二步:修改你的PHP.INI文件。 
[java] 
extension=php_java.dll 
java.library.path=c:\web\php4\extensions\ 
java.class.path="c:\web\php4\extensions\jdk1.2.2\php_java.jar;c:\myclasses" 


在PHP.INI中加入extension=php_java.dll 
并在[java]中,设定好java.class.path,让它指向php_java.jar,如果你使用新的JAVA类,你也应该存入这个路径,在这篇例子中,我们使用c:\myclasses这个目录。 


第三步:测试环境,创建如下PHP文件: 
<?php 


$system = new Java("java.lang.System"); 
print "Java version=".$system->getProperty("java.version")." <br>\n"; 
print "Java vendor=".$system->getProperty("java.vendor")." <p>\n\n"; 
print "OS=".$system->getProperty("os.name")." ". 
       $system->getProperty("os.version")." on ". 
       $system->getProperty("os.arch")." <br>\n"; 


$formatter = new Java("java.text.SimpleDateFormat","EEEE, 
MMMM dd, yyyy 'at' h:mm:ss a zzzz"); 
print $formatter->format(new Java("java.util.Date"))."\n"; 
  
?> 


如果你正确安装了,你将会看到以下信息: 


Java version=1.2.2 
Java vendor=Sun Microsystems Inc. 
OS=Windows 95 4.10 on x86 
Wednesday, October 18, 2000 at 10:22:45 AM China Standard Time 


这样,我们就已经成功的建立起了可以使用JAVA类的PHP运行环境,我们可以开始我们接下去的课程了。 
例子1:创建和使用你自己的JAVA类 
创建你自己的JAVA类非常容易。新建一个phptest.java文件,将它放置在你的java.class.path目录下,文件内容如下: 


public class phptest{ 
/** 
* A sample of a class that can work with PHP 
* NB: The whole class must be public to work,  
* and of course the methods you wish to call 
* directly. 

* Also note that from PHP the main method 
* will not be called   
*/ 


public String foo; 


/** 
* Takes a string and returns the result 
* or a msg saying your string was empty 
*/ 
public String test(String str) {    
if(str.equals("")) { 
      str = "Your string was empty. ";    
}    
return str;   



/** 
* whatisfoo() simply returns the value of the variable foo. 
*/   
public String whatisfoo() {    
return "foo is " + foo;   





/** 
* This is called if phptest is run from the command line with 
* something like 
*  java phptest 
* or 
*  java phptest hello there 
*/ 
public static void main(String args[]) { 
phptest p = new phptest(); 
     
if(args.length == 0) { 
String arg = ""; 
System.out.println(p.test(arg)); 
}else{ 
for (int i=0; i < args.length; i++) { 
String arg = args[i]; 
System.out.println(p.test(arg));   






创建这个文件后,我们要编译好这个文件,在DOS命令行使用javac phptest.java这个命令。 


为了使用PHP测试这个JAVA类,我们创建一个phptest.php文件,内容如下: 


<?php 


$myj = new Java("phptest"); 
echo "Test Results are <b>" . $myj->test("Hello World") . "</b>"; 
  
$myj->foo = "A String Value"; 
echo "You have set foo to <b>"   . $myj->foo . "</b><br>n"; 
echo "My java method repo 
依喊 gold80991 交通事件检测孪生推演实验平台 实验总用时:00:11:32 资源中心 数据集 nav 第1关:高速弯道 100 点击上方按钮,启动实验环境。 学习内容 参考答案 记录 评论 任务描述 相关知识 YOLO v1损失函数 YOLO v2损失函数 YOLO v3损失函数 获取加速度信息 操作流程 编程要求 测试说明 任务描述 本关任务:阅读下面的相关知识,理解YOLO V1的网络框架,然后在虚拟仿真中按指导完成操作,并且在代码输入环节完成填空进行代码评测,然后完成任务。 虚拟仿真的主要内容是部署传感器->选择录制数据并上传的传感器->数据上传后进行图像分析(需完成右侧代码评测)->得到相应分析结果->场景相应的事件处理->完成关卡。 仿真中需要你去按要求部署传感器,不同的传感器在场景中会去监测相应的数据,第二环节我们会选择录制然后在虚拟仿真中按指导完成操作,并且在代码输入环节完成填空进行代码评测,然后各关卡的操作说明完成任务。 相关知识 YOLO v1损失函数 YOLO V1损失函数组成如下所示: λ coord i=0 ∑ S 2 j=0 ∑ B 1 ij obj [(x i − x ^ i ) 2 +(y i − y ^ i ) 2 ] +λ coord i=0 ∑ S 2 j=0 ∑ B 1 ij obj [( w i − w ^ i ) 2 +( h i − h ^ i ) 2 ] + i=0 ∑ S 2 j=0 ∑ B 1 ij obj (C i − C ^ i ) 2 +λ noobj i=0 ∑ S 2 j=0 ∑ B 1 ij noobj (C i − C ^ i ) 2 + i=0 ∑ S 2 1 i obj c∈ classes ∑ (p i (c)− p ^ i (c)) 2 1 i obj 代表cell中含有真实物体的中心, pr(object)=1。 损失函数分为三个部分: ① 坐标误差 为什么宽和高要带根号? 对不同小的bbox预测中,相比于bbox预测偏一点,小box预测偏一点更不能忍受。作者用了一个比较取巧的办法,就是将box的width和height取平方根代替原本的height和width。(主要为了平衡小目标检测预测的偏移) ② IoU误差(很多人不知道 C ^ i 代表什么) 其实这里的 C ^ i 分别表示1和0, C ^ i =Pr( Object )∗1OU pred truth ③分误差 这里就是激活函数的输出。 YOLO v2损失函数 YOLO V2损失函数组成如下所示: loss t = i=0 ∑ W j=0 ∑ H k=0 ∑ A 1 Max IOU< Thresh λ noobj ∗(−b ijk o ) 2 +1 t<12800 λ prior ∗ r∈(x,y,w,h) ∑ ( prior k r −b ijk r ) 2 +1 k truth ⎝ ⎜ ⎛ λ coord ∗ r∈(x,y,w,h) ∑ ( truth r −b ijk r ) 2 +λ obj ∗(IOU truth k −b ijk o ) 2 ∗λ class ∗( c=1 ∑ c ( truth c −b ijk c ) 2 )) 首先W,H分别指的是特征图(3×13的宽与高,而A指的是先验框数(这里是5),各个λ各个loss部分的权重系数,除了预测有对象的损失函数系数设置为5,其他都为1。 有无对象损失函数计算方法 1 MaxIOU< Thresh λ noobj ∗(−b ijk o ) 2 +λ obj ∗(IOU truth k −b ijk o ) 2 其中 λ obj =5,λ nobj =1 ∘ 1 MaxIOU<Thresh 表示最的IOU都小于0.6时,取1。b o ijk 表示0-confidence YOLOv2中,总共有845个anchor_boxes。在未与true_boxes匹配的anchor_boxes中,与true_boxes的max IOU小于0.6预测无对象,需要计算no_objects_loss其损失。而objects_loss则是与true_boxes匹配的anchor_boxes的预测误差。与YOLOv1不同的是修正系数的改变,YOLO v1中no_objects_loss和objects_loss分别是0.5和1,而YOLO v2中则是1和5。其中 objects_loss = (object_scale * detectors_mask * K.square(best_ious - pred_confidence))和公式表述相似。 别损失函数计算方法 +λ class ∗( c=1 ∑ c ( truth c −b ijk c ) 2 )) 均方误差:(1-卷积层预测别概率)的平方。 坐标损失函数计算方法 +1 k truth ⎝ ⎜ ⎛ λ coord ∗ r∈(x,y,w,h) ∑ ( truth r −b ijk r ) 2 和YOLO v1的改动较: (1)计算x,y的误差由相对于整个图像(416x416)的offset坐标误差的均方改变为相对于gird cell的offset坐标误差的均方。并且将YOLOv1w,h取根号处理改为对YOLO v2中长宽放缩因子取log。 (2)并将修正系数由5改为了1 。 YOLO v3损失函数 YOLO V3损失函数组成如下所示: loss ( object ) =λ coord i=0 ∑ K×K j=0 ∑ M I ij obj (2−w i ×h i )[(x i − x ^ i ) 2 +(y i − y ^ i ) 2 ]+ λ coord i=0 ∑ K×K j=0 ∑ M I ij obj (2−w i ×h i )[(w i − w ^ i ) 2 +(h i − h ^ ) 2 ]− i=0 ∑ K×K j=0 ∑ M I ij obj [ C ^ i log(C i )+(1− C ^ i )log(1−C i )]− λ noobj i=0 ∑ K×K j=0 ∑ M I ij noobj [ C ^ i log(C i )+(1− C ^ i )log(1−C i )]− i=0 ∑ K×K I ij obj c∈ classes ∑ [ p ^ i (c)log(p i (c))+(1− p ^ i (c))log(1−p i (c))] 图片输入到神经网络后会被分成S*S个网格,每个网格产生B个候选框,每个候选框会经过网络最终得到相应的bounding box。最终得到S*S*B个bounding box。那么就需要利用损失函数确定具体的bounding box计算误差更新权重。 中心点坐标误差 λ coord i=0 ∑ K×K j=0 ∑ M I ij obj (2−w i ×h i )[(x i − x ^ i ) 2 +(y i − y ^ i ) 2 ] I ij obj 是真实置信度,(2−w i ×h i )是box比例, [(x i − x ^ i ) 2 +(y i − y ^ i ) 2 ] 是求中心点的二值交叉熵。 def xy_loss(true_p,true_xy, pred_xy,box_scale): """ true_p: 真实置信度 true_xy: 真实xy raw_pred_xy: 预测xy box_scale: box比例 """ xy_loss = true_p*box_scale*K.binary_crossentropy(true_xy, pred_xy,from_logits=True) 网络输出是 t x 和 t y , 然后通过 σ(t x ) 和 σ(t y ), 再乘以步长,就映射到了 416 * 416小的图上的目标,所以在计算误差的时候,其实也是用的这一项 σ(t x )∗ stride 和 σ(t y )∗stride和真实目标经过resize到 416 * 416 上的目标的小,去计算误差。 整个这一项表示的是:当第 i 个网格的第 j 个anchor box负责某一个真实目标时,那么这个anchor box所产生的bounding box就应该去 和真实目标的box去比较,计算得到中心坐标误差。 宽高坐标误差 λ coord i=0 ∑ K×K j=0 ∑ M I ij obj (2−w i ×h i )[(w i − w ^ i ) 2 +(h i − h ^ ) 2 ] I ij obj 是真实置信度,(2−w i ×h i )是box比例, [(w i − w ^ i ) 2 +(h i − h ^ ) 2 ] 是求宽高的均方误差。 def xy_loss(true_p,true_wh, pred_wh,box_scale): """ true_p: 真实置信度 true_xy: 真实wh raw_pred_xy: 预测wh box_scale: box比例 """ xy_loss = true_p*box_scale*0.5*K.square(true_wh - pred_wh) 实际上,网络输出的应当是 (t w ) 和 (t h ), 所以在计算误差的时候,其实也是用的这一项 (t w )∗ stride和 (t h )∗ stride和真实目标经过resize之后的值, 去计算误差的。所以可以认为公式里的 w i 就是 (t w )∗ stride等等。 整个这一项表示的是:当第 i 个网格的第j个anchor box负责某一个真实目标时,那么这个anchor box所产生的bounding box就应该去 和真实目标的box去比较,计算得到宽高的误差。 置信度误差 i=0 ∑ K×K j=0 ∑ M I ij obj [ C ^ i log(C i )+(1− C ^ i )log(1−C i )]− λ noobj i=0 ∑ K×K j=0 ∑ M I ij noobj [ C ^ i log(C i )+(1− C ^ i )log(1−C i )] 置信度误差使用交叉熵来表示。另外需要清楚不管anchor box是否负责某个目标,都会计算置信度误差。因为置信度表示:框出的box内确实有物体的自信程度和框出的box将整个物体的所有特征都包括进来的自信程度。 损失函数分为两部分:有物体,没有物体,其中没有物体损失部分还增加了权重系数。 第一项是:存在对象的bounding box的置信度误差。带有I ij obj 意味着只有"负责"(IOU比较)预测的那个bounding box的置信度才会计入误差。 第二项是:不存在对象的bounding box的置信度误差。因为不存在对象的bounding box应该老老实实的说"我这里没有对象",也就是输出尽量低的置信度。如果它不恰当的输出较高的置信度,会与真正"负责"该对象预测的那个bounding box产生混淆。其实就像对象分一样,正确的对象概率最好是1,所有其它对象的概率最好是0。 分误差 i=0 ∑ S 2 I ij obj c∈ classes ∑ ([ P ^ i j log(P i j )+(1− P ^ i j )log(1−P i j )] 分误差也是选择了交叉嫡作为损失函数。当第 i 个网格的第 j 个anchor box负责某一个真实目标时,那么这个anchor box所产生的bounding box才会去计算分损失函数。 获取加速度信息 欧几里得距离或欧几里得度量是欧几里得空间中两点间的即直线距离。使用这个距离,欧氏空间成为度量空间,相关联的范数称为欧几里得范数。 n维空间中的欧几里得距离: d(x,y)= i=1 ∑ n (x i −y i ) 2 = (x 1 −y 1 ) 2 +(x 2 −y 2 ) 2 +⋯+(x n −y n ) 2 2维空间中的欧几里得距离: d(x,y)= (x 1 −y 1 ) 2 +(x 2 −y 2 ) 2 通过计算欧式距离得到小车行驶的路线长度,结合给出的行驶时间,可以推出小车的平均速度,将此作为中点速度,再进行加速度的计算。 操作流程 转弯: 1.部署传感器阶段: 首先我们想要检测到场景的车流以及桥梁载荷的数据,那么我们在通车前部署好在各处的传感器,桥梁一共分了前、中、后段,每段至少都需要部署一处视频传感器、地感线圈传感器、雷达传感器,交互方式是通过拖拽上方的传感器图标会显示可部署区域,然后进行部署,部署后的传感器模型上会有一个放镜按钮,点击可进行放查看操作,并且已部署视频传感器的话,可点击摄像头查看当前监控画面,部署完成后点击下方部署完成按钮。 , 图1-1 2.选用用来录制并上传数据的传感器 此环节会将视频传感器中的画面按图片帧形式传到服务器,所以录制环节的视频传感器是默认勾选的, 另外还有3个传感器作为可录制数据进行上传,激光雷达是探测目标的位置、速度等数据等选项,然后相应传感器会影响到数据的检测,如以下图1和图2,在完成此环节后图像已将同时开始记录并上传如图3。 , 图2-1 , 图2-2 , 图2-3 3.进入超速车流阶段 首先对允许车速的最值进行设置,以此车速为判断超速标准。超速的车辆头上会出现感叹号。 4.图像标识训练阶段 用鼠标点击图像上的车辆进行标识,点击车辆后会出现标识框,完成后点击完成提交到服务器。 , 图4-1 5.完成代码评测阶段 如图,进入视频分析阶段后,需要你根据此关卡的任务描述进行相关知识学习后完成右侧的代码填空,在正确的完成代码填空并评测后将会把正确的结果传输到虚仿界面中,并进入下一个阶段。 , 图5-1 6.图像分析阶段 进入到此环节后,图像上的车辆有检测框并且有速度和车型,并且开始违章检测阶段,代表课程中的代码评测已经正确完成,任务通过。 , 图6-1 7.事故干预方式选择 选择一种事故干预方式,对有可能发生的事故进行预防,完成此步后会检测代码结果,若均正确将在等待一段时间后出现事故,然后处理后通关。 , 图7-1 编程要求 根据上述内容提示,在右侧编辑器补充损失函数和获取加速度函数的代码。 测试说明 如果计算出的损失值等于设定的值,则输出“Y”代表损失函数部分的代码填写正确。补充完获取加速度函数的代码后,系统输入一组参数(0,6,0,8,2,2)进行用测试,如若返回“加速度为: 1.5 是否处于加速中: True”,则代表获取加速度函数部分的代码填写正确。 开始你的任务吧,祝你成! 说点什么 resize-icon 7570717273746869656667636461625960565758545552535051 from keras import backend as K def xy_loss(object_mask, raw_pred, box_loss_scale, raw_true_xy, mf): """ object_mask: 真实置信度 raw_true_xy: 真实xy raw_pred: 预测结果,包含坐标以及置信度和分结果([x, y, w, h, c, a1, a2, a3...]) box_loss_scale: box比例 """ 测试结果 测试集1 测试集2 测试集3 本关最执行时间:20秒 下一关 run 评测
最新发布
07-01
### Point Cloud Registration 或 Pose Estimation 的数学公式推导 Point cloud registration 和 pose estimation 是计算机视觉和机器人学中的重要问题之一,其目标是找到两个点云之间的最佳刚体变换 \( R \)(旋转矩阵)和 \( t \)(平移向量)。通常使用的优化函数可以表示为: \[ J(R, t) = \frac{1}{2} \sum_{i=1}^{n} \| q_i - (R p_i + t) \|^2 \] 其中: - \( p_i \in P \) 表示源点云中的第 \( i \) 个点, - \( q_i \in Q \) 表示目标点云中的对应点, - \( n \) 是匹配点的数量。 #### 数学公式的推导过程 为了最小化上述代价函数 \( J(R, t) \),可以通过分别求解最优的旋转矩阵 \( R \) 和平移向量 \( t \) 来完成配准。以下是详细的推导步骤: --- ##### **Step 1: 平移参数 \( t \)** 通过展开欧几里得范数平方项并简化表达式,得到: \[ J(R, t) = \frac{1}{2} \sum_{i=1}^{n} \big( \|q_i\|^2 - 2(q_i)^T (Rp_i + t) + \| Rp_i + t \|^2 \big) \] 由于 \( \|q_i\|^2 \) 不依赖于 \( R \) 和 \( t \),因此将其视为常数项忽略不计。进一步整理可得: \[ J(R, t) = \frac{1}{2} \sum_{i=1}^{n} \big(-2(q_i)^Tt + \|t\|^2 + \|p_i\|^2 - 2(p_i)^TR^Tq_i + \|Rp_i\|^2 \big) \] 对于固定旋转矩阵 \( R \),令偏导数等于零来计算最优平移矢量 \( t \): \[ \frac{\partial J}{\partial t} = -\sum_{i=1}^{n}(q_i) + nt = 0 \] 从而得出: \[ t = \bar{q} - R\bar{p} \tag{1}[^4] \] 这里定义了中心化的均值点位置 \( \bar{p} = \frac{1}{n}\sum_{i=1}^{n}p_i \), \( \bar{q} = \frac{1}{n}\sum_{i=1}^{n}q_i \). --- ##### **Step 2: 旋转参数 \( R \)** 将平移参数代入原方程后,仅需考虑旋转部分的影响。此时的目标是最小化下述形式的能量函数: \[ E(R) = \sum_{i=1}^{n} \| q_i - R p_i \|^2 \] 利用奇异值分解(SVD)方法解决该子问题。设协方差矩阵 \( H \) 定义如下: \[ H = (\tilde{P})(\tilde{Q})^T \quad \text{where } \tilde{P}=P-\bar{p}, \; \tilde{Q}=Q-\bar{q}. \] 对 \( H \) 进行 SVD 分解获得三个正交矩阵 U,V 及对角阵 D : \[ H = UD V^T . \] 最终旋转矩阵可通过以下方式构建: \[ R = UV^T \tag{2}[^5]. \] 如果行列式小于零,则整最后一列使得满足特殊正交群 SO(3) 要求。 --- ### 实现代码示例 下面是一个简单的 Python 实现用于演示如何基于以上理论执行 point cloud registration. ```python import numpy as np def icp_registration(P, Q): """ Perform Iterative Closest Point (ICP) registration. Parameters: P : ndarray(Nx3) Source points Nx3 array. Q : ndarray(Mx3) Target points Mx3 array. Returns: R : ndarray(3x3) Optimal rotation matrix. t : ndarray(3,) Translation vector. """ # Centering both clouds around their respective means mean_P = np.mean(P, axis=0) mean_Q = np.mean(Q, axis=0) centered_P = P - mean_P[np.newaxis,:] centered_Q = Q - mean_Q[np.newaxis,:] # Compute covariance matrix H = np.dot(centered_P.T, centered_Q) # Singular Value Decomposition U,D,V_T = np.linalg.svd(H) # Ensure proper orientation by checking determinant condition det_product = np.linalg.det(U)*np.linalg.det(V_T.T) if det_product < 0: V_T[-1,:] *= -1 # Construct optimal rotation matrix from singular vectors R = np.dot(U,V_T) # Calculate translation component based on centroids difference after applying computed transformation t = mean_Q - np.dot(mean_P,R) return R,t if __name__ == "__main__": source_points = np.array([[0.,0.,0.],[1.,0.,0.]]) target_points = np.array([[1.,1.,0.],[2.,1.,0.]]) result_R,result_t = icp_registration(source_points,target_points) print("Rotation Matrix:\n",result_R) print("Translation Vector:",result_t) ``` --- ### 结论 综上所述,在 point cloud registration 中采用迭代最近点算法(ICP),能够有效估计两组三维空间数据间的相对位姿关系。此过程中涉及的关键技术包括但不限于重心校正、协方差分析以及SVD数值技巧的应用等。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值