第七届工程训练大赛垃圾分类

第七届全国大学生工程训练大赛垃圾分类

  • 前言
  • 一、机械结构设计
    • 1.Solidworks建模
    • 2.建模的不足以及改进
      • 1.挡板的添加
      • 2.履带防滑
    • 3.整体实物
  • 二、视觉识别部分
    • 1.引入库
    • 2.识别部分
  • 三、上下位机通信方式:
    • 1.高低电平通信:
    • 1.2高低电平树莓派部分:
    • 2.stm32串口通信部分:
  • 四、下位机电机驱动部分
    • 1.电机:涡轮蜗杆电机(履带负载较大,不可直接用步进直流电机)
    • 2.有关于延时的改进:
    • 3.stm32主函数:
  • 五、炸电机:

文章目录

  • 前言
  • 一、机械结构设计
    • 1.Solidworks建模
    • 2.建模的不足以及改进
      • 1.挡板的添加
      • 2.履带防滑
    • 3.整体实物
  • 二、视觉识别部分
    • 1.引入库
    • 2.识别部分
  • 三、上下位机通信方式:
    • 1.高低电平通信:
    • 1.2高低电平树莓派部分:
    • 2.stm32串口通信部分:
  • 四、下位机电机驱动部分
    • 1.电机:涡轮蜗杆电机(履带负载较大,不可直接用步进直流电机)
    • 2.有关于延时的改进:
    • 3.stm32主函数:
  • 五、炸电机:


前言

本人有幸代表内蒙古工业大学参加内蒙古自治区的全国工程训练大赛省赛,并在初赛取得前三名的成绩。可惜后来决赛由于树莓派死机导致程序崩溃,从而无缘国赛。但是经过测试,我们的识别程序可以做到识别率95%,分类准确率90%以上。
硬件设备:树莓派4B+8G(用于视觉识别以及播放视频)
stm32f103zet6 (用于下位机控制电机进行分类)
机械结构设计:双层履带交叉分拣
本人具有嵌入式开发经验两年,可代指导单片机,linux,物联网视觉识别,各种机器人的大创、毕设、项目 具体联系:qq
1549843074


一、机械结构设计

1.Solidworks建模

示例:如图所示,采用双层履带结构

2.建模的不足以及改进

1.挡板的添加

从上履带识别后,移交至第二层履带时。会出现飞出去的情况导致分类失败,于是我们在履带两侧以及垃圾桶整体四周加上挡板。这样情况大大改善。

	挡板:

在这里插入图片描述

2.履带防滑

当进行调试过程中,如果出现瓶子、电池等容易滚的物体,很容易在投掷过程中滚下去导致无法实现识别。为此,我们决定在履带上用胶水粘上小突起,经检验这样能很好解决这个问题。
在这里插入图片描述

3.整体实物

整体实物图:

在这里插入图片描述

俯视图:

在这里插入图片描述

二、视觉识别部分

1.引入库

代码如下(示例):

from __future__ import absolute_import
from __future__ import division
from __future__ import print_functionimport argparse
import io
import time
import numpy as np
#import picamera
import cv2
import RPi.GPIO as GPIO#import tensorflow as tffrom PIL import Image
from tflite_runtime.interpreter import Interpreter

2.识别部分

代码如下:

