scale9Gird图片

http://code.google.com/p/as3ui/ 一个类 setSize方法,指定图片宽高

/**
 *
 *	ScaleBitmap
 *	
 * 	@version	1.1
 * 	@author 	Didier BRUN	-  http://www.bytearray.org
 * 	
 * 	@version	1.2.1
 * 	@author		Alexandre LEGOUT - http://blog.lalex.com
 *
 * 	@version	1.2.2
 * 	@author		Pleh
 * 	
 * 	Project page : http://www.bytearray.org/?p=118
 *
 */

package org.bytearray.display {
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.geom.Matrix;
	import flash.geom.Rectangle;	

	public class ScaleBitmap extends Bitmap {

		// ------------------------------------------------
		//
		// ---o properties
		//
		// ------------------------------------------------

		protected var _originalBitmap : BitmapData;
		protected var _scale9Grid : Rectangle = null;

		// ------------------------------------------------
		//
		// ---o constructor
		//
		// ------------------------------------------------

		
		function ScaleBitmap(bmpData : BitmapData = null, pixelSnapping : String = "auto", smoothing : Boolean = false) {
			
			// super constructor
			super(bmpData, pixelSnapping, smoothing);
		
			// original bitmap
			_originalBitmap = bmpData.clone();
		}

		// ------------------------------------------------
		//
		// ---o public methods
		//
		// ------------------------------------------------
		
		/**
		 * setter bitmapData
		 */
		override public function set bitmapData(bmpData : BitmapData) : void {
			_originalBitmap = bmpData.clone();
			if (_scale9Grid != null) {
				if (!validGrid(_scale9Grid)) {
					_scale9Grid = null;
				}
				setSize(bmpData.width, bmpData.height);
			} else {
				assignBitmapData(_originalBitmap.clone());
			}
		} 

		/**
		 * setter width
		 */
		override public function set width(w : Number) : void {
			if (w != width) {
				setSize(w, height);
			}
		}

		/**
		 * setter height
		 */
		override public function set height(h : Number) : void {
			if (h != height) {
				setSize(width, h);
			}
		}

		/**
		 * set scale9Grid
		 */
		override public function set scale9Grid(r : Rectangle) : void {
			// Check if the given grid is different from the current one
			if ((_scale9Grid == null && r != null) || (_scale9Grid != null && !_scale9Grid.equals(r))) {
				if (r == null) {
					// If deleting scalee9Grid, restore the original bitmap
					// then resize it (streched) to the previously set dimensions
					var currentWidth : Number = width;
					var currentHeight : Number = height;
					_scale9Grid = null;
					assignBitmapData(_originalBitmap.clone());
					setSize(currentWidth, currentHeight);
				} else {
					if (!validGrid(r)) {
						throw (new Error("#001 - The _scale9Grid does not match the original BitmapData"));
						return;
					}
					
					_scale9Grid = r.clone();
					resizeBitmap(width, height);
					scaleX = 1;
					scaleY = 1;
				}
			}
		}

		/**
		 * assignBitmapData
		 * Update the effective bitmapData
		 */
		private function assignBitmapData(bmp : BitmapData) : void {
			super.bitmapData.dispose();
			super.bitmapData = bmp;
		}

		private function validGrid(r : Rectangle) : Boolean {
			return r.right <= _originalBitmap.width && r.bottom <= _originalBitmap.height;
		}

		/**
		 * get scale9Grid
		 */
		override public function get scale9Grid() : Rectangle {
			return _scale9Grid;
		}

		
		/**
		 * setSize
		 */
		public function setSize(w : Number, h : Number) : void {
			if (_scale9Grid == null) {
				super.width = w;
				super.height = h;
			} else {
				w = Math.max(w, _originalBitmap.width - _scale9Grid.width);
				h = Math.max(h, _originalBitmap.height - _scale9Grid.height);
				resizeBitmap(w, h);
			}
		}

		/**
		 * get original bitmap
		 */
		public function getOriginalBitmapData() : BitmapData {
			return _originalBitmap;
		}

		// ------------------------------------------------
		//
		// ---o protected methods
		//
		// ------------------------------------------------
		
		/**
		 * resize bitmap
		 */
		protected function resizeBitmap(w : Number, h : Number) : void {
			
			var bmpData : BitmapData = new BitmapData(w, h, true, 0x00000000);
			
			var rows : Array = [0, _scale9Grid.top, _scale9Grid.bottom, _originalBitmap.height];
			var cols : Array = [0, _scale9Grid.left, _scale9Grid.right, _originalBitmap.width];
			
			var dRows : Array = [0, _scale9Grid.top, h - (_originalBitmap.height - _scale9Grid.bottom), h];
			var dCols : Array = [0, _scale9Grid.left, w - (_originalBitmap.width - _scale9Grid.right), w];

			var origin : Rectangle;
			var draw : Rectangle;
			var mat : Matrix = new Matrix();

			
			for (var cx : int = 0;cx < 3; cx++) {
				for (var cy : int = 0 ;cy < 3; cy++) {
					origin = new Rectangle(cols[cx], rows[cy], cols[cx + 1] - cols[cx], rows[cy + 1] - rows[cy]);
					draw = new Rectangle(dCols[cx], dRows[cy], dCols[cx + 1] - dCols[cx], dRows[cy + 1] - dRows[cy]);
					mat.identity();
					mat.a = draw.width / origin.width;
					mat.d = draw.height / origin.height;
					mat.tx = draw.x - origin.x * mat.a;
					mat.ty = draw.y - origin.y * mat.d;
					bmpData.draw(_originalBitmap, mat, null, null, draw, smoothing);
				}
			}
			assignBitmapData(bmpData);
		}
	}
}
 
测试代码

package 
{
	import com.bit101.components.ProgressBar;
	import com.bit101.components.PushButton;
	import com.bit101.components.Style;
	import flash.display.Bitmap;
	import flash.display.MovieClip;
	import flash.display.SimpleButton;
	import flash.display.Sprite;
	import flash.events.Event;
	import org.bytearray.display.ScaleBitmap;
	
	/**
	 * ...
	 * @author yongkang
	 */
	public class Main extends Sprite 
	{
	
		[Embed(source='/resources/123.jpg')]
		private var icon:Class;
		
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
		
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			
			var bitmap:Bitmap = new icon as Bitmap;
			
			var sb:ScaleBitmap = new ScaleBitmap(bitmap.bitmapData);
			sb.bitmapData = bitmap.bitmapData;
			sb.setSize(800, 800);
			this.addChild(sb);
			
			
			
		}
	
			
	}
			
			
			
}
依喊 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值