如何不再重复识别——针对海康高空球机

114 阅读2分钟

一.背景:

1.有多个类别需要进行识别
2.相机为单目摄像机
3.相机具备一定的俯仰角旋转和水平方向360°旋转

二.分析背景:

针对需求1:意味着这是一个多目标的识别,在同一视频画面中可能会出现1个及以上的目标;
针对需求2和3:意味着无法精准定位目标物,也就意味着通过识别物的地理位置去完成不重复识别

三.现在状况:

现在的出现的情况:
3.1 多个高空摄像头进行巡航扫描的时候会经常扫描到同一目标,而有的目标(按照目标检测划分是属于该类目标)会多次出现,后经人工审核该目标虽然属于需要识别的类别但是这个是属于例外。
3.2 摄像头扫苗速度快,会对同一目标多次识别,现需要对同一目标只识别一次。

四.解决途径

为了解决这种现象建立如下流程:
4.1 建立特例图像库(后面简称:特例库)
4.2 建立识别图像同特例库比对,当满足某特定条件则认定为识别的图像属于特特例图像
在这个特例库中还可以放入经常在某特定地方误识别的图像,间接提高识别率

五.比对系统的建立

5.1 通过平均哈希算法计算相似度
5.2 通过直方图距离计算识别相似度
5.3 通过感知哈希算法计算相似度
5.4 通过差异哈希算法计算图片相似度
5.5 通过余弦计算图像相似度\

六.测试比对系统

在5.1至5.6的过程中出现了如下几个问题:
6.1 计算相似度过程耗时比较久(耗时最小的为:5.1)无法满足拍到即识别推送过程的最小耗时
6.2 通过比较相似度这个方法并不是很可靠,目前未尝试多中相似度并列判断(主要原因耗时久)
6.3 hog+svm这个方案立马被pass掉了

七.通过模板匹配完成

可参考:juejin.cn/post/707598… 写的一个模板匹配
这个过程中的流程为:
7.1 分别建立某类别的特例库
7.2 对识别到的图像进行与特例库中图像做匹配
7.3 设置匹配阈值,当出现第一个大于设定阈值的值出现时PASS掉识别到的图像\

八.简版demo

def TemplateMatching(predict_Img, TypesName):
    oldImgPath = 'E:/Project/imgs/%s/' % TypesName
    oldImgLine = os.listdir(oldImgPath)
    cuont = 0
    for OldimgName in oldImgLine:
        old_images = Image.open(oldImgPath + OldimgName)
        OldImages = cv2.cvtColor(numpy.asarray(old_images), cv2.COLOR_RGB2BGR)
        method = eval('cv2.TM_CCOEFF_NORMED')  # eval 
        # 模板匹配
        NewImages = cv2.cvtColor(numpy.asarray(predict_Img), cv2.COLOR_RGB2BGR)
        res = cv2.matchTemplate(NewImages, OldImages, method)
        # 寻找最值
        min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
        if  (min_val + max_val)/2 > 0.125
            print("与图库中相似:", predict_Img)
            cuont += 1
            break
    if cuont == 0:
        print("认定无相似的:", predict_Img)
    return cuont

继续改进吧......