Tiny_Yolov1_VOC2007目标检测

2024-04-28 18:32

本文主要是介绍Tiny_Yolov1_VOC2007目标检测,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Tiny_Yolov1_VOC2007目标检测

相较于YOLO模型,Tiny_YOLO版本将网络压缩了许多,不管是训练还是移植速度都比较快,更加适用于业界应用。

文章目录

  • Tiny_Yolov1_VOC2007目标检测
  • 一、 Tiny_Yolov1结构
  • 二、VOC2007数据集上的训练过程
  • 三、模型检测效果
  • 四、深入思考
  • 五、源码
  • 六、相关链接

一、 Tiny_Yolov1结构

网络输入:(448,448,3)

第一轮处理:
(1)Conv2D(16, (3, 3), padding=‘same’, use_bias=False)
(2)BatchNormalization
(3)LeakyReLU(alpha=0.1)
(4)MaxPooling2D((2, 2), strides=(2, 2), padding=‘same’)

第二轮处理:
(1)Conv2D(32, (3, 3), padding=‘same’, use_bias=False)
(2)BatchNormalization
(3)LeakyReLU(alpha=0.1)
(4)MaxPooling2D((2, 2), strides=(2, 2), padding=‘same’)

第三轮处理:
(1)Conv2D(64, (3, 3), padding=‘same’, use_bias=False)
(2)BatchNormalization
(3)LeakyReLU(alpha=0.1)
(4)MaxPooling2D((2, 2), strides=(2, 2), padding=‘same’)

第四轮处理:
(1)Conv2D(128, (3, 3), padding=‘same’, use_bias=False)
(2)BatchNormalization
(3)LeakyReLU(alpha=0.1)
(4)MaxPooling2D((2, 2), strides=(2, 2), padding=‘same’)

第五轮处理:
(1)Conv2D(256, (3, 3), padding=‘same’, use_bias=False)
(2)BatchNormalization
(3)LeakyReLU(alpha=0.1)
(4)MaxPooling2D((2, 2), strides=(2, 2), padding=‘same’)

第六轮处理:
(1)Conv2D(512, (3, 3), padding=‘same’, use_bias=False)
(2)BatchNormalization
(3)LeakyReLU(alpha=0.1)
(4)MaxPooling2D((2, 2), strides=(2, 2), padding=‘same’)

第七轮处理:
(1)Conv2D(1024, (3, 3), padding=‘same’, use_bias=False)
(2)BatchNormalization
(3)LeakyReLU(alpha=0.1)

第八轮处理:
(1)Conv2D(256, (3, 3), padding=‘same’, use_bias=False)
(2)BatchNormalization
(3)LeakyReLU(alpha=0.1)

第九轮处理:
(1)Flatten()
(2)Dropout(0.5)
(3)Dense(1470, activation=‘relu’)
(4)Dropout(0.5)
(5)Dense(1470, activation=‘linear’)

第十轮处理:
(1)my_reshape((7, 7, 30))

二、VOC2007数据集上的训练过程

第一轮训练过程:epoch = 5,optimizer=‘adam’, train loss从478.6下降到55.1,val loss从88.3下降到75.1,此时val loss训练已经达到瓶颈,无法再继续下降。

此时要想继续训练使得val loss下降已经颇有困难,得非常具有技巧性。
在这里插入图片描述
第二轮训练过程:epoch = 10,sgd = optimizers.SGD(lr=1e-4, momentum=0.9),train loss从52.4下降到47.3,val loss从74.1下降到73.1。

val loss下降非常缓慢,也非常困难。

在这里插入图片描述
第三轮训练过程:epoch=30,sgd = optimizers.SGD(lr=1e-5, momentum=0.9),train loss从48.0下降到46.4,val loss从73.3下降到72.5。

此轮训练我又进一步调低了学习率,只期望val loss能下降就好。

在这里插入图片描述
第四轮训练过程:epoch=500,sgd = optimizers.SGD(lr=1e-5, momentum=0.9),train loss从47.2下降到41.0,val loss从72.7下降到71.7。

val loss下降越来越困难了,似乎已经达到了极限,我没办法让训练效果再好了。

在这里插入图片描述

三、模型检测效果