def load_labels(path):with open(path, 'r') as f:return {i: line.strip() for i, line in enumerate(f.readlines())}def set_input_tensor(interpreter, image):tensor_index = interpreter.get_input_details()[0]['index']input_tensor = interpreter.tensor(tensor_index)()[0]input_tensor[:, :] = imagedef classify_image(interpreter, image, top_k=1):"""Returns a sorted array of classification results."""set_input_tensor(interpreter, image)interpreter.invoke()output_details = interpreter.get_output_details()[0]output = np.squeeze(interpreter.get_tensor(output_details['index']))# If the model is quantized (uint8 data), then dequantize the resultsif output_details['dtype'] == np.uint8:scale, zero_point = output_details['quantization']output = scale * (output - zero_point)ordered = np.argpartition(-output, top_k)return [(i, output[i]) for i in ordered[:top_k]]def main():parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)parser.add_argument('--model', help='File path of .tflite file.', required=True)parser.add_argument('--labels', help='File path of labels file.', required=True)args = parser.parse_args()labels = load_labels(args.labels)#interpreter = tf.lite.Interpreter(args.model)interpreter = Interpreter(args.model)interpreter.allocate_tensors()_, height, width, _ = interpreter.get_input_details()[0]['shape']#with picamera.PiCamera(resolution=(640, 480), framerate=30) as camera:#camera.start_preview()cap = cv2.VideoCapture(0)#擷取畫面 寬度 設定為640cap.set(cv2.CAP_PROP_FRAME_WIDTH,640)#擷取畫面 高度 設定為480cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)key_detect = 0times=1while (key_detect==0):ret,image_src =cap.read(0)frame_width=image_src.shape[1]frame_height=image_src.shape[0]cut_d=int((frame_width-frame_height)/2)crop_img=image_src[0:frame_height,cut_d:(cut_d+frame_height)]image=cv2.resize(crop_img,(224,224),interpolation=cv2.INTER_AREA)start_time = time.time()if (times==1):results = classify_image(interpreter, image)elapsed_ms = (time.time() - start_time) * 1000label_id, prob = results[0]print(labels[label_id],prob)num=int(label_id)cv2.putText(crop_img,labels[label_id] + " " + str(round(prob,3)), (5,30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,255), 1, cv2.LINE_AA)times=times+1if (times>1):times=1cv2.imshow('Detecting....',crop_img)if cv2.waitKey(1) & 0xFF == ord('q'):key_detect = 1cap.release()cv2.destroyAllWindows()if __name__ == '__main__':main()

以上基于tenserflow,tenserflow适合在树莓派上跑,但是如果数据集过大就会崩溃(我们就是因为这个原因,止步于省赛)建议数据集采样图片时控制在2000张左右,不然会崩


三、上下位机通信方式:

1.高低电平通信:

		   最开始因为下位机仅仅需要接受树莓派识别结果,而结果种类只有四种,于是乎最开始想到的是:树莓派往gpio写高低电平,stm32浮空输入电平结果,通过排列组合进行通信。源码如下:  
	communicate.h:#define Type_2  PEin(10)// PF13#define Type_3  PEin(11)// PF14#define Type_4  PEin(12)// PF15#define Type_5  PEin(13)// PF16#define  Nothing                     0#define  hazardous_waste      1#define  other_waste              2#define  Recyclable_waste     3#define  Kitchen_waste          4void communicate_Init(void);//初始化int  adjust(void);communicate.c:void communicate_Init(void){GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);	//使能PB,PE端口时钟GPIO_InitStructure.GPIO_Pin =GPIO_Pin_10 |GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13;				 	//LED0-->PB.5 端口配置GPIO_InitStructure.GPIO_Mode =   GPIO_Mode_IN_FLOATING; 	//推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	//IO口速度为50MHzGPIO_Init(GPIOE, &GPIO_InitStructure);					//根据设定参数初始化GPIOB.5GPIO_SetBits(GPIOE,GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13);						//PB.5 输出高}int adjust(void){//判断函数delay_ms(10);//防抖if(Type_2==0&&Type_3==1&&Type_4==1&&Type_5==1)//第一个树莓派io输出低电平为可回收return Recyclable_waste;if(Type_2==1&&Type_3==0&&Type_4==1&&Type_5==1)//第二个io输出低电平为有害垃圾return hazardous_waste;if(Type_2==1&&Type_3==1&&Type_4==0&&Type_5==1)//第三个输出低电平为其他return other_waste;if(Type_2==1&&Type_3==1&&Type_4==1&&Type_5==0)//第四个输出低电平为厨余垃圾return Kitchen_waste;return 0;}

