# 红外飞机部件检测 **Repository Path**: ig__wxz/Infrared-Plane-Component-Detection ## Basic Information - **Project Name**: 红外飞机部件检测 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2020-09-28 - **Last Updated**: 2026-03-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 1 红外飞机部件检测--hi3559A ### 1.1 模型性能 任务要求检测红外图像下的[机体plane、机头head、尾焰tail(flame)],数据. 由于数据集较少,且多源于网络视频、实拍视频、仿真图片,数据集信息重复,易过拟合,故指标方面只探讨运行速度的优化,对精度不作深究. | Model | img size | NNIE | soft | FPS | | ---------------- | -------- | ---- | ---- | ----- | | MobileNet v2+FPN | 608x608 | 79.3 | 0.50 | 12.53 | | MobileNet v1+SSD | 300x300 | 5.2 | 4.8 | 100 | - **MobileNet v1+SSD** 模型来源于Caffe的SSD及Mobilenet v1. 输入300x300大小的图片,在6层特征图[19,10,5,3,2,1]共491个点上,用1conv的检测头预测类别和位置,每个特征点上的anchor分别为[4,6,6,6,6,6]. 模型未做修改,依旧采用常规的L1+softmax损失,以IoU来分配正负样本.部署时,用Depthwise层代替分组卷积,将BN参数合并到卷积中,用海思提供的工具量化到8bit. - **MobileNet v2+FPN** 模型来源于Pytorch下的RetinaNet. 输入608x608大小的图片,通过FPN在[76,38,19,10,5]尺寸的5层特征图,共7706个点上检测目标,每个特征点有1个anchor. 损失采用DIoU+Focal Loss,正负样本分配额采用ATSS.部署时将[pytorch模型近似转到caffe框架](https://gitee.com/ig__wxz/17/tree/master/pytorch模型部署/Retinanet)下,用Depthwise层代替分组卷积,将BN参数合并到卷积中,用海思提供的工具量化到8bit. **优化效果:** (1) Depthwise+合并BN参数(NNIE耗时↓) 对于608x608输入的MobileNet v2,Depthwise层取代分组conv,耗时会从40ms涨到52ms,但结合BN后耗时又会降到17.6ms.所以这`两步优化要结合起来使用,对MobileNet v2+FPN来说,NNIE的耗时从121ms显著降到了85.8ms`. 但对于像ResNet50这类不包含轻量化结构(Depthwise)的模型来说,将BN参数合并到卷积层并不能使网络运行速度增加丝毫,如ResNet50+FPN的NNIE耗时从155.146→155.150ms. 详情参考可参考[here](https://gitee.com/ig__wxz/17/tree/master/pytorch模型部署/Retinanet/SVP_code). (2) Sigmoid+ATSS(soft耗时↓) 软件耗时主要来源于DDR数据读取、坐标解算、类别预测、NMS和快速排序.软件耗时同时还受anchor数和类别数的影响,理论上anchor数、类别数与时间成线性关系. Focal Loss采用的Sigmoid计算类别得分的方式,可以无损的去掉exp()的计算.而Softmax的损失对exp()函数有一定依赖,去掉exp()会降低精度. ATSS这类正负样本的分配方法,减少了网络对anchor数量的敏感度,从而可以在每个特征点只设置一个anchor.20类9anchor的soft耗时38ms,而3类1anchor仅耗时0.5ms.从根本上解决了soft耗时长的问题. **可优化的方向:** NNIE耗时长是主要问题,其结构包括backbone(MobileNet v2)、FPN、head.分别耗时`17.6ms、13ms、48.7ms`. (1) head占61% 由于head是在5层特征图上进行4次3x3卷积操作,并未进行轻量化设计,故用深度可分离卷积取代常规卷积,soft耗时仅从55ms下降到43ms(9anchor的情况),情况并不理想. 究其根本,是特征点个数7706过多,我们应根据项目实际检测难度,调整图片大小、特征图个数和尺寸.仅去掉最低层78x78的特征图,预计耗时会缩小到原来的22%,NNIE总耗时预计在~40ms,FPS 25. (2) backbone占22% MobileNet v2耗时17.6ms,初步估计与MobileNet v1(1/4大小的输入,耗时5ms)速度相当,且backbone结构相对固定,提升空间有限,可不作考虑,或参考[EfficientNet](https://gitee.com/ig__wxz/paper_notes/blob/master/Detection/网络结构/EfficientNet-Det.md)做[通道数,卷积层数,图片宽度]协调的优化. (3) FPN占17% 5层特征图的FPN每一层包含1个3x3卷积,对于3输入特征图还有各1个1x1卷积,外加2个反卷积(上采样).和head一样,FPN结构也很受特征图个数和尺寸的影响. 可不作优化或参考[EfficientDet](https://gitee.com/ig__wxz/paper_notes/blob/master/Detection/网络结构/EfficientNet-Det.md)的BiFPN结构,或[SEPC](https://gitee.com/ig__wxz/paper_notes/blob/master/Detection/网络结构/特征融合/SEPC.md)的iBN结构,亦或[ThunderNet](https://gitee.com/ig__wxz/paper_notes/blob/master/Detection/网络结构/轻量级网络/ThunderNet.md)的CAM结构. **分析:** 综上,减小NNIE耗时的主要优化方向就是减小特征图的数量和尺寸.`把低层的大特征图去除掉才能真正解决NNIE耗时长的问题` . 在我们用小模型skynet检测船只时(数据集极简单,目标在图片中央,占25+%的图片区域),ATSS这类方法并不能提升模型的精度,反而因为模型拟合能力过弱,导致精度下降,没能力学到应有信息.而用聚类算法来获得合适anchor却可以极大的提升模型拟合难度,提升小网络精度. 因此,对于不同任务,我们如果能够根据训练难度以及数据集bbox的分布情况,自适应调整特征图的个数和每层特征图anchor尺寸,就可以有效控制NNIE耗时问题. 我称该方法为**自适应anchor学习**.首先模型在5层特征图上都有相同的检测头进行检测,每层特征图的初始尺寸可用聚类算法初始化,或按默认值.每层anchor的wh会在训练时进行动态调整,让网络学习anchor的参数.具体细节需要考虑模型如何分配正负样本,实现对大特征图检测的惩罚(思路方向),让两层特征图的anchor尺寸可以合并. ### 1.2 代码结构 ``` |--红外飞机检测 |--hisi | |--nnie | |--sample_nnie_main.exe | |--retinanet | |--infrared_plane | |--model |--PC | |--PlaneDetSoft | |--main.py | |--ImgSupport | |--utils ``` 代码分为海思侧和PC端侧,海思侧负责实时检测飞机及关键区域,PC侧作为上位机提供可视化界面,用于操控海思. - **安装方法** 将hisi目录下的nnie文件夹copy到PC端NFS指定的目录下(非root),PC目录下的软件代码copy到PC上的非root目录下. 修改`PC/PlaneDetSoft/utils/module1.py`代码中3处默认路径值和一处ip设置: ```python # 默认路径设置 default_nfs_road = '/home/ccc/030/Hi3559AV100R001C02SPC030/01.software/board/Hi3559AV100_SDK_V2.0.3.0' # 挂载nfs路径 default_exe_road = '/mpp/sample/svp/multi-core/nnie' # 可执行文件在挂载的nfs下的路径 default_drive_road = '/mpp/out/linux/multi-core/ko' # 驱动在挂载的nfs下的路径 PC_ip = '192.168.0.100' ``` 第一个路径设置NFS指定目录在PC上的位置,第二个路径是可执行文件sample_nnie_main.exe在NFS下的相对路径,第三个路径是海思驱动在NFS下的相对路径.第4个参数是pc端的网络ip地址,可用ifconfig查看. 在main.py中修改如下参数的输入,owner是PC用户名,password是对应的密码. ```python mod_control = module1.Module1(mainwin, text_dict, mod_screen, mod_command, owner='ccc', password='1234') # 创建模组 ``` 配置界面运行环境,建议通过anaconda创建一个虚拟环境,通过以下命令配置: ``` conda create -n hisi python=3.7 source activate hisi pip3 install pyserial pip3 install pillow pip3 install opencv-python # 待验证/补充 ``` - **使用方法** 通过pycharm运行软件的main.py代码,或者在虚拟环境下输入`python ./main.py`启动软件. 通常可按顺序点击`连接串口`→`加载驱动`→`连接网口`→`选择模型`→`选择数据`→`开始检测`. 连接网口时建议先通过`sudo minicom`ping下PC的ip地址,ping通了在连接.如果板卡没有开机自启动加载驱动设置,在连接网口前需点击加载驱动.选择模型有默认值,也可以自己选择.测试数据选择会生成list.txt,第二次再测试时可以不用再选择了.检测时可停止检测或暂停检测. ![界面图](https://gitee.com/ig__wxz/image_2019/raw/master/2020_8th/20200928005452.png)