通过男生的眼睛进行分类的任务:通过监控摄像头的帧确定停车场中是否有汽车

您好,我是11年级的学生,我对编程,关于IT主题感兴趣。

我写这篇文章是为了分享我的项目,这个项目花了我整个周末的10个小时,并且为了理解现代数据分析方法的可能性而完成。 该出版物可以被视为对这一领域知识不了解的人成功实施的一个例子,也可以作为向那些有相应知识的人指出我的错误的要求。

给定:来自CCTV摄像机的视频流,在该摄像机上有一个100x50像素的片段,上面带有特定停车位的图像,在该停车位上只能存在或不存在特定的汽车。

相机影像

停车位的图像


目的:确定停车位中是否有汽车。

接收相机图像


我使用openCV库获取和预处理图像。
我使用以下代码来构建用于训练神经网络的数据集:我每小时拍摄一次停车位,并在收到60张照片后,将它们手动分成带和不带机器的照片。

dataminer.py
import cv2 as cv import numpy as np import time cap = cv.VideoCapture() r = 0 while r <=100: cap.open('http://**.**.***.***:***/*****CG?container=mjpeg&stream=main') #URL-  hasFrame, frame = cap.read()#    frame = frame[100:200, 300:750] box = [0,335,100,385] quantframe = frame[box[0]:box[2], box[1]:box[3]]#         r+=1 cv.imwrite(str(r)+'.png',quantframe) #     print('saved') cap.release() time.sleep(3600) key = cv.waitKey(1) if key & 0xFF == ord('q'): cv.destroyAllWindows() break 


影像处理


我认为对神经网络进行训练是正确的决定,而不是在源图像上,而是在使用cv2.findcontours(...)函数找到的具有汽车轮廓的图像上进行训练。

这是将原始图像转换为轮廓图像的代码:

寻找轮廓
 def contoursfinder(image): img = image.copy() srcimg = img.copy() hsv_min = np.array((0, 0, 0), np.uint8) hsv_max = np.array((255, 255, 60), np.uint8) #         ,   ,      hsv = cv.cvtColor( img, cv.COLOR_BGR2HSV ) thresh = cv.inRange( hsv, hsv_min, hsv_max ) contours, _ = cv.findContours(thresh, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE) img = np.zeros((100,50,3), np.uint8) cv.drawContours(img, contours, -1, (255,255,255), 1, cv.LINE_AA) return cv.cvtColor(img, cv.COLOR_BGR2GRAY) 


该函数的结果:

隐藏文字

神经网络


我使用了tensorflow库(keras)。

网络结构是从Internet的示例中复制来的:对我来说,为什么这样解释并不清楚。 如果有知识的人告诉或告诉在哪里阅读此体系结构为什么有效或为什么其他体系会更有效,我将不胜感激。
神经网络模型:顺序的,由256和128个神经元的两个密集隐藏层以及输入,输出层组成。

代号
 model = keras.Sequential([ keras.layers.Flatten(input_shape=(100, 50)), keras.layers.Dense(256, activation=tf.nn.relu), keras.layers.Dense(128, activation=tf.nn.relu), keras.layers.Dense(2, activation=tf.nn.softmax) ]) model.compile(optimizer=tf.train.AdamOptimizer(), loss='sparse_categorical_crossentropy', metrics=['accuracy']) model.fit(trainingimagesarr, trainingimagesarrlabel, epochs=1, callbacks=[tbCallBack]) 


在训练之前,将整个numpy矩阵除以255,以便为神经网络的输入提供介于0到1范围内的数字。

 trainingimagesarr = trainingimagesarr / 255.0 trainingimagesarrlabel = np.array(trainingimagesarrlabel)-1 

现在我可以调用该函数:

 def realtest(): cap = cv.VideoCapture() cap.open('http://**.**.***.***:***/*****CG?container=mjpeg&stream=main') hasFrame, frame = cap.read() frame = frame[100:200, 300:750] quantframe = frame[0:100,275:325] quantframe = contoursfinder(quantframe) return model.predict(np.array([quantframe]))[0][1]>0.60 

获取有关停车场中是否有汽车的数据

不要踢太多,而是踢一点:-)

谢谢你

Source: https://habr.com/ru/post/zh-CN440608/


All Articles