UWB-DW1000的TWR测距及代码(五)

article/2025/10/7 20:44:35

UWB测距过程很简单,两个设备(A和B)。设备A先发送,设备B等待接收

  1. 设备A 发送 P 给 设备B,此时读取时间戳,也可以等收到应答再进行读取,发送时间戳和接收时间戳都会保留最新一次,只要没有被覆盖(发送两次,或者接收两次),都是可以随时读取的。
  2. 设备B 收到P 后,发送R 给设备A,此时读取接收时间戳,和发送 时间戳。
  3. 设备A收到 R 后,发送F给设备B,读取发送时间戳。
  4. 设备B收到 F后,读取接收时间戳。
  5. 设备A 把所有时间戳发给设备B。
  6. 设备B收到 设备A的时间戳,再结合自己的时间戳根据DS——TWR算出两者之间的距离。
  7. 设备B算完距离后再打包发给设备A。
注意,因为时间戳是五个字节的,而我们为了方便发送,是只用了四个字节,舍掉高字节。如果前面的时间戳比后面的时间戳大,说明已经过了一个周期,后者需加上一个周期后再进行计算。因为跑完32位计数都需要 15.65 ps x 2^32 = 67.216ms ,所以不用担心会溢出两次的问题,因为一个测距过程也就是几个毫秒内完成,光速传播。

在这里插入图片描述