1.2高低电平树莓派部分:

	GPIO.setmode(GPIO.BCM)GPIO.setup(2,GPIO.OUT)GPIO.setup(3,GPIO.OUT)GPIO.setup(4,GPIO.OUT)GPIO.setup(17,GPIO.OUT)if num == 0:GPIO.output(2,GPIO.HIGH)GPIO.output(3,GPIO.HIGH)GPIO.output(4,GPIO.HIGH)GPIO.output(17,GPIO.HIGH)print('')elif num == 1:GPIO.output(2,GPIO.LOW)GPIO.output(3,GPIO.HIGH)GPIO.output(4,GPIO.HIGH)GPIO.output(17,GPIO.HIGH)print('可回收垃圾')elif num == 2:GPIO.output(2,GPIO.HIGH)GPIO.output(3,GPIO.LOW)GPIO.output(4,GPIO.HIGH)GPIO.output(17,GPIO.HIGH)print('有害垃圾')elif num == 3:GPIO.output(2,GPIO.HIGH)GPIO.output(3,GPIO.HIGH)GPIO.output(4,GPIO.LOW)GPIO.output(17,GPIO.HIGH)print('其他垃圾')elif num == 4:GPIO.output(2,GPIO.HIGH)GPIO.output(3,GPIO.HIGH)GPIO.output(4,GPIO.HIGH)GPIO.output(17,GPIO.LOW)print('厨余垃圾')else:GPIO.output(2,GPIO.HIGH)GPIO.output(3,GPIO.HIGH)GPIO.output(4,GPIO.HIGH)GPIO.output(17,GPIO.HIGH)

2.stm32串口通信部分:

void usb_communicate(void){u16 t;u16 len;if(USART_RX_STA&0x8000){//防抖delay_ms(100);delay_ms(100);if(USART_RX_STA&0x8000){					   len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度printf("\r\n您发送的消息为:\r\n\r\n");for(t=0;t<len;t++){USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束}}}}int USB_adjust(void){usb_communicate();if(USART_RX_BUF[0]=='0'){USART_RX_STA=0;return Nothing  ;//没有垃圾}if(USART_RX_BUF[0]=='1'){USART_RX_STA=0;return  Recyclable_waste ;}//可回收if(USART_RX_BUF[0]=='2'){USART_RX_STA=0;return hazardous_waste ;}//有害if(USART_RX_BUF[0]=='3'){USART_RX_STA=0;return  other_waste;}//可回收垃圾if(USART_RX_BUF[0]=='4'){USART_RX_STA=0;return Kitchen_waste;}//厨余垃圾USART_RX_STA=0;return EOF;//错误标志位
}

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

四、下位机电机驱动部分

1.电机:涡轮蜗杆电机(履带负载较大,不可直接用步进直流电机)

驱动:l298N(12V)

//.h
#ifndef __MOTOR_H
#define __MOTOR_H	 
#include "sys.h"#define IN_1 PFout(1)// PB5
#define IN_2 PFout(2)// PE5	
#define IN_3 PFout(3)// PB5
#define IN_4 PFout(4)// PE5	#define ZHENGXIANG  0
#define FANXIANG    1
#define STOP        2void motor_Init(void);//初始化
void zongxiang_run(u16 model);
void hengxiang_run(u16 model);
void _delay_s(u16 s);	void  stop(void);
void  Recyclable_waste_work(void);//可回收3号
void   hazardous_waste_work(void);//有害垃圾1号
void   other_waste_waste_work(void);//其他垃圾2号
void  Kitchen_waste_waste_work(void);//厨余垃圾4号
#endif
//.c
#include "motor.h"
#include "delay.h"#define ZHENGXIANG  0
#define FANXIANG    1
#define STOP        2
void motor_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);	 //使能PB,PE端口时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;				 //LED0-->PB.5 端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHzGPIO_Init(GPIOF, &GPIO_InitStructure);					 //根据设定参数初始化GPIOB.5}void hengxiang_run(u16 model){switch(model){case 	ZHENGXIANG : {IN_3=0;IN_4=1;break;}case  FANXIANG :{IN_3=1;IN_4=0;break;}case  STOP:{IN_3=1;IN_4=1;break;}}
}void zongxiang_run(u16 model){switch(model){case 	ZHENGXIANG : {IN_1=0;IN_2=1;break;}case  FANXIANG :{IN_1=1;IN_2=0;break;}case  STOP:{IN_1=1;IN_2=1;break;}}
}void _delay_s(u16 s){int i; for(i=0;i<=s;i++)delay_ms(1000);}void  Recyclable_waste_work(void){//可回收3号hengxiang_run(FANXIANG);zongxiang_run(FANXIANG);_delay_s(5);zongxiang_run(STOP);hengxiang_run(STOP);_delay_s(1);}void   hazardous_waste_work(void){//有害垃圾1号zongxiang_run(ZHENGXIANG);hengxiang_run(FANXIANG);_delay_s(5);zongxiang_run(STOP);hengxiang_run(STOP);_delay_s(1);}void   other_waste_waste_work(void){//其他垃圾2号hengxiang_run(ZHENGXIANG);zongxiang_run(ZHENGXIANG);_delay_s(5);zongxiang_run(STOP);hengxiang_run(STOP);_delay_s(1);}void  Kitchen_waste_waste_work(void){//厨余垃圾hengxiang_run(ZHENGXIANG);zongxiang_run(FANXIANG);_delay_s(5);zongxiang_run(STOP);hengxiang_run(STOP);_delay_s(1);}
void stop(void){zongxiang_run(STOP);hengxiang_run(STOP);}

2.有关于延时的改进:

 本人在调试时发现keil环境中:delay_ms(1000)和delay_ms(3000)差别不大竟然有一下发现:
     void _delay_s(u16 s){int i; for(i=0;i<=s;i++)delay_ms(1000);
}//明显好于s*delay_ms(1000)

3.stm32主函数:

int main(void){	 
//  u16 adcx;
//	float temp;delay_init();	    	 //延时函数初始化	  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级uart_init(115200);	 	//串口初始化为115200LED_Init();			     //LED端口初始化LCD_Init();			 	Adc_Init();		  		//ADC初始化POINT_COLOR=RED;//设置字体为红色 LCD_ShowString(60,50,200,16,16,"Elite STM32");	LCD_ShowString(60,70,200,16,16,"ADC TEST");	LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");LCD_ShowString(60,110,200,16,16,"2015/1/14");	//显示提示信息POINT_COLOR=BLUE;//设置字体为蓝色LCD_ShowString(60,130,200,16,16,"ADC_CH0_VAL:");	      LCD_ShowString(60,150,200,16,16,"ADC_CH0_VOL:0.000V");	motor_Init();while(1){if(adjust()){delay_ms(200);delay_ms(200);switch(adjust()){case hazardous_waste:{//有害垃圾分类hazardous_waste_work();_delay_s(5);break;}case other_waste :{//其他垃圾分类other_waste_waste_work();_delay_s(5);break;}case  Recyclable_waste :{//可回收垃圾分类Recyclable_waste_work();_delay_s(5);break;}case  Kitchen_waste :{//厨余垃圾分类Kitchen_waste_waste_work();_delay_s(5);break;}default :{	//没垃圾				stop();break;}}}
}} 

五、炸电机:

在调试过程中,我们炸了六个电机驱动,弄坏了一个步进电机
原因:一夜炸了六个电机驱动,我们依次排查电路接线、程序,最后竟然是电池的原
因!!!

这个已经成为传奇

机械由秦俊酉大力支持

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/64879.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

昇腾应用案例体验:(3) 垃圾分类

昇腾AI应用&#xff0c;探索人工智能的无限可能&#xff0c;使能千行百业 垃圾分类 概述 垃圾分类是对垃圾收集处置传统方式的改革&#xff0c;是对垃圾进行有效处置的一种科学管理方法。人们面对日益增长的垃圾产量和环境状况恶化的局面&#xff0c;如何通过垃圾分类管理&a…

