当前位置: 首页 > news >正文

9月2日目标检测学习笔记——自然场景下文本检测

文章目录

  • 前言
  • 一、ICDAR 数据集
    • 1、数据标注格式
  • 二、EAST 模型
    • 1、参数修改
    • 2、模型测试
  • 三、MTCNN
    • 1、LFPW 数据打包
    • 2、模型训练
    • 3、模型测试


前言

本文为9月2日目标检测学习笔记——自然场景下文本检测,分为三个章节:

  • ICDAR 数据集;
  • EAST 模型;
  • MTCNN 模型。

一、ICDAR 数据集

1、数据标注格式

1

  • 左边:原图;
  • 中间:标注的图像;
  • 右边:ground truth 文件内容,按顺时针顺序的坐标,最后是 words;
  • ###:don’t care。

二、EAST 模型

  • 使用 FCN 生成多尺度融合的特征图;
  • 支持旋转矩形框;

网络结构:

2

1、参数修改

  • multigpu_train.py:
tf.app.flags.DEFINE_integer('input_size', 512, '')
tf.app.flags.DEFINE_integer('batch_size_per_gpu', 2, '')
tf.app.flags.DEFINE_integer('num_readers', 1, '')
tf.app.flags.DEFINE_float('learning_rate', 0.0001, '')
tf.app.flags.DEFINE_integer('max_steps', 100000, '')
tf.app.flags.DEFINE_float('moving_average_decay', 0.997, '')
tf.app.flags.DEFINE_string('gpu_list', '0', '')
tf.app.flags.DEFINE_string('checkpoint_path', '/tmp/east_resnet_v1_50_rbox/', '')
tf.app.flags.DEFINE_boolean('restore', False, 'whether to resotre from checkpoint')
tf.app.flags.DEFINE_integer('save_checkpoint_steps', 1000, '')
tf.app.flags.DEFINE_integer('save_summary_steps', 100, '')
tf.app.flags.DEFINE_string('pretrained_model_path', None, '')

2、模型测试

  • eval.py:
tf.app.flags.DEFINE_string('test_data_path', './test/', '')
tf.app.flags.DEFINE_string('gpu_list', '0', '')
tf.app.flags.DEFINE_string('checkpoint_path', './model/', '')
tf.app.flags.DEFINE_string('output_dir', './out/', '')
tf.app.flags.DEFINE_bool('no_write_images', False, 'do not write images')

三、MTCNN

3

  • Stage 1:proposal net;
  • Stage 2:refine net;
  • Stage 3:output net。

1、LFPW 数据打包

数据划分:

  • Negative:非人脸;

  • Positive:人脸;

  • Part faces:部分人脸;

  • gen_12net_data.py:

anno_file = "wider_face_train.txt"
im_dir = "../../DATA/WIDER_train/images"
pos_save_dir = "../../DATA/12/positive"
part_save_dir = "../../DATA/12/part"
neg_save_dir = '../../DATA/12/negative'
save_dir = "../../DATA/12"
  • gen_landmark_aug_12.py:
dstdir = "../../DATA/12/train_PNet_landmark_aug"
    OUTPUT = '../../DATA/12'
    data_path = '../../DATA'
    if not exists(OUTPUT):
        os.mkdir(OUTPUT)
    if not exists(dstdir):
        os.mkdir(dstdir)
    assert (exists(dstdir) and exists(OUTPUT))
    # train data
    net = "PNet"
    #the file contains the names of all the landmark training data
    train_txt = "trainImageList.txt"
    imgs,landmarks = GenerateData(train_txt,data_path,net,argument=True )

2、模型训练

  • P-Net:
#data path
    base_dir = '../../DATA/imglists/PNet'
    model_name = 'MTCNN'
    #model_path = '../data/%s_model/PNet/PNet' % model_name
    #with landmark
    model_path = '../data/%s_model/PNet_landmark/PNet' % model_name
            
    prefix = model_path
    end_epoch = 30
    display = 100
    lr = 0.001
    train_PNet(base_dir, prefix, end_epoch, display, lr)
  • R-Net:
    base_dir = '../../DATA/imglists_noLM/RNet'

    model_name = 'MTCNN'
    model_path = '../data/%s_model/RNet_No_Landmark/RNet' % model_name
    prefix = model_path
    end_epoch = 22
    display = 100
    lr = 0.001
    train_RNet(base_dir, prefix, end_epoch, display, lr)
  • O-Net:
base_dir = '../../DATA/imglists/ONet'

    model_name = 'MTCNN'
    model_path = '../data/%s_model/ONet_landmark/ONet' % model_name
    prefix = model_path
    end_epoch = 22
    display = 10
    lr = 0.001
    train_ONet(base_dir, prefix, end_epoch, display, lr)

3、模型测试

#coding:utf-8
import sys
sys.path.append('..')
from Detection.MtcnnDetector import MtcnnDetector
from Detection.detector import Detector
from Detection.fcn_detector import FcnDetector
from Detection.train_models import P_Net, R_Net, O_Net
from prepare_data.loader import TestLoader
import cv2
import os
import numpy as np
test_mode = "PNet"
thresh = [0.6, 0.7, 0.7]
min_face_size = 20
stride = 2
slide_window = False
shuffle = False
detectors = [None, None, None]
prefix = ['../data/MTCNN_model/PNet_No_landmark/PNet', '../data/MTCNN_model/RNet_landmark/RNet', '../data/MTCNN_model/ONet_landmark/ONet']
epoch = [30, 14, 16]
batch_size = [2048, 64, 16]
model_path = ['%s-%s' % (x, y) for x, y in zip(prefix, epoch)]
# load pnet model
if slide_window:
    PNet = Detector(P_Net, 12, batch_size[0], model_path[0])
