本来想在网上找一套开源的周报系统,费了好大的劲,基本没找到合适的,于是寻思着,自己开发一套周报系统,该周报系统基于Django框架开发,我认为非常实用,非常适合学生提交周报,实验室,和一些研究团队,现在将源代码分享给大家,希望大家少走弯路

1、效果

编辑周报

我的周报

新增用户

周报管理

用户管理

2、使用

如有使用需求,请在评论区留下你的邮件等联系方式,用你的联系方式发邮件给我,我的邮件:626086048@qq.com,我将判断你是否有合理的要求,和版权使用情况,通过之后我将发给你一个使用下载链接,链接有下载地址和使用说明!

本程序为www.ivdone.top原创内容,版权归www.ivdone.top所有,请不要用作商业用途,仅供个人学习使用,如有问题,请在评论区,留下你咨询的问题和联系方式,以便后续联系和问题解决,谢谢你的支持

0
Posted in 研究, 科技, 算法设计与分析

这是一篇受密码保护的文章,您需要提供访问密码:

0
Posted in 研究, 科技, 算法设计与分析

Tesseract是一个非常著名的OCR开源项目,现在由google在维护,支持上百种语言,现在还在不断的更新中,版本已经到了4.1及以上,这个版本使用的神经网络模型训练的,使用的LSTM网络结构,但是在教程上官方只介绍Ubuntu的使用安装方法,然而在我的CentOS 8 / RHEL 8安装上出现了很多问题,最后我安装成功,现在总结一下安装的全过程,分享给大家,希望大家在评论区给出意见。

1、安装依赖环境

安装相关的依赖环境的库

yum install gcc-c++
yum install zlib-devel
yum install pkg-config
yum install libtool automake autoconf
yum install libjpeg-devel
yum install libpng-devel
yum install libtiff-devel

如果你计划安装训练工具,你需要安装下面的库

这两个库可以用yum工具直接安装

yum install pango pango-devel
yum install cairo cairo-devel

对于libicu-devel这个库,如果直接用yum工具安装,会导致版本过低,最低要求是52.1,我们可以安装52.2的版本,在前面的博客我已经写好了教程,安装52.2版本博客博客链接:Centos源码安装ICU 52.2的libicu-devel 库

安装Leptonica库,这个库我的博客也已经写好了,可以查看我的博客链接:Centos7源码安装Leptonica-17.8库,注意源码安装,Centos7和8是一样的

2、安装Tesseract-OCR 4.1

官方源码下载链接:https://github.com/tesseract-ocr/tesseract/releases/tag/4.1.1

# 官方下载 wget 
wget -c -t 20 https://github.com/tesseract-ocr/tesseract/archive/4.1.1.tar.gz

因为githup是国外的,如果觉得下载有点慢,我已经提前下载好,下载地址:4.1.1.tar.gz

# 本地下载 wget 
wget -c -t 20 https://www.ivdone.top/wordpress/pic/p1559/4.1.1.tar.gz

编译与安装

# 解压
tar -zxvf 4.1.1.tar.gz
cd tesseract-4.1.1/
# 编译与安装
./autogen.sh
./configure --with-extra-includes=/usr/local/include --with-extra-libraries=/usr/local/include
make
make install

查看一下安装结果:

# 查看版本信息
tesseract -v

3、下载并配置训练的语言包,这里以中文为例

官方下载地址(下载tessdata-best):https://tesseract-ocr.github.io/tessdoc/Data-Files.html

官网githup是国外网站,如果下载有点慢的话,本人已经提前下载好,下载地址:chi_sim.traineddata

# 本地wget下载 
wget -c -t 20 https://www.ivdone.top/wordpress/pic/p1559/chi_sim.traineddata

配置traineddata路径的环境变量,并且导出

# 先新建一个目录保存traineddata数据,这个目录自己随意定义
mkdir -p /opt/Tesseract/tessdata
# 编辑profile文件
vi /etc/profile

加入下面的环境变量配置

# 注意这个路径是你自己随意定义的,但是要和上面的新建目录一样
export TESSDATA_PREFIX=/opt/Tesseract/tessdata

保存之后,更新环境变量

source /etc/profile

把我们刚刚下载的语言包移到该目录下