上海居民被垃圾分类逼疯!这款垃圾自动分类器也许能帮上忙

作者 | 视说君 来源 | 授权转载自视说AI&#xff08;ID:techtalkai&#xff09; 让垃圾自动分类 近期垃圾分类成为了一个热门话题&#xff0c;原来直接一次性扔掉的垃圾&#xff0c;现在都需要分门别类进行投放。从今年7月1日起&#xff0c;新的《上海市生活垃圾管理条例》正式…

深度学习:垃圾自动分类

导 言 垃圾分类&#xff0c;指按一定规定或标准将垃圾分类储存、分类投放和分类搬运&#xff0c;从而转变成公共资源的一系列活动的总称。这不仅是出于生态环境角度考虑&#xff0c;“没有垃圾&#xff0c;只有放错位置的资源”&#xff0c;分类收集后&#xff0c;不少垃圾都可…

最新一代智能垃圾分类系统的实施方案

一说到智能垃圾分类&#xff0c;大家普遍的理解是&#xff1a;智能垃圾分类箱投入使用后自动进行垃圾分类。因为“智能”&#xff0c;所以解释为自动分类&#xff0c;一切真的很正常&#xff1b;有很多人有这样的误解。也许在未来&#xff0c;这样的功能会一个个完成&#xff0…

Garbage Classification 垃圾分类测试

Garbage classification 作者背景 郝航以&#xff0c;15岁&#xff0c;女&#xff0c;成都&#xff0c;高中国际部在读。暑假初学Python~ 项目背景 这是我暑假时自我创建的一个代码。 所谓编程&#xff0c;就是要走在时代的前端。上海的“垃圾分类”&#xff0c;卷来了一股风…

对垃圾分类工作作出重要指示PPT模板

模板介绍 精美PPT模板设计&#xff0c;对垃圾分类工作作出重要指示PPT模板。一套垃圾分类幻灯片模板&#xff0c;内含灰色多种配色&#xff0c;精美风格设计&#xff0c;动态播放效果&#xff0c;精美实用。 一份设计精美的PPT模板&#xff0c;可以让你在汇报演讲时脱颖而出。…

Android 垃圾分类APP(四)垃圾分类之图像输入

图像输入 前言正文一、创建平台应用二、新建图像识别页面三、网络订阅四、编写页面代码五、识别网络图片六、识别相册图片七、识别拍照图片八、垃圾分类九、源码 前言 在上一篇文章中完成了语音输入&#xff0c;这一篇来写图像输入 正文 图像输入无非就是图片识别嘛&#xff0…

垃圾分类图片数据集分享-约10w张数据集

1.获取方式 点赞本博客评论区留邮箱&#xff0c;博主在会发送(私信博主)。 访问的人太多了&#xff0c;需要私信联系。 截至到2021.03.30评论区所有邮箱已无偿发送 图片数据集直接留邮箱即可。 2.问题描述 最近在做一个相关项目&#xff0c;从网上整理了许许多多的有关于垃圾…

垃圾分类调研

垃圾分类 welcome&#xff0c;我们是电子科技大学的学生&#xff0c;因为对垃圾分类的一些问题感兴趣&#xff0c;于是我们进行了一些调查。 小组信息 学校&#xff1a;UESTC 年纪&#xff1a;2019级大一学生 成员&#xff1a;林浩&#xff0c;李则程&#xff0c;张智霖 分…

工程训练赛——智能垃圾分类

刚刚搞完工程训练赛&#xff0c;忙活两个月了&#xff0c;由于缺少参赛经验&#xff0c;比赛时出了意外状况&#xff0c;结果还是功亏一篑&#xff0c;就写一篇博客记录一下大学参加的第一次竞赛。 比赛要求 软件思路 由于我刚好在做项目的时候用的是PyQt5来写界面&#xff0…

垃圾分类解决方案-最新全套文件

