工作中你老子要用到物体识别,也有用到OCR识别,因为深度摄像头对玻璃和透明物体拿不到深度距离。所以用这种办法来配合获取识别物体坐标。

首先,我需要强调的是,印刷体的汉字OCR识别你直接调用接口AT两家都可以,自己去搜API。

第二,我做的这个是手写体,因为手写比印刷体复杂至少一万倍,所以增加了训练难度。它比caffe2训练mask训练难多了。

第三,老子开始跟你说怎么搞了:

1、准备数据集,去这个网站下载这两个zip文件:

http://www.nlpr.ia.ac.cn/databases/handwriting/Download.html

HWDB1.1trn_gnt.zip

HWDB1.1tst_gnt.zip

其中一个训练集,一个测试集,前者应该是训练,后者测试。

解压完成后,你会发现文件夹乱码,于是,要用convmv这个工具,在两个目录下分别执行

convmv -f GBK -t UTF-8 --notest -r ./

不要把数据集和测试集放在一个文件夹,否则执行完你就傻逼了。

搞好了往下走。

2、把所有图片生成标签txt和lmdb文件。

用两个文件搞定。

biaoqian.py

-------------------------------------------------

#-*-coding:utf-8-*-
import os
 
def IsSubString(SubStrList,Str):
    flag=True
    for substr in SubStrList:
        if not(substr in Str):
            flag=False
    
    return flag
def GetFileList(FindPath,FlagStr=[]):
    FileList=[]
    FileNames=os.listdir(FindPath)
    if len(FileNames)>0:
        for fn in FileNames:
            if len(FlagStr)>0:
                if IsSubString(FlagStr,fn):
                    fullfilename=os.path.join(FindPath,fn)
                    FileList.append(fullfilename)
            else:
                fullfilename=os.path.join(FindPath,fn)
                FileList.append(fullfilename)
    
    if len(FileList)>0:
        FileList.sort()
        
    return FileList
 
 
 
train_txt=open('train.txt','w')
classfile=GetFileList('train/')
for count in range(0,len(classfile)): 
    str_class=classfile[count]
    imgfile=GetFileList(str_class)
    for count_img in range(0,len(imgfile)): 
        str_img=imgfile[count_img]+' '+str(count)+'\n'
    train_txt.writelines(str_img)

train_txt.close()

val_txt=open('val.txt','w')
classfile2=GetFileList('val/')
for count2 in range(0,len(classfile2)): 
    str_class2=classfile2[count2]
    imgfile=GetFileList(str_class2)
    for count_img in range(0,len(imgfile)): 
        str_img2=imgfile[count_img]+' '+str(count2)+'\n'
    val_txt.writelines(str_img2)
val_txt.close()
print("成功生成文件列表")

---------------------------------------

里面细节得自己改。要保证标签和文件夹一一对应。

lmdb文件转化

create_imagenet.sh

-----------------------------------

#!/usr/bin/env sh
# Create the imagenet lmdb inputs
# N.B. set the path to the imagenet train + val data dirs
set -e
 
 
EXAMPLE=/home/victor/caffe/My_Files/Build_lmdb/      #生成模型训练数据文件夹,即create_imagenet.sh所在文件夹
DATA=/home/victor/dataset/            #python脚本处理数据路径,即生成的文件列表.txt文件所在文件夹
TOOLS=/home/victor/caffe/build/tools/              #caffe的工具库,不用更改
 
TRAIN_DATA_ROOT=/home/victor/dataset/    #待处理的训练数据
VAL_DATA_ROOT=/home/victor/dataset/     #待处理的验证数据
# Set RESIZE=true to resize the images to 256x256. Leave as false if images have
# already been resized using another tool.
RESIZE=true  #是否需要对图片进行resize
if $RESIZE; then
  RESIZE_HEIGHT=256
  RESIZE_WIDTH=256
else
  RESIZE_HEIGHT=0
  RESIZE_WIDTH=0
fi
if [ ! -d "$TRAIN_DATA_ROOT" ]; then
  echo "Error: TRAIN_DATA_ROOT is not a path to a directory: $TRAIN_DATA_ROOT"
  echo "Set the TRAIN_DATA_ROOT variable in create_imagenet.sh to the path" \
       "where the ImageNet training data is stored."
  exit 1
fi
if [ ! -d "$VAL_DATA_ROOT" ]; then
  echo "Error: VAL_DATA_ROOT is not a path to a directory: $VAL_DATA_ROOT"
  echo "Set the VAL_DATA_ROOT variable in create_imagenet.sh to the path" \
       "where the ImageNet validation data is stored."
  exit 1
fi
echo "Creating train lmdb..."
rm -rf $EXAMPLE/train_lmdb
rm -rf $EXAMPLE/val_lmdb    #删除已存在的lmdb格式文件,若在已存在lmdb格式的文件夹下再添加lmdb文件,会出现错误
GLOG_logtostderr=1 $TOOLS/convert_imageset \
    --resize_height=$RESIZE_HEIGHT \
    --resize_width=$RESIZE_WIDTH \
    --shuffle \
    $TRAIN_DATA_ROOT \
    $DATA/train.txt \
    $EXAMPLE/train_lmdb
    