mv chi_sim.traineddata $TESSDATA_PREFIX

4、测试

准备一张中文文字的图片,如下:

上传到服务器,识别命令如下:

# test.jpg是照片的文件名  --oem 1 使能LSTM  -l chi_sim 中文简体
tesseract test.jpg output --oem 1 -l chi_sim

识别结果在output.txt文件中,如下:

0
Posted in 研究, 科技

最近接到一个调用接口识别身份证的web项目,简单看了下阿里云身份证识别的接口,接口实例使用的是python2,我仔细研究了下,把python2改为python3,并且结合最新的Django实现用户上传身份证正反面,在web中返回识别结果

1、源码下载

本程序为www.ivdone.top原创内容,版权归www.ivdone.top所有,请不要用作商业用途,仅供个人学习使用,如有问题,请在评论区,留下你咨询的问题和联系方式,以便后续联系和问题解决,谢谢你的支持

下载地址:点我下载

2、使用说明

将压缩包解压,进入解压目录,修改api.py文件中的appcode变量,写入你申请阿里云给你的appcode

cd ./recognition/recognition/
# 然后编辑文件
vi api.py
# 找到 有appcode那一行 ,写入阿里云给你自己的appcode
appcode = 'xxxx'

运行代码(本程序已经打包好的,解压就能运行,但是前提你能运行Django程序,本程序使用的Django版本是3.0.5),一定要确保你的机器能运行Django程序,如果你的Linux没有安装Django环境,请移步我的博客教程:Linux下如何使用Django创建一个helloworld的web程序

# 端口你可以随意定义,但是要注意在linux防火墙中开放该端口,不然会被切掉
python manage.py  runserver 0.0.0.0:8001

3、测试

在你的浏览器中打开我们刚刚运行的ip和端口:http://x.x.x.x/8001/index/

你会看到下面的界面:

上传身份证的正反面,识别结果如下:

4、核心代码

view.py文件

# coding:utf-8
import os
from django.http import HttpResponse, HttpResponseRedirect
from django.conf import settings
from django.contrib import messages
from django.shortcuts import render
from PIL import Image
from .api import recognition

# 信息显示类, 所有的信息在这里解码,并保存,然后把这个变量渲染到html中显示
class Info(object):

    def __init__(self):
        pass

    def write(self, is_back, result):
        if is_back:
            self.start_date = result['start_date']
            self.end_date = result['end_date']
            self.issue = result['issue']
        else:
            self.name = result['name']
            self.nationality = result['nationality']
            self.num = result['num']
            self.sex = result['sex']
            self.birth = result['birth']
            self.address = result['address']
            self.face_rect_angle = result['face_rect']['angle']
            self.face_rect_center = (result['face_rect']['center']['x'], result['face_rect']['center']['x']).__str__()
            self.face_rect_size = (result['face_rect']['size']['height'], result['face_rect']['size']['width']).__str__()
            self.card_region = str([(result['card_region'][i]['x'], result['card_region'][i]['y']).__str__()  for i in range(4)])
            self.face_rect_vertices =self.card_region = str([(result['face_rect_vertices'][i]['x'], result['face_rect_vertices'][i]['y']).__str__()  for i in range(4)])


def index(request):
    return render(request, 'index.html', {})

def upload(request):
    if request.method == 'POST' and request.POST:
        file = request.FILES.get('image_file', None)
        file_b = request.FILES.get('image_file_b', None)
        img_dir = os.path.join(settings.BASE_DIR, 'media', 'tju')
        if not os.path.isdir(img_dir):
            os.makedirs(img_dir)
        info = Info()
        # 用于控制识别信息显示
        stat_c = None
        stat_b = None   
        if file is None and file_b is None:
            messages.error(request, '提交表单为空,请重新提交')
            HttpResponseRedirect(redirect_to='/index')
        # 正面身份证 文件
        if file :
            image = Image.open(file)
            filename = os.path.join(img_dir, 'idcard' + os.path.splitext(file.name)[-1])
            if os.path.isfile(filename):
                os.remove(filename)
            with open(filename, 'wb') as f:
                for chunk in file.chunks():
                    f.write(chunk)
            result = recognition(filename=filename, is_back=False)
            info.write(is_back=False, result=result)
            # 正面身份证显示 状态改为真
            stat_c = True
        # 反面身份证 文件
        if file_b:
            filename_b = os.path.join(img_dir, 'idcard_b' + os.path.splitext(file_b.name)[-1])
            if os.path.isfile(filename_b):
                os.remove(filename_b)
            with open(filename_b, 'wb') as f:
                for chunk in file_b.chunks():
                    f.write(chunk)
            # 调用识别的接口
            result = recognition(filename=filename_b, is_back=True)
            info.write(is_back=True, result=result)
            # 反面身份证显示 状态改为真
            stat_b = True
    return render(request, 'index.html', {
        "result_c" : stat_c,
         "result_b" : stat_b,
        "info" : info
    })