我从测试集中随意选取10张图片,检测效果如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

这个项目前前后后花费了我快一个月时间,我已经尽力了,YOLOv1模型检测我只能做到这种效果了,以后有想法再继续实验探究。

四、深入思考

Ques1:自己发现之前项目思路中的一个bug。

之前自己写过一个YOLOv1_VOC2007检测模型,网络训练了一个礼拜的时间,最后在训练集上检测效果非常好,而在测试集上的检测效果一塌糊涂。

本来我以为是过拟合问题,训练集loss很低,但验证集loss却降不下去。在尝试添加正则项、简化模型结构、dropout都不起作用后,暂时放弃了这个问题的处理。这段时间我才突然反应过来,根本不是过拟合问题,甚至可以说是欠拟合问题。

我在网络搭建的源代码中,Conv2D、BN层设置了trainable = False,但网络训练却是从头开始训练的。也就是说,卷积层、BN层的权重参数是随机生成的,并且一直无法被更新。我训练了一个礼拜的网络,其实只是在训练最后一层2亿个参数的全卷积。卷积、池化层并没有提取到正确的图片特征,而全连接层的训练只是在不断强行拟合,自然测试集上的效果会一塌糊涂。

实际上,要么我把所有的trainable设置为True,从头开始自己训练模型;要么从网上download已经训练好的部分网络层权重,再把trainable设置为 False。

Ques2:迁移学习。

迁移学习不是一种算法而是一种机器学习思想,应用到深度学习就是微调(Fine-tune)。修改网络模型结构,选择性载入网络模型权重,再用自己的数据集重新训练模型。微调能够快速训练好一个模型,用相对较小的数据量达到不错的结果。

网络训练有两种策略:一种是白手起家从头搭建模型进行训练,一种是通过预训练模型进行训练。

为什么要迁移学习?
(1)站在巨人的肩膀上。前人花很大精力训练出来的模型,大概率会比自己从零训练的效果更好。
(2)训练成本可以很低。迁移学习后期的训练成本非常低,用CPU都完全无压力。
(3)适用于小数据集。对于数据集本身很小(几千张图片)的情况,从头开始训练具有几千万参数的大型神经网络是不现实的,我们可以借用上大型神经网络的超强特征提取能力。

迁移学习有以下3种处理方式:

(1)Transfer Learning:冻结预训练模型的全部卷积层,只训练自己特定的全连接层。
(2)Extract Feature Vector:先计算出预训练模型的卷积层对所有训练、测试数据的特征向量,并存储到硬盘中,然后抛开预训练模型,只训练自己设计的简配版全连接网络。
(3)Fine-tune:冻结预训练模型的部分卷积层(通常是靠近输入的多数卷积层),训练剩下的卷积层(通常是靠近输出的部分卷积层)和全连接层。

第三种是对前两种的补充,但并不一定能真的对模型有所提升,不要期待能有什么质的飞跃。

Ques3:YOLOv1网络训练技巧。

不知道是因为YOLO模型结构太过复杂,还是YOLO损失函数太过复杂,YOLOv1模型真是太难训练了,比前面的图片分类模型、语义分割模型都要复杂的多。

训练技巧:先设置一个sgd学习率训练一段时间,一旦出现train loss不断下降但val loss基本不变的情况,立马停止训练保留此时的权重,此时已经开始向错误方向进行权重优化了,如果再不停止后面训练会更加艰难。尝试将sgd学习率下降10倍,开始下一轮的网络训练。

五、源码

读取数据集:

