Scala 基础语法代码<转>

下面的代码包含了基本的Scala的语法内容。包括:判断,循环代码片段,方法定义,调用。 虚拟类,继承,接口,case,package,单例模式


[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package org.exinglo.scala  
  2.   
  3. class LearnScala {  
  4.   
  5. }  
  6.   
  7. object Test{  
  8.   val variable1 = "this is my first scala variable"  
  9.       
  10.   def func1(): String = "hello world" //不带参数的函数被调用时,可以不加括号  
  11.       
  12.   def func2(who : String): String = { return "hello world " + who}  
  13.     
  14.   def func3 = (x : Int, y : Int) => x + y //这是个匿名函数的写法,调用的时候,func3(1,2)  
  15.     
  16.   //这里给了y一个默认值,如果用户传过来,那就用用户的  
  17.   def func4(x: Int)(y : Int = 1): Int = x + y //加脂法的写法,调用时, func4(1)(2)  
  18.     
  19.   // * 代表多个参数的意思,比如 printEveryChar("c","b", "a"),可以传递多个string  
  20.   def printEveryChar(c : String*) = {  
  21.     c.foreach(x => println(x))  
  22.   }  
  23.       
  24.   def main(args : Array[String]) {  
  25.     println(variable1)  
  26.       
  27.     for(i <- 0 to 10 if i%2 == 0){  
  28.     println("i is a even number: " + i)  
  29.     }  
  30.       
  31.     for(i <- 0 until 10){  
  32.       println("")  
  33.     }  
  34.       
  35.     var (n, r) = (100)  
  36.     while(n > 0){  
  37.       n = n - 1  
  38.     }  
  39.       
  40.     val p = new Person //这里可以省略括号  
  41.     println("information about person:" + p.name + " " + p.age) //如果p.name没有赋值的话,这里会显示为null  
  42.       
  43.   }  
  44.     
  45.     
  46. }  


[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package org.exinglo.scala  
  2.   
  3. class Person{ //类默认是public类型的  
  4.   var name : String = _ //会生成setter和getter方法  
  5.   val age = 10 //只会生成getter方法  
  6.   private[this] val gender = "male" //无法在下面的main方法访问gender,这个属性只能在对象内部访问  
  7.       
  8. }  
  9.   
  10.   
  11. //生成对象时 val p = new Person2("Java", 10)  
  12. //如果参数声明时不带val或者var,那么这个变量相当于内部变量,比如 class Person(name: String) 这里的name就无法在外部被访问到了  
  13. class Person2(val name : String, val age : Int){//括号中的内容属于主构造器,其中的参数会作为类的属性存在  
  14.   println("this is the person2's constructor")//这里属于默认构造器,生成对象时,会执行这句话  
  15.     
  16.   var gender : String = _ //这里要求初始化  
  17.     
  18.   //附属构造器必须叫做this,必须首先调用已经存在的子构造器或者其他附属构造器  
  19.   def this(name : String, age : Int, gender : String){  
  20.     this(name, age)//必须调用默认的构造器,=  
  21.     this.gender = gender  
  22.   }  
  23. }  
  24.   
  25. //成成Student对象的时候,会先打印父类构造器的打印语句,然后但因student类的语句  
  26. class Student(val grade : Int, name : String, age : Int) extends Person2(name, age) {  
  27.   println("this is the subclass of Person, grade is:" + grade)  
  28.     
  29.   override def toString() : String =  {""//覆盖父类的方法,一定要加上override关键字,其实不仅仅是父类的方法,覆盖父类的var val都要加上override  
  30. }  


[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package org.exinglo.abstractandtrait  
  2.   
  3. class ABstractAndTrait {  
  4.   
  5. }  
  6.   
  7. //抽象类(abstract class)  
  8. //• 类的⼀一个或者多个⽅方法没有没完整的定义, 当然也可以没有任何抽象方法。  
  9. //  对于子类覆盖父类的非抽象方法,一定要override关键字  
  10. //• 声明抽象⽅方法不需要加abstract关键字,只需要不写⽅方法体  
  11. //• ⼦子类重写⽗父类的抽象⽅方法时不需要加override  
  12. //• ⽗父类可以声明抽象字段(没有初始值的字段)  
  13. //• ⼦子类重写⽗父类的抽象字段时不需要加override  
  14. abstract class PersonX{  
  15.   def speak  
  16.   val name:String  
  17.   val age:Int  
  18. }  
  19.   
  20. class Student extends PersonX{  
  21.     
  22.   //必须要实现抽象方法,像这种不写等于号的情况,表示返回类型是Unit类型  
  23.   def speak{  
  24.     println("speak")  
  25.   }  
  26.     
  27.   val name:String = ""  
  28.   val age:Int = 3  
  29. }  
  30.   
  31. trait Logger{  
  32.   def log(msg:String)  
  33. }  
  34.   
  35. //这里的trait consoleLogger可以不实现父类的方法,也可以覆盖父类的方法实现,也可以实现父类的虚方法  
  36. trait ConsoleLogger extends Logger{  
  37.   def log(msg:String){  
  38.     println("save money:" + msg)  
  39.   }  
  40. }  
  41.   
  42. //因为是覆盖上级的方法,必须使用override关键字  
  43. trait MessageLogger extends ConsoleLogger{  
  44.   override def log(msg:String){  
  45.     println("save money to account:" + msg)  
  46.   }  
  47. }  
  48. //如果一个类没有继承其他的类,实现的第一个trait只能用extends,其他的用with关键字  
  49. class Test extends ConsoleLogger{  
  50.   def test{  
  51.     log("hellp")  
  52.   }  
  53. }  
  54.   
  55. abstract class Account{  
  56.   def save  
  57. }  
  58.   
  59. class MyAccount extends Account with ConsoleLogger{  
  60.   def save{  
  61.     log("100")  
  62.   }  
  63. }  
  64.     
  65. object Run extends App{  
  66.     
  67.   //这里是一个很好玩的地方,单独给一个对象混入了一个特质trait,并且这个特质与类的定义继承的特质有冲突  
  68.   //打印出来的是MessageLogger中的log方法  
  69.   val acc = new MyAccount with MessageLogger  
  70.   acc.save  
  71. }  


[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package org.exinglo.abstractandtrait  
  2.   
  3. class ApplyTest(val msg:String) {  
  4.   def apply() = msg  
  5.   def test{  
  6.     println(msg)  
  7.   }  
  8. }  
  9.   
  10. object ApplyTest{  
  11.   //下面是apply方法的最常用的方式  
  12.   def apply() = new ApplyTest("object calls new")  
  13.     
  14.   //object的方法相当于java中的静态方法  
  15.   def static{  
  16.     println("I am a static method")  
  17.   }  
  18. }  
  19.   
  20. object Basic extends App{  
  21.     
  22.   //类似于下面,嗲用object的方法  
  23.   ApplyTest.static  
  24.     
  25.   val t = new ApplyTest("new")  
  26.   println(t())  
  27.     
  28.   //据说下面这样可以调用object ApplyTest中的apply方法,但是我的编译器总是报错  
  29.   //后来发现是object的apply方法一开始声明没有加上小括号造成的,如def apply = xxxx  
  30.   val tt = ApplyTest()  
  31.   println(tt())  
  32.     
  33.   // ApplyTest()是调用object的apply方法  
  34.   // val t = new ApplyTest(); t() 调用的是class ApplyTest的apply方法  
  35. }  


[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package org.exinglo.abstractandtrait  
  2. /* 
  3.  * package com.xyz{ 
  4.  * //------------- 
  5.  *  package spark 
  6.  *  } 
  7.  * } 
  8.  *  
  9.  * { //这里只在程序块中可见 
  10.  *   import com.yyy 
  11.  *    
  12.  * } 
  13.  *  
  14.  * import java.util.{HashMap =>JavaHashMap} //定义一个别名 
  15.  *  
  16.  *  
  17.  * package aa.bb.cc.dd 
  18.  *  
  19.  * class Xxx{ 
  20.  *   private[dd] def variable = {} //根据private[]中指定的不同,可见范围不同 
  21.  * } 
  22.  *  
  23.  * */  
  24. class PackageAndCase {  
  25.   
  26. }  
  27.   
  28. object BasicT extends App{  
  29.   val value = 3  
  30.     
  31.   val result = value match{  
  32.     case 1 => "one"  
  33.     case 2 => "two"  
  34.     case _ => "some other number"  
  35.   }  
  36.     
  37.   val result2 = value match{  
  38.     case i if i == 1 => "one"  
  39.     case i if i == 2 => "two"  
  40.     case _ => "other number"  
  41.   }  
  42.     
  43.   def t(obj : Any) = obj match{  
  44.     case x:Int => println("Int")  
  45.     case s:String => println("String")  
  46.     case _ => println("unkonwn type")  
  47.   }  
  48.     
  49.   t(2)  
  50. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1 目标检测的定义 目标检测(Object Detection)的任务是找出图像中所有感兴趣的目标(物体),确定它们的类别和位置,是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具有挑战性的问题。 目标检测任务可分为两个关键的子任务,目标定位和目标分类。首先检测图像中目标的位置(目标定位),然后给出每个目标的具体类别(目标分类)。输出结果是一个边界框(称为Bounding-box,一般形式为(x1,y1,x2,y2),表示框的左上角坐标和右下角坐标),一个置信度分数(Confidence Score),表示边界框中是否包含检测对象的概率和各个类别的概率(首先得到类别概率,经过Softmax可得到类别标签)。 1.1 Two stage方法 目前主流的基于深度学习的目标检测算法主要分为两类:Two stage和One stage。Two stage方法将目标检测过程分为两个阶段。第一个阶段是 Region Proposal 生成阶段,主要用于生成潜在的目标候选框(Bounding-box proposals)。这个阶段通常使用卷积神经网络(CNN)从输入图像中提取特征,然后通过一些技巧(如选择性搜索)来生成候选框。第二个阶段是分类和位置精修阶段,将第一个阶段生成的候选框输入到另一个 CNN 中进行分类,并根据分类结果对候选框的位置进行微调。Two stage 方法的优点是准确度较高,缺点是速度相对较慢。 常见Tow stage目标检测算法有:R-CNN系列、SPPNet等。 1.2 One stage方法 One stage方法直接利用模型提取特征值,并利用这些特征值进行目标的分类和定位,不需要生成Region Proposal。这种方法的优点是速度快,因为省略了Region Proposal生成的过程。One stage方法的缺点是准确度相对较低,因为它没有对潜在的目标进行预先筛选。 常见的One stage目标检测算法有:YOLO系列、SSD系列和RetinaNet等。 2 常见名词解释 2.1 NMS(Non-Maximum Suppression) 目标检测模型一般会给出目标的多个预测边界框,对成百上千的预测边界框都进行调整肯定是不可行的,需要对这些结果先进行一个大体的挑选。NMS称为非极大值抑制,作用是从众多预测边界框中挑选出最具代表性的结果,这样可以加快算法效率,其主要流程如下: 设定一个置信度分数阈值,将置信度分数小于阈值的直接过滤掉 将剩下框的置信度分数从大到小排序,选中值最大的框 遍历其余的框,如果和当前框的重叠面积(IOU)大于设定的阈值(一般为0.7),就将框删除(超过设定阈值,认为两个框的里面的物体属于同一个类别) 从未处理的框中继续选一个置信度分数最大的,重复上述过程,直至所有框处理完毕 2.2 IoU(Intersection over Union) 定义了两个边界框的重叠度,当预测边界框和真实边界框差异很小时,或重叠度很大时,表示模型产生的预测边界框很准确。边界框A、B的IOU计算公式为: 2.3 mAP(mean Average Precision) mAP即均值平均精度,是评估目标检测模型效果的最重要指标,这个值介于0到1之间,且越大越好。mAP是AP(Average Precision)的平均值,那么首先需要了解AP的概念。想要了解AP的概念,还要首先了解目标检测中Precision和Recall的概念。 首先我们设置置信度阈值(Confidence Threshold)和IoU阈值(一般设置为0.5,也会衡量0.75以及0.9的mAP值): 当一个预测边界框被认为是True Positive(TP)时,需要同时满足下面三个条件: Confidence Score > Confidence Threshold 预测类别匹配真实值(Ground truth)的类别 预测边界框的IoU大于设定的IoU阈值 不满足条件2或条件3,则认为是False Positive(FP)。当对应同一个真值有多个预测结果时,只有最高置信度分数的预测结果被认为是True Positive,其余被认为是False Positive。 Precision和Recall的概念如下图所示: Precision表示TP与预测边界框数量的比值 Recall表示TP与真实边界框数量的比值 改变不同的置信度阈值,可以获得多组Precision和Recall,Recall放X轴,Precision放Y轴,可以画出一个Precision-Recall曲线,简称P-R
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值