作者 |Md. Mubasir
编译 |VK
起源 |Towards Data Science
在 1957 年以前,地球上只有一颗人造卫星:月球。1957 年 10 月 4 日,苏联发射了世界上第一颗人造卫星。从那时起,来自 40 多个国家大概有 8900 颗卫星发射升空。
这些卫星帮忙咱们进行监督、通信、导航等等。这些国家还利用卫星监督另一个国家的土地及其动向,预计其经济和实力。然而,所有的国家都相互瞒哄他们的信息。
同样,寰球石油市场也并非齐全通明。简直所有的产油国都致力暗藏本人的总产量、消费量和储存量。各国这样做是为了间接地向外界瞒哄其理论经济,并加强其国防零碎的能力。这种做法可能会对其余国家造成威逼。
出于这个起因,许多初创公司,如 Planet 和 Orbital Insight,都通过卫星图像来关注各国的此类流动。Thye 收集储油罐的卫星图像并估算储量。
但问题是,如何仅凭卫星图像来预计储油罐的体积?好吧,只有当储油罐存在浮顶油罐时才有可能。这种非凡类型的油罐是专门为贮存大量石油产品而设计的,如原油或凝析油。它由顶盖组成,它间接位于油的顶部,随着油箱中油量的减少或降落,并在其四周造成两个暗影。如下图所示,暗影位于北侧
(内部暗影)是指储罐的总高度,而储罐内的暗影 (外部暗影) 示意浮顶的深度。体积预计为 1 -(外部暗影区域 / 内部暗影区域)。
在本博客中,咱们将应用 Tensorflow2.x 框架,在卫星图像的帮忙下,应用 python 从零开始实现一个残缺的模型来预计储油罐的占用量。
GitHub 仓库
本文的所有内容和整个代码都能够在这个 github 存储库中找到
https://github.com/mdmub0587/…
以下是本博客目录。咱们会逐个摸索。
目录
- 问题陈说、数据集和评估指标
- 现有办法
- 相干钻研工作
- 有用的博客和钻研论文
- 咱们的奉献
- 探索性数据分析(EDA)
- 数据裁减
- 数据预处理、裁减和 TFRecords
- 基于 YoloV3 的指标检测
- 储量估算
- 后果
- 论断
- 今后的工作
- 参考援用
1. 问题陈说、数据集和评估指标
问题陈说:
浮顶油罐的检测和储油量的估算。而后将图像块重新组合成具备储油量预计的全图像。
数据集:
数据集链接:https://www.kaggle.com/toward…
该数据集蕴含一个带正文的边界框,卫星图像是从谷歌地球 (google earth) 拍摄的,它蕴含有世界各地的工业区。数据集中有 2 个文件夹和 3 个文件。让咱们逐个看看。
- large_images: 这是一个文件夹,蕴含 100 个卫星原始图像,每个大小为 4800×4800。所有图像都以 id_large.jpg 格局命名。
- Image_patches: Image_patches 目录蕴含从大图像生成的 512×512 大小的子图。每个大的图像被宰割成 100, 512×512 大小的子图,两个轴上的子图之间有 37 个像素的重叠。生成图像子图的程序以 id_row_column.jpg 格局命名
- labels.json:它蕴含所有图像的标签。标签存储为字典列表,每个图像对应一个字典。不蕴含任何浮顶罐的图像将被标记为“skip”。边界框标签的格局为边界框四个角的 (x,y) 坐标。
- labels_coco.json: 它蕴含与前一个文件雷同的标签,转换为 COCO 标签格局。在这里,边界框的格局为[x_min, y_min, width, height].
- large_image_data.csv:它蕴含无关大型图像文件的元数据,包含每个图像的核心坐标和海拔高度。
评估指标:
对于储油罐的检测,咱们将应用每种储油罐的均匀精度 (Average Precision,AP) 和各种储油罐的 mAP(Mean Average Precision,均匀精度)。浮顶罐的预计容积没有度量规范。
mAP 是指标检测模型的规范评估指标。mAP 的具体阐明能够在上面的 youtube 播放列表中找到
https://www.youtube.com/watch…
2. 现有办法
Karl Keyer [1]在他的存储库中应用 RetinaNet 来实现储油罐探测工作。他从头开始创立模型,并将生成的锚框利用于该数据集。这使得浮顶罐的均匀精度 (AP) 达到 76.3%。而后他利用暗影加强和像素阈值法来计算它的体积。
据我所知,这是互联网上惟一可用的办法。
3. 相干钻研工作
Estimating the Volume of Oil Tanks Based on High-Resolution Remote Sensing Images [2]:
这篇文章提出了一种基于卫星图像的油罐容量 / 容积估算办法。为了计算一个储油罐的总容积,他们须要储油罐的高度和半径。为了计算高度,他们应用了与投影暗影长度的几何关系。然而计算暗影的长度并不容易。为了突出暗影应用 HSV(即色调饱和度值)色彩空间,因为通常暗影在 HSV 色彩空间中具备高饱和度。而后采纳基于亚像素细分定位(sub-pixel subdivision positioning)的中值法计算暗影长度。最初利用 Hough 变换算法失去油罐半径。
在本文的相干工作中,提出了基于卫星图像的建筑物高度计算方法。
4. 有用的博客和钻研论文
A Beginner’s Guide To Calculating Oil Storage Tank Occupancy With Help Of Satellite Imagery [3]:
本博客作者为 TankerTracker.com。其中一项服务是利用卫星图像跟踪几个感兴趣的地理位置关注点的原油贮存状况。
在这篇博客中,他们详细描述了储油罐的内部和外部暗影如何帮忙咱们预计其中的石油含量。还比拟了卫星在特定工夫和一个月后拍摄的图像,显示了一个月来储油罐的变动。这个博客给了咱们一个直观的常识,即如何估计量。
A Gentle Introduction to Object Recognition With Deep Learning [4] :
本文介绍了对象检测初学者头脑中呈现的最令人困惑的概念。首先,形容了指标分类、指标定位、指标辨认和指标检测之间的区别。而后探讨了一些最新的深度学习算法来开展指标辨认工作。
对象分类是指将标签调配给蕴含单个对象的图像。而对象定位是指在图像中的一个或多个对象四周绘制一个边界框。指标检测工作联合了指标分类和定位。这意味着这是一个更具挑战性 / 简单的工作,首先通过本地化技术在感兴趣对象 (OI) 四周绘制一个边界框,而后借助分类为每个 OI 调配一个标签。指标辨认只是上述所有工作的汇合(即分类、定位和检测)。
最初,探讨了两种次要的指标检测算法 / 模型:Region-Based Convolutional Neural Networks (R-CNN)和 You Only Look Once (YOLO)。
Selective Search for Object Recognition [5]:
在指标检测工作中,最要害的局部是指标定位,因为指标分类是在此基础上进行的。该分类依赖于定位所提出的感兴趣区域(简称区域倡议)。更完满的定位将导致更完满的指标检测。选择性搜寻是一种新兴的算法,在一些物体辨认模型中被用于物体定位,如 R -CNN 和 Fast-R-CNN。
该算法首先应用高效的基于图的图像宰割办法生成输出图像的子段,而后应用贪心算法将较小的类似区域合并为较大的类似区域。分段相似性基于色彩、纹理、大小和填充四个属性。
Region Proposal Network — A detailed view[6]:
RPN(Region-proposition Network)因为其比传统的选择性搜索算法更快而被宽泛地利用于指标定位。它从特色地图中学习指标的最佳地位,就像 CNN 从特色图中学习分类一样。
它负责三个次要工作,首先生成锚定框(每个特色映射点生成 9 个不同形态的锚定框),而后将每个锚定框分类为前景或背景(即是否蕴含对象),最初学习锚定框的形态偏移量以使其适宜对象。
Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks[7]:
Faster R-CNN 模型解决了前两个相干模型 (R-CNN 和 Fast R-CNN) 的所有问题,并应用 RPN 作为区域倡议生成器。它的架构与 Fast R-CNN 完全相同,只是它应用了 RPN 而不是选择性搜寻,这使得它比 Fast R-CNN 快 34 倍。
Real-time Object Detection with YOLO, YOLOv2, and now YOLOv3 [8]:
在介绍 Yolo 系列模型之前,让咱们先看一下它的首席研究员约瑟夫·雷德曼在 Ted 演讲上的演讲。
https://youtu.be/Cgxsv1riJhI
这个模型在对象检测模型列表中占据首位的起因有很多。然而,最次要的起因是它的牢固性。它的推理工夫十分短,这就是为什么它很容易匹配视频的失常速度 (即 25fps) 并利用于实时数据的起因。
与其余对象检测模型不同,Yolo 模型具备以下个性。
- 单神经网络模型(即分类和定位工作都将从同一个模型中执行):以一张照片作为输出,间接预测每个边界框的边界框和类标签,这意味着它只看一次图像。
- 因为它对整个图像而不是图像的一部分执行卷积,因而它产生的背景谬误非常少。
- YOLO 学习对象的一般化示意。在对天然图像进行训练和艺术品测试时,YOLO 的性能远远超过 DPM 和 R -CNN 等顶级检测办法。因为 YOLO 具备高度的通用性,所以当利用于新的域或意外的输出时,它不太可能解体。
是什么让 YoloV3 比 Yolov2 更好。
- 如果你认真看一下 yolov2 论文的题目,那就是“YOLO9000: Better, Faster, Stronger”。yolov3 比 yolov2 好得多吗?好吧,答案是必定的,它更好,但不是更快更强,因为体系的复杂性减少了。
- Yolov2 应用了 19 层 DarkNet 架构,没有任何残差块、skip 连贯和上采样,因而它很难检测到小对象。然而,在 Yolov3 中,这些个性被增加,并且应用了在 Imagenet 上训练的 53 层 DarkNet 网络。除此之外,还沉积了 53 个卷积层,造成了 106 个卷积层构造。
- Yolov3 在三种不同的尺度上进行预测,首先是大对象的 13X13 网格,其次是中等对象的 26X26 网格,最初是小对象的 52X52 网格。
- YoloV3 总共应用 9 个锚箱,每个标度 3 个。用 K 均值聚类法选出最佳锚盒。
- Yolov3 当初对图像中检测到的对象执行多标签分类。通过 logistic 回归预测对象置信度和类预测。
5. 咱们的奉献
咱们的问题陈说包含两个工作,第一个是浮顶罐的检测,另一个是暗影的提取和已辨认罐容积的预计。第一个工作是基于指标检测,第二个工作是基于计算机视觉技术。让咱们形容一下解决每个工作的办法。
储罐检测:
咱们的指标是估算浮顶罐的容积。咱们能够为一个类建设指标检测模型,然而为了缩小一个模型与另一种储油罐 (即其余类型储油罐) 的混同,并使其具备鲁棒性,咱们提出了三个类别的指标检测模型。应用带有转移学习的 YoloV3 进行指标检测是因为它更容易在机器上训练。此外,为了进步度量分值,还采纳了数据加强的办法。
暗影提取和体积预计:
暗影提取波及许多计算机视觉技术。因为 RGB 色彩计划对暗影不敏感,必须先将其转换成 HSV 和 LAB 色彩空间。咱们应用 (l1+l3)/(V+1)(其中 l1 是 LAB 色彩空间的第一个通道值) 的比值图像来加强暗影局部。
而后,通过阈值 0.5×t1+0.4×t2(其中 t1 是最小像素值,t2 是平均值)来过滤加强图像。而后对阈值图像进行形态学解决(即去除噪声、清晰轮廓等)。
最初,提取出两个储油罐的暗影轮廓,而后根据上述公式估算出所占用的体积。这些想法摘自以下 Notebook。
https://www.kaggle.com/toward…
遵循整个流程来解决这个案例钻研如下所示。
让咱们从数据集的探索性数据分析 EDA 开始!!
6. 探索性数据分析(EDA)
摸索 Labels.json 文件:
json_labels = json.load(open(os.path.join('data','labels.json')))
print('Number of Images:',len(json_labels))
json_labels[25:30]
所有的标签都存储在字典列表中。总共有 10 万张图片。不蕴含任何储罐的图像将标记为 Skip,而蕴含储罐的图像将标记为 tank、tank Cluster 或 Floating Head tank。每个 tank 对象都有字典格局的四个角点的边界框坐标。
计数:
在 10K 个图像中,8187 个图像没有标签(即它们不蕴含任何储油罐对象)。此外,有 81 个图像蕴含至多一个储油罐簇对象,1595 个图像蕴含至多一个浮顶储油罐。
在条形图中,能够察看到,在蕴含图像的 1595 个浮顶罐中,26.45% 的图像仅蕴含一个浮顶罐对象。单个图像中浮顶储罐对象的最高数量为 34。
摸索 labels_coco.json 文件:
json_labels_coco = json.load(open(os.path.join('data','labels_coco.json')))
print('Number of Floating tanks:',len(json_labels_coco['annotations']))
no_unique_img_id = set()
for ann in json_labels_coco['annotations']:
no_unique_img_id.add(ann['image_id'])
print('Number of Images that contains Floating head tank:', len(no_unique_img_id))
json_labels_coco['annotations'][:8]
此文件仅蕴含浮顶罐的边界框及其在字典格局列表中的image_id
打印边界框:
储油罐有三种:
- Tank(T 油罐)
- Tank Cluster(TC 油罐组),
- Floating Head Tank(FHT,浮顶罐)
7. 数据裁减
在 EDA 中,人们察看到 10000 幅图像中有 8171 幅是无用的,因为它们不蕴含任何对象。此外,1595 个图像蕴含至多一个浮顶罐对象。家喻户晓,所有的深度学习模型都须要大量的数据,没有足够的数据会导致性能的降落。
因而,咱们先进行数据裁减,而后将取得的裁减数据拟合到 Yolov3 指标检测模型中。
8. 数据预处理、裁减和 TFRecords
数据预处理:
察看到对象的正文以 Jason 格局给出,其中有 4 个角点。首先,从这些角点提取左上角点和右下角点。接下来,属于单个图像的所有正文及其对应的标签都保留在 CSV 文件的一行列表中。
从角点提取左上角点和右下角点的代码
def conv_bbox(box_dict):
"""
input: box_dict-> 字典中有 4 个角点
Function: 获取左上方和右下方的点
output: tuple(ymin, xmin, ymax, xmax)
"""xs = np.array(list(set([i['x'] for i in box_dict])))
ys = np.array(list(set([i['y'] for i in box_dict])))
x_min = xs.min()
x_max = xs.max()
y_min = ys.min()
y_max = ys.max()
return y_min, x_min, y_max, x_max
CSV 文件将如下所示
为了评估模型,咱们将保留 10% 的图像作为测试集。
# 训练和测试划分
df_train, df_test= model_selection.train_test_split(
df, #CSV 文件正文
test_size=0.1,
random_state=42,
shuffle=True,
)
df_train.shape, df_test.shape
数据裁减:
咱们晓得指标检测须要大量的数据,然而咱们只有 1645 幅图像用于训练,这是非常少的。为了减少数据,咱们必须执行数据裁减。在此过程中,通过翻转和旋转原始图像生成新图像。咱们转到上面的 GitHub 存储库,从中提取代码进行裁减
https://blog.paperspace.com/d…
通过执行以下操作从单个原始图像生成 7 个新图像:
- 程度翻转
- 旋转 90 度
- 旋转 180 度
- 旋转 270 度
- 程度翻转和 90 度旋转
- 程度翻转和 180 度旋转
- 程度翻转和 270 度旋转
示例如下所示
TFRecords:
TFRecords 是 TensorFlow 本人的二进制存储格局。当数据集太大时,它通常很有用。它以二进制格局存储数据,并对训练模型的性能产生显著影响。二进制数据复制所需的工夫更少,而且因为在训练时只加载了一个 batch 数据,所以占用的空间也更少。你能够在上面的博客中找到它的详细描述。
https://medium.com/mostly-ai/…
也能够查看上面的 Tensorflow 文档。
https://www.tensorflow.org/tu…
咱们的数据集已转换成 RFRecords 格局。没有必要执行此工作,因为咱们的数据集不是很大。然而,这是为了常识的目标。如果你感兴趣,能够在我的 GitHub 存储库中找到代码。
9. 基于 YoloV3 的指标检测
训练:
为了训练 yolov3 模型,采纳了迁徙学习。第一步包含加载 DarkNet 网络的权重,并在训练期间解冻它以放弃权重不变。
def create_model():
tf.keras.backend.clear_session()
pret_model = YoloV3(size, channels, classes=80)
load_darknet_weights(pret_model, 'Pretrained_Model/yolov3.weights')
print('\nPretrained Weight Loaded')
model = YoloV3(size, channels, classes=3)
model.get_layer('yolo_darknet').set_weights(pret_model.get_layer('yolo_darknet').get_weights())
print('Yolo DarkNet weight loaded')
freeze_all(model.get_layer('yolo_darknet'))
print('Frozen DarkNet layers')
return model
model = create_model()
model.summary()
咱们应用 adam 优化器 (初始学习率 =0.001) 来训练咱们的模型,并依据 epoch 利用余弦衰减来升高学习速率。在训练过程中应用模型检查点保留最佳权重,训练完结后保留最初一个权重。
tf.keras.backend.clear_session()
epochs = 100
learning_rate=1e-3
optimizer = get_optimizer(
optim_type = 'adam',
learning_rate=1e-3,
decay_type='cosine',
decay_steps=10*600
)
loss = [YoloLoss(yolo_anchors[mask], classes=3) for mask in yolo_anchor_masks]
model = create_model()
model.compile(optimizer=optimizer, loss=loss)
# Tensorbaord
! rm -rf ./logs/
logdir = os.path.join("logs", datetime.datetime.now().strftime("%Y%m%d-%H%M%S"))
%tensorboard --logdir $logdir
tensorboard_callback = tf.keras.callbacks.TensorBoard(logdir, histogram_freq=1)
callbacks = [EarlyStopping(monitor='val_loss', min_delta=0, patience=15, verbose=1),
ModelCheckpoint('Weights/Best_weight.hdf5', verbose=1, save_best_only=True),
tensorboard_callback,
]
history = model.fit(train_dataset,
epochs=epochs,
callbacks=callbacks,
validation_data=valid_dataset)
model.save('Weights/Last_weight.hdf5')
损失函数:
YOLO 损失函数:
Yolov3 模型训练中所用的损失函数相当简单。Yolo 在三个不同的尺度上计算三个不同的损失,并对反向流传进行总结(正如你在下面的代码单元中看到的,最终损失是三个不同损失的列表)。每个 loss 都通过 4 个子函数计算定位损失和分类损失。
- 核心(x,y) 的 MSE 损失.
- 边界框的宽度和高度的均方误差(MSE)
- 边界盒的二元穿插熵得分与无指标得分
- 边界盒多类预测的二元穿插熵或稠密领域穿插熵
让咱们看看 Yolov2 中应用的损失公式
Yolov2 中的最初三项是平方误差,而在 Yolov3 中,它们被穿插熵误差项所取代。换句话说,Yolov3 中的对象置信度和类预测当初通过 logistic 回归进行预测。
看看 Yolov3 损失函数的实现
def YoloLoss(anchors, classes=3, ignore_thresh=0.5):
def yolo_loss(y_true, y_pred):
# 1. 转换所有预测输入
# y_pred: (batch_size, grid, grid, anchors, (x, y, w, h, obj, ...cls))
pred_box, pred_obj, pred_class, pred_xywh = yolo_boxes(y_pred, anchors, classes)
# predicted (tx, ty, tw, th)
pred_xy = pred_xywh[..., 0:2] #x,y of last channel
pred_wh = pred_xywh[..., 2:4] #w,h of last channel
# 2. 转换所有实在输入
# y_true: (batch_size, grid, grid, anchors, (x1, y1, x2, y2, obj, cls))
true_box, true_obj, true_class_idx = tf.split(y_true, (4, 1, 1), axis=-1)
#转换 x1, y1, x2, y2 to x, y, w, h
# x,y = (x2 - x1)/2, (y2-y1)/2
# w, h = (x2- x1), (y2 - y1)
true_xy = (true_box[..., 0:2] + true_box[..., 2:4]) / 2
true_wh = true_box[..., 2:4] - true_box[..., 0:2]
# 小盒子要更高权重
#shape-> (batch_size, grid, grid, anchors)
box_loss_scale = 2 - true_wh[..., 0] * true_wh[..., 1]
# 3. 对 pred box 方程反向
# 把 (bx, by, bw, bh) 变为 (tx, ty, tw, th)
grid_size = tf.shape(y_true)[1]
grid = tf.meshgrid(tf.range(grid_size), tf.range(grid_size))
grid = tf.expand_dims(tf.stack(grid, axis=-1), axis=2)
true_xy = true_xy * tf.cast(grid_size, tf.float32) - tf.cast(grid, tf.float32)
true_wh = tf.math.log(true_wh / anchors)
# 可能有些格的 true_wh 是 0, 用锚点划分可能导致 inf 或 nan
true_wh = tf.where(tf.logical_or(tf.math.is_inf(true_wh),
tf.math.is_nan(true_wh)),
tf.zeros_like(true_wh), true_wh)
# 4. 计算所有掩码
#从张量的形态中去除尺寸为 1 的维度。#obj_mask: (batch_size, grid, grid, anchors)
obj_mask = tf.squeeze(true_obj, -1)
#当 iou 超过临界值时,疏忽假正例
#best_iou: (batch_size, grid, grid, anchors)
best_iou = tf.map_fn(lambda x: tf.reduce_max(broadcast_iou(x[0], tf.boolean_mask(x[1], tf.cast(x[2], tf.bool))), axis=-1),
(pred_box, true_box, obj_mask),
tf.float32)
ignore_mask = tf.cast(best_iou < ignore_thresh, tf.float32)
# 5. 计算所有损失
xy_loss = obj_mask * box_loss_scale * \
tf.reduce_sum(tf.square(true_xy - pred_xy), axis=-1)
wh_loss = obj_mask * box_loss_scale * \
tf.reduce_sum(tf.square(true_wh - pred_wh), axis=-1)
obj_loss = binary_crossentropy(true_obj, pred_obj)
obj_loss = obj_mask * obj_loss + \
(1 - obj_mask) * ignore_mask * obj_loss
#TODO: 应用 binary_crossentropy 代替
class_loss = obj_mask * sparse_categorical_crossentropy(true_class_idx, pred_class)
# 6. 在 (batch, gridx, gridy, anchors) 求和失去 => (batch, 1)
xy_loss = tf.reduce_sum(xy_loss, axis=(1, 2, 3))
wh_loss = tf.reduce_sum(wh_loss, axis=(1, 2, 3))
obj_loss = tf.reduce_sum(obj_loss, axis=(1, 2, 3))
class_loss = tf.reduce_sum(class_loss, axis=(1, 2, 3))
return xy_loss + wh_loss + obj_loss + class_loss
return yolo_loss
分数:
为了评估咱们的模型,咱们应用了 AP 和 mAP 评估训练和测试数据
测试集分数
get_mAP(model, 'data/test.csv')
训练集分数
get_mAP(model, 'data/train.csv')
推理:
让咱们看看这个模型是如何执行的
10. 储量估算
体积估算是本案例钻研的最终后果。没有评估预计容积的规范。然而,咱们试图找到图像的最佳阈值像素值,以便可能在很大水平上检测暗影区域(通过计算像素数)。
咱们将应用卫星拍摄到的 4800X4800 形态的大图像,并将其宰割成 100 个 512×512 的子图,两个轴上的子图之间重叠 37 像素。图像修补程序在 id_row_column.jpg 命名。
每个生成的子图的预测都将存储在一个 CSV 文件中。接下来,预计每个浮顶储油罐的体积(代码和解释以 Notebook 格局在我的 GitHub 存储库中提供)。
最初,将所有的图像块和边界框与标签合并,输入预计的体积,造成一个大的图像。你能够看看上面的例子:
11. 后果
测试集上浮顶罐的 AP 分数为 0.874,训练集上的 AP 分数为 0.942。
12. 论断
- 只需无限的图像就能够失去相当好的后果。
- 数据裁减工作得很到位。
- 在本例中,与 RetinaNet 模型的现有办法相比,yolov3 体现得很好。
13. 今后的工作
- 浮顶罐的 AP 值为 87.4%,得分较高。然而,咱们能够尝试在更大程度上进步分数。
- 咱们将尝试生成的更多数据来训练这个模型。
- 咱们将尝试训练另一个更准确的模型,如 yolov4,yolov5(非官方)。
14. 参考援用
[1] Oil-Tank-Volume-Estimation, by Karl Heyer, Nov 2019.(https://github.com/kheyer/Oil…)
[2] Estimating the Volume of Oil Tanks Based on High-Resolution Remote Sensing Images by Tong Wang, Ying Li, Shengtao Yu, and Yu Liu, April 2019.(https://www.researchgate.net/…)
[3] A Beginner’s Guide To Calculating Oil Storage Tank Occupancy With Help Of Satellite Imagery by TankerTrackers.com, Sep 2017.(https://medium.com/planet-sto…)
[4] A Gentle Introduction to Object Recognition With Deep Learning by https://machinelearningmaster… May 2019.(https://machinelearningmaster…)
[5] Selective Search for Object Recognition by J.R.R. Uijlings at el. 2012(http://www.huppelen.nl/public…)
[6] Region Proposal Network — A detailed view by Sambasivarao. K, Dec 2019(https://towardsdatascience.co…)
[7] Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks by Ross Girshick et al. Jan 2016.(https://arxiv.org/abs/1506.01497)
[8] Real-time Object Detection with YOLO, YOLOv2 and now YOLOv3 by Joseph Redmon, 2015–2018(https://arxiv.org/abs/1506.02640,https://arxiv.org/abs/1612.08242,https://arxiv.org/abs/1804.02767)
原文链接:https://towardsdatascience.co…
欢送关注磐创 AI 博客站:
http://panchuang.net/
sklearn 机器学习中文官网文档:
http://sklearn123.com/
欢送关注磐创博客资源汇总站:
http://docs.panchuang.net/