垃圾分类解决方案-最新全套文件 一、建设背景垃圾分类的意义1.为什么要进行垃圾分类2.智慧垃圾分类的重要性 二、建设思路三、建设方案四、获取 - 垃圾分类全套最新解决方案合集 一、建设背景 垃圾分类的意义 1.为什么要进行垃圾分类 将易腐有机成分为主的厨房垃圾单独分类&…

垃圾分类全套技术方案

向AI转型的程序员都关注了这个号&#x1f447;&#x1f447;&#x1f447; 设计构思与创意 本作品以微信小程序为“个人”平台&#xff0c;用户可在微信小程序中录入必要的人脸等个人信息&#xff0c;并且能够以微信小程序为窗口查询自己的垃圾分类详情。为保证微信小程序的丰富…

垃圾分类资料汇总

目录 一、前言二、垃圾分类话题简介三、当前存在的一些有用参考资源四、当前存在的垃圾分类小程序或者APP五、当前规模比较大的产品六、个人想法参考资料注意事项 一、前言 自从上海实行了垃圾分类之后&#xff0c;垃圾分类这个话题就成为了一个热点话题&#xff0c;比较流行的…

智能垃圾分类

智能垃圾分类 2021.4.9&#xff0c;浙江省举办了第七届工程训练大赛&#xff0c;我们组参加的是垃圾分类的项目&#xff0c;我们组顺利挺进决赛&#xff0c;但是我们看决赛规则并没有标注多种垃圾分类&#xff0c;我们没有完全的准备好应对多种垃圾分类&#xff0c;所以与国赛…

【图像分类数据集】非常全面实用的垃圾分类图片数据集共享

【图像分类数据集】非常全面实用的垃圾分类图片数据集共享 数据集介绍&#xff1a; 训练集 文件夹结构如下&#xff08;部分&#xff1a; 第0类文件夹下数据展示如下&#xff08;部分&#xff1a; 测试集 大致如下&#xff1a; 数据集获取方式&#xff1a; 总结&#xf…

VS2019安装不上 怎么弄啊

之前的版本是VS2017,因为笔记本很卡,就重装了个系统 再次安VS的时候就怎么都安不上去,是这样,卡到2/67,就不动了,然后就失败 安的时候选了C++有关的项目,不行,然后什么负载都不选,还是上面那样,还把C盘里的Microsoft.Net文件夹给删了,专门的卸载程序试过、控制面板…

计算机重新启动进不去系统,电脑关机重启进不了系统怎么办

可能还有些网友不太了解电脑关机重启进不了系统的情况&#xff0c;下面就由学习啦小编给你们介绍电脑关机重启进不了系统的原因及解决方法吧&#xff0c;希望能帮到大家哦! 电脑关机重启进不了系统的解决方法一&#xff1a; 蓝屏代码或事件查看器里面的内容普通人是看不懂的&am…

8Manage:分散的软件正在扼杀公司的生产力

在企业领域&#xff0c;数字化不仅仅是指工具能力&#xff0c;而是指用户如何很好地应用他们的知识来做决策&#xff0c;培养关系&#xff0c;建立声誉&#xff0c;以及动员同事、团队。几十年来&#xff0c;企业已经部署了生产力、搜索和协作平台&#xff0c;以提高员工和业务…

中高端洪流已至,酒店企业如何趁势突围

五一小长假即将到来&#xff0c;在人们热切盼望能出行游玩时&#xff0c;频发的疫情却挡住了人们出行的脚步。原本2020年突发的疫情“黑天鹅”&#xff0c;在近两年已经成为常态&#xff0c;对旅游业、酒店业造成严重影响。不过&#xff0c;从酒店行业整体来看&#xff0c;走向…

酒店预订网客户流失分析案例

阅读路线 项目介绍&#xff1a;该项目对某酒店预订网在一段时间内的客户预定信息数据进行分析&#xff0c;其中着重对该网站整体消费情况和用户行为展开分析&#xff0c;找出高价值用户人群&#xff0c;对客户进行用户画像分析&#xff0c;从而为该网站的精细化营销提供相关建议…