import os
import xml.etree.ElementTree as ETclass_dictionary = {'aeroplane': 0, 'bicycle': 1, 'bird': 2, 'boat': 3, 'bottle': 4, 'bus': 5,'car': 6, 'cat': 7, 'chair': 8, 'cow': 9, 'diningtable': 10, 'dog': 11,'horse': 12, 'motorbike': 13, 'person': 14, 'pottedplant': 15, 'sheep': 16,'sofa': 17, 'train': 18, 'tvmonitor': 19}
class_list = list(class_dictionary.keys())def read_image_path():data_x = []filename = os.listdir('/home/zk/Desktop/yolov1/JPEGImages')filename.sort()for name in filename:path = '/home/zk/Desktop/yolov1/JPEGImages/' + namedata_x.append(path)print('JPEGImages has been download ! ')return data_xdef read_coordinate_txt():data_y = []filename = os.listdir('/home/zk/Desktop/yolov1/Annotations')filename.sort()for name in filename:tree = ET.parse('/home/zk/Desktop/yolov1/Annotations/' + name)root = tree.getroot()coordinate = ''for obj in root.iter('object'):difficult = obj.find('difficult').textcls = obj.find('name').textif cls not in class_list or int(difficult) == 1:continuecls_id = class_list.index(cls)xml_box = obj.find('bndbox')x_min = int(xml_box.find('xmin').text)y_min = int(xml_box.find('ymin').text)x_max = int(xml_box.find('xmax').text)y_max = int(xml_box.find('ymax').text)loc = (str(x_min) + ',' + str(y_min) + ',' + str(x_max) + ',' + str(y_max) + ',' + str(cls_id) + '  ')coordinate = coordinate + locdata_y.append(coordinate)print('Object Coordinate has been download ! ')return data_ydef make_data():data_x = read_image_path()data_y = read_coordinate_txt()n = len(data_x)train_x = data_x[0:8000]train_y = data_y[0:8000]val_x = data_x[8000:9000]val_y = data_y[8000:9000]test_x = data_x[9000:n]test_y = data_y[9000:n]return train_x, train_y, val_x, val_y, test_x, test_y

损失函数:

import keras.backend as kdef iou(pre_min, pre_max, true_min, true_max):intersect_min = k.maximum(pre_min, true_min)    # batch * 7 * 7 * 2 * 2intersect_max = k.minimum(pre_max, true_max)    # batch * 7 * 7 * 2 * 2intersect_wh = k.maximum(intersect_max - intersect_min, 0.)    # batch * 7 * 7 * 2 * 2intersect_area = intersect_wh[..., 0] * intersect_wh[..., 1]    # batch * 7 * 7 * 2pre_wh = pre_max - pre_min    # batch * 7 * 7 * 2 * 2true_wh = true_max - true_min    # batch * 7 * 7 * 1 * 2pre_area = pre_wh[..., 0] * pre_wh[..., 1]    # batch * 7 * 7 * 2true_area = true_wh[..., 0] * true_wh[..., 1]   # batch * 7 * 7 * 1union_area = pre_area + true_area - intersect_area    # batch * 7 * 7 * 2iou_score = intersect_area / union_area    # batch * 7 * 7 * 2return iou_scoredef yolo_loss(y_true, y_pre):true_class = y_true[..., :20]    # batch * 7 * 7 * 20true_confidence = y_true[..., 20]    # batch * 7 * 7true_confidence1 = k.expand_dims(true_confidence)    # batch * 7 * 7 * 1true_location = y_true[..., 21:25]    # batch * 7 * 7 * 4pre_class = y_pre[..., :20]    # batch * 7 * 7 * 20pre_confidence = y_pre[..., 20:22]    # batch * 7 * 7 * 2pre_location = y_pre[..., 22:30]    # batch * 7 * 7 * 8true_location1 = k.reshape(true_location, [-1, 7, 7, 1, 4])    # batch * 7 * 7 * 1 * 4pre_location1 = k.reshape(pre_location, [-1, 7, 7, 2, 4])    # batch * 7 * 7 * 2 * 4true_xy = true_location1[..., :2] * 448 / 7    # batch * 7 * 7 * 1 * 2true_wh = true_location1[..., 2:4] * 448     # batch * 7 * 7 * 1 * 2true_xy_min = true_xy - true_wh / 2    # batch * 7 * 7 * 1 * 2true_xy_max = true_xy + true_wh / 2    # batch * 7 * 7 * 1 * 2pre_xy = pre_location1[..., :2] * 448 / 7    # batch * 7 * 7 * 2 * 2pre_wh = pre_location1[..., 2:4] * 448    # batch * 7 * 7 * 2 * 2pre_xy_min = pre_xy - pre_wh / 2    # batch * 7 * 7 * 2 * 2pre_xy_max = pre_xy + pre_wh / 2  # batch * 7 * 7 * 2 * 2iou_score = iou(pre_xy_min, pre_xy_max, true_xy_min, true_xy_max)  # batch * 7 * 7 * 2best_score = k.max(iou_score, axis=3, keepdims=True)   # batch * 7 * 7 * 1box_mask = k.cast(iou_score >= best_score, k.dtype(iou_score))  # batch * 7 * 7 * 2no_object_loss = 0.5 * (1 - box_mask * true_confidence1) * k.square(0 - pre_confidence)object_loss = box_mask * true_confidence1 * k.square(1 - pre_confidence)confidence_loss = no_object_loss + object_lossconfidence_loss = k.sum(confidence_loss)class_loss = true_confidence1 * k.square(true_class - pre_class)class_loss = k.sum(class_loss)box_mask1 = k.expand_dims(box_mask)    # batch * 7 * 7 * 2 * 1true_confidence2 = k.expand_dims(true_confidence1)    # batch * 7 * 7 * 1 * 1location_loss_xy = 5 * box_mask1 * true_confidence2 * k.square((true_xy - pre_xy) / 448)location_loss_wh = 5 * box_mask1 * true_confidence2 * k.square((k.sqrt(true_wh) - k.sqrt(pre_wh)) / 448)location_loss = k.sum(location_loss_xy) + k.sum(location_loss_wh)total_loss = confidence_loss + class_loss + location_lossreturn total_loss

