1.MMDet——DETR源码解读
2.为ä»ä¹objectå¯ä»¥è½¬ä¸ºstring
3.èè JS ä¸ç Object.create
4.QT源码分析:QObject
5.java中Object类是码图怎么回事,干嘛使的码图?举例说明!
6.js引擎v8源码分析之Object(基于v8 0.1.5)
MMDet——DETR源码解读
DETR是码图Object Detection领域中的创新之作,首次以完全采用Transformer结构实现端到端目标检测。码图DETR通过引入object query,码图将目标信息以query形式送入Transformer的码图排队叫号系统源码decoder,以实现自注意力学习,码图捕捉不同目标的码图特征。query在经过Self Attention后,码图与图像特征进行Cross Attention,码图提取检测目标的码图特征。最终输出含有目标信息的码图query,通过FFN得到bbox和class信息。码图
理解DETR模型前,码图需明确模型结构与配置。码图模型主要由三部分组成:Backbone,Transformer(encoder与decoder)及head。源码安装agent输入为batch图像,假设维度为[B, 3, W, H],使用隐层维度embed_dims为,模型变换过程如下。
DETR配置文件中,model部分分为Backbone和bbox_head。理解其配置有助于深入模型运作机制。
DETR的前向过程在mmdet/models/detectors/single_stage.py中统一为两个步骤,具体实现于detr_head(mmdet/models/dense_heads/detr_head.py)中的forward_single()函数。该函数负责除backbone外的所有前向过程。变量shape示例供理解,注意img_shape因随机裁剪而不同,导致shape不唯一。
DETR的backbone采用常规的Resnet,结构相对简单,非本文讨论重点。亚太cp源码Transformer部分的源码在mmdet/models/utils/transformer.py文件,解析如下,N = W_feat*H_feat。
详细解读及参考文章将帮助您更深入理解DETR的内部运作与实现细节。
为ä»ä¹objectå¯ä»¥è½¬ä¸ºstring
å¨java项ç®çå®é å¼åååºç¨ä¸ï¼å¸¸å¸¸éè¦ç¨å°å°å¯¹è±¡è½¬ä¸ºStringè¿ä¸åºæ¬åè½ãæ¬æå°å¯¹å¸¸ç¨ç转æ¢æ¹æ³è¿è¡ä¸ä¸ªæ»ç»ã常ç¨çæ¹æ³æObject.toString()ï¼ï¼Stringï¼è¦è½¬æ¢ç对象ï¼String.valueOf(Object)çãä¸é¢å¯¹è¿äºæ¹æ³ä¸ä¸è¿è¡åæã
æ¹æ³1ï¼éç¨ Object.toString()æ¹æ³
请çä¸é¢çä¾åï¼
Object object = getObject();
System.out.println(object.toString());
注1
å¨è¿ç§ä½¿ç¨æ¹æ³ä¸ï¼å 为java.lang.Objectç±»éå·²æpublicæ¹æ³.toString()ï¼æ以对任ä½ä¸¥æ ¼æä¹ä¸çjava对象é½å¯ä»¥è°ç¨æ¤æ¹æ³ãä½å¨ä½¿ç¨æ¶è¦æ³¨æï¼å¿ é¡»ä¿è¯objectä¸æ¯nullå¼ï¼å¦åå°æåºNullPointerExceptionå¼å¸¸ãéç¨è¿ç§æ¹æ³æ¶ï¼é常派çç±»ä¼è¦çObjectéçtoStringï¼ï¼æ¹æ³ã
æ¹æ³2ï¼éç¨ç±»å转æ¢ï¼Stringï¼objectæ¹æ³
è¿æ¯æ åçç±»å转æ¢ï¼å°object转æStringç±»åçå¼ã使ç¨è¿ç§æ¹æ³æ¶ï¼éè¦æ³¨æçæ¯ç±»åå¿ é¡»è½è½¬æStringç±»åãå æ¤æ好ç¨instanceofå个类åæ£æ¥ï¼ä»¥å¤ææ¯å¦å¯ä»¥è½¬æ¢ãå¦å容ææåºCalssCastExceptionå¼å¸¸ãæ¤å¤ï¼éç¹å«å°å¿çæ¯å å®ä¹ä¸ºObject
ç±»åç对象å¨è½¬æStringæ¶è¯æ³æ£æ¥å¹¶ä¸ä¼æ¥éï¼è¿å°å¯è½å¯¼è´æ½å¨çé误åå¨ãè¿æ¶è¦æ ¼å¤å°å¿ãå¦ï¼
Object obj = new Integer();
String strVal = (String)obj;
å¨è¿è¡æ¶å°ä¼åºéï¼å 为å°Integerç±»å强å¶è½¬æ¢ä¸ºStringç±»åï¼æ æ³éè¿ãä½æ¯ï¼
Integer obj = new Integer();
String strVal = (String)obj;
å¦ä¸æ ¼å¼ä»£ç ï¼å°ä¼æ¥è¯æ³é误ã
æ¤å¤ï¼å nullå¼å¯ä»¥å¼ºå¶è½¬æ¢ä¸ºä»»ä½java类类åï¼(String)nullä¹æ¯åæ³çã
æ¹æ³3ï¼éç¨String.valueOf(Object)
String.valueOf(Object)çåºç¡æ¯Object.toString()ãä½å®ä¸Objec.toString()åææä¸åãå¨åé¢æ¹æ³1çåæä¸æå°ï¼ä½¿ç¨åè æ¶éä¿è¯ä¸ä¸ºnullãä½éç¨ç¬¬ä¸ç§æ¹æ³æ¶ï¼å°ä¸ç¨æ å¿objectæ¯å¦ä¸ºnullå¼è¿ä¸é®é¢ã为äºä¾¿äºè¯´æé®é¢ï¼æ们æ¥åæä¸ä¸ç¸å ³çæºä»£ç ãJdkéString.
valueOf(Object)æºç å¦ä¸ï¼
/
*** Returns the string representation of the Object argument.
*
* @param obj an Object.
* @return if the argument is null, then a string equal to
* "null"; otherwise, the value of
* obj.toString() is returned.
* @see java.lang.Object#toString()
*/
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
ä»ä¸é¢çæºç å¯ä»¥å¾æ¸ æ°ççåºnullå¼ä¸ç¨æ å¿ççç±ãä½æ¯ï¼è¿ä¹æ°æ°ç»äºæ们éæ£ãæ们åºå½æ³¨æå°ï¼å½object为nullæ¶ï¼String.valueOfï¼objectï¼çå¼æ¯å符串ânullâï¼èä¸æ¯
nullï¼ï¼ï¼å¨ä½¿ç¨è¿ç¨ä¸åè®°è¦æ³¨æãè¯æ³ä¸ä¸ï¼å¦ææä»¬ç¨ if(String.valueOfï¼objectï¼==null){ System.out.println(âä¼ å ¥çå¼æ¯nullï¼â);}è¿æ ·çè¯å¥å°å¯è½ä¼åçä»ä¹é®é¢ãåæ³ä¸ä¸ï¼åæ§å¶å°è¾åºæ¶ï¼å¨è§è§ä¸å¦ä¸è¯å¥å¨æ§è¡çç»æä¸æä»ä¹ä¸åï¼
System.out.println(String.valueOf((Object)null));
注2
System.out.println(null);
æ们çå°çè¾åºå°æ¯ä¸æ¨¡ä¸æ ·çä¸è¥¿ï¼nullï¼ä½å®ä»¬æä¹ç¸ååï¼
注1ï¼å å°±System.out.printlnç使ç¨æ¥è¯´ï¼è¯å¥System.out.println(object.toString());
æ¢ä¸ºSystem.out.println(object);
æ´å¥½ãæ¤å¤å¦æ¯ç¨æ³ä¸»è¦æ¯ä¸ºäºè¯´æObject#toString()çç¨æ³ã
注2ï¼æ¨è使ç¨System.out.println(String.valueOf((Object)null));
ä¸æ¨è使ç¨System.out.println(String.valueOf(null));å¨ä½¿ç¨éè½½æ¹æ³æ¶ï¼è¿æ ·åæ¯ä¸ä¸ªå¥½çä¹ æ¯ã
以ä¸æ¯å¯¹object对象转æ¢ä¸ºStringçä¸äºæ»ç»ã
new Integer.valueof()è¿åçæ¯Integerç对象ã
Integer.parseInt() è¿åçæ¯ä¸ä¸ªintçå¼ã
new Integer.valueof().intValue();è¿åçä¹æ¯ä¸ä¸ªintçå¼ã
Integer.valueof(String s)æ¯å°ä¸ä¸ªå è£ ç±»æ¯å°ä¸ä¸ªå®é å¼ä¸ºæ°åçåéå 转æstringååå°å®è½¬æIntegeråçå è£ ç±»å¯¹è±¡(ç¸å½äºè½¬æäºintç对象)è¿æ ·è½¬å®çå¯¹è±¡å°±å ·ææ¹æ³åå±æ§äºã
èInteger.parseInt(String s)åªæ¯å°æ¯æ°åçå符串转ææ°åï¼æ³¨æä»è¿åçæ¯intååéä¸å ·å¤æ¹æ³åå±æ§ã
1
å符串转æ¢ææ°æ®
å符串转æ¢ææ´æ°ï¼
String MyNumber ="";
int MyInt = Integer.parseInt(MyNumber);
å符串转æ¢æbyte, short, int, float, double, longçæ°æ®ç±»åï¼å¯ä»¥åå«åèByte, Short, Integer, Float, Double,
Longç±»çparseXXXæ¹æ³ã
2
æ°æ®è½¬æ¢æå符串
æ´æ°è½¬æ¢æå符串ï¼
int MyInt = ;
String MyString = "" + MyInt;
å ¶å®æ°æ®ç±»åå¯ä»¥å©ç¨åæ ·çæ¹æ³è½¬æ¢æå符串ã
3
åè¿å¶å°å ¶ä»è¿å¶ç转æ¢
åè¿å¶æ´æ°è½¬æ¢æäºè¿å¶æ´æ°ï¼è¿åç»ææ¯ä¸ä¸ªå符串ï¼
Integer.toBinaryString(int i);
IntegeråLongæä¾äºtoBinaryString, toHexStringåtoOctalStringæ¹æ³ï¼å¯ä»¥æ¹ä¾¿çå°æ°æ®è½¬æ¢æäºè¿å¶ãåå è¿å¶åå «è¿å¶å符串ãåè½æ´å 强大çæ¯å ¶toString(int/long
i, int radix)æ¹æ³ï¼å¯ä»¥å°ä¸ä¸ªåè¿å¶æ°è½¬æ¢æä»»æè¿å¶çå符串形å¼ã
byte, short, floatådoubleçæ°æ®ç±»åï¼å¯ä»¥å©ç¨Integeræè æ¯LongçtoBinaryString,
toHexString, to OctalStringåtoStringæ¹æ³è½¬æ¢æå ¶ä»è¿å¶çå符串形å¼ã
4
å ¶å®è¿å¶å°åè¿å¶ç转æ¢
äºè¿å¶å符串转æ¢æåè¿å¶æ´æ°ï¼ç»ææ¯ï¼
System.out.println(Integer.valueOf("", 5);
IntegeråLongæä¾çvalueOf(String source, int radix)æ¹æ³ï¼å¯ä»¥å°ä»»æè¿å¶çå符串转æ¢æåè¿å¶æ°æ®ã
5 æ´æ°å°åèæ°ç»ç转æ¢
public static byte[] toByteArray(int number)
{
int temp = number;
byte[] b=new byte[4];
for (int i = b.length - 1; i > -1; i--)
{
b[i] = new Integer(temp & 0xff).byteValue();
temp = temp >> 8;
}
return b;
}
6 åèæ°ç»å°æ´æ°ç转æ¢
public static int toInteger(byte[] b)
{
int s = 0;
for (int i = 0; i < 3; i++)
{
if (b[i] > 0)
s = s + b[i];
else
s = s + + b[i];
s = s * ;
}
if (b[3] > 0)
s = s + b[3];
else
s = s + + b[3];
return s;
}
7 çæ´æ°ä¸åèæ°ç»ä¹é´çç¸äºè½¬æ¢
shortä¸intä¹é´çåºå«å¨äºshortæ¯ä¸¤ä¸ªåèçï¼èintæ¯å个åèçãå æ¤ï¼åªéè¦å°5
ä¸6 ä¸çèä¾ç¨åºå°åæ¹å¨ï¼å³å¯å®ç°çæ´æ°ä¸åèæ°ç»ä¹é´çç¸äºè½¬æ¢ã
8
åèæ°ç»è½¬æ¢æå精度浮ç¹æ°
public double toDouble(byte[] b)
{
long l = 0;
Double D = new Double(0.0);
l = b[0];
l |= ((long)b[1]<<8);
l |= ((long)b[2]<<);
l |= ((long)b[3]<<);
l |= ((long)b[4]<<);
l |= ((long)b[5]<<);
l |= ((long)b[6]<<);
l |= ((long)b[7]<<);
return D.longBitsToDouble(l);
}
9 å¸å°ç±»å转æ¢æå符串
第ä¸ç§æ¹æ³æ¯ï¼
boolean bool = true;
String s = new Boolean(bool).toString();//å°boolå©ç¨å¯¹è±¡å°è£ å¨è½¬å为对象
s.equals("true");
/* å ¶ä¸ï¼toStringæ¹æ³æ¯ä¸ä¸ªç»§æ¿æ¹æ³ãjavaä¸ææçç±»é½æ¯objectç继æ¿ï¼objectçä¸ä¸ªéè¦æ¹æ³å°±æ¯toStringï¼ç¨äºå°å¯¹è±¡è½¬å为å符串ã*/
第äºç§æ¹æ³æ¯ï¼
boolean bool = true;
String s = String.valueOf( bool );
é¦å ï¼ä»ä»£ç é¿åº¦ä¸è®²ç¬¬äºç§æ¹æ³ææ¾è¦æ¯ç¬¬ä¸ç§æ¹æ³ç®æ´ï¼å ¶æ¬¡ï¼ç¬¬ä¸ç§æ¹æ³å¨è½¬åè¿ç¨ä¸å¤å¼å ¥äºä¸ä¸ªå®å ¨æ²¡æå¿ è¦ç对象ï¼å æ¤ï¼ç¸å¯¹ç¬¬äºç§æ¹æ³æ¥è¯´è¿å°±é æäºå å空é´ç浪费ï¼å¤§å¤§åæ ¢äºè¿è¡é度ãæ以ï¼æ¨è使ç¨ç¬¬äºç§æ¹æ³ã
æ°åç±»åä¸æ°å类对象ä¹é´ç转æ¢
byte b = ;
Byte bo = new Byte( b );
b = bo.byteValue();
short t = ;
Short to = new Short( t );
t = to.shortValue();
int i = ;
Integer io = new Integer( i );
i = io.intValue();
long l = ;
Long lo = new Long( l );
l = lo.longValue();
float f = f;
Float fo = new Float( f );
f = fo.floatValue();
double d = f;
Double dObj = new Double( d );
d = dObj.doubleValue();
5.0 String 转 Integer
Integer in=new Integer(String s);
Integer in=new Integer(Integer.parseInt(String s));
5.1 String 转 int
1). int i = Integer.parseInt([String]);
æ
i = Integer.parseInt([String],[int radix]);
2). int i = Integer.valueOf(my_str).intValue();
5.2 å¦ä½å°æ´æ° int
转æ¢æå串 String ?
A. æåç§æ¹æ³:
1.) String s = String.valueOf(i);
2.) String s = Integer.toString(i);
3.) String s = "" + i;
注: Double, Float, Long
转æå串çæ¹æ³å¤§åå°å¼.
5.3 String
转 Date
å¯¼å ¥ java.util.Date date=null;
date=java.sql.Date.valueOf(String s);
èè JS ä¸ç Object.create
å®è¯è¯´ï¼ä¹åä¸ç¥éè¿æè¿ä¹ä¸ªç©æãå¶ç¶é´çæå new æºç ï¼æç®åå®ç¬¬ä¸æ¬¡è®¤è¯ãObject.create() å®æ¹è§£éï¼æ¹æ³å建ä¸ä¸ªæ°å¯¹è±¡ï¼ä½¿ç¨ç°æç对象æ¥æä¾æ°å建ç对象çprotoã
å ¶å® Object.create() æ两个åæ°ï¼ Object.create(proto, [propertiesObject])
proto : å¿ é¡»ï¼è¡¨ç¤ºæ°å»ºå¯¹è±¡çåå对象ã
å³è¯¥åæ°ä¼è¢«èµå¼å°ç®æ 对象(å³æ°å¯¹è±¡ï¼æ说æ¯æåè¿åç对象)çååä¸ã
该åæ°å¯ä»¥æ¯nullï¼ å¯¹è±¡ï¼ å½æ°ç prototype å±æ§
注æï¼å建空ç对象æ¶éä¼ null , å¦åä¼æåº TypeError å¼å¸¸
propertiesObject : å¯éï¼æ·»å å°æ°å建对象çå¯æ举å±æ§ã
( å³å ¶èªèº«çå±æ§ï¼èä¸æ¯ååé¾ä¸çæ举å±æ§ ) 对象çå±æ§æ述符以åç¸åºçå±æ§å称ã
è¿äºå±æ§å¯¹åº Object.defineProperties() ç第äºä¸ªåæ°ã
ä¸ æ®éæ¹å¼ å建对象 ä¸åç¹
QT源码分析:QObject
在QT框架中,元对象系统(Meta-Object System)的核心是信号与槽机制,它巧妙地利用C++语法实现,涉及函数、函数指针和回调。信号与槽机制的一大亮点是自动代码生成,比如当我们声明信号时,编译器会自动生成相应的槽函数实现,无需手动编写。通过connect函数,信号与槽能在不同线程间安全地自动连接与触发,确保线程同步,源码网站外网无需额外编码。QObject类是实现元对象系统的关键,所有类继承自它,因此深入研究QObject对理解QT元对象机制极其重要。
QT的元对象系统通过宏Q_OBJECT实现,它在编译时会生成与类相关的元对象和信号实现。Q_PROPERTY宏用于定义属性,与变量类似,但支持只读、可读写和信号通知。Q_DECLARE_PRIVATE(QObject)宏则用于创建类的私有部分,存放私有变量和子对象,维护类的封装性。
构造函数中,首先创建QObjectPrivate指针并设置关联,然后初始化线程数据和处理 moveToThread 功能,qp源码社区确保对象在正确线程运行。connect函数是连接信号与槽的重要工具,它会进行参数检查和类型匹配,并在满足条件后通过QMetaObject的Connection功能实现回调。
总之,通过理解QObject及其相关机制,开发者可以更有效地利用QT框架的信号与槽系统,简化编程并提高代码的线程安全性和可维护性。
java中Object类是怎么回事,干嘛使的?举例说明!
Object类的作用:m a r k - t o- w i
n:在java中,因为所有的类都有共性,所以java的缔造者们把java设计成这样:所有的类都是Object类的直接或间接子类,而且把上述所有类
的共性都放在Object类中。这样就可以达到代码重用。All classes in java are subclasses of
Objectclass。
Object类的equals和toString的用法:
下面一组两个例子,马克-to-
win:第一个例子是用的父类Object的equals和toString方法,Object的equals是比较对象在内存当中的地址,当然不一样
了。而Company的equals方法是自己写的,比较的他们的name属性,只要name一样,对象的equals返回的就是真。另外,Object
的toString方法打印出来就是Company@1bf,这是Sun公司编的。而后面一个例子的toString方法时咱们自己编的。
例:2.1.1---本章源码
class CompanyMark_to_win {
private String name;
CompanyMark_to_win(String name) {
this.name = name;
}
/
*public String toString() {
return name;
}
public boolean equals(Object o) {
if (!(o instanceof CompanyMark_to_win))
return false;
CompanyMark_to_win c = (CompanyMark_to_win) o;
return name.equals(c.name);。。。。。。。。。。。。。。。。。。。。。
更多详情,请网上找“马克-to-win”,参考他的网站或他的百度空间:java第三章的内容。
给个链接:/p/
js引擎v8源码分析之Object(基于v8 0.1.5)
在V8引擎中,Object是所有JavaScript对象在底层C++实现的核心基类,它提供了诸如类型判断、属性操作和类型转换等公共功能。
V8的对象采用4字节对齐,通过地址的低两位来识别对象的类型。作为Object的子类,堆对象(HeapObject)有其独特的属性,如map,它记录了对象的类型(type)和大小(size)。type字段用于识别C++对象类型,低位8位用于区分字符串类型,高位1位标识非字符串,低7位则存储字符串的子类型信息。
对于C++对象类型的判断,V8引擎定义了一系列宏。这些宏包括isType函数,用于确定对象的具体类型。此外,还有其他函数,如解包数字、转换为smi对象、检查索引的有效性、实现JavaScript的IsInstanceOf逻辑,以及将非对象类型转换为对象(ToObject)等。
对于数字处理,smi(Small Integers)在V8中用于表示整数,其长度为位。ToBoolean函数用于判断变量的真假,而属性查找则通过依赖子类的特定查找函数来实现,包括查找原型对象。
由于后续分析将深入探讨Object的子类和这些函数的详细实现,这里只是概述了Object类及其关键功能的概览。