//首先发送端
static volatile uint8_t stage;
static uint32_t TX_set_delay_times;
static volatile uint64_t TX_poll_times,TX_resp_times,TX_final_times;
static uint8_t Poll_Buff[]={0x15,0x16,0xab,0,0};        //第一次发送无关数据
static uint8_t Resp_Buff[5]={0};        //接收回应的无关数据的buff
static uint8_t First_Buff[]={0x15,0x16,0xae,0,0,0,0,0,0,0,0,0,0};  //发送第一次发送和接收的时间戳
static uint8_t NO_Buff[5]={0};  //接收无关信息
static uint8_t Final_Buff[9]={0x15,0x16,0xbc,0,0,0,0,0,0};  //发送最后一次发送数据的时间戳static uint8_t Distance_Buff[13]={0};   //接收距离
//static uint8_t Tx_Final_Buff[]={0x15,0x16,0xae,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0,0};  //最后一次发送时间戳信息过去unsigned char LCD_Buff[10];
//为了减少发送次数,把时间戳放在握手协议里面发了
int main(void)   
{uint8 len = 0,i;  /* Start with board specific hardware init. */peripherals_init();printf("hello dwm1000!\r\n");// dwt_dumpregisters();/* Reset and initialise DW1000.* For initialisation, DW1000 clocks must be temporarily set to crystal speed. After initialisation SPI rate can be increased for optimum* performance. */reset_DW1000(); /* Target specific drive of RSTn line into DW1000 low for a period. */spi_set_rate_low();if(dwt_initialise(DWT_LOADUCODE) == -1){printf("dwm1000 init fail!\r\n");OLED_ShowString(0,0,"INIT FAIL");while (1){STM_EVAL_LEDOn(LED1);deca_sleep(100);STM_EVAL_LEDOff(LED1);deca_sleep(100);}}spi_set_rate_high();/* Configure DW1000. See NOTE 6 below. */dwt_configure(&config);dwt_setleds(2);/* Apply default antenna delay value. See NOTE 1 below. */dwt_setrxantennadelay(RX_ANT_DLY);dwt_settxantennadelay(TX_ANT_DLY);OLED_ShowString(0,0,"INIT PASS");printf("init pass!\r\n");deca_sleep(1000);
while(1)
{dwt_setrxtimeout(8300);    //设置接收超时时间dwt_setrxmode(0,0,0);      //设置接收为正常模式dwt_writetxdata(sizeof(Poll_Buff), Poll_Buff, 0);dwt_writetxfctrl(sizeof(Poll_Buff), 0);dwt_starttx(DWT_START_TX_IMMEDIATE|DWT_RESPONSE_EXPECTED);while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR))) { }; //等待接收完成if (status_reg & SYS_STATUS_RXFCG)
{	
dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG | SYS_STATUS_TXFRS); //清除发送和接收状态
len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFLEN_MASK; //获取接收长度if (len <= sizeof(Resp_Buff)){dwt_readrxdata(Resp_Buff, len, 0);}	
if(Resp_Buff[0]==0x15&&Resp_Buff[1]==0x16)  //判断头
{if(Resp_Buff[2] ==0xac) //判断特有标置位。每次发都不一样,可理解为每个设备特定标签号或基站编号{TX_poll_times = get_tx_timestamp_u64();  //获取发送端第一次发送的时间戳TX_resp_times = get_rx_timestamp_u64();  //获取发送端接收应答数据的的时间戳//   TX_set_delay_times = (TX_resp_times + (RESP_RX_TO_FINAL_TX_DLY_UUS * UUS_TO_DWT_TIME)) >> 8;  //获取延时发送时间点
//   dwt_setdelayedtrxtime(TX_set_delay_times); //设置延时发送时间点// TX_final_times = (((uint64_t)(TX_set_delay_times&0xfffffffe))<<8) + TX_ANT_DLY;  //获取发送端最后一次发送的时间戳final_msg_set_ts(&First_Buff[3], TX_poll_times);final_msg_set_ts(&First_Buff[7], TX_resp_times);dwt_writetxdata(sizeof(First_Buff), First_Buff, 0);dwt_writetxfctrl(sizeof(First_Buff), 0);dwt_starttx(DWT_START_TX_IMMEDIATE|DWT_RESPONSE_EXPECTED);while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR))) { }; //等待接收距离完成if (status_reg & SYS_STATUS_RXFCG){
//							dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG | SYS_STATUS_TXFRS); //清除发送和接收状态	len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFLEN_MASK; //获取接收长度if (len <= sizeof(NO_Buff)){dwt_readrxdata(NO_Buff, len, 0);}	if((NO_Buff[0]==0x15)&&(NO_Buff[1]==0x16))  //判断头{if(NO_Buff[2] ==0xad) //判断特有标置位。每次发都不一样,可理解为每个设备特定标签号或基站编号{						TX_final_times = get_tx_timestamp_u64();						final_msg_set_ts(&Final_Buff[3], TX_final_times); //将时间戳放入buff发送给接收端dwt_writetxdata(sizeof(Final_Buff), Final_Buff, 0);dwt_writetxfctrl(sizeof(Final_Buff), 0);dwt_starttx(DWT_START_TX_IMMEDIATE|DWT_RESPONSE_EXPECTED);					while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR))) { }; //等待接收距离完成if (status_reg & SYS_STATUS_RXFCG){ dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG | SYS_STATUS_TXFRS); //清除发送和接收状态len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFLEN_MASK; //获取接收长度if (len <= sizeof(Distance_Buff)){dwt_readrxdata(Distance_Buff, len, 0);}if((Distance_Buff[0]==0x15)&&(Distance_Buff[1]==0x16))  //判断头{if(Distance_Buff[2] ==0xdc) //判断特有标置位。每次发都不一样,可理解为每个设备特定标签号或基站编号{Distance = (double)Distance_Buff[3] +  ((double)Distance_Buff[4])/100;   	//接收距离printf("Distance=%lf\r\n",Distance);sprintf(LCD_Buff, "Dis:%3.2fm", Distance);										OLED_ShowString(0,2,LCD_Buff);}else {printf("接收距离判断特殊位失败\r\n");}}else {printf("接收距离判断头错误\r\n");}}else{printf("TX-F接收失败\r\n");							 }			}else{dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR); //清除错误标志printf("发送端接收距离信息的特有标准错误\r\n");}}else{printf("发送端接收距离信息的帧头错误\r\n");}}else{dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR); //清除错误标志}							}
else
{// stage = POLL;  //数据错误,从头开始	printf("发送端应答接收特定标签号错误\r\n");
//	for(i=0;i<len;i++)
//		{
//			 printf("buff[%d]=%x\r\n",i,Tx_Resp_Buff[i]);
//			Tx_Resp_Buff[i] =0;
//		}}}else{printf("发送端应答接收头错误\r\n");
//	for(i=0;i<len;i++)
//		{
//			printf("buff[%d]=%x\r\n",i,Tx_Resp_Buff[i]);
//			Tx_Resp_Buff[i] =0;
//		}}	}else{dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR); //清除错误标志printf("发送端应答接收数据错误 !\r\n");
//			for(i=0;i<len;i++)
//			{
//			 printf("buff[%d]=%x\r\n",i,Tx_Resp_Buff[i]);
//				Tx_Resp_Buff[i] =0;
//			}} 				 }													}
//首先接收端
#define CYCLE (4294967295.0) //一个周期unsigned char LCD_Buff[10];
static volatile uint8_t stage;static  uint32_t TX_poll_times,TX_resp_times,TX_final_times;
static  uint32_t RX_poll_times,RX_resp_times,RX_final_times;static volatile uint64_t RX_poll_times_64,RX_resp_times_64,RX_final_times_64;static uint8_t Poll_Buff[5]={0};                //第一次接收数据的buff
static uint8_t Resp_Buff[5]={0x15,0x16,0xac,0,0};   //回应无关数据给发送端数据的buff
static uint8_t First_Buff[13]={0};  //  接收发送端第一次发送和接收的时间戳
static uint8_t NO_Buff[5]={0x15,0x16,0xad,0,0};     //回应无关信息
static uint8_t Final_Buff[9]={0};     //接收发送端最后一次发送的时间戳static uint8_t Distance_Buff[13]={0x15,0x16,0xdc,0,0,0,0}; //发送距离double Ra,Rb,Da,Db,Distance;int tof_dtu;int main(void)
{uint8 len = 0,i;/* Start with board specific hardware init. */peripherals_init();printf("hello dwm1000!\r\n");// dwt_dumpregisters();/* Reset and initialise DW1000.* For initialisation, DW1000 clocks must be temporarily set to crystal speed. After initialisation SPI rate can be increased for optimum* performance. */reset_DW1000(); /* Target specific drive of RSTn line into DW1000 low for a period. */spi_set_rate_low();if(dwt_initialise(DWT_LOADUCODE) == -1){printf("dwm1000 init fail!\r\n");OLED_ShowString(0,0,"INIT FAIL");while (1){STM_EVAL_LEDOn(LED1);deca_sleep(100);STM_EVAL_LEDOff(LED1);deca_sleep(100);}}spi_set_rate_high();/* Configure DW1000. See NOTE 6 below. */dwt_configure(&config);dwt_setleds(1);/* Apply default antenna delay value. See NOTE 1 below. */dwt_setrxantennadelay(RX_ANT_DLY);dwt_settxantennadelay(TX_ANT_DLY);OLED_ShowString(0,0,"INIT PASS");printf("init pass!\r\n");while(1){dwt_setrxtimeout(0);  dwt_setrxmode(0,0,0);   dwt_rxenable(0);while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR))){ };if (status_reg & SYS_STATUS_RXFCG){dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG | SYS_STATUS_TXFRS); //清除发送和接收状态len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFL_MASK_1023;if (len <= sizeof(Poll_Buff)){dwt_readrxdata(Poll_Buff, len, 0);}if(Poll_Buff[0]==0x15&&Poll_Buff[1]==0x16)  //判断头{if(Poll_Buff[2] ==0xab) //判断特有标置位。每次发都不一样,可理解为每个设备特定标签号或基站编号{RX_poll_times_64 = get_rx_timestamp_u64();  //获取接收端第一次接收数据的的时间戳dwt_setrxaftertxdelay(0);  //设置发送接收后打开接收的延时时间dwt_setrxtimeout(6800);    //设置接收超时时间dwt_setrxmode(0,0,0);      //设置接收为正常模式dwt_writetxdata(sizeof(Resp_Buff), Resp_Buff, 0);dwt_writetxfctrl(sizeof(Resp_Buff), 0);dwt_starttx(DWT_START_TX_IMMEDIATE|DWT_RESPONSE_EXPECTED);	while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR))){ };if (status_reg & SYS_STATUS_RXFCG){dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG | SYS_STATUS_TXFRS); //清除发送和接收状态len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFL_MASK_1023;//	printf("len =%d\r\n",len);if (len <= sizeof(First_Buff)){dwt_readrxdata(First_Buff, len, 0);}if(First_Buff[0]==0x15&&First_Buff[1]==0x16)  //判断头{if(First_Buff[2] ==0xae) //判断特有标置位。每次发都不一样,可理解为每个设备特定标签号或基站编号{			RX_resp_times_64 = get_tx_timestamp_u64();  //获取接收端第一次发送数据的的时间戳RX_final_times_64 = get_rx_timestamp_u64();  //获取接收端最后一次接收的时间戳final_msg_get_ts(&First_Buff[3], &TX_poll_times);final_msg_get_ts(&First_Buff[7], &TX_resp_times);RX_poll_times = (uint32_t)RX_poll_times_64;RX_resp_times = (uint32_t)RX_resp_times_64;		RX_final_times = (uint32_t)RX_final_times_64;    //得到接收端的时间戳dwt_writetxdata(sizeof(NO_Buff), NO_Buff, 0);dwt_writetxfctrl(sizeof(NO_Buff), 0);dwt_starttx(DWT_START_TX_IMMEDIATE|DWT_RESPONSE_EXPECTED);	while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR))){ }; if (status_reg & SYS_STATUS_RXFCG){dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_RXFCG | SYS_STATUS_TXFRS); //清除发送和接收状态len = dwt_read32bitreg(RX_FINFO_ID) & RX_FINFO_RXFL_MASK_1023;//	printf("len =%d\r\n",len);if (len <= sizeof(Final_Buff)){dwt_readrxdata(Final_Buff, len, 0);}if(Final_Buff[0]==0x15&&Final_Buff[1]==0x16)  //判断头{if(Final_Buff[2] ==0xbc) //判断特有标置位。每次发都不一样,可理解为每个设备特定标签号或基站编号{final_msg_get_ts(&Final_Buff[3], &TX_final_times); //提取发送端的时间戳// printf("/*****************************************************/\r\n");//						Ra = (double)(TX_resp_times - TX_poll_times);
//						Da = (double)(TX_final_times - TX_resp_times);
//						Rb = (double)(RX_final_times - RX_resp_times);
//						Db = (double)(RX_resp_times - RX_poll_times);
//														if(TX_resp_times > TX_poll_times)  //判断是否超过一周期{Ra = (double)((double)TX_resp_times - (double)TX_poll_times);}else{//	 printf("/****************************/\r\n");Ra = (double)((double)TX_resp_times - (double)TX_poll_times);//	 printf("Ra=%lf\r\n",Ra);Ra += CYCLE;   //加上周期// printf("Ra=%lf\r\n",Ra);}if(TX_final_times > TX_resp_times){Da = (double)((double)TX_final_times - (double)TX_resp_times);}else{// printf("/****************************/\r\n");Da = (double)((double)TX_final_times - (double)TX_resp_times);//	 printf("Da=%lf\r\n",Da);Da += CYCLE;//	 printf("Da=%lf\r\n",Da);}if(RX_final_times > RX_resp_times){		Rb = (double)((double)RX_final_times - (double)RX_resp_times);}else{//printf("/****************************/\r\n"); Rb = (double)((double)RX_final_times - (double)RX_resp_times);// printf("Rb=%lf\r\n",Rb);Rb += CYCLE;// printf("Rb=%lf\r\n",Rb);}if(RX_resp_times > RX_poll_times)  {Db = (double)(RX_resp_times - RX_poll_times);}else{//printf("/****************************/\r\n");Db = (double)((double)RX_resp_times - (double)RX_poll_times);//	printf("Db=%lf\r\n",Db);Db += CYCLE;//	printf("Db=%lf\r\n",Db);}					Distance =0;tof_dtu = (int64)((Ra * Rb - Da * Db) / (Ra + Rb + Da + Db));tof = tof_dtu * DWT_TIME_UNITS;Distance = tof * SPEED_OF_LIGHT;//printf("Dis=%f\r\n",Distance);Distance = Distance - dwt_getrangebias(config.chan,(float)Distance, config.prf);//距离减去矫正系数//						printf("Ra =%lf\r\n",Ra);
//						printf("Rb =%lf\r\n",Rb);
//						printf("Da =%lf\r\n",Da);
//						printf("Db =%lf\r\n",Db);
                          													
//						printf("Ra-Db =%lf\r\n",Ra-Db);
//						printf("Rb-Da =%lf\r\n",Rb-Da);
//												printf("Dis=%f\r\n",Distance);int temp =0;temp = (int)(Distance*100);//printf("temp=%d\r\n",temp);Distance_Buff[3] = temp/100; //取整Distance_Buff[4] = temp%100; //取小数   //打包发送距离//					printf("/**************************************************/\r\n");	
//					printf("TX_poll_times =%u\r\n",TX_poll_times);
//					printf("RX_poll_times =%u\r\n",RX_poll_times);
//					printf("RX_resp_times =%u\r\n",RX_resp_times);
//					printf("TX_resp_times =%u\r\n",TX_resp_times);
//					printf("TX_final_times =%u\r\n",TX_final_times);
//					printf("RX_final_times =%u\r\n",RX_final_times);
//								//					printf("Distance_Buff[3]=%d\r\n",Distance_Buff[3]);
//					printf("Distance_Buff[4]=%d\r\n",Distance_Buff[4]);sprintf(LCD_Buff, "Dis:%3.2fm", Distance);OLED_ShowString(0,2,LCD_Buff);dwt_writetxdata(sizeof(Distance_Buff), Distance_Buff, 0);dwt_writetxfctrl(sizeof(Distance_Buff), 0);dwt_starttx(DWT_START_TX_IMMEDIATE);	}else{printf("端接收接收最后一次时间戳失败\r\n");}}}else{dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR);printf("接收发送端最后一次时间戳失败\r\n");}}else{ //stage = POLL;  //数据错误,从头开始printf("接收端最后一次接收特定标签号错误\r\n");
//					for(i=0;i<len;i++)
//					{
//						printf("buff[%d]=%x\r\n",i,Rx_Final_Buff[i]);
//						Rx_Final_Buff[i] =0;
//				}}}else{ //stage = POLL;  //数据错误,从头开始printf("接收端最后一次接收头错误\r\n");//			for(i=0;i<len;i++)
//			{
//				printf("buff[%d]=%x\r\n",i,Rx_Final_Buff[i]);
//				Rx_Final_Buff[i] =0;
//			}}}else{dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR);//stage = POLL;
//									printf("接收端最后一次接收数据错误\r\n");
//									 
//			for(i=0;i<len;i++)
//			{
//				printf("buff[%d]=%x\r\n",i,Rx_Final_Buff[i]);
//				Rx_Final_Buff[i] =0;
//			}}							 }else{printf("接收端第一次接收特定标签号错误\r\n");
//					for(i=0;i<len;i++)
//					{
//						printf("buff[%d]=%x\r\n",i,Rx_Poll_Buff[i]);
//						Rx_Poll_Buff[i] =0;
//					}}}else{ printf("接收端第一次接收头错误\r\n");
//			 for(i=0;i<len;i++)
//					{
//						printf("buff[%d]=%x\r\n",i,Rx_Poll_Buff[i]);
//						Rx_Poll_Buff[i] =0;
//					}}	}else{	dwt_write32bitreg(SYS_STATUS_ID, SYS_STATUS_ALL_RX_ERR);
//										stage = POLL;
//									printf("接收端第一次接收数据错误\r\n");
//			for(i=0;i<len;i++)
//				{
//					printf("buff[%d]=%x\r\n",i,Rx_Poll_Buff[i]);
//					Rx_Poll_Buff[i] =0;
//				}}}
}

http://chatgpt.dhexx.cn/article/LEmCWGKO.shtml

相关文章

UWB DW1000 TWR测距定位功能实现

3基站对1标签进行测距的流程如下&#xff1a; 1、标签发起测距poll&#xff0c;等待3个基站的回应resp&#xff1b;依次收到3个基站的resp后&#xff0c;发送携带时间戳的final&#xff1b; 2、基站等待poll&#xff1b;收到poll后&#xff0c;发送resp&#xff0c;再继续等待…

hp 800 g4 twr linux,【拆机】HP EliteDesk 800 G4 TWR—探究塔式机箱的秘密

惠普商务台式机在专业领域口碑一直强势,其优良的结构设计与出色的稳定性素来为用户所青睐。今天的拆机要为大家带来的是——HP EliteDesk 800 G4 TWR。这款商务台式机内部做工到底如何?今天我就为大家带来答案。 按照惯例先为大家介绍一下这款产品的外观。 作为一台商务台式机…

uwb最详细的DS-TWR测距

简介 •测距、定位和数据传输。 •利用双向测距&#xff08;TOF&#xff09;测量或单向到达时间差&#xff08;TDOA&#xff09;到达时间差&#xff0c;误差在10cm&#xff0c;经过一定的滤波可以达到更低。 •跨越 3.5 GHz 至 6.5 GHz 的 6 个 RF 频段。 •支持 110 kbps&…

DRAM知识整理系列(三):部分时序参数整理

目录 一、时序参数整理 第一时序&#xff1a; 1、tCL - CAS Lantency Control 2、tRCD - RAS to CAS Delay 3、tRP - Row Precharge Timing 4、tRAS - RAS Active Time 第二时序&#xff1a; 5、CWL - CAS Write Latency 6、tRC - Row Cycle Time 7、tRFC - Row Refr…

超宽带(UWB)学习笔记——TWR测距

文章目录 前言1. 单边双向测距&#xff08;SS-TWR, Single Side - Two Way Ranging&#xff09;1.1 测距方式1.2 误差分析 2 双边双向测距&#xff08;DS-TWR, Double Side - Two Way Ranging&#xff09;2.1 测距方式2.2 误差分析 参考文献 前言 TOF&#xff08;Time Of Figh…

UWB定位的3种算法:TWR、TOA和TDOA算法

UWB定位的3种算法&#xff1a;TWR、TOA和TDOA算法 文章目录 UWB定位的3种算法&#xff1a;TWR、TOA和TDOA算法UWB定位技术一、TER定位算法二、 TOA定位算法三、 TDOA定位算法相关链接 UWB定位技术 UWB 定位原理和卫星导航定位原理相类似&#xff0c;由多个定位基站和定位标签组…

【提高准确率方法总结】

文章目录 1.数据集扩增2.增大数据集差异性&#xff0c;随机性3.使用tensor transform对数据进行预处理4.调节batch_size大小5.设置shuffleTrue6.调节学习率&#xff08;learning rate&#xff09;7.权重衰减 &#xff08;weight_decay&#xff09;8.适当增加训练轮次&#xff0…

准确率、召回率和mAP、AP50/75

1、准确率和召回率 真实值与预测值之间的关系如下左图所示&#xff0c;右图是二者之间的一个直观表示&#xff0c;同时也能清晰的看出准确率和召回率的具体含义。准确率 P P P 给出了“预测为真值的样本中确实有多少比例为真值”&#xff0c;召回率 R R R 则给出了“本来就是…

如何区分精确率(precision)、准确率(accuracy)和召回率(recall)

理解精确率(precision)、准确率(accuracy)和召回率&#xff08;recall&#xff09; 正样本 负样本 预测正例 TP FP 预测反例 FN TN TN&#xff0c;预测是负样本&#xff0c;预测对了 FP&#xff0c;预测是正样本&#xff0c;预测错了 FN&#xff0c;预测是负样本&am…

pytorch_cifar10 学习记录(91%准确率)

目录 一、首次尝试深度学习 1.1训练参数 网络结构&#xff1a; 1.2训练结果 1.3 总结 二、修改网络和学习率&#xff0c;初次使用GPU炼丹&#xff08;kaggle线上炼丹&#xff09; 2.1训练参数 三、cifar10数据增强后进行炼丹 3.1 参数设置 3.2训练记录 3.2.1 0-100轮…

精度评定中的准确率(Precision)和召回率(Recall)

在模式识别中&#xff0c;我们经常会使用到一些指标对目标识别或者影像分类的结果进行评价。 假设我们需要将一个样本集分类为苹果和非苹果两类&#xff0c;那么分类结果有四种情况&#xff1a; 第一种情况&#xff1a;True Positive&#xff0c;本来就是苹果被分类成苹果&…

机器学习:什么是召回率、准确率和精确率?

在机器学习中&#xff0c;经常会听到准确率、召回率及精确率三个专业评价指标&#xff0c;刚开始接触时&#xff0c;总是会傻傻的分不清&#xff0c;今天之后&#xff0c;就能准确区分了&#xff01; —准确率&#xff1a;就是在预测的所有样本中预测正确的比率&#xff08;包…

准确率、精度和召回率

原文链接 精度&#xff08;查准率&#xff09;和召回率&#xff08;查全率&#xff09;是衡量机器学习模型性能的重要指标&#xff0c;特别是数据集分布不平衡的案例中。 什么是分布不平衡的数据集&#xff1f; 倘若某人声称创建一个能够识别登上飞机的恐怖分子的模型&#…

深度学习提高模型准确率方法

这里写目录标题 深度学习数据使用更多数据更改图像大小减少颜色通道 算法模型改进增加训练轮次迁移学习添加更多层调整超参数 总结 深度学习 我们已经收集好了一个数据集&#xff0c;建立了一个神经网络&#xff0c;并训练了模型&#xff0c;在测试和验证阶段最后得到的准确率…

准确率、精准率和召回率的理解

我们在在分类任务时&#xff0c;经常会对模型结果进行评估。评估模型好坏的指标有AUC、KS值等等。这些指标是通过预测概率进行计算的。而准确率、精准率和召回率也通过混淆矩阵计算出来的。下图是对混淆矩阵的介绍&#xff1a; 其中&#xff0c; TP&#xff1a;样本为正&#…

准确率召回率

http://blog.sina.com.cn/s/blog_4b59de070100ehl7.html 最近一直在做相关推荐方面的研究与应用工作&#xff0c;召回率与准确率这两个概念偶尔会遇到&#xff0c; 知道意思&#xff0c;但是有时候要很清晰地向同学介绍则有点转不过弯来。 召回率和准确率是数据挖掘中预测、互…

准确度(accuracy)、精确率(precision)、召回率(recall)、F1值 谈谈我的看法

目录 前言 基本概念 准确率 Accuracy 精确度 Precision 召回率 Recall F1 值 sklearn 的评估函数 pyspark 的评估函数 tensorflow 的评估函数 多分类下的评估 前言 准确度、精确率、召回率、F1值作为评估指标&#xff0c;经常用到分类效果的评测上。比较好理解的二分…

准确率,精确率,召回率和F1值

机器学习(ML),自然语言处理(NLP),信息检索(IR)等领域,评估(Evaluation)是一个必要的 工作,而其评价指标往往有如下几点:准确率(Accuracy),精确率(Precision),召回率(Recall)和F1-Measure。 (注&#xff1a; 相对来说&#xff0c;IR 的 ground truth 很多时候是一个 Ordered Lis…

准确率与召回率

在信息检索、分类体系中&#xff0c;有一系列的指标&#xff0c;搞清楚这些指标对于评价检索和分类性能非常重要&#xff0c;因此最近根据网友的博客做了一个汇总。 准确率、召回率、F1 信息检索、分类、识别、翻译等领域两个最基本指标是召回率(Recall Rate)和准确率(Precisio…

【机器学习】召回率、精确率、准确率的区别

1. 作用语言定义 作用&#xff1a;提升****精确率是为了不错报、提升召回率是为了不漏报 分不清准确率和精确率&#xff0c;在这里先正确区分一下精确率和准确率&#xff0c;以及他们的别称这里[HashArt]给出了一个通俗易懂的解释&#xff1a;(https://zhuanlan.zhihu.com/p/9…