网络结构:

import numpy as np
from keras.models import Sequential, Model, Input
from keras.layers import Dense, LeakyReLU, Flatten, Dropout
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import BatchNormalization
from keras import layers
from keras.engine.topology import Layer
import keras.backend as k
from keras.regularizers import l2class my_reshape(Layer):def __init__(self, target_shape, **kwargs):super(my_reshape, self).__init__(**kwargs)self.target_shape = target_shape    # (7, 7, 30)def compute_output_shape(self, input_shape):return (input_shape[0], ) + self.target_shape    # (batch, 7, 7, 30)def call(self, inputs, **kwargs):s = [self.target_shape[0], self.target_shape[1]]    # [7, 7]c = 20b = 2idx1 = s[0] * s[1] * c    # 7 * 7 * 20 = 980idx2 = idx1 + s[0] * s[1] * b    # 980 + 7 * 7 * 2 = 1078class_tensor = k.reshape(inputs[:, :idx1], (k.shape(inputs)[0],) + tuple([s[0], s[1], c]))class_tensor = k.softmax(class_tensor)    # shape = (batch, 7, 7, 20)confidence_tensor = k.reshape(inputs[:, idx1:idx2], (k.shape(inputs)[0],) + tuple([s[0], s[1], b]))confidence_tensor = k.sigmoid(confidence_tensor)    # shape = (batch, 7, 7, 2)location_tensor = k.reshape(inputs[:, idx2:], (k.shape(inputs)[0],) + tuple([s[0], s[1], b * 4]))location_tensor = k.sigmoid(location_tensor)    # shape = (batch, 7, 7, 8)outputs = k.concatenate([class_tensor, confidence_tensor, location_tensor])    # shape = (batch, 7, 7, 30)return outputsdef create_network():inputs = Input((448, 448, 3))x = Conv2D(16, (3, 3), padding='same', name='convolutional_0', use_bias=False,kernel_regularizer=l2(5e-4))(inputs)x = BatchNormalization(name='bnconvolutional_0')(x)x = LeakyReLU(alpha=0.1)(x)x = MaxPooling2D((2, 2), strides=(2, 2), padding='same')(x)x = Conv2D(32, (3, 3), padding='same', name='convolutional_1', use_bias=False,kernel_regularizer=l2(5e-4))(x)x = BatchNormalization(name='bnconvolutional_1')(x)x = LeakyReLU(alpha=0.1)(x)x = MaxPooling2D((2, 2), strides=(2, 2), padding='same')(x)x = Conv2D(64, (3, 3), padding='same', name='convolutional_2', use_bias=False,kernel_regularizer=l2(5e-4))(x)x = BatchNormalization(name='bnconvolutional_2')(x)x = LeakyReLU(alpha=0.1)(x)x = MaxPooling2D((2, 2), strides=(2, 2), padding='same')(x)x = Conv2D(128, (3, 3), padding='same', name='convolutional_3', use_bias=False,kernel_regularizer=l2(5e-4))(x)x = BatchNormalization(name='bnconvolutional_3')(x)x = LeakyReLU(alpha=0.1)(x)x = MaxPooling2D((2, 2), strides=(2, 2), padding='same')(x)x = Conv2D(256, (3, 3), padding='same', name='convolutional_4', use_bias=False,kernel_regularizer=l2(5e-4))(x)x = BatchNormalization(name='bnconvolutional_4')(x)x = LeakyReLU(alpha=0.1)(x)x = MaxPooling2D((2, 2), strides=(2, 2), padding='same')(x)x = Conv2D(512, (3, 3), padding='same', name='convolutional_5', use_bias=False,kernel_regularizer=l2(5e-4))(x)x = BatchNormalization(name='bnconvolutional_5')(x)x = LeakyReLU(alpha=0.1)(x)x = MaxPooling2D((2, 2), strides=(2, 2), padding='same')(x)x = Conv2D(1024, (3, 3), padding='same', name='convolutional_6', use_bias=False,kernel_regularizer=l2(5e-4))(x)x = BatchNormalization(name='bnconvolutional_6')(x)x = LeakyReLU(alpha=0.1)(x)x = Conv2D(256, (3, 3), padding='same', name='convolutional_7', use_bias=False,kernel_regularizer=l2(5e-3))(x)x = BatchNormalization(name='bnconvolutional_7')(x)x = LeakyReLU(alpha=0.1)(x)x = Flatten()(x)x = Dropout(0.5)(x)x = Dense(1470, activation='relu', name='connected_0')(x)x = Dropout(0.5)(x)x = Dense(1470, activation='linear', name='connected_1')(x)outputs = my_reshape((7, 7, 30))(x)model = Model(inputs=inputs, outputs=outputs)return model