api.py文件

import sys,os
import base64
import time
import json

import traceback
import urllib
import base64


def get_img_base64(img_file):
    with open(img_file, 'rb') as infile:
        s = infile.read()
    return str(base64.b64encode(s), 'utf-8') 


def predict(url, appcode, img_base64, kv_config, old_format):
        if not old_format:
            param = {}
            param['image'] = img_base64

            if kv_config is not None:
                param['configure'] = json.dumps(kv_config)
            #body = json.dumps(param, cls=Encode, indent=4)
            body = json.dumps(param).encode(encoding='UTF8')
        else:
            param = {}
            pic = {}
            pic['dataType'] = 50
            pic['dataValue'] = img_base64
            param['image'] = pic

            if kv_config is not None:
                conf = {}
                conf['dataType'] = 50
                conf['dataValue'] = json.dumps(kv_config) 
                param['configure'] = conf


            inputs = { "inputs" : [param]}
            body = json.dumps(inputs)

        headers = {'Authorization' : 'APPCODE %s' % appcode}
        request = urllib.request.Request(url=url, headers=headers, data=body)
        try:
            response = urllib.request.urlopen(url=request, timeout=10)
            return response.code, response.headers, response.read()
        except urllib.request.HTTPError as e:
            return e.code, e.headers, e.read()


def recognition(filename, is_back):
    """
    filename : 你的身份证文件
    is_back : True->反面  False->正面
    """
    # 这里更改为自己在阿里云的申请的appcode
    appcode = '你的appcode'
    url = 'http://dm-51.data.aliyun.com/rest/160601/ocr/ocr_idcard.json'
    #如果输入带有inputs, 设置为True,否则设为False
    is_old_format = False
    # 代表识别正面
    if not is_back:
        config = {'side':'face'}
    else:
        config = {'side':'back'}
    #如果没有configure字段,config设为None
    #config = None

    img_base64data = get_img_base64(filename)
    stat, header, content = predict( url, appcode, img_base64data, config, is_old_format)

    if stat != 200:
        print("Http status code:{}".format(stat))
        print('Error msg in header: {}'.format(header['x-ca-error-message']))
        print('Error msg in body: {}'.format(content))
        raise RuntimeError("发送请求失败")

    else:
        if is_old_format:
            result_str = json.loads(content)['outputs'][0]['outputValue']['dataValue']
        else:
            result_str = json.loads(content)
    return result_str
0
Posted in 研究, 科技, 算法设计与分析

有时我们在发布网站时,我们会发现浏览器找不到网站图标,正确的图标如下图所示,下面介绍如何用Django引入网站图标

1、制作网站图标

首先你可以制作自己个性化的图片,或者在百度图片上找到自己喜欢的图片,然后在下面的网站转换成特定格式的图标文件(.ico文件),网站链接:https://www.bitbug.net/

2、Django配置

第一步,将下载的图标文件上传到Django工程中static目录下:

第二步,在你的模板html文件中的head之间加入下面的代码

 <!-- favicon.ico  -->
<link rel="shortcut icon" href="{% static 'images/favicon.ico' %}" />

第三步,在你的urls.py文件中,加入下面的路由函数

from django.contrib import admin
from django.urls import path, re_path
from django.views.generic import RedirectView

urlpatterns = [
            path('admin/', admin.site.urls),
            re_path(r'^favicon\.ico$',RedirectView.as_view(url=r'static/images/favicon.ico')),   # 网站图标路由
]

3、测试

在浏览器中输入自己的网址,效果如下:

0
Posted in 学习, 科技, 问题解决