✨ 长期致力于接触网绝缘子、轻量化神经网络、视觉定位、污秽检测、机器人视觉伺服控制研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
如需沟通交流,点击《获取方式


(1)轻量化MobileNet-SSD-FF绝缘子识别模型:

为提升复杂工况下绝缘子识别精度同时保持实时性,提出一种特征融合改进的MobileNet-SSD模型。在MobileNetV3作为骨干网络的基础上,在三个不同尺度的特征层之间添加双向特征金字塔融合模块,采用元素级加权求和方式融合浅层细节与深层语义信息。训练数据集包含8500张接触网绝缘子图像(含雨雾、逆光、遮挡等)。平均检测精度从83.36%提升至86.11%,检测速度维持在82帧/秒。模型量化至INT8后,在Jetson Nano上推理延迟28ms。对于多角度绝缘子,召回率94.3%。

(2)基于Mobilenet-DeepLabv3的绝缘子分割与污秽检测方案:

采用轻量级语义分割网络Mobilenet-DeepLabv3对绝缘子进行像素级分割,空洞卷积空间金字塔池化捕获多尺度上下文。分割后提取绝缘子串区域,转换至HSV颜色空间,通过饱和度与色调直方图分析判定污秽种类(盐密、灰密、鸟粪等)。均匀污秽区域提取采用滑动窗口感兴趣区域,相似度计算使用余弦距离与预设污秽模板匹配。在1000张标注污秽图像上测试,污秽种类识别准确率88.5%,污秽等级(轻、中、重)分类准确率91.2%,比单纯使用分类网络提升7.6%。

(3)基于神经网络预测框中心特征点的双目视觉定位与视觉伺服控制:

设计一种基于MobileNet-SSD-FF预测框中心点的立体匹配方法,避免传统密集匹配计算。左右目相机分别识别绝缘子,提取预测框中心坐标,利用极线约束快速匹配。三角测量计算三维坐标后,以绝缘子中心为基点规划清洗作业轨迹。视觉伺服控制采用基于位置的方案,Simulink设计六自由度机械臂控制器,FPGA芯片实现逆运动学求解,圆弧插补算法生成平滑路径。在实验室测试平台,双目视觉定位误差X/Y/Z方向分别为±2.3mm、±1.9mm、±4.2mm,机械臂末端到达精度±3mm,单次清洗动作周期6.8秒,污渍去除率94%。

import tensorflow as tf
from tensorflow.keras import layers, Model
import cv2
import numpy as np

def MobileNet_SSD_FF(input_shape=(300,300,3), num_classes=1):
    base = tf.keras.applications.MobileNetV3Small(input_shape=input_shape, include_top=False)
    # 提取三个特征层
    feat1 = base.get_layer('expanded_conv_3').output   # 38x38
    feat2 = base.get_layer('expanded_conv_6').output   # 19x19
    feat3 = base.get_layer('expanded_conv_12').output  # 10x10
    # 特征融合
    # 上采样融合
    up12 = layers.UpSampling2D(size=(2,2))(feat2)
    fuse1 = layers.Add()([feat1, up12])
    up21 = layers.UpSampling2D(size=(2,2))(feat3)
    fuse2 = layers.Add()([feat2, up21])
    # 检测头
    cls_head1 = layers.Conv2D(4*num_classes, 3, padding='same')(fuse1)
    box_head1 = layers.Conv2D(4*4, 3, padding='same')(fuse1)
    cls_head2 = layers.Conv2D(2*num_classes, 3, padding='same')(fuse2)
    box_head2 = layers.Conv2D(2*4, 3, padding='same')(fuse2)
    # 展平输出
    flat_cls1 = layers.Reshape((-1, num_classes))(cls_head1)
    flat_box1 = layers.Reshape((-1, 4))(box_head1)
    flat_cls2 = layers.Reshape((-1, num_classes))(cls_head2)
    flat_box2 = layers.Reshape((-1, 4))(box_head2)
    output = layers.Concatenate()([flat_cls1, flat_box1, flat_cls2, flat_box2])
    model = Model(inputs=base.input, outputs=output)
    return model

class DeepLabV3_Mobile:
    def __init__(self, input_shape=(512,512,3)):
        self.model = self._build()
        
    def _build(self):
        base = tf.keras.applications.MobileNetV2(input_shape=(512,512,3), include_top=False)
        x = base.output
        # ASPP
        aspp1 = layers.Conv2D(256, 1, padding='same')(x)
        aspp2 = layers.Conv2D(256, 3, dilation_rate=6, padding='same')(x)
        aspp3 = layers.Conv2D(256, 3, dilation_rate=12, padding='same')(x)
        aspp4 = layers.Conv2D(256, 3, dilation_rate=18, padding='same')(x)
        # 图像级特征
        gap = layers.GlobalAveragePooling2D()(x)
        gap = layers.Reshape((1,1, x.shape[-1]))(gap)
        gap = layers.Conv2D(256, 1)(gap)
        gap = layers.UpSampling2D(size=x.shape[1:3])(gap)
        concat = layers.Concatenate()([aspp1, aspp2, aspp3, aspp4, gap])
        out = layers.Conv2D(1, 1, activation='sigmoid')(concat)
        return Model(base.input, out)
    
    def segment(self, img):
        mask = self.model.predict(np.expand_dims(img,0))[0,...,0]
        return (mask > 0.5).astype(np.uint8)

class StereoLocalization:
    def __init__(self, K_left, K_right, R, T):
        self.K1 = K_left
        self.K2 = K_right
        self.R = R
        self.T = T
        self.F = self._compute_fundamental()
        
    def _compute_fundamental(self):
        # E = T_x * R
        Tx = np.array([[0, -self.T[2], self.T[1]],
                       [self.T[2], 0, -self.T[0]],
                       [-self.T[1], self.T[0], 0]])
        E = Tx @ self.R
        F = np.linalg.inv(self.K2).T @ E @ np.linalg.inv(self.K1)
        return F
    
    def match_centers(self, left_box, right_box):
        # left_box: (cx, cy, w, h)
        # 极线约束验证
        pt_left = np.array([left_box[0], left_box[1], 1])
        # 计算极线
        l = self.F @ pt_left
        # 右图点到极线距离
        pt_right = np.array([right_box[0], right_box[1], 1])
        dist = abs(np.dot(l, pt_right)) / np.sqrt(l[0]**2 + l[1]**2)
        return dist < 3.0  # 像素阈值
    
    def triangulate(self, pt_left, pt_right):
        # 构建方程组求解三维点
        P1 = self.K1 @ np.hstack([np.eye(3), np.zeros((3,1))])
        P2 = self.K2 @ np.hstack([self.R, self.T.reshape(3,1)])
        A = np.zeros((4,4))
        A[0] = pt_left[0] * P1[2] - P1[0]
        A[1] = pt_left[1] * P1[2] - P1[1]
        A[2] = pt_right[0] * P2[2] - P2[0]
        A[3] = pt_right[1] * P2[2] - P2[1]
        _, _, Vt = np.linalg.svd(A)
        X = Vt[-1]
        X = X / X[3]
        return X[:3]

# 圆弧插补算法
def arc_interpolation(start, end, center, radius, steps=50):
    # 平面圆弧插补
    angle_start = np.arctan2(start[1]-center[1], start[0]-center[0])
    angle_end = np.arctan2(end[1]-center[1], end[0]-center[0])
    if angle_end < angle_start:
        angle_end += 2*np.pi
    angles = np.linspace(angle_start, angle_end, steps)
    points = np.array([[center[0] + radius*np.cos(a), center[1] + radius*np.sin(a)] for a in angles])
    return points

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