训练过程:

import numpy as np
from keras.models import load_model
import cv2
import tiny_yolov1_model
from yolo_loss import yolo_loss
from keras.utils import Sequence
import math
from keras.callbacks import ModelCheckpoint
from keras import optimizersclass SequenceData(Sequence):def __init__(self, data_x, data_y, batch_size):self.batch_size = batch_sizeself.data_x = data_xself.data_y = data_yself.indexes = np.arange(len(self.data_x))def __len__(self):return math.floor(len(self.data_x) / float(self.batch_size))def on_epoch_end(self):np.random.shuffle(self.indexes)def __getitem__(self, idx):batch_index = self.indexes[idx * self.batch_size:(idx + 1) * self.batch_size]batch_x = [self.data_x[k] for k in batch_index]batch_y = [self.data_y[k] for k in batch_index]x = np.zeros((len(batch_x), 448, 448, 3))y = np.zeros((len(batch_y), 7, 7, 25))for i in range(self.batch_size):img = cv2.imread(batch_x[i])obj_all = batch_y[i].strip().split()size = img.shapeimg1 = img / 255resize_img = cv2.resize(img1, (448, 448), interpolation=cv2.INTER_AREA)x[i, :, :, :] = resize_imgfor j in range(len(obj_all)):obj = obj_all[j].split(',')x1, y1, x2, y2 = [int(obj[0]), int(obj[1]), int(obj[2]), int(obj[3])]category = int(obj[4])center_x = (x1 + x2) / 2center_y = (y1 + y2) / 2w = x2 - x1h = y2 - y1grid_x = int(7 * center_x / size[1])grid_y = int(7 * center_y / size[0])center_x_ratio = center_x * 7 / size[1] - grid_xcenter_y_ratio = center_y * 7 / size[0] - grid_yw_ratio = w / size[1]h_ratio = h / size[0]y[i, grid_y, grid_x, category] = 1y[i, grid_y, grid_x, 20] = 1y[i, grid_y, grid_x, 21:25] = np.array([center_x_ratio, center_y_ratio, w_ratio, h_ratio])return x, y# create model and train and save
def train_network(train_generator, validation_generator, epoch):model = tiny_yolov1_model.create_network()model.load_weights('/home/zk/Desktop/yolov1/raw_tiny-yolov1.hdf5', by_name=True)for i in range(31):model.layers[i].trainable = Falseprint(model.layers[i])model.summary()model.compile(loss=yolo_loss, optimizer='adam')checkpoint = ModelCheckpoint('/home/zk/Desktop/yolov1/best_weights.hdf5', monitor='val_loss',save_weights_only=True, save_best_only=True)model.fit_generator(train_generator,steps_per_epoch=len(train_generator),epochs=epoch,validation_data=validation_generator,validation_steps=len(validation_generator),callbacks=[checkpoint])model.save_weights('first_weights.hdf5')# Load the partially trained model and continue training and save
def load_network_then_train(train_generator, validation_generator, epoch, input_name, output_name):model = tiny_yolov1_model.create_network()model.load_weights(input_name)for i in range(31):model.layers[i].trainable = Falseprint(model.layers[i])model.summary()sgd = optimizers.SGD(lr=1e-5, momentum=0.9)model.compile(loss=yolo_loss, optimizer=sgd)checkpoint = ModelCheckpoint('/home/zk/Desktop/yolov1/best_weights.hdf5', monitor='val_loss',save_weights_only=True, save_best_only=True)model.fit_generator(train_generator,steps_per_epoch=len(train_generator),epochs=epoch,validation_data=validation_generator,validation_steps=len(validation_generator),callbacks=[checkpoint])model.save_weights(output_name)

