# 泉州多品类果蔬智能分选项目(番茄&百香果) 2024年4月开始开发的项目,项目组成员( 薛胜、滕广、吴旻、徐耀、方晓东) 灵魂领袖---薛胜,如有算法方面的疑问或者其他方面的不解请虚心请教薛胜大师兄 ​ ❤☺→薛胜←☺❤ ## 项目分支说明 ```text supermachine--tomato-passion_fruit ├── master ├── actual-deployment ``` 该项目下包含两个分支,master为主分支,包含各个阶段的开发测试程序;actual-deployment分支为部署版本分支,包含设备实际部署版本程序。 ## master分支 ### 整体结构 ```text supermachine--tomato-passion_fruit ├── 20240410RGBtest1 ├── 20240419RGBtest2 ├── 20240529RGBtest3 ├── 20240627test4 ├── spectrum ├── README.md ├── 通信协议(20240722).md ``` 当前项目包含所有阶段测试程序。 20240410RGBtest1为4月开发第一版,以薛胜大师兄为开发主力,项目框架参照木地板项目进行编程,采用socket通信,与吴旻师兄协商定好通信协议。 20240419RGBtest2为4月开发第二版,经过实验及实际设备运行证明在数据传输时存在丢图漏图等问题,经过老倪的亲自指导(烟草项目实际运行一年多,管道可靠~),将socket通信改为命名管道通信,采用windows下的win32包进行pipe命名管道创建及连接使用。 20240529RGBtest3为5月底开发第三版,重新梳理了项目框架,去除冗余代码,新增对百香果的RGB及糖度预测解决方案(薛胜大师兄为主力),截止目前所有的测试代码均采用传统方法,在色彩空间上进行处理。 20240627test4为实际设备部署版本基础上的测试版本,为实际开发第4版,在当前版本中,新增百香果褶皱判别模型(图像分类)、番茄裂口检测模型(yolo目标检测)、番茄叶片&果蒂&根分割模型(yolo实例分割),在番茄传统方法处理中新增lab色彩空间处理用于检测后期发现的小样本(姑且认为是白色变质缺陷)。 spectrum为前期无锡光谱实验中,用于处理光谱数据,验证光谱检测方案(透射or反射)的测试程序。 PS:实际部署版本采用pipe命名管道进行通信,数据传输采取通信协议进行协商通讯,通讯协议见——通信协议(20240722).md ## actual-deployment分支 ### 整体结构 ```text supermachine--tomato-passion_fruit 文件夹: ├── models ├── utils ├── weights 代码: ├── classifer.py ├── config.py ├── detetor.py ├── export.py ├── main.py ├── pipe_utils.py ├── root_dir.py ├── to_seg.py 文件: ├── requirements.txt ├── tomato-passion_fruit.log 补充文件: ├── README.md ├── 通信协议(20240722).md ``` 核心部分为文件夹&代码。 models文件内包含百香果糖度预测模型权重、百香果褶皱判别模型权重、百香果及番茄传统色彩模型预热图像;utils文件夹内为yolo自带;weights文件夹内包含各个版本的番茄裂口检测模型权重、番茄分割模型权重。 main.py为入口函数,实际运行只启动main.py即可; classifer.py为处理程序,内部封装了多个类,结构如下所示; ```text classifer.py ├── Tomato ├── Passion_fruit ├── Spec_predict { ├── BasicBlock ├── ResNet ├── resnet18 ├── resnet34 } ├── ImageClassifier ├── Data_processing ``` Tomato类内定义了番茄传统方法所用到的函数;Passion_fruit类内定义了百香果传统方法所用到的函数;Spec_predict类内定义了百香果糖度预测模型;{BasicBlock、ResNet、resnet18、resnet34}为百香果褶皱判别模型定义所需;ImageClassifier类定义了百香果褶皱判别模型;Data_processing类内定义了图像处理所需函数、番茄图像分析函数、百香果图像分析函数、图像数据处理函数。 config.py为项目参数定义代码; detetor.py为番茄裂口检测模型; pipe_utils.py为管道通信及数据解析代码; to_seg.py为番茄分割模型; root_dir.py为根目录检测代码; # 通讯协议(百香果&西红柿通信) 基于pipe命名管道,数据共3个字段(长度、指令、数据): | 长度1 | 长度2 | 长度3 | 长度4 | 指令1 | 指令2 | 数据1 | 数据2 | ... | 数据i | | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :--: | :---: | | 8'hzz | 8'hzz | 8'hzz | 8'hzz | 8'hzz | 8'hzz | 8'hzz | 8'hzz | ... | 8'hzz | ## 长度 一个32位无符号数length,长度 = 数据字节数i + 2 。
`长度1`指length[31:24],`长度2`指length[23:16],`长度3`指length[15:8],`长度4`指length[7:0] ## 指令 ASCII字符,共2字节16位,比如`指令1`为'T',`指令2`为'O',代表番茄数据包 具体指令: | 指令1 | 指令2 | 指令含义 | | :---: | :---: | :----------: | | Y | R | 预热数据 | | T | O | 番茄数据 | | P | F | 百香果数据 | | R | E | 返回结果数据 | | K | O | 返回空果 | ## **数据** **预热数据包:‘Y’‘R’**,不包含数据字段,仅有**长度字段+指令字段** **RGB图像数据包:'指令1''指令2 '**,`数据1`~`数据i`包含了图像的行数rows(高度)、列数cols(宽度)、以及图像的RGB数据,组合方式为**高度+宽度+RGB数据** $$ i-4=rows \times cols \times 3 $$ `数据1`~`数据i`的分布具体如下: | 行数1 | 行数2 | 列数1 | 列数2 | 图像数据1 | ... | 图像数据(i-4) | | :--------: | :-------: | :--------: | :-------: | :-------: | :--: | :-----------: | | rows[15:8] | rows[7:0] | cols[15:8] | cols[7:0] | | ... | | **光谱数据包:' 指令1''指令2 '**,`数据1`~`数据i`包含了光谱数据的行数rows(高度)、列数cols(宽度)、谱段数bands、以及光谱数据,组合方式为**高度+宽度+谱段数+光谱数据** $$ i-6=rows \times cols \times bands \times 2 $$ `数据1`~`数据i`的分布具体如下: | 行数1 | 行数2 | 列数1 | 列数2 | 谱段1 | 谱段2 | 图像数据1 | ... | 图像数据(i-6) | | :--------: | :-------: | :--------: | :-------: | :---------: | :--------: | :-------: | :--: | :-----------: | | rows[15:8] | rows[7:0] | cols[15:8] | cols[7:0] | bands[15:8] | bands[7:0] | | ... | | **返回结果数据包:'R''E'**,`数据1`~`数据i`包含了糖度值Brix、颜色占比color、直径long、预估重量weight、缺陷个数num、缺陷面积area、结果图像的行数rows(高度)、列数cols(宽度)、以及结果图像的RGB数据,组合方式为**糖度值+颜色占比+直径+预估重量+缺陷个数+缺陷面积+高度+宽度+RGB数据** $$ i-16=rows \times cols \times 3 $$ `数据1`~`数据i`的分布具体如下: | 糖度值2 | 糖度值1 | 颜色占比 | 直径2 | 直径1 | 预估重量 | 缺陷个数1 | 缺陷个数2 | 缺陷面积1 | 缺陷面积2 | 缺陷面积3 | 缺陷面积4 | 行数1 | 行数2 | 列数1 | 列数2 | 图像数据1 | ... | 图像数据(i-16) | | :--------: | :-------: | :--------: | :--------: | :-------: | :---------: | :-------: | :-------: | :---------: | :---------: | :--------: | :-------: | :--------: | :-------: | :--------: | --------- | --------- | ---- | -------------- | | Brix[15:8] | Brix[7:0] | color[7:0] | long[15:8] | long[7:0] | weight[7:0] | num[15:8] | num[7:0] | area[31:24] | area[23:16] | area[15:8] | area[7:0] | rows[15:8] | rows[7:0] | cols[15:8] | cols[7:0] | | ... | | **返回空果数据包:‘K’‘O’**,不包含数据字段,仅有**长度字段+指令字段**