一.背景:
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
继续改进吧......