主函数调用:

import read_data_path as rp
import numpy as np
import cv2
import train as tr
from train import SequenceData
import yolo_loss
import tiny_yolov1_modelimport osos.environ["CUDA_VISIBLE_DEVICES"] = "0"class_dictionary = {'aeroplane': 0, 'bicycle': 1, 'bird': 2, 'boat': 3, 'bottle': 4, 'bus': 5,'car': 6, 'cat': 7, 'chair': 8, 'cow': 9, 'diningtable': 10, 'dog': 11,'horse': 12, 'motorbike': 13, 'person': 14, 'pottedplant': 15, 'sheep': 16,'sofa': 17, 'train': 18, 'tvmonitor': 19}
class_list = list(class_dictionary.keys())if __name__ == "__main__":train_x, train_y, val_x, val_y, test_x, test_y = rp.make_data()train_generator = SequenceData(train_x, train_y, 32)validation_generator = SequenceData(val_x, val_y, 32)# tr.train_network(train_generator, validation_generator, epoch=5)# tr.load_network_then_train(train_generator, validation_generator, epoch=10,#                            input_name='first_weights.hdf5', output_name='second_weights.hdf5')# tr.load_network_then_train(train_generator, validation_generator, epoch=30,#                            input_name='second_weights.hdf5', output_name='third_weights.hdf5')# tr.load_network_then_train(train_generator, validation_generator, epoch=500,#                            input_name='third_weights.hdf5', output_name='fourth_weights.hdf5')for i in range(len(test_x)-100, len(test_x)-90):img1 = cv2.imread(test_x[i])size = img1.shapeimg2 = img1 / 255img3 = cv2.resize(img2, (448, 448), interpolation=cv2.INTER_AREA)img4 = img3[np.newaxis, :, :, :]model = tiny_yolov1_model.create_network()model.compile(loss=yolo_loss, optimizer='adam')model.load_weights('fourth_weights.hdf5')pre = model.predict(img4)pre1 = pre[0]candidate = []for j in range(7):for k in range(7):pre1[j, k, 22] = pre1[j, k, 22] * 448 / 7 + k * 448 / 7pre1[j, k, 23] = pre1[j, k, 23] * 448 / 7 + j * 448 / 7pre1[j, k, 24] = pre1[j, k, 24] * 448pre1[j, k, 25] = pre1[j, k, 25] * 448pre1[j, k, 26] = pre1[j, k, 26] * 448 / 7 + k * 448 / 7pre1[j, k, 27] = pre1[j, k, 27] * 448 / 7 + j * 448 / 7pre1[j, k, 28] = pre1[j, k, 28] * 448pre1[j, k, 29] = pre1[j, k, 29] * 448if pre1[j, k, 20] > 0.5 or pre1[j, k, 21] > 0.5:if pre1[j, k, 20] > pre1[j, k, 21]:x1 = pre1[j, k, 22] - pre1[j, k, 24] / 2y1 = pre1[j, k, 23] - pre1[j, k, 25] / 2x2 = pre1[j, k, 22] + pre1[j, k, 24] / 2y2 = pre1[j, k, 23] + pre1[j, k, 25] / 2category = np.argmax(pre1[j, k, 0:20])confidence = pre1[j, k, 20] * np.max(pre1[j, k, 0:20])x1 = x1 / 448 * size[1]y1 = y1 / 448 * size[0]x2 = x2 / 448 * size[1]y2 = y2 / 448 * size[0]candidate.append([x1, y1, x2, y2, category, confidence])else:x1 = pre1[j, k, 26] - pre1[j, k, 28] / 2y1 = pre1[j, k, 27] - pre1[j, k, 29] / 2x2 = pre1[j, k, 26] + pre1[j, k, 28] / 2y2 = pre1[j, k, 27] + pre1[j, k, 29] / 2category = np.argmax(pre1[j, k, 0:20])confidence = pre1[j, k, 21] * np.max(pre1[j, k, 0:20])x1 = x1 / 448 * size[1]y1 = y1 / 448 * size[0]x2 = x2 / 448 * size[1]y2 = y2 / 448 * size[0]candidate.append([x1, y1, x2, y2, category, confidence])candidate = np.array(candidate)for num in range(len(candidate)):a1 = int(candidate[num, 0])b1 = int(candidate[num, 1])a2 = int(candidate[num, 2])b2 = int(candidate[num, 3])index = int(candidate[num, 4])pre_class = class_list[index]confidence = str(candidate[num, 5])cv2.rectangle(img1, (a1, b1), (a2, b2), (0, 0, 255), 2)cv2.putText(img1, pre_class, (a1, b1), 1, 1, (0, 0, 255))cv2.putText(img1, confidence, (a1, b2), 1, 1, (0, 0, 255))cv2.namedWindow("Image")cv2.imshow("Image", img1)cv2.waitKey(0)cv2.imwrite('/home/zk/Desktop/yolov1/demo/' + str(i) + '.jpg', img1)