echo "Creating val lmdb..."
GLOG_logtostderr=1 $TOOLS/convert_imageset \
    --resize_height=$RESIZE_HEIGHT \
    --resize_width=$RESIZE_WIDTH \
    --shuffle \
    $VAL_DATA_ROOT \
    $DATA/val.txt \
    $EXAMPLE/val_lmdb
   
echo "Done."

---------------------------------------------------------------

以上数据集已经搞定完,请注意convert_imageset是build生成的exe文件。自己搜下看在哪里。

最终你注意了在你的datasets文件夹下面会生成两个txt文件,train.txt,val.txt,分别是图片的路径,再加上了标签的阿拉伯数字。

然后在你的caffe目录下有myfiles/buildlmdb/文件夹里面有两个文件夹,每个文件夹理由两个lmdb文件,其中一个lock比较小。

3、训练开始

接下来要去models/bvlc_googlenet文件下面把3个txt文件都cp到你的My_Files/Build_lmdb/里,然后非常有用。mb,

我告诉你3个文件分别是干哈的:

solver.prototxt这个鸟文件你至少需要调整4个参数:

我也是经过一番尝试才知道的:

第一,改基础学习率,基本要加1个0.

第二,改maxinter,就是至少10000,如果你牛B,改到10万,我也没意见。

第三,改test_iter: ,这个时候你要稍微动点脑子,你去train_val.protxt里面找test下面的batch_size是多少,基本这个算法是你test下面有多少张图片,除以这个batch_size=50,比方说是3667.你就把这个test_iter改成3700.

第四,test_interval: 就是test里面的batch_size

train_val.protxt这个鸟文件你基本改2个地方:

分别是路径

source: "examples/imagenet/ilsvrc12_train_lmdb"换成你自己的????

source: "examples/imagenet/ilsvrc12_val_lmdb"换成你自己的???????????

如果你上环节你都做完了,你执行下面命令

build/tools/caffe train -solver My_Files/Build_lmdb/solver.prototxt。

你看看训练过程的几个参数有没有变化

acuuracy有没有趋向1;

loss有没有下降趋向0;

如果没变化,可能参数要调整。

以上最终训练结果会生成一个文件,

solver_iter_10000.caffemodel,这个文件是你要用它测试图片的模型。

然后你写一个脚本来执行。

建一个preditct文件夹,放几张你要识别的图片,写一个predict.py脚本文件

-----------------------

#!/usr/bin/env python
#-*- coding:utf-8 -*-
import cv2
import numpy as np
import sys
import os 
import caffe
 
def GetFileList(dir, fileList):
    newDir = dir
    if os.path.isfile(dir):
        fileList.append(dir.decode('gbk'))
    elif os.path.isdir(dir):
        for s in os.listdir(dir):
            newDir=os.path.join(dir,s)
            GetFileList(newDir, fileList)
    return fileList
 
 
 
if __name__=='__main__':
    caffe_root='/home/victor/caffe/'
    sys.path.insert(0,caffe_root+'python')
    os.chdir(caffe_root)
 
    net_file='/home/victor/caffe/My_Files/Build_lmdb/deploy.prototxt'
    caffe_model='/home/victor/caffe/My_Files/Build_lmdb/solver_iter_10000.caffemodel'
    mean_file='/home/victor/caffe/My_Files/Build_lmdb/mean.npy'
 
    net=caffe.Net(net_file,caffe_model,caffe.TEST)
    transformer=caffe.io.Transformer({'data':net.blobs['data'].data.shape})
    transformer.set_transpose('data',(2,0,1))
    transformer.set_mean('data',np.load(mean_file).mean(1).mean(1))
    transformer.set_raw_scale('data',225)
    transformer.set_channel_swap('data',(2,1,0))
 
    imagenet_labels_filename='/home/victor/dataset/train.txt'
    labels=np.loadtxt(imagenet_labels_filename,str,delimiter='\t')
 
    MyPicList=GetFileList('/home/victor/caffe/My_Files/Build_lmdb/2',[])
    for imgPath in MyPicList:
        img=caffe.io.load_image(imgPath)
        img=img[...,::-1]
 
        net.blobs['data'].data[...]=transformer.preprocess('data',img)
        out=net.forward()
        top_k=net.blobs['prob'].data[0].flatten().argsort()[-1:-5:-1]
        print('------------------------')
        print(labels[top_k[0]]+'\n')

如果结果预测得正确,说明你的训练模型没问题。我的不正确。不知道哪里出问题了。重新搞文件数据。

