diff --git a/.gitignore b/.gitignore index 0297ae9..331f1f0 100644 --- a/.gitignore +++ b/.gitignore @@ -103,3 +103,5 @@ fabric.properties /20240627test4/testimg_result/ /20240627test4/zz_test/ /20240627test4/误识别测试20240714/ +/20240529RGBtest3/xs/百香果rgb效果/ +/20240529RGBtest3/xs/光谱数据3030/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..48318ea --- /dev/null +++ b/README.md @@ -0,0 +1,179 @@ +# 泉州多品类果蔬智能分选项目(番茄&百香果) + +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’**,不包含数据字段,仅有**长度字段+指令字段**