六、相关链接

如果代码跑不通,或者想直接使用训练好的模型,可以去下载项目链接:
https://blog.csdn.net/Twilight737

这篇关于Tiny_Yolov1_VOC2007目标检测的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/943942

相关文章

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.

[数据集][目标检测]血细胞检测数据集VOC+YOLO格式2757张4类别

数据集格式:Pascal VOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2757 标注数量(xml文件个数):2757 标注数量(txt文件个数):2757 标注类别数:4 标注类别名称:["Platelets","RBC","WBC","sickle cell"] 每个类别标注的框数:

Temu官方宣导务必将所有的点位材料进行检测-RSL资质检测

关于饰品类产品合规问题宣导: 产品法规RSL要求 RSL测试是根据REACH法规及附录17的要求进行测试。REACH法规是欧洲一项重要的法规,其中包含许多对化学物质进行限制的规定和高度关注物质。 为了确保珠宝首饰的安全性,欧盟REACH法规规定,珠宝首饰上架各大电商平台前必须进行RSLReport(欧盟禁限用化学物质检测报告)资质认证,以确保产品不含对人体有害的化学物质。 RSL-铅,

YOLOv8/v10+DeepSORT多目标车辆跟踪(车辆检测/跟踪/车辆计数/测速/禁停区域/绘制进出线/绘制禁停区域/车道车辆统计)

01:YOLOv8 + DeepSort 车辆跟踪 该项目利用YOLOv8作为目标检测模型,DeepSort用于多目标跟踪。YOLOv8负责从视频帧中检测出车辆的位置,而DeepSort则负责关联这些检测结果,从而实现车辆的持续跟踪。这种组合使得系统能够在视频流中准确地识别并跟随特定车辆。 02:YOLOv8 + DeepSort 车辆跟踪 + 任意绘制进出线 在此基础上增加了用户

独立按键单击检测(延时消抖+定时器扫描)

目录 独立按键简介 按键抖动 模块接线 延时消抖 Key.h Key.c 定时器扫描按键代码 Key.h Key.c main.c 思考  MultiButton按键驱动 独立按键简介 ​ 轻触按键相当于一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通与断开。  ​ 按键抖动 由于按键内部使用的是机