caffe 训练手写字体HWDB1.1trn_gnt.zip HWDB1.1tst_gnt.zip并测试完整超详尽攻略相关推荐

  1. Dataset之Handwritten Digits:Handwritten Digits(手写数字图片识别)数据集简介、安装、使用方法之详细攻略

    Dataset之Handwritten Digits:Handwritten Digits(手写数字图片识别)数据集简介.安装.使用方法之详细攻略 目录 Handwritten Digits数据集的简 ...

  2. linux手写数字识别,OpenCV 3.0中的SVM训练 mnist 手写字体识别

    前言: SVM(支持向量机)一种训练分类器的学习方法 mnist 是一个手写字体图像数据库,训练样本有60000个,测试样本有10000个 LibSVM 一个常用的SVM框架 OpenCV3.0 中的 ...

  3. AI基础:KNN与K近邻距离度量说明、利用KNN手写字体识别分类实践

    KNN k近邻 文章目录 KNN算法 K近邻中近邻的距离度量 欧式距离 标准化欧式距离 曼哈顿距离 汉明距离 夹角余弦 杰卡德相似系数 皮尔逊系数 切比雪夫距离 闵可夫斯基距离 马氏距离 巴氏距离 各 ...

  4. 用tensorflow框架和Mnist手写字体,训练cnn模型以及测试一张手写字体

    感想 首先我是首先看了一下莫凡pyhton教程中tensorflow python搭建自己的神经网络教程以及查看了官方的教程TensorFlow中文社区-MNIST进阶教程,这里面只是有简单的测试出来 ...

  5. 【转载】Windows下Tesseract4.0识别与中文手写字体训练

    一 . tesseract 4.0 安装及使用 1. tesseract 4.0 安装 安装包下载地址: http://digi.bib.uni-mannheim.de/tesseract/tesse ...

  6. Windows下Tesseract4.0识别与中文手写字体训练

    一 . tesseract 4.0 安装及使用 1. tesseract 4.0 安装 安装包下载地址: http://digi.bib.uni-mannheim.de/tesseract/tesse ...

  7. 用c语言实现knn算法要有训练集和测试集,KNN算法实战:手写字体识别

    我们已经知道手写字体数据集是一个8×8的矩阵,共有64个特征.让我们看一下K最近邻算法对手写字体数据集处理的效果. 1) 导入相关包 这里我们将用到 datasets 中的手写字体数据,使用 trai ...

  8. Caffe MNIST 手写数字识别(全面流程)

    目录 1.下载MNIST数据集 2.生成MNIST图片训练.验证.测试数据集 3.制作LMDB数据库文件 4.准备LeNet-5网络结构定义模型.prototxt文件 5.准备模型求解配置文件_sol ...

  9. java识别手写文字_神经网络入门 第6章 识别手写字体

    前言 神经网络是一种很特别的解决问题的方法.本书将用最简单易懂的方式与读者一起从最简单开始,一步一步深入了解神经网络的基础算法.本书将尽量避开让人望而生畏的名词和数学概念,通过构造可以运行的Java程 ...

最新文章

  1. 在 vSphere Client(Vcenter 管理中心) 中迁移虚拟机(从一台物理主机迁移到另一台物理主机)
  2. 『设计模式』我就要一个对象,你别给我这么多好不好!---单例模式
  3. linux和GNU之间的关系
  4. SubRenamer – 字幕批量重命名,自动匹配视频文件与字幕文件[Windows]
  5. ubuntu-kylin16.04搭建lamp环境。
  6. 中国双色向滤光镜行业市场供需与战略研究报告
  7. Delphi 与 DirectX 之 DelphiX(93): TDIB.DrawDarken();
  8. BZOJ3531-[Sdoi2014]旅行(树剖+线段树动态开点)
  9. 中级通信工程师证书有什么用
  10. 了解KVM切换器的四种类形
  11. c语言解三色旗问题加注释,三色旗问题(Three
  12. 通信专业考研就业专栏
  13. 中台渐入佳境,云徙科技的有所为与有所不为
  14. 线上引流方法有哪些?怎么做线上引流推广?
  15. 安卓访客模式_如何设置Android访客模式以及为什么要这么做 | MOS86
  16. Pytorch训练速度更快的十七种方法
  17. 华为无线设备配置动态负载均衡
  18. extreme Table 使用
  19. 精品基于Uniapp+SSM实现的安卓的掌上校园系统
  20. 2023 弹幕播放器解析源码

热门文章

  1. 读书清单(2011/01 - 2011/12)
  2. 自动售货机发展优势你了解多少?
  3. pip 下载速度慢,导致报错:pip._vendor.urllib3.exceptions.ReadTimeoutError……
  4. 云可以省钱吗? 这些公司说是
  5. 学习3dmax游戏建模一定要美术基础很高吗?入门游戏模型怎么做
  6. 灯串UL588认证是什么?亚马逊季节性电子装饰产品UL588
  7. 计算机考研复试常问问题 计算机网络篇
  8. 如何用Java实现网络中国象棋室(一)
  9. npm run serve 报“npm ERR! enoent ENOENT: no such file or directory, open ‘C:\Users\XXX\web_page“ 错误
  10. 焊接中的计算机应用,计算机技术在焊接课程中的应用