else:
    PNet = FcnDetector(P_Net, model_path[0])
detectors[0] = PNet

# load rnet model
if test_mode in ["RNet", "ONet"]:
    RNet = Detector(R_Net, 24, batch_size[1], model_path[1])
    detectors[1] = RNet

# load onet model
if test_mode == "ONet":
    ONet = Detector(O_Net, 48, batch_size[2], model_path[2])
    detectors[2] = ONet

mtcnn_detector = MtcnnDetector(detectors=detectors, min_face_size=min_face_size,
                               stride=stride, threshold=thresh, slide_window=slide_window)
gt_imdb = []
#gt_imdb.append("35_Basketball_Basketball_35_515.jpg")
#imdb_ = dict()"
#imdb_['image'] = im_path
#imdb_['label'] = 5
path = "../../DATA/test/lfpw_testImage"
for item in os.listdir(path):
    gt_imdb.append(os.path.join(path,item))
test_data = TestLoader(gt_imdb)

all_boxes,landmarks = mtcnn_detector.detect_face(test_data)

count = 0
for imagepath in gt_imdb:
    print(imagepath)
    image = cv2.imread(imagepath)
    for bbox in all_boxes[count]:
        cv2.putText(image,str(np.round(bbox[4],2)),(int(bbox[0]),int(bbox[1])),cv2.FONT_HERSHEY_TRIPLEX,1,color=(255,0,255))
        cv2.rectangle(image, (int(bbox[0]),int(bbox[1])),(int(bbox[2]),int(bbox[3])),(0,0,255))

    '''
        for landmark in landmarks[count]:

        for i in range(len(landmark)//2):
            cv2.circle(image, (int(landmark[2*i]),int(int(landmark[2*i+1]))), 3, (0,0,255))
    '''
    
    count = count + 1
    #cv2.imwrite("result_landmark/%d.png" %(count),image)
    cv2.imshow("lala",image)
    cv2.waitKey(0)    

'''
for data in test_data:
    print type(data)
    for bbox in all_boxes[0]:
        print bbox
        print (int(bbox[0]),int(bbox[1]))
        cv2.rectangle(data, (int(bbox[0]),int(bbox[1])),(int(bbox[2]),int(bbox[3])),(0,0,255))
    #print data
    cv2.imshow("lala",data)
    cv2.waitKey(0)
'''

相关文章:

  • 易基因技术推介|植物内生菌宏基因组研究
  • 基于springboot+vue的游戏交流论坛系统 elementui
  • 【目标检测算法】YOLO-V1~V3原理梳理
  • 【Kafka】Docker安装kafka、搭建kafka集群
  • 4.【Linux虚拟机】创建自己的docker image并提供后端服务
  • 基于STFT和卷积神经网络的时序数据分类 代码+数据 可直接运行
  • 神经网络建模的适用范围,神经网络建模流程详解
  • 实名核验类API推荐
  • cmakelist.txt , cmake, makefile, make 【超快区分理解】
  • 【去雾论文阅读】Saturation Based Iterative Approach for Single Image Dehazing
  • 机器学习:详细推导序列最小优化SMO算法+Python实现
  • Flask 学习-20. route 路由中的 endpoint 参数
  • bp神经网络反向传播推导,bp神经网络的传递函数
  • Flask 学习-21. 项目配置通过.env环境变量启动开发/生产环境
  • 图像识别和机器视觉区别,比较两幅图像的相似度
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • Akka系列(七):Actor持久化之Akka persistence
  • Angular4 模板式表单用法以及验证
  • Hibernate最全面试题
  • Java 23种设计模式 之单例模式 7种实现方式
  • Redis 懒删除(lazy free)简史
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • select2 取值 遍历 设置默认值
  • Shadow DOM 内部构造及如何构建独立组件
  • sublime配置文件
  • ucore操作系统实验笔记 - 重新理解中断
  • ViewService——一种保证客户端与服务端同步的方法
  • vuex 笔记整理
  • 订阅Forge Viewer所有的事件
  • 经典排序算法及其 Java 实现
  • 聊聊redis的数据结构的应用
  • 微信小程序填坑清单
  • 智能网联汽车信息安全
  • 大数据全解:定义、价值及挑战
  • ​VRRP 虚拟路由冗余协议(华为)
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • (06)金属布线——为半导体注入生命的连接
  • (1)(1.9) MSP (version 4.2)
  • (1)常见O(n^2)排序算法解析
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (附源码)ssm码农论坛 毕业设计 231126
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (十八)三元表达式和列表解析
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转)母版页和相对路径
  • .cn根服务器被攻击之后
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NET导入Excel数据
  • .NET项目中存在多个web.config文件时的加载顺序
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • [20180129]bash显示path环境变量.txt
  • [30期] 我的学习方法
  • [Bugku]密码???[writeup]
  • [BZOJ 4598][Sdoi2016]模式字符串